blob: 8b1f40d2709464ae84200e6c668b0b6f583381bb [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"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090036)
37
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070038var buildDir string
39
Jooyung Hand3639552019-08-09 12:57:43 +090040// names returns name list from white space separated string
41func names(s string) (ns []string) {
42 for _, n := range strings.Split(s, " ") {
43 if len(n) > 0 {
44 ns = append(ns, n)
45 }
46 }
47 return
48}
49
Jooyung Han344d5432019-08-23 11:17:39 +090050func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
51 t.Helper()
52 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090053 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
54 if len(errs) > 0 {
55 android.FailIfNoMatchingErrors(t, pattern, errs)
56 return
57 }
58 _, errs = ctx.PrepareBuildActions(config)
59 if len(errs) > 0 {
60 android.FailIfNoMatchingErrors(t, pattern, errs)
61 return
62 }
63
64 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
65}
66
Jooyung Han344d5432019-08-23 11:17:39 +090067func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
68 t.Helper()
69 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010070 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090071 android.FailIfErrored(t, errs)
72 _, errs = ctx.PrepareBuildActions(config)
73 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070074 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090075}
76
Jooyung Han344d5432019-08-23 11:17:39 +090077type testCustomizer func(fs map[string][]byte, config android.Config)
78
79func withFiles(files map[string][]byte) testCustomizer {
80 return func(fs map[string][]byte, config android.Config) {
81 for k, v := range files {
82 fs[k] = v
83 }
84 }
85}
86
87func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
88 return func(fs map[string][]byte, config android.Config) {
89 for k, v := range targets {
90 config.Targets[k] = v
91 }
92 }
93}
94
Jooyung Han35155c42020-02-06 17:33:20 +090095// withNativeBridgeTargets sets configuration with targets including:
96// - X86_64 (primary)
97// - X86 (secondary)
98// - Arm64 on X86_64 (native bridge)
99// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700100func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900101 config.Targets[android.Android] = []android.Target{
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
110 }
111}
112
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900113func withManifestPackageNameOverrides(specs []string) testCustomizer {
114 return func(fs map[string][]byte, config android.Config) {
115 config.TestProductVariables.ManifestPackageNameOverrides = specs
116 }
117}
118
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700119func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900120 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
121}
122
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700123func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900124 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
125}
126
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700127func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900129 filegroup {
130 name: "myapex-file_contexts",
131 srcs: [
132 "system/sepolicy/apex/myapex-file_contexts",
133 ],
134 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900135 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800136
Colin Crossf9aabd72020-02-15 11:29:50 -0800137 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
138
Dario Frenicde2a032019-10-27 00:29:22 +0100139 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900140
Jooyung Han344d5432019-08-23 11:17:39 +0900141 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900142 "a.java": nil,
143 "PrebuiltAppFoo.apk": nil,
144 "PrebuiltAppFooPriv.apk": nil,
145 "build/make/target/product/security": nil,
146 "apex_manifest.json": nil,
147 "AndroidManifest.xml": nil,
148 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900149 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900150 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900151 "system/sepolicy/apex/otherapex-file_contexts": nil,
152 "system/sepolicy/apex/commonapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800154 "mylib.cpp": nil,
155 "mylib_common.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100164 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900175 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700180 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "build/make/core/proguard.flags": nil,
184 "build/make/core/proguard_basic_keeps.flags": nil,
185 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700186 "baz": nil,
187 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700188 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700189 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900190 }
191
Colin Crossf9aabd72020-02-15 11:29:50 -0800192 cc.GatherRequiredFilesForTest(fs)
193
Jooyung Han344d5432019-08-23 11:17:39 +0900194 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800195 // The fs now needs to be populated before creating the config, call handlers twice
196 // for now, once to get any fs changes, and later after the config was created to
197 // set product variables or targets.
198 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
199 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900200 }
201
Colin Cross98be1bb2019-12-13 20:41:13 -0800202 config := android.TestArchConfig(buildDir, nil, bp, fs)
203 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
204 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
205 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
206 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
207 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700208 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800209 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
210
211 for _, handler := range handlers {
212 // The fs now needs to be populated before creating the config, call handlers twice
213 // for now, earlier to get any fs changes, and now after the config was created to
214 // set product variables or targets.
215 tempFS := map[string][]byte{}
216 handler(tempFS, config)
217 }
218
219 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100220
221 // from android package
222 android.RegisterPackageBuildComponents(ctx)
223 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
224
Colin Cross98be1bb2019-12-13 20:41:13 -0800225 ctx.RegisterModuleType("apex", BundleFactory)
226 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
227 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
228 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
229 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
230 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
231 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700232 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800233
Jooyung Hana57af4a2020-01-23 05:36:59 +0000234 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100235 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
237
Paul Duffin021f4e52020-07-30 16:04:17 +0100238 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 // Register these after the prebuilt mutators have been registered to match what
241 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100242 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
243 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
244
Paul Duffin021f4e52020-07-30 16:04:17 +0100245 cc.RegisterRequiredBuildComponentsForTest(ctx)
246
Colin Cross98be1bb2019-12-13 20:41:13 -0800247 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800248 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
249 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900250 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000251 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700252 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800253 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000254 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000255 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000256 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100257 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900258 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800259 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260
Colin Cross98be1bb2019-12-13 20:41:13 -0800261 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
264 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267}
268
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700269func setUp() {
270 var err error
271 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700273 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275}
276
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700278 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279}
280
Jooyung Han643adc42020-02-27 13:50:06 +0900281// ensure that 'result' equals 'expected'
282func ensureEquals(t *testing.T, result string, expected string) {
283 t.Helper()
284 if result != expected {
285 t.Errorf("%q != %q", expected, result)
286 }
287}
288
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289// ensure that 'result' contains 'expected'
290func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900291 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292 if !strings.Contains(result, expected) {
293 t.Errorf("%q is not found in %q", expected, result)
294 }
295}
296
Liz Kammer5bd365f2020-05-27 15:15:11 -0700297// ensure that 'result' contains 'expected' exactly one time
298func ensureContainsOnce(t *testing.T, result string, expected string) {
299 t.Helper()
300 count := strings.Count(result, expected)
301 if count != 1 {
302 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// ensures that 'result' does not contain 'notExpected'
307func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900308 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309 if strings.Contains(result, notExpected) {
310 t.Errorf("%q is found in %q", notExpected, result)
311 }
312}
313
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700314func ensureMatches(t *testing.T, result string, expectedRex string) {
315 ok, err := regexp.MatchString(expectedRex, result)
316 if err != nil {
317 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
318 return
319 }
320 if !ok {
321 t.Errorf("%s does not match regular expession %s", result, expectedRex)
322 }
323}
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900326 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 if !android.InList(expected, result) {
328 t.Errorf("%q is not found in %v", expected, result)
329 }
330}
331
332func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900333 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 if android.InList(notExpected, result) {
335 t.Errorf("%q is found in %v", notExpected, result)
336 }
337}
338
Jooyung Hane1633032019-08-01 17:41:43 +0900339func ensureListEmpty(t *testing.T, result []string) {
340 t.Helper()
341 if len(result) > 0 {
342 t.Errorf("%q is expected to be empty", result)
343 }
344}
345
Jiyong Park25fc6a92018-11-18 18:02:45 +0900346// Minimal test
347func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900348 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900349 apex_defaults {
350 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900351 manifest: ":myapex.manifest",
352 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 key: "myapex.key",
354 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800355 multilib: {
356 both: {
357 binaries: ["foo",],
358 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900359 },
Jiyong Park77acec62020-06-01 21:39:15 +0900360 java_libs: [
361 "myjar",
362 "myjar_dex",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 }
365
Jiyong Park30ca9372019-02-07 16:27:23 +0900366 apex {
367 name: "myapex",
368 defaults: ["myapex-defaults"],
369 }
370
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 apex_key {
372 name: "myapex.key",
373 public_key: "testkey.avbpubkey",
374 private_key: "testkey.pem",
375 }
376
Jiyong Park809bb722019-02-13 21:33:49 +0900377 filegroup {
378 name: "myapex.manifest",
379 srcs: ["apex_manifest.json"],
380 }
381
382 filegroup {
383 name: "myapex.androidmanifest",
384 srcs: ["AndroidManifest.xml"],
385 }
386
Jiyong Park25fc6a92018-11-18 18:02:45 +0900387 cc_library {
388 name: "mylib",
389 srcs: ["mylib.cpp"],
390 shared_libs: ["mylib2"],
391 system_shared_libs: [],
392 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000393 // TODO: remove //apex_available:platform
394 apex_available: [
395 "//apex_available:platform",
396 "myapex",
397 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900398 }
399
Alex Light3d673592019-01-18 14:37:31 -0800400 cc_binary {
401 name: "foo",
402 srcs: ["mylib.cpp"],
403 compile_multilib: "both",
404 multilib: {
405 lib32: {
406 suffix: "32",
407 },
408 lib64: {
409 suffix: "64",
410 },
411 },
412 symlinks: ["foo_link_"],
413 symlink_preferred_arch: true,
414 system_shared_libs: [],
415 static_executable: true,
416 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700417 apex_available: [ "myapex", "com.android.gki.*" ],
418 }
419
420 apex {
421 name: "com.android.gki.fake",
422 binaries: ["foo"],
423 key: "myapex.key",
424 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800425 }
426
Paul Duffindddd5462020-04-07 15:25:44 +0100427 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900428 name: "mylib2",
429 srcs: ["mylib.cpp"],
430 system_shared_libs: [],
431 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900432 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900433 static_libs: ["libstatic"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_prebuilt_library_shared {
442 name: "mylib2",
443 srcs: ["prebuilt.so"],
444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
449 }
450
Jiyong Park9918e1a2020-03-17 19:16:40 +0900451 cc_library_static {
452 name: "libstatic",
453 srcs: ["mylib.cpp"],
454 system_shared_libs: [],
455 stl: "none",
456 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900462 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463
464 java_library {
465 name: "myjar",
466 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900467 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 sdk_version: "none",
469 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900471 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 }
478
Jiyong Park77acec62020-06-01 21:39:15 +0900479 dex_import {
480 name: "myjar_dex",
481 jars: ["prebuilt.jar"],
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 java_library {
489 name: "myotherjar",
490 srcs: ["foo/bar/MyClass.java"],
491 sdk_version: "none",
492 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900499
500 java_library {
501 name: "mysharedjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900506 `)
507
Sundong Ahnabb64432019-10-22 13:58:29 +0900508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900509
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900510 // Make sure that Android.mk is created
511 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
512 data := android.AndroidMkDataForTest(t, config, "", ab)
513 var builder strings.Builder
514 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
515
516 androidMk := builder.String()
517 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
518 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
519
Jiyong Park42cca6c2019-04-01 11:15:50 +0900520 optFlags := apexRule.Args["opt_flags"]
521 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700522 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900523 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 copyCmds := apexRule.Args["copy_commands"]
526
527 // Ensure that main rule creates an output
528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
529
530 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
533 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534
535 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700536 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
537 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800540 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
541 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900542 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900543 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900544 // .. but not for java libs
545 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900546 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800547
Colin Cross7113d202019-11-20 16:39:12 -0800548 // Ensure that the platform variant ends with _shared or _common
549 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
554
555 // Ensure that dynamic dependency to java libs are not included
556 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800557
558 // Ensure that all symlinks are present.
559 found_foo_link_64 := false
560 found_foo := false
561 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900562 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800563 if strings.HasSuffix(cmd, "bin/foo") {
564 found_foo = true
565 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
566 found_foo_link_64 = true
567 }
568 }
569 }
570 good := found_foo && found_foo_link_64
571 if !good {
572 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
573 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900574
Sundong Ahnabb64432019-10-22 13:58:29 +0900575 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700576 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900577 if len(noticeInputs) != 3 {
578 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900579 }
580 ensureListContains(t, noticeInputs, "NOTICE")
581 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900582 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900583
Artur Satayeva8bd1132020-04-27 18:07:06 +0100584 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100585 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
586 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
587 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
588 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
589 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100590
591 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
593 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
594 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800597}
598
Jooyung Hanf21c7972019-12-16 22:32:06 +0900599func TestDefaults(t *testing.T) {
600 ctx, _ := testApex(t, `
601 apex_defaults {
602 name: "myapex-defaults",
603 key: "myapex.key",
604 prebuilts: ["myetc"],
605 native_shared_libs: ["mylib"],
606 java_libs: ["myjar"],
607 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900608 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800609 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610 }
611
612 prebuilt_etc {
613 name: "myetc",
614 src: "myprebuilt",
615 }
616
617 apex {
618 name: "myapex",
619 defaults: ["myapex-defaults"],
620 }
621
622 apex_key {
623 name: "myapex.key",
624 public_key: "testkey.avbpubkey",
625 private_key: "testkey.pem",
626 }
627
628 cc_library {
629 name: "mylib",
630 system_shared_libs: [],
631 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000632 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900633 }
634
635 java_library {
636 name: "myjar",
637 srcs: ["foo/bar/MyClass.java"],
638 sdk_version: "none",
639 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
642
643 android_app {
644 name: "AppFoo",
645 srcs: ["foo/bar/MyClass.java"],
646 sdk_version: "none",
647 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900650
651 runtime_resource_overlay {
652 name: "rro",
653 theme: "blue",
654 }
655
markchien2f59ec92020-09-02 16:23:38 +0800656 bpf {
657 name: "bpf",
658 srcs: ["bpf.c", "bpf2.c"],
659 }
660
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000662 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 "etc/myetc",
664 "javalib/myjar.jar",
665 "lib64/mylib.so",
666 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900667 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800668 "etc/bpf/bpf.o",
669 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900670 })
671}
672
Jooyung Han01a3ee22019-11-02 02:52:25 +0900673func TestApexManifest(t *testing.T) {
674 ctx, _ := testApex(t, `
675 apex {
676 name: "myapex",
677 key: "myapex.key",
678 }
679
680 apex_key {
681 name: "myapex.key",
682 public_key: "testkey.avbpubkey",
683 private_key: "testkey.pem",
684 }
685 `)
686
687 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900688 args := module.Rule("apexRule").Args
689 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
690 t.Error("manifest should be apex_manifest.pb, but " + manifest)
691 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692}
693
Alex Light5098a612018-11-29 17:12:15 -0800694func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700695 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800696 apex {
697 name: "myapex",
698 key: "myapex.key",
699 payload_type: "zip",
700 native_shared_libs: ["mylib"],
701 }
702
703 apex_key {
704 name: "myapex.key",
705 public_key: "testkey.avbpubkey",
706 private_key: "testkey.pem",
707 }
708
709 cc_library {
710 name: "mylib",
711 srcs: ["mylib.cpp"],
712 shared_libs: ["mylib2"],
713 system_shared_libs: [],
714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000715 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800716 }
717
718 cc_library {
719 name: "mylib2",
720 srcs: ["mylib.cpp"],
721 system_shared_libs: [],
722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000723 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800724 }
725 `)
726
Sundong Ahnabb64432019-10-22 13:58:29 +0900727 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800728 copyCmds := zipApexRule.Args["copy_commands"]
729
730 // Ensure that main rule creates an output
731 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
732
733 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700734 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800735
736 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700737 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800738
739 // Ensure that both direct and indirect deps are copied into apex
740 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
741 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900742}
743
744func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700745 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900746 apex {
747 name: "myapex",
748 key: "myapex.key",
749 native_shared_libs: ["mylib", "mylib3"],
750 }
751
752 apex_key {
753 name: "myapex.key",
754 public_key: "testkey.avbpubkey",
755 private_key: "testkey.pem",
756 }
757
758 cc_library {
759 name: "mylib",
760 srcs: ["mylib.cpp"],
761 shared_libs: ["mylib2", "mylib3"],
762 system_shared_libs: [],
763 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000764 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900765 }
766
767 cc_library {
768 name: "mylib2",
769 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900770 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900771 system_shared_libs: [],
772 stl: "none",
773 stubs: {
774 versions: ["1", "2", "3"],
775 },
776 }
777
778 cc_library {
779 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900780 srcs: ["mylib.cpp"],
781 shared_libs: ["mylib4"],
782 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900783 stl: "none",
784 stubs: {
785 versions: ["10", "11", "12"],
786 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000787 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900788 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900789
790 cc_library {
791 name: "mylib4",
792 srcs: ["mylib.cpp"],
793 system_shared_libs: [],
794 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000795 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900796 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797 `)
798
Sundong Ahnabb64432019-10-22 13:58:29 +0900799 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900800 copyCmds := apexRule.Args["copy_commands"]
801
802 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800803 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804
805 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800806 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807
808 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800809 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900810
Colin Crossaede88c2020-08-11 12:17:01 -0700811 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812
813 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900814 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900815 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900816 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817
818 // 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 -0700819 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900820 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700821 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900822
823 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900824 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900825 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900826
827 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700828 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900829
Jooyung Hana57af4a2020-01-23 05:36:59 +0000830 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900831 "lib64/mylib.so",
832 "lib64/mylib3.so",
833 "lib64/mylib4.so",
834 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835}
836
Colin Cross7812fd32020-09-25 12:35:10 -0700837func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
838 t.Parallel()
839 ctx, _ := testApex(t, `
840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
844 min_sdk_version: "29",
845 }
846
847 apex_key {
848 name: "myapex.key",
849 public_key: "testkey.avbpubkey",
850 private_key: "testkey.pem",
851 }
852
853 cc_library {
854 name: "mylib",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["mylib2", "mylib3"],
857 system_shared_libs: [],
858 stl: "none",
859 apex_available: [ "myapex" ],
860 min_sdk_version: "28",
861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
866 cflags: ["-include mylib.h"],
867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["28", "29", "30", "current"],
871 },
872 min_sdk_version: "28",
873 }
874
875 cc_library {
876 name: "mylib3",
877 srcs: ["mylib.cpp"],
878 shared_libs: ["mylib4"],
879 system_shared_libs: [],
880 stl: "none",
881 stubs: {
882 versions: ["28", "29", "30", "current"],
883 },
884 apex_available: [ "myapex" ],
885 min_sdk_version: "28",
886 }
887
888 cc_library {
889 name: "mylib4",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
893 apex_available: [ "myapex" ],
894 min_sdk_version: "28",
895 }
896 `)
897
898 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
899 copyCmds := apexRule.Args["copy_commands"]
900
901 // Ensure that direct non-stubs dep is always included
902 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
903
904 // Ensure that indirect stubs dep is not included
905 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
906
907 // Ensure that direct stubs dep is included
908 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
909
910 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
911
912 // Ensure that mylib is linking with the version 29 stubs for mylib2
913 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
914 // ... and not linking to the non-stub (impl) variant of mylib2
915 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
916
917 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
918 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
919 // .. and not linking to the stubs variant of mylib3
920 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
921
922 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700923 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700924 ensureNotContains(t, mylib2Cflags, "-include ")
925
926 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700927 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700928
929 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
930 "lib64/mylib.so",
931 "lib64/mylib3.so",
932 "lib64/mylib4.so",
933 })
934}
935
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900936func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700937 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900938 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900939 name: "myapex2",
940 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900941 native_shared_libs: ["mylib"],
942 }
943
944 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900945 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900946 public_key: "testkey.avbpubkey",
947 private_key: "testkey.pem",
948 }
949
950 cc_library {
951 name: "mylib",
952 srcs: ["mylib.cpp"],
953 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900954 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900955 system_shared_libs: [],
956 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000957 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900958 }
959
960 cc_library {
961 name: "libfoo",
962 srcs: ["mylib.cpp"],
963 shared_libs: ["libbar"],
964 system_shared_libs: [],
965 stl: "none",
966 stubs: {
967 versions: ["10", "20", "30"],
968 },
969 }
970
971 cc_library {
972 name: "libbar",
973 srcs: ["mylib.cpp"],
974 system_shared_libs: [],
975 stl: "none",
976 }
977
Jiyong Park678c8812020-02-07 17:25:49 +0900978 cc_library_static {
979 name: "libbaz",
980 srcs: ["mylib.cpp"],
981 system_shared_libs: [],
982 stl: "none",
983 apex_available: [ "myapex2" ],
984 }
985
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900986 `)
987
Jiyong Park83dc74b2020-01-14 18:38:44 +0900988 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900989 copyCmds := apexRule.Args["copy_commands"]
990
991 // Ensure that direct non-stubs dep is always included
992 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
993
994 // Ensure that indirect stubs dep is not included
995 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
996
997 // Ensure that dependency of stubs is not included
998 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
999
Colin Crossaede88c2020-08-11 12:17:01 -07001000 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001001
1002 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001003 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001004 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001005 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001006
Jiyong Park3ff16992019-12-27 14:11:47 +09001007 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001008
1009 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1010 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001011
Artur Satayeva8bd1132020-04-27 18:07:06 +01001012 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001013 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1014 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1015 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001016
Artur Satayeva8bd1132020-04-27 18:07:06 +01001017 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001018 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1019 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1020 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001021}
1022
Jooyung Hand3639552019-08-09 12:57:43 +09001023func TestApexWithRuntimeLibsDependency(t *testing.T) {
1024 /*
1025 myapex
1026 |
1027 v (runtime_libs)
1028 mylib ------+------> libfoo [provides stub]
1029 |
1030 `------> libbar
1031 */
1032 ctx, _ := testApex(t, `
1033 apex {
1034 name: "myapex",
1035 key: "myapex.key",
1036 native_shared_libs: ["mylib"],
1037 }
1038
1039 apex_key {
1040 name: "myapex.key",
1041 public_key: "testkey.avbpubkey",
1042 private_key: "testkey.pem",
1043 }
1044
1045 cc_library {
1046 name: "mylib",
1047 srcs: ["mylib.cpp"],
1048 runtime_libs: ["libfoo", "libbar"],
1049 system_shared_libs: [],
1050 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001051 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001052 }
1053
1054 cc_library {
1055 name: "libfoo",
1056 srcs: ["mylib.cpp"],
1057 system_shared_libs: [],
1058 stl: "none",
1059 stubs: {
1060 versions: ["10", "20", "30"],
1061 },
1062 }
1063
1064 cc_library {
1065 name: "libbar",
1066 srcs: ["mylib.cpp"],
1067 system_shared_libs: [],
1068 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001069 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001070 }
1071
1072 `)
1073
Sundong Ahnabb64432019-10-22 13:58:29 +09001074 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001075 copyCmds := apexRule.Args["copy_commands"]
1076
1077 // Ensure that direct non-stubs dep is always included
1078 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1079
1080 // Ensure that indirect stubs dep is not included
1081 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1082
1083 // Ensure that runtime_libs dep in included
1084 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1085
Sundong Ahnabb64432019-10-22 13:58:29 +09001086 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001087 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1088 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001089
1090}
1091
Jooyung Han8ce8db92020-05-15 19:05:05 +09001092func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1093 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1094 bp := `
1095 apex {
1096 name: "com.android.runtime",
1097 key: "com.android.runtime.key",
1098 native_shared_libs: ["libc"],
1099 }
1100
1101 apex_key {
1102 name: "com.android.runtime.key",
1103 public_key: "testkey.avbpubkey",
1104 private_key: "testkey.pem",
1105 }
1106
1107 cc_library {
1108 name: "libc",
1109 no_libcrt: true,
1110 nocrt: true,
1111 stl: "none",
1112 system_shared_libs: [],
1113 stubs: { versions: ["1"] },
1114 apex_available: ["com.android.runtime"],
1115
1116 sanitize: {
1117 hwaddress: true,
1118 }
1119 }
1120
1121 cc_prebuilt_library_shared {
1122 name: "libclang_rt.hwasan-aarch64-android",
1123 no_libcrt: true,
1124 nocrt: true,
1125 stl: "none",
1126 system_shared_libs: [],
1127 srcs: [""],
1128 stubs: { versions: ["1"] },
1129
1130 sanitize: {
1131 never: true,
1132 },
1133 }
1134 `
1135 // override bp to use hard-coded names: com.android.runtime and libc
1136 fs["Android.bp"] = []byte(bp)
1137 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1138 })
1139
1140 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1141 "lib64/bionic/libc.so",
1142 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1143 })
1144
1145 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1146
1147 installed := hwasan.Description("install libclang_rt.hwasan")
1148 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1149
1150 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1151 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1152 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1153}
1154
1155func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1156 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1157 bp := `
1158 apex {
1159 name: "com.android.runtime",
1160 key: "com.android.runtime.key",
1161 native_shared_libs: ["libc"],
1162 }
1163
1164 apex_key {
1165 name: "com.android.runtime.key",
1166 public_key: "testkey.avbpubkey",
1167 private_key: "testkey.pem",
1168 }
1169
1170 cc_library {
1171 name: "libc",
1172 no_libcrt: true,
1173 nocrt: true,
1174 stl: "none",
1175 system_shared_libs: [],
1176 stubs: { versions: ["1"] },
1177 apex_available: ["com.android.runtime"],
1178 }
1179
1180 cc_prebuilt_library_shared {
1181 name: "libclang_rt.hwasan-aarch64-android",
1182 no_libcrt: true,
1183 nocrt: true,
1184 stl: "none",
1185 system_shared_libs: [],
1186 srcs: [""],
1187 stubs: { versions: ["1"] },
1188
1189 sanitize: {
1190 never: true,
1191 },
1192 }
1193 `
1194 // override bp to use hard-coded names: com.android.runtime and libc
1195 fs["Android.bp"] = []byte(bp)
1196 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1197
1198 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1199 })
1200
1201 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1202 "lib64/bionic/libc.so",
1203 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1204 })
1205
1206 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1207
1208 installed := hwasan.Description("install libclang_rt.hwasan")
1209 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1210
1211 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1212 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1213 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1214}
1215
Jooyung Han61b66e92020-03-21 14:21:46 +00001216func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1217 testcases := []struct {
1218 name string
1219 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001220 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001221 shouldLink string
1222 shouldNotLink []string
1223 }{
1224 {
Jooyung Han75568392020-03-20 04:29:24 +09001225 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001226 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001227 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001228 shouldLink: "30",
1229 shouldNotLink: []string{"29"},
1230 },
1231 {
1232 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001233 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001234 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001235 shouldLink: "29",
1236 shouldNotLink: []string{"30"},
1237 },
1238 }
1239 for _, tc := range testcases {
1240 t.Run(tc.name, func(t *testing.T) {
1241 ctx, _ := testApex(t, `
1242 apex {
1243 name: "myapex",
1244 key: "myapex.key",
1245 use_vendor: true,
1246 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001247 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001248 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001249
Jooyung Han61b66e92020-03-21 14:21:46 +00001250 apex_key {
1251 name: "myapex.key",
1252 public_key: "testkey.avbpubkey",
1253 private_key: "testkey.pem",
1254 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001255
Jooyung Han61b66e92020-03-21 14:21:46 +00001256 cc_library {
1257 name: "mylib",
1258 srcs: ["mylib.cpp"],
1259 vendor_available: true,
1260 shared_libs: ["libbar"],
1261 system_shared_libs: [],
1262 stl: "none",
1263 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001264 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001265 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001266
Jooyung Han61b66e92020-03-21 14:21:46 +00001267 cc_library {
1268 name: "libbar",
1269 srcs: ["mylib.cpp"],
1270 system_shared_libs: [],
1271 stl: "none",
1272 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001273 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001274 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001275
Jooyung Han61b66e92020-03-21 14:21:46 +00001276 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001277 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001278 symbol_file: "",
1279 }
1280 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001281 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001282 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001283
Jooyung Han61b66e92020-03-21 14:21:46 +00001284 // Ensure that LLNDK dep is not included
1285 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1286 "lib64/mylib.so",
1287 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001288
Jooyung Han61b66e92020-03-21 14:21:46 +00001289 // Ensure that LLNDK dep is required
1290 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1291 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1292 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001293
Colin Crossaede88c2020-08-11 12:17:01 -07001294 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001295 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1296 for _, ver := range tc.shouldNotLink {
1297 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1298 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001299
Colin Crossaede88c2020-08-11 12:17:01 -07001300 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001301 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1302 })
1303 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001304}
1305
Jiyong Park25fc6a92018-11-18 18:02:45 +09001306func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001307 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001308 apex {
1309 name: "myapex",
1310 key: "myapex.key",
1311 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 cc_library {
1321 name: "mylib",
1322 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001323 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001324 shared_libs: ["libdl#27"],
1325 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001326 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001327 }
1328
1329 cc_library_shared {
1330 name: "mylib_shared",
1331 srcs: ["mylib.cpp"],
1332 shared_libs: ["libdl#27"],
1333 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001334 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001335 }
1336
1337 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001338 name: "libBootstrap",
1339 srcs: ["mylib.cpp"],
1340 stl: "none",
1341 bootstrap: true,
1342 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001343 `)
1344
Sundong Ahnabb64432019-10-22 13:58:29 +09001345 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001346 copyCmds := apexRule.Args["copy_commands"]
1347
1348 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001349 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001350 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1351 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001352
1353 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001354 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001355
Colin Crossaede88c2020-08-11 12:17:01 -07001356 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1357 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1358 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001359
1360 // For dependency to libc
1361 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001362 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001363 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001364 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001365 // ... Cflags from stub is correctly exported to mylib
1366 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1367 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1368
1369 // For dependency to libm
1370 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001371 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001372 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001373 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001374 // ... and is not compiling with the stub
1375 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1376 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1377
1378 // For dependency to libdl
1379 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001380 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001381 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001382 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1383 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001384 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001385 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001386 // ... Cflags from stub is correctly exported to mylib
1387 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1388 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001389
1390 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001391 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1392 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1393 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1394 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001395}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001396
Jooyung Han749dc692020-04-15 11:03:39 +09001397func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001398 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001399 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1400 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001401 // 3) (platform) -> liba -> libz : this should be non-stub link
1402 ctx, _ := testApex(t, `
1403 apex {
1404 name: "myapex",
1405 key: "myapex.key",
1406 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001407 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001408 }
1409
1410 apex {
1411 name: "otherapex",
1412 key: "myapex.key",
1413 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001414 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001415 }
1416
1417 apex_key {
1418 name: "myapex.key",
1419 public_key: "testkey.avbpubkey",
1420 private_key: "testkey.pem",
1421 }
1422
1423 cc_library {
1424 name: "libx",
1425 shared_libs: ["liba"],
1426 system_shared_libs: [],
1427 stl: "none",
1428 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001429 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001430 }
1431
1432 cc_library {
1433 name: "liby",
1434 shared_libs: ["liba"],
1435 system_shared_libs: [],
1436 stl: "none",
1437 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001438 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001439 }
1440
1441 cc_library {
1442 name: "liba",
1443 shared_libs: ["libz"],
1444 system_shared_libs: [],
1445 stl: "none",
1446 apex_available: [
1447 "//apex_available:anyapex",
1448 "//apex_available:platform",
1449 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001450 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001451 }
1452
1453 cc_library {
1454 name: "libz",
1455 system_shared_libs: [],
1456 stl: "none",
1457 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001458 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001459 },
1460 }
Jooyung Han749dc692020-04-15 11:03:39 +09001461 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001462
1463 expectLink := func(from, from_variant, to, to_variant string) {
1464 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1465 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1466 }
1467 expectNoLink := func(from, from_variant, to, to_variant string) {
1468 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1469 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1470 }
1471 // platform liba is linked to non-stub version
1472 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001473 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001474 expectLink("liba", "shared_apex29", "libz", "shared_28")
1475 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1476 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001477 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001478 expectLink("liba", "shared_apex30", "libz", "shared_30")
1479 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1480 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001481}
1482
Jooyung Hanaed150d2020-04-02 01:41:41 +09001483func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1484 ctx, _ := testApex(t, `
1485 apex {
1486 name: "myapex",
1487 key: "myapex.key",
1488 native_shared_libs: ["libx"],
1489 min_sdk_version: "R",
1490 }
1491
1492 apex_key {
1493 name: "myapex.key",
1494 public_key: "testkey.avbpubkey",
1495 private_key: "testkey.pem",
1496 }
1497
1498 cc_library {
1499 name: "libx",
1500 shared_libs: ["libz"],
1501 system_shared_libs: [],
1502 stl: "none",
1503 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001504 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001505 }
1506
1507 cc_library {
1508 name: "libz",
1509 system_shared_libs: [],
1510 stl: "none",
1511 stubs: {
1512 versions: ["29", "R"],
1513 },
1514 }
1515 `, func(fs map[string][]byte, config android.Config) {
1516 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1517 })
1518
1519 expectLink := func(from, from_variant, to, to_variant string) {
1520 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1521 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1522 }
1523 expectNoLink := func(from, from_variant, to, to_variant string) {
1524 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1525 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1526 }
Dan Albertc8060532020-07-22 22:32:17 -07001527 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001528 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1529 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001530}
1531
Jooyung Han749dc692020-04-15 11:03:39 +09001532func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001533 ctx, _ := testApex(t, `
1534 apex {
1535 name: "myapex",
1536 key: "myapex.key",
1537 native_shared_libs: ["libx"],
1538 }
1539
1540 apex_key {
1541 name: "myapex.key",
1542 public_key: "testkey.avbpubkey",
1543 private_key: "testkey.pem",
1544 }
1545
1546 cc_library {
1547 name: "libx",
1548 shared_libs: ["libz"],
1549 system_shared_libs: [],
1550 stl: "none",
1551 apex_available: [ "myapex" ],
1552 }
1553
1554 cc_library {
1555 name: "libz",
1556 system_shared_libs: [],
1557 stl: "none",
1558 stubs: {
1559 versions: ["1", "2"],
1560 },
1561 }
1562 `)
1563
1564 expectLink := func(from, from_variant, to, to_variant string) {
1565 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1566 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1567 }
1568 expectNoLink := func(from, from_variant, to, to_variant string) {
1569 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1570 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1571 }
Colin Crossaede88c2020-08-11 12:17:01 -07001572 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1573 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1574 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001575}
1576
1577func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1578 ctx, _ := testApex(t, `
1579 apex {
1580 name: "myapex",
1581 key: "myapex.key",
1582 native_shared_libs: ["libx"],
1583 }
1584
1585 apex_key {
1586 name: "myapex.key",
1587 public_key: "testkey.avbpubkey",
1588 private_key: "testkey.pem",
1589 }
1590
1591 cc_library {
1592 name: "libx",
1593 system_shared_libs: [],
1594 stl: "none",
1595 apex_available: [ "myapex" ],
1596 stubs: {
1597 versions: ["1", "2"],
1598 },
1599 }
1600
1601 cc_library {
1602 name: "libz",
1603 shared_libs: ["libx"],
1604 system_shared_libs: [],
1605 stl: "none",
1606 }
1607 `)
1608
1609 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001610 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001611 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1612 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1613 }
1614 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001615 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001616 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1617 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1618 }
1619 expectLink("libz", "shared", "libx", "shared_2")
1620 expectNoLink("libz", "shared", "libz", "shared_1")
1621 expectNoLink("libz", "shared", "libz", "shared")
1622}
1623
Jooyung Han75568392020-03-20 04:29:24 +09001624func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001625 ctx, _ := testApex(t, `
1626 apex {
1627 name: "myapex",
1628 key: "myapex.key",
1629 native_shared_libs: ["libx"],
1630 min_sdk_version: "29",
1631 }
1632
1633 apex_key {
1634 name: "myapex.key",
1635 public_key: "testkey.avbpubkey",
1636 private_key: "testkey.pem",
1637 }
1638
1639 cc_library {
1640 name: "libx",
1641 shared_libs: ["libbar"],
1642 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001643 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001644 }
1645
1646 cc_library {
1647 name: "libbar",
1648 stubs: {
1649 versions: ["29", "30"],
1650 },
1651 }
Jooyung Han75568392020-03-20 04:29:24 +09001652 `, func(fs map[string][]byte, config android.Config) {
1653 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1654 })
Jooyung Han03b51852020-02-26 22:45:42 +09001655 expectLink := func(from, from_variant, to, to_variant string) {
1656 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1657 libFlags := ld.Args["libFlags"]
1658 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1659 }
Colin Crossaede88c2020-08-11 12:17:01 -07001660 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001661}
1662
Jooyung Han75568392020-03-20 04:29:24 +09001663func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001664 ctx, _ := testApex(t, `
1665 apex {
1666 name: "myapex",
1667 key: "myapex.key",
1668 native_shared_libs: ["libx"],
1669 min_sdk_version: "29",
1670 }
1671
1672 apex_key {
1673 name: "myapex.key",
1674 public_key: "testkey.avbpubkey",
1675 private_key: "testkey.pem",
1676 }
1677
1678 cc_library {
1679 name: "libx",
1680 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001681 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001682 }
Jooyung Han75568392020-03-20 04:29:24 +09001683 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001684
1685 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001686 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001687 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1688 // note that platform variant is not.
1689 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1690 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001691}
1692
Jooyung Han749dc692020-04-15 11:03:39 +09001693func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001694 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001695 apex {
1696 name: "myapex",
1697 key: "myapex.key",
1698 native_shared_libs: ["libx"],
1699 min_sdk_version: "29",
1700 }
1701
1702 apex_key {
1703 name: "myapex.key",
1704 public_key: "testkey.avbpubkey",
1705 private_key: "testkey.pem",
1706 }
1707
1708 cc_library {
1709 name: "libx",
1710 shared_libs: ["libz"],
1711 system_shared_libs: [],
1712 stl: "none",
1713 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001714 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001715 }
1716
1717 cc_library {
1718 name: "libz",
1719 system_shared_libs: [],
1720 stl: "none",
1721 stubs: {
1722 versions: ["30"],
1723 },
1724 }
Jooyung Han75568392020-03-20 04:29:24 +09001725 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001726}
Jooyung Han03b51852020-02-26 22:45:42 +09001727
Jooyung Han749dc692020-04-15 11:03:39 +09001728func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1729 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001730 apex {
1731 name: "myapex",
1732 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001733 native_shared_libs: ["mylib"],
1734 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001735 }
1736
1737 apex_key {
1738 name: "myapex.key",
1739 public_key: "testkey.avbpubkey",
1740 private_key: "testkey.pem",
1741 }
Jooyung Han749dc692020-04-15 11:03:39 +09001742
1743 cc_library {
1744 name: "mylib",
1745 srcs: ["mylib.cpp"],
1746 system_shared_libs: [],
1747 stl: "none",
1748 apex_available: [
1749 "myapex",
1750 ],
1751 min_sdk_version: "30",
1752 }
1753 `)
1754}
1755
1756func TestApexMinSdkVersion_Okay(t *testing.T) {
1757 testApex(t, `
1758 apex {
1759 name: "myapex",
1760 key: "myapex.key",
1761 native_shared_libs: ["libfoo"],
1762 java_libs: ["libbar"],
1763 min_sdk_version: "29",
1764 }
1765
1766 apex_key {
1767 name: "myapex.key",
1768 public_key: "testkey.avbpubkey",
1769 private_key: "testkey.pem",
1770 }
1771
1772 cc_library {
1773 name: "libfoo",
1774 srcs: ["mylib.cpp"],
1775 shared_libs: ["libfoo_dep"],
1776 apex_available: ["myapex"],
1777 min_sdk_version: "29",
1778 }
1779
1780 cc_library {
1781 name: "libfoo_dep",
1782 srcs: ["mylib.cpp"],
1783 apex_available: ["myapex"],
1784 min_sdk_version: "29",
1785 }
1786
1787 java_library {
1788 name: "libbar",
1789 sdk_version: "current",
1790 srcs: ["a.java"],
1791 static_libs: ["libbar_dep"],
1792 apex_available: ["myapex"],
1793 min_sdk_version: "29",
1794 }
1795
1796 java_library {
1797 name: "libbar_dep",
1798 sdk_version: "current",
1799 srcs: ["a.java"],
1800 apex_available: ["myapex"],
1801 min_sdk_version: "29",
1802 }
Jooyung Han03b51852020-02-26 22:45:42 +09001803 `)
1804}
1805
Artur Satayev8cf899a2020-04-15 17:29:42 +01001806func TestJavaStableSdkVersion(t *testing.T) {
1807 testCases := []struct {
1808 name string
1809 expectedError string
1810 bp string
1811 }{
1812 {
1813 name: "Non-updatable apex with non-stable dep",
1814 bp: `
1815 apex {
1816 name: "myapex",
1817 java_libs: ["myjar"],
1818 key: "myapex.key",
1819 }
1820 apex_key {
1821 name: "myapex.key",
1822 public_key: "testkey.avbpubkey",
1823 private_key: "testkey.pem",
1824 }
1825 java_library {
1826 name: "myjar",
1827 srcs: ["foo/bar/MyClass.java"],
1828 sdk_version: "core_platform",
1829 apex_available: ["myapex"],
1830 }
1831 `,
1832 },
1833 {
1834 name: "Updatable apex with stable dep",
1835 bp: `
1836 apex {
1837 name: "myapex",
1838 java_libs: ["myjar"],
1839 key: "myapex.key",
1840 updatable: true,
1841 min_sdk_version: "29",
1842 }
1843 apex_key {
1844 name: "myapex.key",
1845 public_key: "testkey.avbpubkey",
1846 private_key: "testkey.pem",
1847 }
1848 java_library {
1849 name: "myjar",
1850 srcs: ["foo/bar/MyClass.java"],
1851 sdk_version: "current",
1852 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001853 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001854 }
1855 `,
1856 },
1857 {
1858 name: "Updatable apex with non-stable dep",
1859 expectedError: "cannot depend on \"myjar\"",
1860 bp: `
1861 apex {
1862 name: "myapex",
1863 java_libs: ["myjar"],
1864 key: "myapex.key",
1865 updatable: true,
1866 }
1867 apex_key {
1868 name: "myapex.key",
1869 public_key: "testkey.avbpubkey",
1870 private_key: "testkey.pem",
1871 }
1872 java_library {
1873 name: "myjar",
1874 srcs: ["foo/bar/MyClass.java"],
1875 sdk_version: "core_platform",
1876 apex_available: ["myapex"],
1877 }
1878 `,
1879 },
1880 {
1881 name: "Updatable apex with non-stable transitive dep",
1882 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1883 bp: `
1884 apex {
1885 name: "myapex",
1886 java_libs: ["myjar"],
1887 key: "myapex.key",
1888 updatable: true,
1889 }
1890 apex_key {
1891 name: "myapex.key",
1892 public_key: "testkey.avbpubkey",
1893 private_key: "testkey.pem",
1894 }
1895 java_library {
1896 name: "myjar",
1897 srcs: ["foo/bar/MyClass.java"],
1898 sdk_version: "current",
1899 apex_available: ["myapex"],
1900 static_libs: ["transitive-jar"],
1901 }
1902 java_library {
1903 name: "transitive-jar",
1904 srcs: ["foo/bar/MyClass.java"],
1905 sdk_version: "core_platform",
1906 apex_available: ["myapex"],
1907 }
1908 `,
1909 },
1910 }
1911
1912 for _, test := range testCases {
1913 t.Run(test.name, func(t *testing.T) {
1914 if test.expectedError == "" {
1915 testApex(t, test.bp)
1916 } else {
1917 testApexError(t, test.expectedError, test.bp)
1918 }
1919 })
1920 }
1921}
1922
Jooyung Han749dc692020-04-15 11:03:39 +09001923func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1924 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1925 apex {
1926 name: "myapex",
1927 key: "myapex.key",
1928 native_shared_libs: ["mylib"],
1929 min_sdk_version: "29",
1930 }
1931
1932 apex_key {
1933 name: "myapex.key",
1934 public_key: "testkey.avbpubkey",
1935 private_key: "testkey.pem",
1936 }
1937
1938 cc_library {
1939 name: "mylib",
1940 srcs: ["mylib.cpp"],
1941 shared_libs: ["mylib2"],
1942 system_shared_libs: [],
1943 stl: "none",
1944 apex_available: [
1945 "myapex",
1946 ],
1947 min_sdk_version: "29",
1948 }
1949
1950 // indirect part of the apex
1951 cc_library {
1952 name: "mylib2",
1953 srcs: ["mylib.cpp"],
1954 system_shared_libs: [],
1955 stl: "none",
1956 apex_available: [
1957 "myapex",
1958 ],
1959 min_sdk_version: "30",
1960 }
1961 `)
1962}
1963
1964func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1965 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1966 apex {
1967 name: "myapex",
1968 key: "myapex.key",
1969 apps: ["AppFoo"],
1970 min_sdk_version: "29",
1971 }
1972
1973 apex_key {
1974 name: "myapex.key",
1975 public_key: "testkey.avbpubkey",
1976 private_key: "testkey.pem",
1977 }
1978
1979 android_app {
1980 name: "AppFoo",
1981 srcs: ["foo/bar/MyClass.java"],
1982 sdk_version: "current",
1983 min_sdk_version: "29",
1984 system_modules: "none",
1985 stl: "none",
1986 static_libs: ["bar"],
1987 apex_available: [ "myapex" ],
1988 }
1989
1990 java_library {
1991 name: "bar",
1992 sdk_version: "current",
1993 srcs: ["a.java"],
1994 apex_available: [ "myapex" ],
1995 }
1996 `)
1997}
1998
1999func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2000 ctx, _ := testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 native_shared_libs: ["mylib"],
2005 min_sdk_version: "29",
2006 }
2007
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }
2013
2014 // mylib in myapex will link to mylib2#29
2015 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2016 cc_library {
2017 name: "mylib",
2018 srcs: ["mylib.cpp"],
2019 shared_libs: ["mylib2"],
2020 system_shared_libs: [],
2021 stl: "none",
2022 apex_available: ["myapex", "otherapex"],
2023 min_sdk_version: "29",
2024 }
2025
2026 cc_library {
2027 name: "mylib2",
2028 srcs: ["mylib.cpp"],
2029 system_shared_libs: [],
2030 stl: "none",
2031 apex_available: ["otherapex"],
2032 stubs: { versions: ["29", "30"] },
2033 min_sdk_version: "30",
2034 }
2035
2036 apex {
2037 name: "otherapex",
2038 key: "myapex.key",
2039 native_shared_libs: ["mylib", "mylib2"],
2040 min_sdk_version: "30",
2041 }
2042 `)
2043 expectLink := func(from, from_variant, to, to_variant string) {
2044 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2045 libFlags := ld.Args["libFlags"]
2046 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2047 }
Colin Crossaede88c2020-08-11 12:17:01 -07002048 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2049 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002050}
2051
Jiyong Park7c2ee712018-12-07 00:42:25 +09002052func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002053 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002054 apex {
2055 name: "myapex",
2056 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002057 native_shared_libs: ["mylib"],
2058 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002059 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002060 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002061 }
2062
2063 apex_key {
2064 name: "myapex.key",
2065 public_key: "testkey.avbpubkey",
2066 private_key: "testkey.pem",
2067 }
2068
2069 prebuilt_etc {
2070 name: "myetc",
2071 src: "myprebuilt",
2072 sub_dir: "foo/bar",
2073 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002074
2075 cc_library {
2076 name: "mylib",
2077 srcs: ["mylib.cpp"],
2078 relative_install_path: "foo/bar",
2079 system_shared_libs: [],
2080 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002081 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002082 }
2083
2084 cc_binary {
2085 name: "mybin",
2086 srcs: ["mylib.cpp"],
2087 relative_install_path: "foo/bar",
2088 system_shared_libs: [],
2089 static_executable: true,
2090 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002091 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002092 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002093 `)
2094
Sundong Ahnabb64432019-10-22 13:58:29 +09002095 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002096 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2097
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002098 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002099 ensureListContains(t, dirs, "etc")
2100 ensureListContains(t, dirs, "etc/foo")
2101 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002102 ensureListContains(t, dirs, "lib64")
2103 ensureListContains(t, dirs, "lib64/foo")
2104 ensureListContains(t, dirs, "lib64/foo/bar")
2105 ensureListContains(t, dirs, "lib")
2106 ensureListContains(t, dirs, "lib/foo")
2107 ensureListContains(t, dirs, "lib/foo/bar")
2108
Jiyong Parkbd13e442019-03-15 18:10:35 +09002109 ensureListContains(t, dirs, "bin")
2110 ensureListContains(t, dirs, "bin/foo")
2111 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002112}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002113
Jooyung Han35155c42020-02-06 17:33:20 +09002114func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2115 ctx, _ := testApex(t, `
2116 apex {
2117 name: "myapex",
2118 key: "myapex.key",
2119 multilib: {
2120 both: {
2121 native_shared_libs: ["mylib"],
2122 binaries: ["mybin"],
2123 },
2124 },
2125 compile_multilib: "both",
2126 native_bridge_supported: true,
2127 }
2128
2129 apex_key {
2130 name: "myapex.key",
2131 public_key: "testkey.avbpubkey",
2132 private_key: "testkey.pem",
2133 }
2134
2135 cc_library {
2136 name: "mylib",
2137 relative_install_path: "foo/bar",
2138 system_shared_libs: [],
2139 stl: "none",
2140 apex_available: [ "myapex" ],
2141 native_bridge_supported: true,
2142 }
2143
2144 cc_binary {
2145 name: "mybin",
2146 relative_install_path: "foo/bar",
2147 system_shared_libs: [],
2148 static_executable: true,
2149 stl: "none",
2150 apex_available: [ "myapex" ],
2151 native_bridge_supported: true,
2152 compile_multilib: "both", // default is "first" for binary
2153 multilib: {
2154 lib64: {
2155 suffix: "64",
2156 },
2157 },
2158 }
2159 `, withNativeBridgeEnabled)
2160 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2161 "bin/foo/bar/mybin",
2162 "bin/foo/bar/mybin64",
2163 "bin/arm/foo/bar/mybin",
2164 "bin/arm64/foo/bar/mybin64",
2165 "lib/foo/bar/mylib.so",
2166 "lib/arm/foo/bar/mylib.so",
2167 "lib64/foo/bar/mylib.so",
2168 "lib64/arm64/foo/bar/mylib.so",
2169 })
2170}
2171
Jiyong Parkda6eb592018-12-19 17:12:36 +09002172func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002173 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["mylib"],
2178 use_vendor: true,
2179 }
2180
2181 apex_key {
2182 name: "myapex.key",
2183 public_key: "testkey.avbpubkey",
2184 private_key: "testkey.pem",
2185 }
2186
2187 cc_library {
2188 name: "mylib",
2189 srcs: ["mylib.cpp"],
2190 shared_libs: ["mylib2"],
2191 system_shared_libs: [],
2192 vendor_available: true,
2193 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002194 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002195 }
2196
2197 cc_library {
2198 name: "mylib2",
2199 srcs: ["mylib.cpp"],
2200 system_shared_libs: [],
2201 vendor_available: true,
2202 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002203 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002204 }
Jooyung Handc782442019-11-01 03:14:38 +09002205 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002206 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002207 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002208
2209 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002210 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002211 for _, implicit := range i.Implicits {
2212 inputsList = append(inputsList, implicit.String())
2213 }
2214 }
2215 inputsString := strings.Join(inputsList, " ")
2216
2217 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002218 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2219 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002220
2221 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002222 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2223 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002224}
Jiyong Park16e91a02018-12-20 18:18:08 +09002225
Jooyung Han85d61762020-06-24 23:50:26 +09002226func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002227 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2228 apex {
2229 name: "myapex",
2230 key: "myapex.key",
2231 use_vendor: true,
2232 }
2233 apex_key {
2234 name: "myapex.key",
2235 public_key: "testkey.avbpubkey",
2236 private_key: "testkey.pem",
2237 }
2238 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002239 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002240 })
Colin Cross440e0d02020-06-11 11:32:11 -07002241 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002242 testApex(t, `
2243 apex {
2244 name: "myapex",
2245 key: "myapex.key",
2246 use_vendor: true,
2247 }
2248 apex_key {
2249 name: "myapex.key",
2250 public_key: "testkey.avbpubkey",
2251 private_key: "testkey.pem",
2252 }
2253 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002254 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002255 })
2256}
2257
Jooyung Han5c998b92019-06-27 11:30:33 +09002258func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2259 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2260 apex {
2261 name: "myapex",
2262 key: "myapex.key",
2263 native_shared_libs: ["mylib"],
2264 use_vendor: true,
2265 }
2266
2267 apex_key {
2268 name: "myapex.key",
2269 public_key: "testkey.avbpubkey",
2270 private_key: "testkey.pem",
2271 }
2272
2273 cc_library {
2274 name: "mylib",
2275 srcs: ["mylib.cpp"],
2276 system_shared_libs: [],
2277 stl: "none",
2278 }
2279 `)
2280}
2281
Jooyung Han85d61762020-06-24 23:50:26 +09002282func TestVendorApex(t *testing.T) {
2283 ctx, config := testApex(t, `
2284 apex {
2285 name: "myapex",
2286 key: "myapex.key",
2287 binaries: ["mybin"],
2288 vendor: true,
2289 }
2290 apex_key {
2291 name: "myapex.key",
2292 public_key: "testkey.avbpubkey",
2293 private_key: "testkey.pem",
2294 }
2295 cc_binary {
2296 name: "mybin",
2297 vendor: true,
2298 shared_libs: ["libfoo"],
2299 }
2300 cc_library {
2301 name: "libfoo",
2302 proprietary: true,
2303 }
2304 `)
2305
2306 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2307 "bin/mybin",
2308 "lib64/libfoo.so",
2309 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2310 "lib64/libc++.so",
2311 })
2312
2313 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2314 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2315 name := apexBundle.BaseModuleName()
2316 prefix := "TARGET_"
2317 var builder strings.Builder
2318 data.Custom(&builder, name, prefix, "", data)
2319 androidMk := builder.String()
2320 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002321
2322 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2323 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2324 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002325}
2326
Jooyung Handf78e212020-07-22 15:54:47 +09002327func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2328 ctx, _ := testApex(t, `
2329 apex {
2330 name: "myapex",
2331 key: "myapex.key",
2332 binaries: ["mybin"],
2333 vendor: true,
2334 use_vndk_as_stable: true,
2335 }
2336 apex_key {
2337 name: "myapex.key",
2338 public_key: "testkey.avbpubkey",
2339 private_key: "testkey.pem",
2340 }
2341 cc_binary {
2342 name: "mybin",
2343 vendor: true,
2344 shared_libs: ["libvndk", "libvendor"],
2345 }
2346 cc_library {
2347 name: "libvndk",
2348 vndk: {
2349 enabled: true,
2350 },
2351 vendor_available: true,
2352 }
2353 cc_library {
2354 name: "libvendor",
2355 vendor: true,
2356 }
2357 `)
2358
2359 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2360
Colin Crossaede88c2020-08-11 12:17:01 -07002361 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002362 libs := names(ldRule.Args["libFlags"])
2363 // VNDK libs(libvndk/libc++) as they are
2364 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2365 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2366 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002367 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002368
2369 // VNDK libs are not included when use_vndk_as_stable: true
2370 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2371 "bin/mybin",
2372 "lib64/libvendor.so",
2373 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002374
2375 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2376 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2377 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002378}
2379
Jooyung Han8e5685d2020-09-21 11:02:57 +09002380func TestApex_withPrebuiltFirmware(t *testing.T) {
2381 testCases := []struct {
2382 name string
2383 additionalProp string
2384 }{
2385 {"system apex with prebuilt_firmware", ""},
2386 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2387 }
2388 for _, tc := range testCases {
2389 t.Run(tc.name, func(t *testing.T) {
2390 ctx, _ := testApex(t, `
2391 apex {
2392 name: "myapex",
2393 key: "myapex.key",
2394 prebuilts: ["myfirmware"],
2395 `+tc.additionalProp+`
2396 }
2397 apex_key {
2398 name: "myapex.key",
2399 public_key: "testkey.avbpubkey",
2400 private_key: "testkey.pem",
2401 }
2402 prebuilt_firmware {
2403 name: "myfirmware",
2404 src: "myfirmware.bin",
2405 filename_from_src: true,
2406 `+tc.additionalProp+`
2407 }
2408 `)
2409 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2410 "etc/firmware/myfirmware.bin",
2411 })
2412 })
2413 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002414}
2415
Jooyung Hanefb184e2020-06-25 17:14:25 +09002416func TestAndroidMk_UseVendorRequired(t *testing.T) {
2417 ctx, config := testApex(t, `
2418 apex {
2419 name: "myapex",
2420 key: "myapex.key",
2421 use_vendor: true,
2422 native_shared_libs: ["mylib"],
2423 }
2424
2425 apex_key {
2426 name: "myapex.key",
2427 public_key: "testkey.avbpubkey",
2428 private_key: "testkey.pem",
2429 }
2430
2431 cc_library {
2432 name: "mylib",
2433 vendor_available: true,
2434 apex_available: ["myapex"],
2435 }
2436 `, func(fs map[string][]byte, config android.Config) {
2437 setUseVendorAllowListForTest(config, []string{"myapex"})
2438 })
2439
2440 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2441 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2442 name := apexBundle.BaseModuleName()
2443 prefix := "TARGET_"
2444 var builder strings.Builder
2445 data.Custom(&builder, name, prefix, "", data)
2446 androidMk := builder.String()
2447 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2448}
2449
2450func TestAndroidMk_VendorApexRequired(t *testing.T) {
2451 ctx, config := testApex(t, `
2452 apex {
2453 name: "myapex",
2454 key: "myapex.key",
2455 vendor: true,
2456 native_shared_libs: ["mylib"],
2457 }
2458
2459 apex_key {
2460 name: "myapex.key",
2461 public_key: "testkey.avbpubkey",
2462 private_key: "testkey.pem",
2463 }
2464
2465 cc_library {
2466 name: "mylib",
2467 vendor_available: true,
2468 }
2469 `)
2470
2471 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2472 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2473 name := apexBundle.BaseModuleName()
2474 prefix := "TARGET_"
2475 var builder strings.Builder
2476 data.Custom(&builder, name, prefix, "", data)
2477 androidMk := builder.String()
2478 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2479}
2480
Jooyung Han2ed99d02020-06-24 23:26:26 +09002481func TestAndroidMkWritesCommonProperties(t *testing.T) {
2482 ctx, config := testApex(t, `
2483 apex {
2484 name: "myapex",
2485 key: "myapex.key",
2486 vintf_fragments: ["fragment.xml"],
2487 init_rc: ["init.rc"],
2488 }
2489 apex_key {
2490 name: "myapex.key",
2491 public_key: "testkey.avbpubkey",
2492 private_key: "testkey.pem",
2493 }
2494 cc_binary {
2495 name: "mybin",
2496 }
2497 `)
2498
2499 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2500 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2501 name := apexBundle.BaseModuleName()
2502 prefix := "TARGET_"
2503 var builder strings.Builder
2504 data.Custom(&builder, name, prefix, "", data)
2505 androidMk := builder.String()
2506 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2507 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2508}
2509
Jiyong Park16e91a02018-12-20 18:18:08 +09002510func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002511 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002512 apex {
2513 name: "myapex",
2514 key: "myapex.key",
2515 native_shared_libs: ["mylib"],
2516 }
2517
2518 apex_key {
2519 name: "myapex.key",
2520 public_key: "testkey.avbpubkey",
2521 private_key: "testkey.pem",
2522 }
2523
2524 cc_library {
2525 name: "mylib",
2526 srcs: ["mylib.cpp"],
2527 system_shared_libs: [],
2528 stl: "none",
2529 stubs: {
2530 versions: ["1", "2", "3"],
2531 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002532 apex_available: [
2533 "//apex_available:platform",
2534 "myapex",
2535 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002536 }
2537
2538 cc_binary {
2539 name: "not_in_apex",
2540 srcs: ["mylib.cpp"],
2541 static_libs: ["mylib"],
2542 static_executable: true,
2543 system_shared_libs: [],
2544 stl: "none",
2545 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002546 `)
2547
Colin Cross7113d202019-11-20 16:39:12 -08002548 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002549
2550 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002551 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002552}
Jiyong Park9335a262018-12-24 11:31:58 +09002553
2554func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002555 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002556 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002557 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002558 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002559 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002560 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002561 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002562 }
2563
2564 cc_library {
2565 name: "mylib",
2566 srcs: ["mylib.cpp"],
2567 system_shared_libs: [],
2568 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002569 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002570 }
2571
2572 apex_key {
2573 name: "myapex.key",
2574 public_key: "testkey.avbpubkey",
2575 private_key: "testkey.pem",
2576 }
2577
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002578 android_app_certificate {
2579 name: "myapex.certificate",
2580 certificate: "testkey",
2581 }
2582
2583 android_app_certificate {
2584 name: "myapex.certificate.override",
2585 certificate: "testkey.override",
2586 }
2587
Jiyong Park9335a262018-12-24 11:31:58 +09002588 `)
2589
2590 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002591 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002592
2593 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2594 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2595 "vendor/foo/devkeys/testkey.avbpubkey")
2596 }
2597 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2598 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2599 "vendor/foo/devkeys/testkey.pem")
2600 }
2601
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002602 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002603 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002604 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002605 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002606 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002607 }
2608}
Jiyong Park58e364a2019-01-19 19:24:06 +09002609
Jooyung Hanf121a652019-12-17 14:30:11 +09002610func TestCertificate(t *testing.T) {
2611 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2612 ctx, _ := testApex(t, `
2613 apex {
2614 name: "myapex",
2615 key: "myapex.key",
2616 }
2617 apex_key {
2618 name: "myapex.key",
2619 public_key: "testkey.avbpubkey",
2620 private_key: "testkey.pem",
2621 }`)
2622 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2623 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2624 if actual := rule.Args["certificates"]; actual != expected {
2625 t.Errorf("certificates should be %q, not %q", expected, actual)
2626 }
2627 })
2628 t.Run("override when unspecified", func(t *testing.T) {
2629 ctx, _ := testApex(t, `
2630 apex {
2631 name: "myapex_keytest",
2632 key: "myapex.key",
2633 file_contexts: ":myapex-file_contexts",
2634 }
2635 apex_key {
2636 name: "myapex.key",
2637 public_key: "testkey.avbpubkey",
2638 private_key: "testkey.pem",
2639 }
2640 android_app_certificate {
2641 name: "myapex.certificate.override",
2642 certificate: "testkey.override",
2643 }`)
2644 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2645 expected := "testkey.override.x509.pem testkey.override.pk8"
2646 if actual := rule.Args["certificates"]; actual != expected {
2647 t.Errorf("certificates should be %q, not %q", expected, actual)
2648 }
2649 })
2650 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2651 ctx, _ := testApex(t, `
2652 apex {
2653 name: "myapex",
2654 key: "myapex.key",
2655 certificate: ":myapex.certificate",
2656 }
2657 apex_key {
2658 name: "myapex.key",
2659 public_key: "testkey.avbpubkey",
2660 private_key: "testkey.pem",
2661 }
2662 android_app_certificate {
2663 name: "myapex.certificate",
2664 certificate: "testkey",
2665 }`)
2666 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2667 expected := "testkey.x509.pem testkey.pk8"
2668 if actual := rule.Args["certificates"]; actual != expected {
2669 t.Errorf("certificates should be %q, not %q", expected, actual)
2670 }
2671 })
2672 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2673 ctx, _ := testApex(t, `
2674 apex {
2675 name: "myapex_keytest",
2676 key: "myapex.key",
2677 file_contexts: ":myapex-file_contexts",
2678 certificate: ":myapex.certificate",
2679 }
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
2685 android_app_certificate {
2686 name: "myapex.certificate.override",
2687 certificate: "testkey.override",
2688 }`)
2689 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2690 expected := "testkey.override.x509.pem testkey.override.pk8"
2691 if actual := rule.Args["certificates"]; actual != expected {
2692 t.Errorf("certificates should be %q, not %q", expected, actual)
2693 }
2694 })
2695 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2696 ctx, _ := testApex(t, `
2697 apex {
2698 name: "myapex",
2699 key: "myapex.key",
2700 certificate: "testkey",
2701 }
2702 apex_key {
2703 name: "myapex.key",
2704 public_key: "testkey.avbpubkey",
2705 private_key: "testkey.pem",
2706 }`)
2707 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2708 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2709 if actual := rule.Args["certificates"]; actual != expected {
2710 t.Errorf("certificates should be %q, not %q", expected, actual)
2711 }
2712 })
2713 t.Run("override when specified as <name>", func(t *testing.T) {
2714 ctx, _ := testApex(t, `
2715 apex {
2716 name: "myapex_keytest",
2717 key: "myapex.key",
2718 file_contexts: ":myapex-file_contexts",
2719 certificate: "testkey",
2720 }
2721 apex_key {
2722 name: "myapex.key",
2723 public_key: "testkey.avbpubkey",
2724 private_key: "testkey.pem",
2725 }
2726 android_app_certificate {
2727 name: "myapex.certificate.override",
2728 certificate: "testkey.override",
2729 }`)
2730 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2731 expected := "testkey.override.x509.pem testkey.override.pk8"
2732 if actual := rule.Args["certificates"]; actual != expected {
2733 t.Errorf("certificates should be %q, not %q", expected, actual)
2734 }
2735 })
2736}
2737
Jiyong Park58e364a2019-01-19 19:24:06 +09002738func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002739 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002740 apex {
2741 name: "myapex",
2742 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002743 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002744 }
2745
2746 apex {
2747 name: "otherapex",
2748 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002749 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002750 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002751 }
2752
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758
2759 cc_library {
2760 name: "mylib",
2761 srcs: ["mylib.cpp"],
2762 system_shared_libs: [],
2763 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002764 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002765 "myapex",
2766 "otherapex",
2767 ],
Jooyung Han24282772020-03-21 23:20:55 +09002768 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002769 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002770 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002771 cc_library {
2772 name: "mylib2",
2773 srcs: ["mylib.cpp"],
2774 system_shared_libs: [],
2775 stl: "none",
2776 apex_available: [
2777 "myapex",
2778 "otherapex",
2779 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002780 static_libs: ["mylib3"],
2781 recovery_available: true,
2782 min_sdk_version: "29",
2783 }
2784 cc_library {
2785 name: "mylib3",
2786 srcs: ["mylib.cpp"],
2787 system_shared_libs: [],
2788 stl: "none",
2789 apex_available: [
2790 "myapex",
2791 "otherapex",
2792 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002793 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002794 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002795 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002796 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002797 `)
2798
Jooyung Hanc87a0592020-03-02 17:44:33 +09002799 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002800 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002801 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002802 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002803
Jooyung Hanccce2f22020-03-07 03:45:53 +09002804 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002805 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002806 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002807 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002808 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002809
Jooyung Hanccce2f22020-03-07 03:45:53 +09002810 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002811 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002812 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002813 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002814 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002815
Colin Crossaede88c2020-08-11 12:17:01 -07002816 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2817 // each variant defines additional macros to distinguish which apex variant it is built for
2818
2819 // non-APEX variant does not have __ANDROID_APEX__ defined
2820 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2821 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2822
2823 // APEX variant has __ANDROID_APEX__ defined
2824 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2825 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2826 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2827 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2828
2829 // APEX variant has __ANDROID_APEX__ defined
2830 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2831 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2832 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2833 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2834
2835 // recovery variant does not set __ANDROID_SDK_VERSION__
2836 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2837 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2838 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2839
2840 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2841 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002842
2843 // non-APEX variant does not have __ANDROID_APEX__ defined
2844 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2845 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2846
2847 // APEX variant has __ANDROID_APEX__ defined
2848 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002849 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002850 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002851 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002852
Jooyung Hanc87a0592020-03-02 17:44:33 +09002853 // APEX variant has __ANDROID_APEX__ defined
2854 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002855 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002856 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002857 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002858
2859 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002860 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002861 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2862 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002863}
Jiyong Park7e636d02019-01-28 16:16:54 +09002864
2865func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002866 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002867 apex {
2868 name: "myapex",
2869 key: "myapex.key",
2870 native_shared_libs: ["mylib"],
2871 }
2872
2873 apex_key {
2874 name: "myapex.key",
2875 public_key: "testkey.avbpubkey",
2876 private_key: "testkey.pem",
2877 }
2878
2879 cc_library_headers {
2880 name: "mylib_headers",
2881 export_include_dirs: ["my_include"],
2882 system_shared_libs: [],
2883 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002884 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002885 }
2886
2887 cc_library {
2888 name: "mylib",
2889 srcs: ["mylib.cpp"],
2890 system_shared_libs: [],
2891 stl: "none",
2892 header_libs: ["mylib_headers"],
2893 export_header_lib_headers: ["mylib_headers"],
2894 stubs: {
2895 versions: ["1", "2", "3"],
2896 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002897 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002898 }
2899
2900 cc_library {
2901 name: "otherlib",
2902 srcs: ["mylib.cpp"],
2903 system_shared_libs: [],
2904 stl: "none",
2905 shared_libs: ["mylib"],
2906 }
2907 `)
2908
Colin Cross7113d202019-11-20 16:39:12 -08002909 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002910
2911 // Ensure that the include path of the header lib is exported to 'otherlib'
2912 ensureContains(t, cFlags, "-Imy_include")
2913}
Alex Light9670d332019-01-29 18:07:33 -08002914
Jiyong Park7cd10e32020-01-14 09:22:18 +09002915type fileInApex struct {
2916 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002917 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002918 isLink bool
2919}
2920
Jooyung Hana57af4a2020-01-23 05:36:59 +00002921func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002922 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002923 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002924 copyCmds := apexRule.Args["copy_commands"]
2925 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002926 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002927 for _, cmd := range strings.Split(copyCmds, "&&") {
2928 cmd = strings.TrimSpace(cmd)
2929 if cmd == "" {
2930 continue
2931 }
2932 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002933 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002934 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002935 switch terms[0] {
2936 case "mkdir":
2937 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002938 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002939 t.Fatal("copyCmds contains invalid cp command", cmd)
2940 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002941 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002942 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002943 isLink = false
2944 case "ln":
2945 if len(terms) != 3 && len(terms) != 4 {
2946 // ln LINK TARGET or ln -s LINK TARGET
2947 t.Fatal("copyCmds contains invalid ln command", cmd)
2948 }
2949 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002950 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002951 isLink = true
2952 default:
2953 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2954 }
2955 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002956 index := strings.Index(dst, imageApexDir)
2957 if index == -1 {
2958 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2959 }
2960 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002961 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002962 }
2963 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002964 return ret
2965}
2966
Jooyung Hana57af4a2020-01-23 05:36:59 +00002967func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2968 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002969 var failed bool
2970 var surplus []string
2971 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002972 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002973 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002974 for _, expected := range files {
2975 if matched, _ := path.Match(expected, file.path); matched {
2976 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002977 mactchFound = true
2978 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002979 }
2980 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002981 if !mactchFound {
2982 surplus = append(surplus, file.path)
2983 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002984 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002985
Jooyung Han31c470b2019-10-18 16:26:59 +09002986 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002987 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002988 t.Log("surplus files", surplus)
2989 failed = true
2990 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002991
2992 if len(files) > len(filesMatched) {
2993 var missing []string
2994 for _, expected := range files {
2995 if !filesMatched[expected] {
2996 missing = append(missing, expected)
2997 }
2998 }
2999 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003000 t.Log("missing files", missing)
3001 failed = true
3002 }
3003 if failed {
3004 t.Fail()
3005 }
3006}
3007
Jooyung Han344d5432019-08-23 11:17:39 +09003008func TestVndkApexCurrent(t *testing.T) {
3009 ctx, _ := testApex(t, `
3010 apex_vndk {
3011 name: "myapex",
3012 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003013 }
3014
3015 apex_key {
3016 name: "myapex.key",
3017 public_key: "testkey.avbpubkey",
3018 private_key: "testkey.pem",
3019 }
3020
3021 cc_library {
3022 name: "libvndk",
3023 srcs: ["mylib.cpp"],
3024 vendor_available: true,
3025 vndk: {
3026 enabled: true,
3027 },
3028 system_shared_libs: [],
3029 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003030 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003031 }
3032
3033 cc_library {
3034 name: "libvndksp",
3035 srcs: ["mylib.cpp"],
3036 vendor_available: true,
3037 vndk: {
3038 enabled: true,
3039 support_system_process: true,
3040 },
3041 system_shared_libs: [],
3042 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003043 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003044 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003045 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003046
Jooyung Hana57af4a2020-01-23 05:36:59 +00003047 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003048 "lib/libvndk.so",
3049 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003050 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003051 "lib64/libvndk.so",
3052 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003053 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003054 "etc/llndk.libraries.VER.txt",
3055 "etc/vndkcore.libraries.VER.txt",
3056 "etc/vndksp.libraries.VER.txt",
3057 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003058 })
Jooyung Han344d5432019-08-23 11:17:39 +09003059}
3060
3061func TestVndkApexWithPrebuilt(t *testing.T) {
3062 ctx, _ := testApex(t, `
3063 apex_vndk {
3064 name: "myapex",
3065 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003066 }
3067
3068 apex_key {
3069 name: "myapex.key",
3070 public_key: "testkey.avbpubkey",
3071 private_key: "testkey.pem",
3072 }
3073
3074 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003075 name: "libvndk",
3076 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003077 vendor_available: true,
3078 vndk: {
3079 enabled: true,
3080 },
3081 system_shared_libs: [],
3082 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003083 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003084 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003085
3086 cc_prebuilt_library_shared {
3087 name: "libvndk.arm",
3088 srcs: ["libvndk.arm.so"],
3089 vendor_available: true,
3090 vndk: {
3091 enabled: true,
3092 },
3093 enabled: false,
3094 arch: {
3095 arm: {
3096 enabled: true,
3097 },
3098 },
3099 system_shared_libs: [],
3100 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003101 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003102 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003103 `+vndkLibrariesTxtFiles("current"),
3104 withFiles(map[string][]byte{
3105 "libvndk.so": nil,
3106 "libvndk.arm.so": nil,
3107 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003108
Jooyung Hana57af4a2020-01-23 05:36:59 +00003109 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003110 "lib/libvndk.so",
3111 "lib/libvndk.arm.so",
3112 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003113 "lib/libc++.so",
3114 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003115 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003116 })
Jooyung Han344d5432019-08-23 11:17:39 +09003117}
3118
Jooyung Han39edb6c2019-11-06 16:53:07 +09003119func vndkLibrariesTxtFiles(vers ...string) (result string) {
3120 for _, v := range vers {
3121 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003122 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003123 result += `
3124 vndk_libraries_txt {
3125 name: "` + txt + `.libraries.txt",
3126 }
3127 `
3128 }
3129 } else {
3130 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3131 result += `
3132 prebuilt_etc {
3133 name: "` + txt + `.libraries.` + v + `.txt",
3134 src: "dummy.txt",
3135 }
3136 `
3137 }
3138 }
3139 }
3140 return
3141}
3142
Jooyung Han344d5432019-08-23 11:17:39 +09003143func TestVndkApexVersion(t *testing.T) {
3144 ctx, _ := testApex(t, `
3145 apex_vndk {
3146 name: "myapex_v27",
3147 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003148 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003149 vndk_version: "27",
3150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
Jooyung Han31c470b2019-10-18 16:26:59 +09003158 vndk_prebuilt_shared {
3159 name: "libvndk27",
3160 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003161 vendor_available: true,
3162 vndk: {
3163 enabled: true,
3164 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003165 target_arch: "arm64",
3166 arch: {
3167 arm: {
3168 srcs: ["libvndk27_arm.so"],
3169 },
3170 arm64: {
3171 srcs: ["libvndk27_arm64.so"],
3172 },
3173 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003174 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003175 }
3176
3177 vndk_prebuilt_shared {
3178 name: "libvndk27",
3179 version: "27",
3180 vendor_available: true,
3181 vndk: {
3182 enabled: true,
3183 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003184 target_arch: "x86_64",
3185 arch: {
3186 x86: {
3187 srcs: ["libvndk27_x86.so"],
3188 },
3189 x86_64: {
3190 srcs: ["libvndk27_x86_64.so"],
3191 },
3192 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003193 }
3194 `+vndkLibrariesTxtFiles("27"),
3195 withFiles(map[string][]byte{
3196 "libvndk27_arm.so": nil,
3197 "libvndk27_arm64.so": nil,
3198 "libvndk27_x86.so": nil,
3199 "libvndk27_x86_64.so": nil,
3200 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003201
Jooyung Hana57af4a2020-01-23 05:36:59 +00003202 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003203 "lib/libvndk27_arm.so",
3204 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003205 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003206 })
Jooyung Han344d5432019-08-23 11:17:39 +09003207}
3208
3209func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3210 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3211 apex_vndk {
3212 name: "myapex_v27",
3213 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003214 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003215 vndk_version: "27",
3216 }
3217 apex_vndk {
3218 name: "myapex_v27_other",
3219 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003220 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003221 vndk_version: "27",
3222 }
3223
3224 apex_key {
3225 name: "myapex.key",
3226 public_key: "testkey.avbpubkey",
3227 private_key: "testkey.pem",
3228 }
3229
3230 cc_library {
3231 name: "libvndk",
3232 srcs: ["mylib.cpp"],
3233 vendor_available: true,
3234 vndk: {
3235 enabled: true,
3236 },
3237 system_shared_libs: [],
3238 stl: "none",
3239 }
3240
3241 vndk_prebuilt_shared {
3242 name: "libvndk",
3243 version: "27",
3244 vendor_available: true,
3245 vndk: {
3246 enabled: true,
3247 },
3248 srcs: ["libvndk.so"],
3249 }
3250 `, withFiles(map[string][]byte{
3251 "libvndk.so": nil,
3252 }))
3253}
3254
Jooyung Han90eee022019-10-01 20:02:42 +09003255func TestVndkApexNameRule(t *testing.T) {
3256 ctx, _ := testApex(t, `
3257 apex_vndk {
3258 name: "myapex",
3259 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003260 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003261 }
3262 apex_vndk {
3263 name: "myapex_v28",
3264 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003265 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003266 vndk_version: "28",
3267 }
3268 apex_key {
3269 name: "myapex.key",
3270 public_key: "testkey.avbpubkey",
3271 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003272 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003273
3274 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003275 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003276 actual := proptools.String(bundle.properties.Apex_name)
3277 if !reflect.DeepEqual(actual, expected) {
3278 t.Errorf("Got '%v', expected '%v'", actual, expected)
3279 }
3280 }
3281
3282 assertApexName("com.android.vndk.vVER", "myapex")
3283 assertApexName("com.android.vndk.v28", "myapex_v28")
3284}
3285
Jooyung Han344d5432019-08-23 11:17:39 +09003286func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3287 ctx, _ := testApex(t, `
3288 apex_vndk {
3289 name: "myapex",
3290 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003291 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003292 }
3293
3294 apex_key {
3295 name: "myapex.key",
3296 public_key: "testkey.avbpubkey",
3297 private_key: "testkey.pem",
3298 }
3299
3300 cc_library {
3301 name: "libvndk",
3302 srcs: ["mylib.cpp"],
3303 vendor_available: true,
3304 native_bridge_supported: true,
3305 host_supported: true,
3306 vndk: {
3307 enabled: true,
3308 },
3309 system_shared_libs: [],
3310 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003311 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003312 }
Jooyung Han35155c42020-02-06 17:33:20 +09003313 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003314
Jooyung Hana57af4a2020-01-23 05:36:59 +00003315 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003316 "lib/libvndk.so",
3317 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003318 "lib/libc++.so",
3319 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003320 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003321 })
Jooyung Han344d5432019-08-23 11:17:39 +09003322}
3323
3324func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3325 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3326 apex_vndk {
3327 name: "myapex",
3328 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003329 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003330 native_bridge_supported: true,
3331 }
3332
3333 apex_key {
3334 name: "myapex.key",
3335 public_key: "testkey.avbpubkey",
3336 private_key: "testkey.pem",
3337 }
3338
3339 cc_library {
3340 name: "libvndk",
3341 srcs: ["mylib.cpp"],
3342 vendor_available: true,
3343 native_bridge_supported: true,
3344 host_supported: true,
3345 vndk: {
3346 enabled: true,
3347 },
3348 system_shared_libs: [],
3349 stl: "none",
3350 }
3351 `)
3352}
3353
Jooyung Han31c470b2019-10-18 16:26:59 +09003354func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003355 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003356 apex_vndk {
3357 name: "myapex_v27",
3358 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003359 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003360 vndk_version: "27",
3361 }
3362
3363 apex_key {
3364 name: "myapex.key",
3365 public_key: "testkey.avbpubkey",
3366 private_key: "testkey.pem",
3367 }
3368
3369 vndk_prebuilt_shared {
3370 name: "libvndk27",
3371 version: "27",
3372 target_arch: "arm",
3373 vendor_available: true,
3374 vndk: {
3375 enabled: true,
3376 },
3377 arch: {
3378 arm: {
3379 srcs: ["libvndk27.so"],
3380 }
3381 },
3382 }
3383
3384 vndk_prebuilt_shared {
3385 name: "libvndk27",
3386 version: "27",
3387 target_arch: "arm",
3388 binder32bit: true,
3389 vendor_available: true,
3390 vndk: {
3391 enabled: true,
3392 },
3393 arch: {
3394 arm: {
3395 srcs: ["libvndk27binder32.so"],
3396 }
3397 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003398 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003399 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003400 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003401 withFiles(map[string][]byte{
3402 "libvndk27.so": nil,
3403 "libvndk27binder32.so": nil,
3404 }),
3405 withBinder32bit,
3406 withTargets(map[android.OsType][]android.Target{
3407 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003408 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3409 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003410 },
3411 }),
3412 )
3413
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003415 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003416 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003417 })
3418}
3419
Jooyung Han45a96772020-06-15 14:59:42 +09003420func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3421 ctx, _ := testApex(t, `
3422 apex_vndk {
3423 name: "myapex",
3424 key: "myapex.key",
3425 file_contexts: ":myapex-file_contexts",
3426 }
3427
3428 apex_key {
3429 name: "myapex.key",
3430 public_key: "testkey.avbpubkey",
3431 private_key: "testkey.pem",
3432 }
3433
3434 cc_library {
3435 name: "libz",
3436 vendor_available: true,
3437 vndk: {
3438 enabled: true,
3439 },
3440 stubs: {
3441 symbol_file: "libz.map.txt",
3442 versions: ["30"],
3443 }
3444 }
3445 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3446 "libz.map.txt": nil,
3447 }))
3448
3449 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3450 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3451 ensureListEmpty(t, provideNativeLibs)
3452}
3453
Jooyung Hane1633032019-08-01 17:41:43 +09003454func TestDependenciesInApexManifest(t *testing.T) {
3455 ctx, _ := testApex(t, `
3456 apex {
3457 name: "myapex_nodep",
3458 key: "myapex.key",
3459 native_shared_libs: ["lib_nodep"],
3460 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003461 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003462 }
3463
3464 apex {
3465 name: "myapex_dep",
3466 key: "myapex.key",
3467 native_shared_libs: ["lib_dep"],
3468 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003469 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003470 }
3471
3472 apex {
3473 name: "myapex_provider",
3474 key: "myapex.key",
3475 native_shared_libs: ["libfoo"],
3476 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003477 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003478 }
3479
3480 apex {
3481 name: "myapex_selfcontained",
3482 key: "myapex.key",
3483 native_shared_libs: ["lib_dep", "libfoo"],
3484 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003485 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003486 }
3487
3488 apex_key {
3489 name: "myapex.key",
3490 public_key: "testkey.avbpubkey",
3491 private_key: "testkey.pem",
3492 }
3493
3494 cc_library {
3495 name: "lib_nodep",
3496 srcs: ["mylib.cpp"],
3497 system_shared_libs: [],
3498 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003499 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003500 }
3501
3502 cc_library {
3503 name: "lib_dep",
3504 srcs: ["mylib.cpp"],
3505 shared_libs: ["libfoo"],
3506 system_shared_libs: [],
3507 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003508 apex_available: [
3509 "myapex_dep",
3510 "myapex_provider",
3511 "myapex_selfcontained",
3512 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003513 }
3514
3515 cc_library {
3516 name: "libfoo",
3517 srcs: ["mytest.cpp"],
3518 stubs: {
3519 versions: ["1"],
3520 },
3521 system_shared_libs: [],
3522 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003523 apex_available: [
3524 "myapex_provider",
3525 "myapex_selfcontained",
3526 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003527 }
3528 `)
3529
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003530 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003531 var provideNativeLibs, requireNativeLibs []string
3532
Sundong Ahnabb64432019-10-22 13:58:29 +09003533 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003534 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3535 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003536 ensureListEmpty(t, provideNativeLibs)
3537 ensureListEmpty(t, requireNativeLibs)
3538
Sundong Ahnabb64432019-10-22 13:58:29 +09003539 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003540 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3541 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003542 ensureListEmpty(t, provideNativeLibs)
3543 ensureListContains(t, requireNativeLibs, "libfoo.so")
3544
Sundong Ahnabb64432019-10-22 13:58:29 +09003545 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003546 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3547 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003548 ensureListContains(t, provideNativeLibs, "libfoo.so")
3549 ensureListEmpty(t, requireNativeLibs)
3550
Sundong Ahnabb64432019-10-22 13:58:29 +09003551 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003552 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3553 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003554 ensureListContains(t, provideNativeLibs, "libfoo.so")
3555 ensureListEmpty(t, requireNativeLibs)
3556}
3557
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003558func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003559 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003560 apex {
3561 name: "myapex",
3562 key: "myapex.key",
3563 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003564 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003565 }
3566
3567 apex_key {
3568 name: "myapex.key",
3569 public_key: "testkey.avbpubkey",
3570 private_key: "testkey.pem",
3571 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003572
3573 cc_library {
3574 name: "mylib",
3575 srcs: ["mylib.cpp"],
3576 system_shared_libs: [],
3577 stl: "none",
3578 apex_available: [
3579 "//apex_available:platform",
3580 "myapex",
3581 ],
3582 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003583 `)
3584
Sundong Ahnabb64432019-10-22 13:58:29 +09003585 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003586 apexManifestRule := module.Rule("apexManifestRule")
3587 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3588 apexRule := module.Rule("apexRule")
3589 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003590
3591 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3592 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3593 name := apexBundle.BaseModuleName()
3594 prefix := "TARGET_"
3595 var builder strings.Builder
3596 data.Custom(&builder, name, prefix, "", data)
3597 androidMk := builder.String()
3598 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3599 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003600}
3601
Alex Light0851b882019-02-07 13:20:53 -08003602func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003603 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003604 apex {
3605 name: "myapex",
3606 key: "myapex.key",
3607 native_shared_libs: ["mylib_common"],
3608 }
3609
3610 apex_key {
3611 name: "myapex.key",
3612 public_key: "testkey.avbpubkey",
3613 private_key: "testkey.pem",
3614 }
3615
3616 cc_library {
3617 name: "mylib_common",
3618 srcs: ["mylib.cpp"],
3619 system_shared_libs: [],
3620 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003621 apex_available: [
3622 "//apex_available:platform",
3623 "myapex",
3624 ],
Alex Light0851b882019-02-07 13:20:53 -08003625 }
3626 `)
3627
Sundong Ahnabb64432019-10-22 13:58:29 +09003628 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003629 apexRule := module.Rule("apexRule")
3630 copyCmds := apexRule.Args["copy_commands"]
3631
3632 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3633 t.Log("Apex was a test apex!")
3634 t.Fail()
3635 }
3636 // Ensure that main rule creates an output
3637 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3638
3639 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003640 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003641
3642 // Ensure that both direct and indirect deps are copied into apex
3643 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3644
Colin Cross7113d202019-11-20 16:39:12 -08003645 // Ensure that the platform variant ends with _shared
3646 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003647
Colin Cross56a83212020-09-15 18:30:11 -07003648 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003649 t.Log("Found mylib_common not in any apex!")
3650 t.Fail()
3651 }
3652}
3653
3654func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003655 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003656 apex_test {
3657 name: "myapex",
3658 key: "myapex.key",
3659 native_shared_libs: ["mylib_common_test"],
3660 }
3661
3662 apex_key {
3663 name: "myapex.key",
3664 public_key: "testkey.avbpubkey",
3665 private_key: "testkey.pem",
3666 }
3667
3668 cc_library {
3669 name: "mylib_common_test",
3670 srcs: ["mylib.cpp"],
3671 system_shared_libs: [],
3672 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003673 // TODO: remove //apex_available:platform
3674 apex_available: [
3675 "//apex_available:platform",
3676 "myapex",
3677 ],
Alex Light0851b882019-02-07 13:20:53 -08003678 }
3679 `)
3680
Sundong Ahnabb64432019-10-22 13:58:29 +09003681 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003682 apexRule := module.Rule("apexRule")
3683 copyCmds := apexRule.Args["copy_commands"]
3684
3685 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3686 t.Log("Apex was not a test apex!")
3687 t.Fail()
3688 }
3689 // Ensure that main rule creates an output
3690 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3691
3692 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003693 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003694
3695 // Ensure that both direct and indirect deps are copied into apex
3696 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3697
Colin Cross7113d202019-11-20 16:39:12 -08003698 // Ensure that the platform variant ends with _shared
3699 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003700}
3701
Alex Light9670d332019-01-29 18:07:33 -08003702func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003703 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003704 apex {
3705 name: "myapex",
3706 key: "myapex.key",
3707 multilib: {
3708 first: {
3709 native_shared_libs: ["mylib_common"],
3710 }
3711 },
3712 target: {
3713 android: {
3714 multilib: {
3715 first: {
3716 native_shared_libs: ["mylib"],
3717 }
3718 }
3719 },
3720 host: {
3721 multilib: {
3722 first: {
3723 native_shared_libs: ["mylib2"],
3724 }
3725 }
3726 }
3727 }
3728 }
3729
3730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
3735
3736 cc_library {
3737 name: "mylib",
3738 srcs: ["mylib.cpp"],
3739 system_shared_libs: [],
3740 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003741 // TODO: remove //apex_available:platform
3742 apex_available: [
3743 "//apex_available:platform",
3744 "myapex",
3745 ],
Alex Light9670d332019-01-29 18:07:33 -08003746 }
3747
3748 cc_library {
3749 name: "mylib_common",
3750 srcs: ["mylib.cpp"],
3751 system_shared_libs: [],
3752 stl: "none",
3753 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003754 // TODO: remove //apex_available:platform
3755 apex_available: [
3756 "//apex_available:platform",
3757 "myapex",
3758 ],
Alex Light9670d332019-01-29 18:07:33 -08003759 }
3760
3761 cc_library {
3762 name: "mylib2",
3763 srcs: ["mylib.cpp"],
3764 system_shared_libs: [],
3765 stl: "none",
3766 compile_multilib: "first",
3767 }
3768 `)
3769
Sundong Ahnabb64432019-10-22 13:58:29 +09003770 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003771 copyCmds := apexRule.Args["copy_commands"]
3772
3773 // Ensure that main rule creates an output
3774 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3775
3776 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003777 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3778 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3779 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003780
3781 // Ensure that both direct and indirect deps are copied into apex
3782 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3783 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3784 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3785
Colin Cross7113d202019-11-20 16:39:12 -08003786 // Ensure that the platform variant ends with _shared
3787 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3788 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3789 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003790}
Jiyong Park04480cf2019-02-06 00:16:29 +09003791
3792func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003793 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003794 apex {
3795 name: "myapex",
3796 key: "myapex.key",
3797 binaries: ["myscript"],
3798 }
3799
3800 apex_key {
3801 name: "myapex.key",
3802 public_key: "testkey.avbpubkey",
3803 private_key: "testkey.pem",
3804 }
3805
3806 sh_binary {
3807 name: "myscript",
3808 src: "mylib.cpp",
3809 filename: "myscript.sh",
3810 sub_dir: "script",
3811 }
3812 `)
3813
Sundong Ahnabb64432019-10-22 13:58:29 +09003814 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003815 copyCmds := apexRule.Args["copy_commands"]
3816
3817 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3818}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003819
Jooyung Han91df2082019-11-20 01:49:42 +09003820func TestApexInVariousPartition(t *testing.T) {
3821 testcases := []struct {
3822 propName, parition, flattenedPartition string
3823 }{
3824 {"", "system", "system_ext"},
3825 {"product_specific: true", "product", "product"},
3826 {"soc_specific: true", "vendor", "vendor"},
3827 {"proprietary: true", "vendor", "vendor"},
3828 {"vendor: true", "vendor", "vendor"},
3829 {"system_ext_specific: true", "system_ext", "system_ext"},
3830 }
3831 for _, tc := range testcases {
3832 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3833 ctx, _ := testApex(t, `
3834 apex {
3835 name: "myapex",
3836 key: "myapex.key",
3837 `+tc.propName+`
3838 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003839
Jooyung Han91df2082019-11-20 01:49:42 +09003840 apex_key {
3841 name: "myapex.key",
3842 public_key: "testkey.avbpubkey",
3843 private_key: "testkey.pem",
3844 }
3845 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003846
Jooyung Han91df2082019-11-20 01:49:42 +09003847 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3848 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3849 actual := apex.installDir.String()
3850 if actual != expected {
3851 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3852 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003853
Jooyung Han91df2082019-11-20 01:49:42 +09003854 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3855 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3856 actual = flattened.installDir.String()
3857 if actual != expected {
3858 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3859 }
3860 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003861 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003862}
Jiyong Park67882562019-03-21 01:11:21 +09003863
Jooyung Han580eb4f2020-06-24 19:33:06 +09003864func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003865 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003866 apex {
3867 name: "myapex",
3868 key: "myapex.key",
3869 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003870
Jooyung Han580eb4f2020-06-24 19:33:06 +09003871 apex_key {
3872 name: "myapex.key",
3873 public_key: "testkey.avbpubkey",
3874 private_key: "testkey.pem",
3875 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003876 `)
3877 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003878 rule := module.Output("file_contexts")
3879 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3880}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003881
Jooyung Han580eb4f2020-06-24 19:33:06 +09003882func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003883 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003884 apex {
3885 name: "myapex",
3886 key: "myapex.key",
3887 file_contexts: "my_own_file_contexts",
3888 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003889
Jooyung Han580eb4f2020-06-24 19:33:06 +09003890 apex_key {
3891 name: "myapex.key",
3892 public_key: "testkey.avbpubkey",
3893 private_key: "testkey.pem",
3894 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003895 `, withFiles(map[string][]byte{
3896 "my_own_file_contexts": nil,
3897 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003898}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003899
Jooyung Han580eb4f2020-06-24 19:33:06 +09003900func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003901 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003902 apex {
3903 name: "myapex",
3904 key: "myapex.key",
3905 product_specific: true,
3906 file_contexts: "product_specific_file_contexts",
3907 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003908
Jooyung Han580eb4f2020-06-24 19:33:06 +09003909 apex_key {
3910 name: "myapex.key",
3911 public_key: "testkey.avbpubkey",
3912 private_key: "testkey.pem",
3913 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003914 `)
3915
Jooyung Han580eb4f2020-06-24 19:33:06 +09003916 ctx, _ := testApex(t, `
3917 apex {
3918 name: "myapex",
3919 key: "myapex.key",
3920 product_specific: true,
3921 file_contexts: "product_specific_file_contexts",
3922 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003923
Jooyung Han580eb4f2020-06-24 19:33:06 +09003924 apex_key {
3925 name: "myapex.key",
3926 public_key: "testkey.avbpubkey",
3927 private_key: "testkey.pem",
3928 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003929 `, withFiles(map[string][]byte{
3930 "product_specific_file_contexts": nil,
3931 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003932 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3933 rule := module.Output("file_contexts")
3934 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3935}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003936
Jooyung Han580eb4f2020-06-24 19:33:06 +09003937func TestFileContexts_SetViaFileGroup(t *testing.T) {
3938 ctx, _ := testApex(t, `
3939 apex {
3940 name: "myapex",
3941 key: "myapex.key",
3942 product_specific: true,
3943 file_contexts: ":my-file-contexts",
3944 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003945
Jooyung Han580eb4f2020-06-24 19:33:06 +09003946 apex_key {
3947 name: "myapex.key",
3948 public_key: "testkey.avbpubkey",
3949 private_key: "testkey.pem",
3950 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003951
Jooyung Han580eb4f2020-06-24 19:33:06 +09003952 filegroup {
3953 name: "my-file-contexts",
3954 srcs: ["product_specific_file_contexts"],
3955 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003956 `, withFiles(map[string][]byte{
3957 "product_specific_file_contexts": nil,
3958 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003959 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3960 rule := module.Output("file_contexts")
3961 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003962}
3963
Jiyong Park67882562019-03-21 01:11:21 +09003964func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003965 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003966 apex_key {
3967 name: "myapex.key",
3968 public_key: ":my.avbpubkey",
3969 private_key: ":my.pem",
3970 product_specific: true,
3971 }
3972
3973 filegroup {
3974 name: "my.avbpubkey",
3975 srcs: ["testkey2.avbpubkey"],
3976 }
3977
3978 filegroup {
3979 name: "my.pem",
3980 srcs: ["testkey2.pem"],
3981 }
3982 `)
3983
3984 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3985 expected_pubkey := "testkey2.avbpubkey"
3986 actual_pubkey := apex_key.public_key_file.String()
3987 if actual_pubkey != expected_pubkey {
3988 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3989 }
3990 expected_privkey := "testkey2.pem"
3991 actual_privkey := apex_key.private_key_file.String()
3992 if actual_privkey != expected_privkey {
3993 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3994 }
3995}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003996
3997func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003998 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003999 prebuilt_apex {
4000 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004001 arch: {
4002 arm64: {
4003 src: "myapex-arm64.apex",
4004 },
4005 arm: {
4006 src: "myapex-arm.apex",
4007 },
4008 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004009 }
4010 `)
4011
4012 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4013
Jiyong Parkc95714e2019-03-29 14:23:10 +09004014 expectedInput := "myapex-arm64.apex"
4015 if prebuilt.inputApex.String() != expectedInput {
4016 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4017 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004018}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004019
4020func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004021 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004022 prebuilt_apex {
4023 name: "myapex",
4024 src: "myapex-arm.apex",
4025 filename: "notmyapex.apex",
4026 }
4027 `)
4028
4029 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4030
4031 expected := "notmyapex.apex"
4032 if p.installFilename != expected {
4033 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4034 }
4035}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004036
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004037func TestPrebuiltOverrides(t *testing.T) {
4038 ctx, config := testApex(t, `
4039 prebuilt_apex {
4040 name: "myapex.prebuilt",
4041 src: "myapex-arm.apex",
4042 overrides: [
4043 "myapex",
4044 ],
4045 }
4046 `)
4047
4048 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4049
4050 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004051 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004052 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004053 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004054 }
4055}
4056
Roland Levillain630846d2019-06-26 12:48:34 +01004057func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004058 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004059 apex_test {
4060 name: "myapex",
4061 key: "myapex.key",
4062 tests: [
4063 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004064 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004065 ],
4066 }
4067
4068 apex_key {
4069 name: "myapex.key",
4070 public_key: "testkey.avbpubkey",
4071 private_key: "testkey.pem",
4072 }
4073
Liz Kammer1c14a212020-05-12 15:26:55 -07004074 filegroup {
4075 name: "fg",
4076 srcs: [
4077 "baz",
4078 "bar/baz"
4079 ],
4080 }
4081
Roland Levillain630846d2019-06-26 12:48:34 +01004082 cc_test {
4083 name: "mytest",
4084 gtest: false,
4085 srcs: ["mytest.cpp"],
4086 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004087 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004088 system_shared_libs: [],
4089 static_executable: true,
4090 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004091 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004092 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004093
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004094 cc_library {
4095 name: "mylib",
4096 srcs: ["mylib.cpp"],
4097 system_shared_libs: [],
4098 stl: "none",
4099 }
4100
Liz Kammer5bd365f2020-05-27 15:15:11 -07004101 filegroup {
4102 name: "fg2",
4103 srcs: [
4104 "testdata/baz"
4105 ],
4106 }
4107
Roland Levillain9b5fde92019-06-28 15:41:19 +01004108 cc_test {
4109 name: "mytests",
4110 gtest: false,
4111 srcs: [
4112 "mytest1.cpp",
4113 "mytest2.cpp",
4114 "mytest3.cpp",
4115 ],
4116 test_per_src: true,
4117 relative_install_path: "test",
4118 system_shared_libs: [],
4119 static_executable: true,
4120 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004121 data: [
4122 ":fg",
4123 ":fg2",
4124 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004125 }
Roland Levillain630846d2019-06-26 12:48:34 +01004126 `)
4127
Sundong Ahnabb64432019-10-22 13:58:29 +09004128 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004129 copyCmds := apexRule.Args["copy_commands"]
4130
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004131 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004132 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004133 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004134
Liz Kammer1c14a212020-05-12 15:26:55 -07004135 //Ensure that test data are copied into apex.
4136 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4137 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4138
Roland Levillain9b5fde92019-06-28 15:41:19 +01004139 // Ensure that test deps built with `test_per_src` are copied into apex.
4140 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4141 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4142 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004143
4144 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004145 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4146 data := android.AndroidMkDataForTest(t, config, "", bundle)
4147 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004148 prefix := "TARGET_"
4149 var builder strings.Builder
4150 data.Custom(&builder, name, prefix, "", data)
4151 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004152 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4153 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4154 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4155 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004156 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004157 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004158 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004159
4160 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4161 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4162 data.Custom(&builder, name, prefix, "", data)
4163 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004164 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4165 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004166}
4167
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004168func TestInstallExtraFlattenedApexes(t *testing.T) {
4169 ctx, config := testApex(t, `
4170 apex {
4171 name: "myapex",
4172 key: "myapex.key",
4173 }
4174 apex_key {
4175 name: "myapex.key",
4176 public_key: "testkey.avbpubkey",
4177 private_key: "testkey.pem",
4178 }
4179 `, func(fs map[string][]byte, config android.Config) {
4180 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4181 })
4182 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004183 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004184 mk := android.AndroidMkDataForTest(t, config, "", ab)
4185 var builder strings.Builder
4186 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4187 androidMk := builder.String()
4188 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4189}
4190
Jooyung Han5c998b92019-06-27 11:30:33 +09004191func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004192 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004193 apex {
4194 name: "myapex",
4195 key: "myapex.key",
4196 native_shared_libs: ["mylib"],
4197 uses: ["commonapex"],
4198 }
4199
4200 apex {
4201 name: "commonapex",
4202 key: "myapex.key",
4203 native_shared_libs: ["libcommon"],
4204 provide_cpp_shared_libs: true,
4205 }
4206
4207 apex_key {
4208 name: "myapex.key",
4209 public_key: "testkey.avbpubkey",
4210 private_key: "testkey.pem",
4211 }
4212
4213 cc_library {
4214 name: "mylib",
4215 srcs: ["mylib.cpp"],
4216 shared_libs: ["libcommon"],
4217 system_shared_libs: [],
4218 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004219 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004220 }
4221
4222 cc_library {
4223 name: "libcommon",
4224 srcs: ["mylib_common.cpp"],
4225 system_shared_libs: [],
4226 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004227 // TODO: remove //apex_available:platform
4228 apex_available: [
4229 "//apex_available:platform",
4230 "commonapex",
4231 "myapex",
4232 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004233 }
4234 `)
4235
Sundong Ahnabb64432019-10-22 13:58:29 +09004236 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004237 apexRule1 := module1.Rule("apexRule")
4238 copyCmds1 := apexRule1.Args["copy_commands"]
4239
Sundong Ahnabb64432019-10-22 13:58:29 +09004240 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004241 apexRule2 := module2.Rule("apexRule")
4242 copyCmds2 := apexRule2.Args["copy_commands"]
4243
Colin Crossaede88c2020-08-11 12:17:01 -07004244 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4245 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004246 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4247 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4248 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4249}
4250
4251func TestApexUsesFailsIfNotProvided(t *testing.T) {
4252 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4253 apex {
4254 name: "myapex",
4255 key: "myapex.key",
4256 uses: ["commonapex"],
4257 }
4258
4259 apex {
4260 name: "commonapex",
4261 key: "myapex.key",
4262 }
4263
4264 apex_key {
4265 name: "myapex.key",
4266 public_key: "testkey.avbpubkey",
4267 private_key: "testkey.pem",
4268 }
4269 `)
4270 testApexError(t, `uses: "commonapex" is not a provider`, `
4271 apex {
4272 name: "myapex",
4273 key: "myapex.key",
4274 uses: ["commonapex"],
4275 }
4276
4277 cc_library {
4278 name: "commonapex",
4279 system_shared_libs: [],
4280 stl: "none",
4281 }
4282
4283 apex_key {
4284 name: "myapex.key",
4285 public_key: "testkey.avbpubkey",
4286 private_key: "testkey.pem",
4287 }
4288 `)
4289}
4290
4291func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4292 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4293 apex {
4294 name: "myapex",
4295 key: "myapex.key",
4296 use_vendor: true,
4297 uses: ["commonapex"],
4298 }
4299
4300 apex {
4301 name: "commonapex",
4302 key: "myapex.key",
4303 provide_cpp_shared_libs: true,
4304 }
4305
4306 apex_key {
4307 name: "myapex.key",
4308 public_key: "testkey.avbpubkey",
4309 private_key: "testkey.pem",
4310 }
Jooyung Handc782442019-11-01 03:14:38 +09004311 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004312 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004313 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004314}
4315
Jooyung Hand48f3c32019-08-23 11:18:57 +09004316func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4317 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4318 apex {
4319 name: "myapex",
4320 key: "myapex.key",
4321 native_shared_libs: ["libfoo"],
4322 }
4323
4324 apex_key {
4325 name: "myapex.key",
4326 public_key: "testkey.avbpubkey",
4327 private_key: "testkey.pem",
4328 }
4329
4330 cc_library {
4331 name: "libfoo",
4332 stl: "none",
4333 system_shared_libs: [],
4334 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004335 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004336 }
4337 `)
4338 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4339 apex {
4340 name: "myapex",
4341 key: "myapex.key",
4342 java_libs: ["myjar"],
4343 }
4344
4345 apex_key {
4346 name: "myapex.key",
4347 public_key: "testkey.avbpubkey",
4348 private_key: "testkey.pem",
4349 }
4350
4351 java_library {
4352 name: "myjar",
4353 srcs: ["foo/bar/MyClass.java"],
4354 sdk_version: "none",
4355 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004356 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004357 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004358 }
4359 `)
4360}
4361
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004362func TestApexWithApps(t *testing.T) {
4363 ctx, _ := testApex(t, `
4364 apex {
4365 name: "myapex",
4366 key: "myapex.key",
4367 apps: [
4368 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004369 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004370 ],
4371 }
4372
4373 apex_key {
4374 name: "myapex.key",
4375 public_key: "testkey.avbpubkey",
4376 private_key: "testkey.pem",
4377 }
4378
4379 android_app {
4380 name: "AppFoo",
4381 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004382 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004383 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004384 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004385 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004386 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004387 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004388
4389 android_app {
4390 name: "AppFooPriv",
4391 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004392 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004393 system_modules: "none",
4394 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004395 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004396 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004397 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004398
4399 cc_library_shared {
4400 name: "libjni",
4401 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004402 shared_libs: ["libfoo"],
4403 stl: "none",
4404 system_shared_libs: [],
4405 apex_available: [ "myapex" ],
4406 sdk_version: "current",
4407 }
4408
4409 cc_library_shared {
4410 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004411 stl: "none",
4412 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004413 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004414 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004415 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004416 `)
4417
Sundong Ahnabb64432019-10-22 13:58:29 +09004418 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004419 apexRule := module.Rule("apexRule")
4420 copyCmds := apexRule.Args["copy_commands"]
4421
4422 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004423 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004424
Colin Crossaede88c2020-08-11 12:17:01 -07004425 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004426 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004427 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004428 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004429 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004430 // JNI libraries including transitive deps are
4431 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004432 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004433 // ... embedded inside APK (jnilibs.zip)
4434 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4435 // ... and not directly inside the APEX
4436 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4437 }
Dario Frenicde2a032019-10-27 00:29:22 +01004438}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004439
Dario Frenicde2a032019-10-27 00:29:22 +01004440func TestApexWithAppImports(t *testing.T) {
4441 ctx, _ := testApex(t, `
4442 apex {
4443 name: "myapex",
4444 key: "myapex.key",
4445 apps: [
4446 "AppFooPrebuilt",
4447 "AppFooPrivPrebuilt",
4448 ],
4449 }
4450
4451 apex_key {
4452 name: "myapex.key",
4453 public_key: "testkey.avbpubkey",
4454 private_key: "testkey.pem",
4455 }
4456
4457 android_app_import {
4458 name: "AppFooPrebuilt",
4459 apk: "PrebuiltAppFoo.apk",
4460 presigned: true,
4461 dex_preopt: {
4462 enabled: false,
4463 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004464 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004465 }
4466
4467 android_app_import {
4468 name: "AppFooPrivPrebuilt",
4469 apk: "PrebuiltAppFooPriv.apk",
4470 privileged: true,
4471 presigned: true,
4472 dex_preopt: {
4473 enabled: false,
4474 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004475 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004476 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004477 }
4478 `)
4479
Sundong Ahnabb64432019-10-22 13:58:29 +09004480 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004481 apexRule := module.Rule("apexRule")
4482 copyCmds := apexRule.Args["copy_commands"]
4483
4484 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004485 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4486}
4487
4488func TestApexWithAppImportsPrefer(t *testing.T) {
4489 ctx, _ := testApex(t, `
4490 apex {
4491 name: "myapex",
4492 key: "myapex.key",
4493 apps: [
4494 "AppFoo",
4495 ],
4496 }
4497
4498 apex_key {
4499 name: "myapex.key",
4500 public_key: "testkey.avbpubkey",
4501 private_key: "testkey.pem",
4502 }
4503
4504 android_app {
4505 name: "AppFoo",
4506 srcs: ["foo/bar/MyClass.java"],
4507 sdk_version: "none",
4508 system_modules: "none",
4509 apex_available: [ "myapex" ],
4510 }
4511
4512 android_app_import {
4513 name: "AppFoo",
4514 apk: "AppFooPrebuilt.apk",
4515 filename: "AppFooPrebuilt.apk",
4516 presigned: true,
4517 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004518 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004519 }
4520 `, withFiles(map[string][]byte{
4521 "AppFooPrebuilt.apk": nil,
4522 }))
4523
4524 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4525 "app/AppFoo/AppFooPrebuilt.apk",
4526 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004527}
4528
Dario Freni6f3937c2019-12-20 22:58:03 +00004529func TestApexWithTestHelperApp(t *testing.T) {
4530 ctx, _ := testApex(t, `
4531 apex {
4532 name: "myapex",
4533 key: "myapex.key",
4534 apps: [
4535 "TesterHelpAppFoo",
4536 ],
4537 }
4538
4539 apex_key {
4540 name: "myapex.key",
4541 public_key: "testkey.avbpubkey",
4542 private_key: "testkey.pem",
4543 }
4544
4545 android_test_helper_app {
4546 name: "TesterHelpAppFoo",
4547 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004548 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004549 }
4550
4551 `)
4552
4553 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4554 apexRule := module.Rule("apexRule")
4555 copyCmds := apexRule.Args["copy_commands"]
4556
4557 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4558}
4559
Jooyung Han18020ea2019-11-13 10:50:48 +09004560func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4561 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004562 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004563 apex {
4564 name: "myapex",
4565 key: "myapex.key",
4566 native_shared_libs: ["libfoo"],
4567 }
4568
4569 apex_key {
4570 name: "myapex.key",
4571 public_key: "testkey.avbpubkey",
4572 private_key: "testkey.pem",
4573 }
4574
4575 apex {
4576 name: "otherapex",
4577 key: "myapex.key",
4578 native_shared_libs: ["libfoo"],
4579 }
4580
4581 cc_defaults {
4582 name: "libfoo-defaults",
4583 apex_available: ["otherapex"],
4584 }
4585
4586 cc_library {
4587 name: "libfoo",
4588 defaults: ["libfoo-defaults"],
4589 stl: "none",
4590 system_shared_libs: [],
4591 }`)
4592}
4593
Paul Duffine52e66f2020-03-30 17:54:29 +01004594func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004595 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004596 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004597 apex {
4598 name: "myapex",
4599 key: "myapex.key",
4600 native_shared_libs: ["libfoo"],
4601 }
4602
4603 apex_key {
4604 name: "myapex.key",
4605 public_key: "testkey.avbpubkey",
4606 private_key: "testkey.pem",
4607 }
4608
4609 apex {
4610 name: "otherapex",
4611 key: "otherapex.key",
4612 native_shared_libs: ["libfoo"],
4613 }
4614
4615 apex_key {
4616 name: "otherapex.key",
4617 public_key: "testkey.avbpubkey",
4618 private_key: "testkey.pem",
4619 }
4620
4621 cc_library {
4622 name: "libfoo",
4623 stl: "none",
4624 system_shared_libs: [],
4625 apex_available: ["otherapex"],
4626 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004627}
Jiyong Park127b40b2019-09-30 16:04:35 +09004628
Paul Duffine52e66f2020-03-30 17:54:29 +01004629func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004630 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004631 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004632.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004633.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004634.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004635.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004636.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004637.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004638 apex {
4639 name: "myapex",
4640 key: "myapex.key",
4641 native_shared_libs: ["libfoo"],
4642 }
4643
4644 apex_key {
4645 name: "myapex.key",
4646 public_key: "testkey.avbpubkey",
4647 private_key: "testkey.pem",
4648 }
4649
Jiyong Park127b40b2019-09-30 16:04:35 +09004650 cc_library {
4651 name: "libfoo",
4652 stl: "none",
4653 shared_libs: ["libbar"],
4654 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004655 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004656 }
4657
4658 cc_library {
4659 name: "libbar",
4660 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004661 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004662 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004663 apex_available: ["myapex"],
4664 }
4665
4666 cc_library {
4667 name: "libbaz",
4668 stl: "none",
4669 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004670 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004671}
Jiyong Park127b40b2019-09-30 16:04:35 +09004672
Paul Duffine52e66f2020-03-30 17:54:29 +01004673func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004674 testApexError(t, "\"otherapex\" is not a valid module name", `
4675 apex {
4676 name: "myapex",
4677 key: "myapex.key",
4678 native_shared_libs: ["libfoo"],
4679 }
4680
4681 apex_key {
4682 name: "myapex.key",
4683 public_key: "testkey.avbpubkey",
4684 private_key: "testkey.pem",
4685 }
4686
4687 cc_library {
4688 name: "libfoo",
4689 stl: "none",
4690 system_shared_libs: [],
4691 apex_available: ["otherapex"],
4692 }`)
4693
Paul Duffine52e66f2020-03-30 17:54:29 +01004694 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004695 apex {
4696 name: "myapex",
4697 key: "myapex.key",
4698 native_shared_libs: ["libfoo", "libbar"],
4699 }
4700
4701 apex_key {
4702 name: "myapex.key",
4703 public_key: "testkey.avbpubkey",
4704 private_key: "testkey.pem",
4705 }
4706
4707 cc_library {
4708 name: "libfoo",
4709 stl: "none",
4710 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004711 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004712 apex_available: ["myapex"],
4713 }
4714
4715 cc_library {
4716 name: "libbar",
4717 stl: "none",
4718 system_shared_libs: [],
4719 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004720 }
4721
4722 cc_library {
4723 name: "libbaz",
4724 stl: "none",
4725 system_shared_libs: [],
4726 stubs: {
4727 versions: ["10", "20", "30"],
4728 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004729 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004730}
Jiyong Park127b40b2019-09-30 16:04:35 +09004731
Jiyong Park89e850a2020-04-07 16:37:39 +09004732func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004733 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004734 apex {
4735 name: "myapex",
4736 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004737 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004738 }
4739
4740 apex_key {
4741 name: "myapex.key",
4742 public_key: "testkey.avbpubkey",
4743 private_key: "testkey.pem",
4744 }
4745
4746 cc_library {
4747 name: "libfoo",
4748 stl: "none",
4749 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004750 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004751 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004752 }
4753
4754 cc_library {
4755 name: "libfoo2",
4756 stl: "none",
4757 system_shared_libs: [],
4758 shared_libs: ["libbaz"],
4759 apex_available: ["//apex_available:platform"],
4760 }
4761
4762 cc_library {
4763 name: "libbar",
4764 stl: "none",
4765 system_shared_libs: [],
4766 apex_available: ["myapex"],
4767 }
4768
4769 cc_library {
4770 name: "libbaz",
4771 stl: "none",
4772 system_shared_libs: [],
4773 apex_available: ["myapex"],
4774 stubs: {
4775 versions: ["1"],
4776 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004777 }`)
4778
Jiyong Park89e850a2020-04-07 16:37:39 +09004779 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4780 // because it depends on libbar which isn't available to platform
4781 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4782 if libfoo.NotAvailableForPlatform() != true {
4783 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4784 }
4785
4786 // libfoo2 however can be available to platform because it depends on libbaz which provides
4787 // stubs
4788 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4789 if libfoo2.NotAvailableForPlatform() == true {
4790 t.Errorf("%q should be available to platform", libfoo2.String())
4791 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004792}
Jiyong Parka90ca002019-10-07 15:47:24 +09004793
Paul Duffine52e66f2020-03-30 17:54:29 +01004794func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004795 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004796 apex {
4797 name: "myapex",
4798 key: "myapex.key",
4799 native_shared_libs: ["libfoo"],
4800 }
4801
4802 apex_key {
4803 name: "myapex.key",
4804 public_key: "testkey.avbpubkey",
4805 private_key: "testkey.pem",
4806 }
4807
4808 cc_library {
4809 name: "libfoo",
4810 stl: "none",
4811 system_shared_libs: [],
4812 apex_available: ["myapex"],
4813 static: {
4814 apex_available: ["//apex_available:platform"],
4815 },
4816 }`)
4817
Jiyong Park89e850a2020-04-07 16:37:39 +09004818 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4819 if libfooShared.NotAvailableForPlatform() != true {
4820 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4821 }
4822 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4823 if libfooStatic.NotAvailableForPlatform() != false {
4824 t.Errorf("%q should be available to platform", libfooStatic.String())
4825 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004826}
4827
Jiyong Park5d790c32019-11-15 18:40:32 +09004828func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004829 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004830 apex {
4831 name: "myapex",
4832 key: "myapex.key",
4833 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004834 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004835 }
4836
4837 override_apex {
4838 name: "override_myapex",
4839 base: "myapex",
4840 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004841 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004842 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004843 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004844 }
4845
4846 apex_key {
4847 name: "myapex.key",
4848 public_key: "testkey.avbpubkey",
4849 private_key: "testkey.pem",
4850 }
4851
4852 android_app {
4853 name: "app",
4854 srcs: ["foo/bar/MyClass.java"],
4855 package_name: "foo",
4856 sdk_version: "none",
4857 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004858 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004859 }
4860
4861 override_android_app {
4862 name: "override_app",
4863 base: "app",
4864 package_name: "bar",
4865 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004866 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004867
Jiyong Park317645e2019-12-05 13:20:58 +09004868 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4869 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4870 if originalVariant.GetOverriddenBy() != "" {
4871 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4872 }
4873 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4874 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4875 }
4876
Jiyong Park5d790c32019-11-15 18:40:32 +09004877 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4878 apexRule := module.Rule("apexRule")
4879 copyCmds := apexRule.Args["copy_commands"]
4880
4881 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004882 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004883
4884 apexBundle := module.Module().(*apexBundle)
4885 name := apexBundle.Name()
4886 if name != "override_myapex" {
4887 t.Errorf("name should be \"override_myapex\", but was %q", name)
4888 }
4889
Baligh Uddin004d7172020-02-19 21:29:28 -08004890 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4891 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4892 }
4893
Jiyong Park20bacab2020-03-03 11:45:41 +09004894 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004895 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004896
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004897 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4898 var builder strings.Builder
4899 data.Custom(&builder, name, "TARGET_", "", data)
4900 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004901 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004902 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4903 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004904 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004905 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004906 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004907 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4908 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004909}
4910
Jooyung Han214bf372019-11-12 13:03:50 +09004911func TestLegacyAndroid10Support(t *testing.T) {
4912 ctx, _ := testApex(t, `
4913 apex {
4914 name: "myapex",
4915 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004916 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004917 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004918 }
4919
4920 apex_key {
4921 name: "myapex.key",
4922 public_key: "testkey.avbpubkey",
4923 private_key: "testkey.pem",
4924 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004925
4926 cc_library {
4927 name: "mylib",
4928 srcs: ["mylib.cpp"],
4929 stl: "libc++",
4930 system_shared_libs: [],
4931 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004932 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004933 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004934 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004935
4936 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4937 args := module.Rule("apexRule").Args
4938 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004939 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004940
4941 // The copies of the libraries in the apex should have one more dependency than
4942 // the ones outside the apex, namely the unwinder. Ideally we should check
4943 // the dependency names directly here but for some reason the names are blank in
4944 // this test.
4945 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004946 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004947 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4948 if len(apexImplicits) != len(nonApexImplicits)+1 {
4949 t.Errorf("%q missing unwinder dep", lib)
4950 }
4951 }
Jooyung Han214bf372019-11-12 13:03:50 +09004952}
4953
Paul Duffin9b879592020-05-26 13:21:35 +01004954var filesForSdkLibrary = map[string][]byte{
4955 "api/current.txt": nil,
4956 "api/removed.txt": nil,
4957 "api/system-current.txt": nil,
4958 "api/system-removed.txt": nil,
4959 "api/test-current.txt": nil,
4960 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004961
4962 // For java_sdk_library_import
4963 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004964}
4965
Jooyung Han58f26ab2019-12-18 15:34:32 +09004966func TestJavaSDKLibrary(t *testing.T) {
4967 ctx, _ := testApex(t, `
4968 apex {
4969 name: "myapex",
4970 key: "myapex.key",
4971 java_libs: ["foo"],
4972 }
4973
4974 apex_key {
4975 name: "myapex.key",
4976 public_key: "testkey.avbpubkey",
4977 private_key: "testkey.pem",
4978 }
4979
4980 java_sdk_library {
4981 name: "foo",
4982 srcs: ["a.java"],
4983 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004984 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004985 }
Paul Duffin9b879592020-05-26 13:21:35 +01004986 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004987
4988 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004989 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004990 "javalib/foo.jar",
4991 "etc/permissions/foo.xml",
4992 })
4993 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004994 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4995 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004996}
4997
Paul Duffin9b879592020-05-26 13:21:35 +01004998func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4999 ctx, _ := testApex(t, `
5000 apex {
5001 name: "myapex",
5002 key: "myapex.key",
5003 java_libs: ["foo", "bar"],
5004 }
5005
5006 apex_key {
5007 name: "myapex.key",
5008 public_key: "testkey.avbpubkey",
5009 private_key: "testkey.pem",
5010 }
5011
5012 java_sdk_library {
5013 name: "foo",
5014 srcs: ["a.java"],
5015 api_packages: ["foo"],
5016 apex_available: ["myapex"],
5017 sdk_version: "none",
5018 system_modules: "none",
5019 }
5020
5021 java_library {
5022 name: "bar",
5023 srcs: ["a.java"],
5024 libs: ["foo"],
5025 apex_available: ["myapex"],
5026 sdk_version: "none",
5027 system_modules: "none",
5028 }
5029 `, withFiles(filesForSdkLibrary))
5030
5031 // java_sdk_library installs both impl jar and permission XML
5032 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5033 "javalib/bar.jar",
5034 "javalib/foo.jar",
5035 "etc/permissions/foo.xml",
5036 })
5037
5038 // The bar library should depend on the implementation jar.
5039 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5040 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5041 t.Errorf("expected %q, found %#q", expected, actual)
5042 }
5043}
5044
5045func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5046 ctx, _ := testApex(t, `
5047 apex {
5048 name: "myapex",
5049 key: "myapex.key",
5050 java_libs: ["foo"],
5051 }
5052
5053 apex_key {
5054 name: "myapex.key",
5055 public_key: "testkey.avbpubkey",
5056 private_key: "testkey.pem",
5057 }
5058
5059 java_sdk_library {
5060 name: "foo",
5061 srcs: ["a.java"],
5062 api_packages: ["foo"],
5063 apex_available: ["myapex"],
5064 sdk_version: "none",
5065 system_modules: "none",
5066 }
5067
5068 java_library {
5069 name: "bar",
5070 srcs: ["a.java"],
5071 libs: ["foo"],
5072 sdk_version: "none",
5073 system_modules: "none",
5074 }
5075 `, withFiles(filesForSdkLibrary))
5076
5077 // java_sdk_library installs both impl jar and permission XML
5078 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5079 "javalib/foo.jar",
5080 "etc/permissions/foo.xml",
5081 })
5082
5083 // The bar library should depend on the stubs jar.
5084 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5085 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5086 t.Errorf("expected %q, found %#q", expected, actual)
5087 }
5088}
5089
Paul Duffineedc5d52020-06-12 17:46:39 +01005090func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5091 ctx, _ := testApex(t, ``,
5092 withFiles(map[string][]byte{
5093 "apex/a.java": nil,
5094 "apex/apex_manifest.json": nil,
5095 "apex/Android.bp": []byte(`
5096 package {
5097 default_visibility: ["//visibility:private"],
5098 }
5099
5100 apex {
5101 name: "myapex",
5102 key: "myapex.key",
5103 java_libs: ["foo", "bar"],
5104 }
5105
5106 apex_key {
5107 name: "myapex.key",
5108 public_key: "testkey.avbpubkey",
5109 private_key: "testkey.pem",
5110 }
5111
5112 java_library {
5113 name: "bar",
5114 srcs: ["a.java"],
5115 libs: ["foo"],
5116 apex_available: ["myapex"],
5117 sdk_version: "none",
5118 system_modules: "none",
5119 }
5120`),
5121 "source/a.java": nil,
5122 "source/api/current.txt": nil,
5123 "source/api/removed.txt": nil,
5124 "source/Android.bp": []byte(`
5125 package {
5126 default_visibility: ["//visibility:private"],
5127 }
5128
5129 java_sdk_library {
5130 name: "foo",
5131 visibility: ["//apex"],
5132 srcs: ["a.java"],
5133 api_packages: ["foo"],
5134 apex_available: ["myapex"],
5135 sdk_version: "none",
5136 system_modules: "none",
5137 public: {
5138 enabled: true,
5139 },
5140 }
5141`),
5142 "prebuilt/a.jar": nil,
5143 "prebuilt/Android.bp": []byte(`
5144 package {
5145 default_visibility: ["//visibility:private"],
5146 }
5147
5148 java_sdk_library_import {
5149 name: "foo",
5150 visibility: ["//apex", "//source"],
5151 apex_available: ["myapex"],
5152 prefer: true,
5153 public: {
5154 jars: ["a.jar"],
5155 },
5156 }
5157`),
5158 }),
5159 )
5160
5161 // java_sdk_library installs both impl jar and permission XML
5162 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5163 "javalib/bar.jar",
5164 "javalib/foo.jar",
5165 "etc/permissions/foo.xml",
5166 })
5167
5168 // The bar library should depend on the implementation jar.
5169 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5170 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5171 t.Errorf("expected %q, found %#q", expected, actual)
5172 }
5173}
5174
5175func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5176 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5177 apex {
5178 name: "myapex",
5179 key: "myapex.key",
5180 java_libs: ["foo"],
5181 }
5182
5183 apex_key {
5184 name: "myapex.key",
5185 public_key: "testkey.avbpubkey",
5186 private_key: "testkey.pem",
5187 }
5188
5189 java_sdk_library_import {
5190 name: "foo",
5191 apex_available: ["myapex"],
5192 prefer: true,
5193 public: {
5194 jars: ["a.jar"],
5195 },
5196 }
5197
5198 `, withFiles(filesForSdkLibrary))
5199}
5200
atrost6e126252020-01-27 17:01:16 +00005201func TestCompatConfig(t *testing.T) {
5202 ctx, _ := testApex(t, `
5203 apex {
5204 name: "myapex",
5205 key: "myapex.key",
5206 prebuilts: ["myjar-platform-compat-config"],
5207 java_libs: ["myjar"],
5208 }
5209
5210 apex_key {
5211 name: "myapex.key",
5212 public_key: "testkey.avbpubkey",
5213 private_key: "testkey.pem",
5214 }
5215
5216 platform_compat_config {
5217 name: "myjar-platform-compat-config",
5218 src: ":myjar",
5219 }
5220
5221 java_library {
5222 name: "myjar",
5223 srcs: ["foo/bar/MyClass.java"],
5224 sdk_version: "none",
5225 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005226 apex_available: [ "myapex" ],
5227 }
5228 `)
5229 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5230 "etc/compatconfig/myjar-platform-compat-config.xml",
5231 "javalib/myjar.jar",
5232 })
5233}
5234
Jiyong Park479321d2019-12-16 11:47:12 +09005235func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5236 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5237 apex {
5238 name: "myapex",
5239 key: "myapex.key",
5240 java_libs: ["myjar"],
5241 }
5242
5243 apex_key {
5244 name: "myapex.key",
5245 public_key: "testkey.avbpubkey",
5246 private_key: "testkey.pem",
5247 }
5248
5249 java_library {
5250 name: "myjar",
5251 srcs: ["foo/bar/MyClass.java"],
5252 sdk_version: "none",
5253 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005254 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005255 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005256 }
5257 `)
5258}
5259
Jiyong Park7afd1072019-12-30 16:56:33 +09005260func TestCarryRequiredModuleNames(t *testing.T) {
5261 ctx, config := testApex(t, `
5262 apex {
5263 name: "myapex",
5264 key: "myapex.key",
5265 native_shared_libs: ["mylib"],
5266 }
5267
5268 apex_key {
5269 name: "myapex.key",
5270 public_key: "testkey.avbpubkey",
5271 private_key: "testkey.pem",
5272 }
5273
5274 cc_library {
5275 name: "mylib",
5276 srcs: ["mylib.cpp"],
5277 system_shared_libs: [],
5278 stl: "none",
5279 required: ["a", "b"],
5280 host_required: ["c", "d"],
5281 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005282 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005283 }
5284 `)
5285
5286 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5287 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5288 name := apexBundle.BaseModuleName()
5289 prefix := "TARGET_"
5290 var builder strings.Builder
5291 data.Custom(&builder, name, prefix, "", data)
5292 androidMk := builder.String()
5293 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5294 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5295 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5296}
5297
Jiyong Park7cd10e32020-01-14 09:22:18 +09005298func TestSymlinksFromApexToSystem(t *testing.T) {
5299 bp := `
5300 apex {
5301 name: "myapex",
5302 key: "myapex.key",
5303 native_shared_libs: ["mylib"],
5304 java_libs: ["myjar"],
5305 }
5306
Jiyong Park9d677202020-02-19 16:29:35 +09005307 apex {
5308 name: "myapex.updatable",
5309 key: "myapex.key",
5310 native_shared_libs: ["mylib"],
5311 java_libs: ["myjar"],
5312 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005313 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005314 }
5315
Jiyong Park7cd10e32020-01-14 09:22:18 +09005316 apex_key {
5317 name: "myapex.key",
5318 public_key: "testkey.avbpubkey",
5319 private_key: "testkey.pem",
5320 }
5321
5322 cc_library {
5323 name: "mylib",
5324 srcs: ["mylib.cpp"],
5325 shared_libs: ["myotherlib"],
5326 system_shared_libs: [],
5327 stl: "none",
5328 apex_available: [
5329 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005330 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005331 "//apex_available:platform",
5332 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005333 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005334 }
5335
5336 cc_library {
5337 name: "myotherlib",
5338 srcs: ["mylib.cpp"],
5339 system_shared_libs: [],
5340 stl: "none",
5341 apex_available: [
5342 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005343 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005344 "//apex_available:platform",
5345 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005346 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005347 }
5348
5349 java_library {
5350 name: "myjar",
5351 srcs: ["foo/bar/MyClass.java"],
5352 sdk_version: "none",
5353 system_modules: "none",
5354 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005355 apex_available: [
5356 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005357 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005358 "//apex_available:platform",
5359 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005360 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005361 }
5362
5363 java_library {
5364 name: "myotherjar",
5365 srcs: ["foo/bar/MyClass.java"],
5366 sdk_version: "none",
5367 system_modules: "none",
5368 apex_available: [
5369 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005370 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005371 "//apex_available:platform",
5372 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005373 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005374 }
5375 `
5376
5377 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5378 for _, f := range files {
5379 if f.path == file {
5380 if f.isLink {
5381 t.Errorf("%q is not a real file", file)
5382 }
5383 return
5384 }
5385 }
5386 t.Errorf("%q is not found", file)
5387 }
5388
5389 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5390 for _, f := range files {
5391 if f.path == file {
5392 if !f.isLink {
5393 t.Errorf("%q is not a symlink", file)
5394 }
5395 return
5396 }
5397 }
5398 t.Errorf("%q is not found", file)
5399 }
5400
Jiyong Park9d677202020-02-19 16:29:35 +09005401 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5402 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005403 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005404 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005405 ensureRealfileExists(t, files, "javalib/myjar.jar")
5406 ensureRealfileExists(t, files, "lib64/mylib.so")
5407 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5408
Jiyong Park9d677202020-02-19 16:29:35 +09005409 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5410 ensureRealfileExists(t, files, "javalib/myjar.jar")
5411 ensureRealfileExists(t, files, "lib64/mylib.so")
5412 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5413
5414 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005415 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005416 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005417 ensureRealfileExists(t, files, "javalib/myjar.jar")
5418 ensureRealfileExists(t, files, "lib64/mylib.so")
5419 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005420
5421 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5422 ensureRealfileExists(t, files, "javalib/myjar.jar")
5423 ensureRealfileExists(t, files, "lib64/mylib.so")
5424 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005425}
5426
Yo Chiange8128052020-07-23 20:09:18 +08005427func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5428 ctx, config := testApex(t, `
5429 apex {
5430 name: "myapex",
5431 key: "myapex.key",
5432 native_shared_libs: ["mylib"],
5433 }
5434
5435 apex_key {
5436 name: "myapex.key",
5437 public_key: "testkey.avbpubkey",
5438 private_key: "testkey.pem",
5439 }
5440
5441 cc_library_shared {
5442 name: "mylib",
5443 srcs: ["mylib.cpp"],
5444 shared_libs: ["myotherlib"],
5445 system_shared_libs: [],
5446 stl: "none",
5447 apex_available: [
5448 "myapex",
5449 "//apex_available:platform",
5450 ],
5451 }
5452
5453 cc_prebuilt_library_shared {
5454 name: "myotherlib",
5455 srcs: ["prebuilt.so"],
5456 system_shared_libs: [],
5457 stl: "none",
5458 apex_available: [
5459 "myapex",
5460 "//apex_available:platform",
5461 ],
5462 }
5463 `)
5464
5465 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5466 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5467 var builder strings.Builder
5468 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5469 androidMk := builder.String()
5470 // `myotherlib` is added to `myapex` as symlink
5471 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5472 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5473 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5474 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5475 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5476}
5477
Jooyung Han643adc42020-02-27 13:50:06 +09005478func TestApexWithJniLibs(t *testing.T) {
5479 ctx, _ := testApex(t, `
5480 apex {
5481 name: "myapex",
5482 key: "myapex.key",
5483 jni_libs: ["mylib"],
5484 }
5485
5486 apex_key {
5487 name: "myapex.key",
5488 public_key: "testkey.avbpubkey",
5489 private_key: "testkey.pem",
5490 }
5491
5492 cc_library {
5493 name: "mylib",
5494 srcs: ["mylib.cpp"],
5495 shared_libs: ["mylib2"],
5496 system_shared_libs: [],
5497 stl: "none",
5498 apex_available: [ "myapex" ],
5499 }
5500
5501 cc_library {
5502 name: "mylib2",
5503 srcs: ["mylib.cpp"],
5504 system_shared_libs: [],
5505 stl: "none",
5506 apex_available: [ "myapex" ],
5507 }
5508 `)
5509
5510 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5511 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5512 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5513 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5514 "lib64/mylib.so",
5515 "lib64/mylib2.so",
5516 })
5517}
5518
Jooyung Han49f67012020-04-17 13:43:10 +09005519func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5520 ctx, _ := testApex(t, `
5521 apex {
5522 name: "myapex",
5523 key: "myapex.key",
5524 }
5525 apex_key {
5526 name: "myapex.key",
5527 public_key: "testkey.avbpubkey",
5528 private_key: "testkey.pem",
5529 }
5530 `, func(fs map[string][]byte, config android.Config) {
5531 delete(config.Targets, android.Android)
5532 config.AndroidCommonTarget = android.Target{}
5533 })
5534
5535 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5536 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5537 }
5538}
5539
Jiyong Parkbd159612020-02-28 15:22:21 +09005540func TestAppBundle(t *testing.T) {
5541 ctx, _ := testApex(t, `
5542 apex {
5543 name: "myapex",
5544 key: "myapex.key",
5545 apps: ["AppFoo"],
5546 }
5547
5548 apex_key {
5549 name: "myapex.key",
5550 public_key: "testkey.avbpubkey",
5551 private_key: "testkey.pem",
5552 }
5553
5554 android_app {
5555 name: "AppFoo",
5556 srcs: ["foo/bar/MyClass.java"],
5557 sdk_version: "none",
5558 system_modules: "none",
5559 apex_available: [ "myapex" ],
5560 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005561 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005562
5563 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5564 content := bundleConfigRule.Args["content"]
5565
5566 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005567 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 +09005568}
5569
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005570func TestAppSetBundle(t *testing.T) {
5571 ctx, _ := testApex(t, `
5572 apex {
5573 name: "myapex",
5574 key: "myapex.key",
5575 apps: ["AppSet"],
5576 }
5577
5578 apex_key {
5579 name: "myapex.key",
5580 public_key: "testkey.avbpubkey",
5581 private_key: "testkey.pem",
5582 }
5583
5584 android_app_set {
5585 name: "AppSet",
5586 set: "AppSet.apks",
5587 }`)
5588 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5589 bundleConfigRule := mod.Description("Bundle Config")
5590 content := bundleConfigRule.Args["content"]
5591 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5592 s := mod.Rule("apexRule").Args["copy_commands"]
5593 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5594 if len(copyCmds) != 3 {
5595 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5596 }
5597 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5598 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5599 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5600}
5601
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005602func TestAppSetBundlePrebuilt(t *testing.T) {
5603 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5604 bp := `
5605 apex_set {
5606 name: "myapex",
5607 filename: "foo_v2.apex",
5608 sanitized: {
5609 none: { set: "myapex.apks", },
5610 hwaddress: { set: "myapex.hwasan.apks", },
5611 },
5612 }`
5613 fs["Android.bp"] = []byte(bp)
5614
5615 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5616 })
5617
5618 m := ctx.ModuleForTests("myapex", "android_common")
5619 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5620
5621 actual := extractedApex.Inputs
5622 if len(actual) != 1 {
5623 t.Errorf("expected a single input")
5624 }
5625
5626 expected := "myapex.hwasan.apks"
5627 if actual[0].String() != expected {
5628 t.Errorf("expected %s, got %s", expected, actual[0].String())
5629 }
5630}
5631
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005632func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005633 t.Helper()
5634
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005635 bp := `
5636 java_library {
5637 name: "some-updatable-apex-lib",
5638 srcs: ["a.java"],
5639 sdk_version: "current",
5640 apex_available: [
5641 "some-updatable-apex",
5642 ],
5643 }
5644
5645 java_library {
5646 name: "some-non-updatable-apex-lib",
5647 srcs: ["a.java"],
5648 apex_available: [
5649 "some-non-updatable-apex",
5650 ],
5651 }
5652
5653 java_library {
5654 name: "some-platform-lib",
5655 srcs: ["a.java"],
5656 sdk_version: "current",
5657 installable: true,
5658 }
5659
5660 java_library {
5661 name: "some-art-lib",
5662 srcs: ["a.java"],
5663 sdk_version: "current",
5664 apex_available: [
5665 "com.android.art.something",
5666 ],
5667 hostdex: true,
5668 }
5669
5670 apex {
5671 name: "some-updatable-apex",
5672 key: "some-updatable-apex.key",
5673 java_libs: ["some-updatable-apex-lib"],
5674 updatable: true,
5675 min_sdk_version: "current",
5676 }
5677
5678 apex {
5679 name: "some-non-updatable-apex",
5680 key: "some-non-updatable-apex.key",
5681 java_libs: ["some-non-updatable-apex-lib"],
5682 }
5683
5684 apex_key {
5685 name: "some-updatable-apex.key",
5686 }
5687
5688 apex_key {
5689 name: "some-non-updatable-apex.key",
5690 }
5691
5692 apex {
5693 name: "com.android.art.something",
5694 key: "com.android.art.something.key",
5695 java_libs: ["some-art-lib"],
5696 updatable: true,
5697 min_sdk_version: "current",
5698 }
5699
5700 apex_key {
5701 name: "com.android.art.something.key",
5702 }
5703
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005704 filegroup {
5705 name: "some-updatable-apex-file_contexts",
5706 srcs: [
5707 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5708 ],
5709 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005710
5711 filegroup {
5712 name: "some-non-updatable-apex-file_contexts",
5713 srcs: [
5714 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5715 ],
5716 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005717 `
5718 bp += cc.GatherRequiredDepsForTest(android.Android)
5719 bp += java.GatherRequiredDepsForTest()
5720 bp += dexpreopt.BpToolModulesForTest()
5721
5722 fs := map[string][]byte{
5723 "a.java": nil,
5724 "a.jar": nil,
5725 "build/make/target/product/security": nil,
5726 "apex_manifest.json": nil,
5727 "AndroidManifest.xml": nil,
5728 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005729 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005730 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5731 "framework/aidl/a.aidl": nil,
5732 }
5733 cc.GatherRequiredFilesForTest(fs)
5734
5735 ctx := android.NewTestArchContext()
5736 ctx.RegisterModuleType("apex", BundleFactory)
5737 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5738 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005739 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005740 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005741 cc.RegisterRequiredBuildComponentsForTest(ctx)
5742 java.RegisterJavaBuildComponents(ctx)
5743 java.RegisterSystemModulesBuildComponents(ctx)
5744 java.RegisterAppBuildComponents(ctx)
5745 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005746 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5747 ctx.PreDepsMutators(RegisterPreDepsMutators)
5748 ctx.PostDepsMutators(RegisterPostDepsMutators)
5749
5750 config := android.TestArchConfig(buildDir, nil, bp, fs)
5751 ctx.Register(config)
5752
5753 _ = dexpreopt.GlobalSoongConfigForTests(config)
5754 dexpreopt.RegisterToolModulesForTest(ctx)
5755 pathCtx := android.PathContextForTesting(config)
5756 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5757 transformDexpreoptConfig(dexpreoptConfig)
5758 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5759
5760 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5761 android.FailIfErrored(t, errs)
5762
5763 _, errs = ctx.PrepareBuildActions(config)
5764 if errmsg == "" {
5765 android.FailIfErrored(t, errs)
5766 } else if len(errs) > 0 {
5767 android.FailIfNoMatchingErrors(t, errmsg, errs)
5768 return
5769 } else {
5770 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5771 }
5772}
5773
Jooyung Han548640b2020-04-27 12:10:30 +09005774func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5775 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5776 apex {
5777 name: "myapex",
5778 key: "myapex.key",
5779 updatable: true,
5780 }
5781
5782 apex_key {
5783 name: "myapex.key",
5784 public_key: "testkey.avbpubkey",
5785 private_key: "testkey.pem",
5786 }
5787 `)
5788}
5789
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005790func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005791 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005792 var transform func(*dexpreopt.GlobalConfig)
5793
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005794 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5795 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005796 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005797 }
5798 testNoUpdatableJarsInBootImage(t, "", transform)
5799 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005800
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005801 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005802 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 +01005803 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005804 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005805 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005806 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005807 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005808
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005809 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005810 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005811 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005812 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005813 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005814 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005815 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005816
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005817 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005818 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005819 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005820 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005821 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005822 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005823 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005824
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005825 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 -07005826 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 +01005827 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005828 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005829 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005830 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005831 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005832
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005833 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5834 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005835 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005836 }
5837 testNoUpdatableJarsInBootImage(t, "", transform)
5838 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005839
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005840 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005841 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005842 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005843 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005844 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005845 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005846 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005847
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005848 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005849 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005850 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005851 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005852 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005853 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005854 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005855
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005856 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005857 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005858 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005859 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005860 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005861 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005862 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005863
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005864 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5865 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005866 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005867 }
5868 testNoUpdatableJarsInBootImage(t, "", transform)
5869 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005870}
5871
Andrei Onea115e7e72020-06-05 21:14:03 +01005872func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5873 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005874 bp += `
5875 apex_key {
5876 name: "myapex.key",
5877 public_key: "testkey.avbpubkey",
5878 private_key: "testkey.pem",
5879 }`
5880 fs := map[string][]byte{
5881 "lib1/src/A.java": nil,
5882 "lib2/src/B.java": nil,
5883 "system/sepolicy/apex/myapex-file_contexts": nil,
5884 }
5885
5886 ctx := android.NewTestArchContext()
5887 ctx.RegisterModuleType("apex", BundleFactory)
5888 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5889 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5890 cc.RegisterRequiredBuildComponentsForTest(ctx)
5891 java.RegisterJavaBuildComponents(ctx)
5892 java.RegisterSystemModulesBuildComponents(ctx)
5893 java.RegisterDexpreoptBootJarsComponents(ctx)
5894 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5895 ctx.PreDepsMutators(RegisterPreDepsMutators)
5896 ctx.PostDepsMutators(RegisterPostDepsMutators)
5897 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5898
5899 config := android.TestArchConfig(buildDir, nil, bp, fs)
5900 android.SetTestNeverallowRules(config, rules)
5901 updatableBootJars := make([]string, 0, len(apexBootJars))
5902 for _, apexBootJar := range apexBootJars {
5903 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5904 }
Paul Duffine10dfa42020-10-23 21:23:44 +01005905 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
Andrei Onea115e7e72020-06-05 21:14:03 +01005906
5907 ctx.Register(config)
5908
5909 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5910 android.FailIfErrored(t, errs)
5911
5912 _, errs = ctx.PrepareBuildActions(config)
5913 if errmsg == "" {
5914 android.FailIfErrored(t, errs)
5915 } else if len(errs) > 0 {
5916 android.FailIfNoMatchingErrors(t, errmsg, errs)
5917 return
5918 } else {
5919 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5920 }
5921}
5922
5923func TestApexPermittedPackagesRules(t *testing.T) {
5924 testcases := []struct {
5925 name string
5926 expectedError string
5927 bp string
5928 bootJars []string
5929 modulesPackages map[string][]string
5930 }{
5931
5932 {
5933 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5934 expectedError: "",
5935 bp: `
5936 java_library {
5937 name: "bcp_lib1",
5938 srcs: ["lib1/src/*.java"],
5939 permitted_packages: ["foo.bar"],
5940 apex_available: ["myapex"],
5941 sdk_version: "none",
5942 system_modules: "none",
5943 }
5944 java_library {
5945 name: "nonbcp_lib2",
5946 srcs: ["lib2/src/*.java"],
5947 apex_available: ["myapex"],
5948 permitted_packages: ["a.b"],
5949 sdk_version: "none",
5950 system_modules: "none",
5951 }
5952 apex {
5953 name: "myapex",
5954 key: "myapex.key",
5955 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5956 }`,
5957 bootJars: []string{"bcp_lib1"},
5958 modulesPackages: map[string][]string{
5959 "myapex": []string{
5960 "foo.bar",
5961 },
5962 },
5963 },
5964 {
5965 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5966 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.`,
5967 bp: `
5968 java_library {
5969 name: "bcp_lib1",
5970 srcs: ["lib1/src/*.java"],
5971 apex_available: ["myapex"],
5972 permitted_packages: ["foo.bar"],
5973 sdk_version: "none",
5974 system_modules: "none",
5975 }
5976 java_library {
5977 name: "bcp_lib2",
5978 srcs: ["lib2/src/*.java"],
5979 apex_available: ["myapex"],
5980 permitted_packages: ["foo.bar", "bar.baz"],
5981 sdk_version: "none",
5982 system_modules: "none",
5983 }
5984 apex {
5985 name: "myapex",
5986 key: "myapex.key",
5987 java_libs: ["bcp_lib1", "bcp_lib2"],
5988 }
5989 `,
5990 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5991 modulesPackages: map[string][]string{
5992 "myapex": []string{
5993 "foo.bar",
5994 },
5995 },
5996 },
5997 }
5998 for _, tc := range testcases {
5999 t.Run(tc.name, func(t *testing.T) {
6000 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6001 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6002 })
6003 }
6004}
6005
Jiyong Park62304bb2020-04-13 16:19:48 +09006006func TestTestFor(t *testing.T) {
6007 ctx, _ := testApex(t, `
6008 apex {
6009 name: "myapex",
6010 key: "myapex.key",
6011 native_shared_libs: ["mylib", "myprivlib"],
6012 }
6013
6014 apex_key {
6015 name: "myapex.key",
6016 public_key: "testkey.avbpubkey",
6017 private_key: "testkey.pem",
6018 }
6019
6020 cc_library {
6021 name: "mylib",
6022 srcs: ["mylib.cpp"],
6023 system_shared_libs: [],
6024 stl: "none",
6025 stubs: {
6026 versions: ["1"],
6027 },
6028 apex_available: ["myapex"],
6029 }
6030
6031 cc_library {
6032 name: "myprivlib",
6033 srcs: ["mylib.cpp"],
6034 system_shared_libs: [],
6035 stl: "none",
6036 apex_available: ["myapex"],
6037 }
6038
6039
6040 cc_test {
6041 name: "mytest",
6042 gtest: false,
6043 srcs: ["mylib.cpp"],
6044 system_shared_libs: [],
6045 stl: "none",
6046 shared_libs: ["mylib", "myprivlib"],
6047 test_for: ["myapex"]
6048 }
6049 `)
6050
6051 // the test 'mytest' is a test for the apex, therefore is linked to the
6052 // actual implementation of mylib instead of its stub.
6053 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6054 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6055 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6056}
6057
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006058// TODO(jungjw): Move this to proptools
6059func intPtr(i int) *int {
6060 return &i
6061}
6062
6063func TestApexSet(t *testing.T) {
6064 ctx, config := testApex(t, `
6065 apex_set {
6066 name: "myapex",
6067 set: "myapex.apks",
6068 filename: "foo_v2.apex",
6069 overrides: ["foo"],
6070 }
6071 `, func(fs map[string][]byte, config android.Config) {
6072 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006073 config.Targets[android.Android] = []android.Target{
6074 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6075 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6076 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006077 })
6078
6079 m := ctx.ModuleForTests("myapex", "android_common")
6080
6081 // Check extract_apks tool parameters.
6082 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6083 actual := extractedApex.Args["abis"]
6084 expected := "ARMEABI_V7A,ARM64_V8A"
6085 if actual != expected {
6086 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6087 }
6088 actual = extractedApex.Args["sdk-version"]
6089 expected = "30"
6090 if actual != expected {
6091 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6092 }
6093
6094 a := m.Module().(*ApexSet)
6095 expectedOverrides := []string{"foo"}
6096 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6097 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6098 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6099 }
6100}
6101
Jiyong Park7d95a512020-05-10 15:16:24 +09006102func TestNoStaticLinkingToStubsLib(t *testing.T) {
6103 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6104 apex {
6105 name: "myapex",
6106 key: "myapex.key",
6107 native_shared_libs: ["mylib"],
6108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
6116 cc_library {
6117 name: "mylib",
6118 srcs: ["mylib.cpp"],
6119 static_libs: ["otherlib"],
6120 system_shared_libs: [],
6121 stl: "none",
6122 apex_available: [ "myapex" ],
6123 }
6124
6125 cc_library {
6126 name: "otherlib",
6127 srcs: ["mylib.cpp"],
6128 system_shared_libs: [],
6129 stl: "none",
6130 stubs: {
6131 versions: ["1", "2", "3"],
6132 },
6133 apex_available: [ "myapex" ],
6134 }
6135 `)
6136}
6137
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006138func TestApexKeysTxt(t *testing.T) {
6139 ctx, _ := testApex(t, `
6140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 }
6144
6145 apex_key {
6146 name: "myapex.key",
6147 public_key: "testkey.avbpubkey",
6148 private_key: "testkey.pem",
6149 }
6150
6151 prebuilt_apex {
6152 name: "myapex",
6153 prefer: true,
6154 arch: {
6155 arm64: {
6156 src: "myapex-arm64.apex",
6157 },
6158 arm: {
6159 src: "myapex-arm.apex",
6160 },
6161 },
6162 }
6163
6164 apex_set {
6165 name: "myapex_set",
6166 set: "myapex.apks",
6167 filename: "myapex_set.apex",
6168 overrides: ["myapex"],
6169 }
6170 `)
6171
6172 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6173 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6174 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 +09006175 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 +09006176}
6177
Jooyung Han938b5932020-06-20 12:47:47 +09006178func TestAllowedFiles(t *testing.T) {
6179 ctx, _ := testApex(t, `
6180 apex {
6181 name: "myapex",
6182 key: "myapex.key",
6183 apps: ["app"],
6184 allowed_files: "allowed.txt",
6185 }
6186
6187 apex_key {
6188 name: "myapex.key",
6189 public_key: "testkey.avbpubkey",
6190 private_key: "testkey.pem",
6191 }
6192
6193 android_app {
6194 name: "app",
6195 srcs: ["foo/bar/MyClass.java"],
6196 package_name: "foo",
6197 sdk_version: "none",
6198 system_modules: "none",
6199 apex_available: [ "myapex" ],
6200 }
6201 `, withFiles(map[string][]byte{
6202 "sub/Android.bp": []byte(`
6203 override_apex {
6204 name: "override_myapex",
6205 base: "myapex",
6206 apps: ["override_app"],
6207 allowed_files: ":allowed",
6208 }
6209 // Overridable "path" property should be referenced indirectly
6210 filegroup {
6211 name: "allowed",
6212 srcs: ["allowed.txt"],
6213 }
6214 override_android_app {
6215 name: "override_app",
6216 base: "app",
6217 package_name: "bar",
6218 }
6219 `),
6220 }))
6221
6222 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6223 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6224 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6225 }
6226
6227 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6228 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6229 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6230 }
6231}
6232
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006233func TestNonPreferredPrebuiltDependency(t *testing.T) {
6234 _, _ = testApex(t, `
6235 apex {
6236 name: "myapex",
6237 key: "myapex.key",
6238 native_shared_libs: ["mylib"],
6239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 cc_library {
6248 name: "mylib",
6249 srcs: ["mylib.cpp"],
6250 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006251 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006252 },
6253 apex_available: ["myapex"],
6254 }
6255
6256 cc_prebuilt_library_shared {
6257 name: "mylib",
6258 prefer: false,
6259 srcs: ["prebuilt.so"],
6260 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006261 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006262 },
6263 apex_available: ["myapex"],
6264 }
6265 `)
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}