blob: 532a7aaafb691ac0170852ff3842168155c00dee [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
Colin Crossae8600b2020-10-29 17:09:13 -0700219 ctx := android.NewTestArchContext(config)
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
Colin Crossae8600b2020-10-29 17:09:13 -0700264 ctx.Register()
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,
Justin Yun63e9ec72020-10-29 16:49:43 +09002352 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002353 }
2354 cc_library {
2355 name: "libvendor",
2356 vendor: true,
2357 }
2358 `)
2359
2360 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2361
Colin Crossaede88c2020-08-11 12:17:01 -07002362 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002363 libs := names(ldRule.Args["libFlags"])
2364 // VNDK libs(libvndk/libc++) as they are
2365 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2366 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2367 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002368 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002369
2370 // VNDK libs are not included when use_vndk_as_stable: true
2371 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2372 "bin/mybin",
2373 "lib64/libvendor.so",
2374 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002375
2376 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2377 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2378 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002379}
2380
Jooyung Han8e5685d2020-09-21 11:02:57 +09002381func TestApex_withPrebuiltFirmware(t *testing.T) {
2382 testCases := []struct {
2383 name string
2384 additionalProp string
2385 }{
2386 {"system apex with prebuilt_firmware", ""},
2387 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2388 }
2389 for _, tc := range testCases {
2390 t.Run(tc.name, func(t *testing.T) {
2391 ctx, _ := testApex(t, `
2392 apex {
2393 name: "myapex",
2394 key: "myapex.key",
2395 prebuilts: ["myfirmware"],
2396 `+tc.additionalProp+`
2397 }
2398 apex_key {
2399 name: "myapex.key",
2400 public_key: "testkey.avbpubkey",
2401 private_key: "testkey.pem",
2402 }
2403 prebuilt_firmware {
2404 name: "myfirmware",
2405 src: "myfirmware.bin",
2406 filename_from_src: true,
2407 `+tc.additionalProp+`
2408 }
2409 `)
2410 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2411 "etc/firmware/myfirmware.bin",
2412 })
2413 })
2414 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002415}
2416
Jooyung Hanefb184e2020-06-25 17:14:25 +09002417func TestAndroidMk_UseVendorRequired(t *testing.T) {
2418 ctx, config := testApex(t, `
2419 apex {
2420 name: "myapex",
2421 key: "myapex.key",
2422 use_vendor: true,
2423 native_shared_libs: ["mylib"],
2424 }
2425
2426 apex_key {
2427 name: "myapex.key",
2428 public_key: "testkey.avbpubkey",
2429 private_key: "testkey.pem",
2430 }
2431
2432 cc_library {
2433 name: "mylib",
2434 vendor_available: true,
2435 apex_available: ["myapex"],
2436 }
2437 `, func(fs map[string][]byte, config android.Config) {
2438 setUseVendorAllowListForTest(config, []string{"myapex"})
2439 })
2440
2441 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2442 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2443 name := apexBundle.BaseModuleName()
2444 prefix := "TARGET_"
2445 var builder strings.Builder
2446 data.Custom(&builder, name, prefix, "", data)
2447 androidMk := builder.String()
2448 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2449}
2450
2451func TestAndroidMk_VendorApexRequired(t *testing.T) {
2452 ctx, config := testApex(t, `
2453 apex {
2454 name: "myapex",
2455 key: "myapex.key",
2456 vendor: true,
2457 native_shared_libs: ["mylib"],
2458 }
2459
2460 apex_key {
2461 name: "myapex.key",
2462 public_key: "testkey.avbpubkey",
2463 private_key: "testkey.pem",
2464 }
2465
2466 cc_library {
2467 name: "mylib",
2468 vendor_available: true,
2469 }
2470 `)
2471
2472 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2473 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2474 name := apexBundle.BaseModuleName()
2475 prefix := "TARGET_"
2476 var builder strings.Builder
2477 data.Custom(&builder, name, prefix, "", data)
2478 androidMk := builder.String()
2479 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2480}
2481
Jooyung Han2ed99d02020-06-24 23:26:26 +09002482func TestAndroidMkWritesCommonProperties(t *testing.T) {
2483 ctx, config := testApex(t, `
2484 apex {
2485 name: "myapex",
2486 key: "myapex.key",
2487 vintf_fragments: ["fragment.xml"],
2488 init_rc: ["init.rc"],
2489 }
2490 apex_key {
2491 name: "myapex.key",
2492 public_key: "testkey.avbpubkey",
2493 private_key: "testkey.pem",
2494 }
2495 cc_binary {
2496 name: "mybin",
2497 }
2498 `)
2499
2500 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2501 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2502 name := apexBundle.BaseModuleName()
2503 prefix := "TARGET_"
2504 var builder strings.Builder
2505 data.Custom(&builder, name, prefix, "", data)
2506 androidMk := builder.String()
2507 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2508 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2509}
2510
Jiyong Park16e91a02018-12-20 18:18:08 +09002511func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002512 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002513 apex {
2514 name: "myapex",
2515 key: "myapex.key",
2516 native_shared_libs: ["mylib"],
2517 }
2518
2519 apex_key {
2520 name: "myapex.key",
2521 public_key: "testkey.avbpubkey",
2522 private_key: "testkey.pem",
2523 }
2524
2525 cc_library {
2526 name: "mylib",
2527 srcs: ["mylib.cpp"],
2528 system_shared_libs: [],
2529 stl: "none",
2530 stubs: {
2531 versions: ["1", "2", "3"],
2532 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002533 apex_available: [
2534 "//apex_available:platform",
2535 "myapex",
2536 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002537 }
2538
2539 cc_binary {
2540 name: "not_in_apex",
2541 srcs: ["mylib.cpp"],
2542 static_libs: ["mylib"],
2543 static_executable: true,
2544 system_shared_libs: [],
2545 stl: "none",
2546 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002547 `)
2548
Colin Cross7113d202019-11-20 16:39:12 -08002549 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002550
2551 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002552 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002553}
Jiyong Park9335a262018-12-24 11:31:58 +09002554
2555func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002556 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002557 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002558 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002559 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002560 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002561 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002562 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002563 }
2564
2565 cc_library {
2566 name: "mylib",
2567 srcs: ["mylib.cpp"],
2568 system_shared_libs: [],
2569 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002570 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002571 }
2572
2573 apex_key {
2574 name: "myapex.key",
2575 public_key: "testkey.avbpubkey",
2576 private_key: "testkey.pem",
2577 }
2578
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002579 android_app_certificate {
2580 name: "myapex.certificate",
2581 certificate: "testkey",
2582 }
2583
2584 android_app_certificate {
2585 name: "myapex.certificate.override",
2586 certificate: "testkey.override",
2587 }
2588
Jiyong Park9335a262018-12-24 11:31:58 +09002589 `)
2590
2591 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002592 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002593
2594 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2595 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2596 "vendor/foo/devkeys/testkey.avbpubkey")
2597 }
2598 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2599 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2600 "vendor/foo/devkeys/testkey.pem")
2601 }
2602
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002603 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002604 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002605 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002606 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002607 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002608 }
2609}
Jiyong Park58e364a2019-01-19 19:24:06 +09002610
Jooyung Hanf121a652019-12-17 14:30:11 +09002611func TestCertificate(t *testing.T) {
2612 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2613 ctx, _ := testApex(t, `
2614 apex {
2615 name: "myapex",
2616 key: "myapex.key",
2617 }
2618 apex_key {
2619 name: "myapex.key",
2620 public_key: "testkey.avbpubkey",
2621 private_key: "testkey.pem",
2622 }`)
2623 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2624 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2625 if actual := rule.Args["certificates"]; actual != expected {
2626 t.Errorf("certificates should be %q, not %q", expected, actual)
2627 }
2628 })
2629 t.Run("override when unspecified", func(t *testing.T) {
2630 ctx, _ := testApex(t, `
2631 apex {
2632 name: "myapex_keytest",
2633 key: "myapex.key",
2634 file_contexts: ":myapex-file_contexts",
2635 }
2636 apex_key {
2637 name: "myapex.key",
2638 public_key: "testkey.avbpubkey",
2639 private_key: "testkey.pem",
2640 }
2641 android_app_certificate {
2642 name: "myapex.certificate.override",
2643 certificate: "testkey.override",
2644 }`)
2645 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2646 expected := "testkey.override.x509.pem testkey.override.pk8"
2647 if actual := rule.Args["certificates"]; actual != expected {
2648 t.Errorf("certificates should be %q, not %q", expected, actual)
2649 }
2650 })
2651 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2652 ctx, _ := testApex(t, `
2653 apex {
2654 name: "myapex",
2655 key: "myapex.key",
2656 certificate: ":myapex.certificate",
2657 }
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663 android_app_certificate {
2664 name: "myapex.certificate",
2665 certificate: "testkey",
2666 }`)
2667 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2668 expected := "testkey.x509.pem testkey.pk8"
2669 if actual := rule.Args["certificates"]; actual != expected {
2670 t.Errorf("certificates should be %q, not %q", expected, actual)
2671 }
2672 })
2673 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2674 ctx, _ := testApex(t, `
2675 apex {
2676 name: "myapex_keytest",
2677 key: "myapex.key",
2678 file_contexts: ":myapex-file_contexts",
2679 certificate: ":myapex.certificate",
2680 }
2681 apex_key {
2682 name: "myapex.key",
2683 public_key: "testkey.avbpubkey",
2684 private_key: "testkey.pem",
2685 }
2686 android_app_certificate {
2687 name: "myapex.certificate.override",
2688 certificate: "testkey.override",
2689 }`)
2690 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2691 expected := "testkey.override.x509.pem testkey.override.pk8"
2692 if actual := rule.Args["certificates"]; actual != expected {
2693 t.Errorf("certificates should be %q, not %q", expected, actual)
2694 }
2695 })
2696 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2697 ctx, _ := testApex(t, `
2698 apex {
2699 name: "myapex",
2700 key: "myapex.key",
2701 certificate: "testkey",
2702 }
2703 apex_key {
2704 name: "myapex.key",
2705 public_key: "testkey.avbpubkey",
2706 private_key: "testkey.pem",
2707 }`)
2708 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2709 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2710 if actual := rule.Args["certificates"]; actual != expected {
2711 t.Errorf("certificates should be %q, not %q", expected, actual)
2712 }
2713 })
2714 t.Run("override when specified as <name>", func(t *testing.T) {
2715 ctx, _ := testApex(t, `
2716 apex {
2717 name: "myapex_keytest",
2718 key: "myapex.key",
2719 file_contexts: ":myapex-file_contexts",
2720 certificate: "testkey",
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 android_app_certificate {
2728 name: "myapex.certificate.override",
2729 certificate: "testkey.override",
2730 }`)
2731 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2732 expected := "testkey.override.x509.pem testkey.override.pk8"
2733 if actual := rule.Args["certificates"]; actual != expected {
2734 t.Errorf("certificates should be %q, not %q", expected, actual)
2735 }
2736 })
2737}
2738
Jiyong Park58e364a2019-01-19 19:24:06 +09002739func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002740 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002741 apex {
2742 name: "myapex",
2743 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002744 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002745 }
2746
2747 apex {
2748 name: "otherapex",
2749 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002750 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002751 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002752 }
2753
2754 apex_key {
2755 name: "myapex.key",
2756 public_key: "testkey.avbpubkey",
2757 private_key: "testkey.pem",
2758 }
2759
2760 cc_library {
2761 name: "mylib",
2762 srcs: ["mylib.cpp"],
2763 system_shared_libs: [],
2764 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002765 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002766 "myapex",
2767 "otherapex",
2768 ],
Jooyung Han24282772020-03-21 23:20:55 +09002769 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002770 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002771 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002772 cc_library {
2773 name: "mylib2",
2774 srcs: ["mylib.cpp"],
2775 system_shared_libs: [],
2776 stl: "none",
2777 apex_available: [
2778 "myapex",
2779 "otherapex",
2780 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002781 static_libs: ["mylib3"],
2782 recovery_available: true,
2783 min_sdk_version: "29",
2784 }
2785 cc_library {
2786 name: "mylib3",
2787 srcs: ["mylib.cpp"],
2788 system_shared_libs: [],
2789 stl: "none",
2790 apex_available: [
2791 "myapex",
2792 "otherapex",
2793 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002794 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002795 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002796 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002797 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002798 `)
2799
Jooyung Hanc87a0592020-03-02 17:44:33 +09002800 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002801 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002802 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002803 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002804
Jooyung Hanccce2f22020-03-07 03:45:53 +09002805 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002806 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002807 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002808 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002809 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002810
Jooyung Hanccce2f22020-03-07 03:45:53 +09002811 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002812 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002813 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002814 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002815 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002816
Colin Crossaede88c2020-08-11 12:17:01 -07002817 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2818 // each variant defines additional macros to distinguish which apex variant it is built for
2819
2820 // non-APEX variant does not have __ANDROID_APEX__ defined
2821 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2822 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2823
2824 // APEX variant has __ANDROID_APEX__ defined
2825 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2826 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2827 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2828 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2829
2830 // APEX variant has __ANDROID_APEX__ defined
2831 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2832 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2833 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2834 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2835
2836 // recovery variant does not set __ANDROID_SDK_VERSION__
2837 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2838 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2839 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2840
2841 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2842 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002843
2844 // non-APEX variant does not have __ANDROID_APEX__ defined
2845 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2846 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2847
2848 // APEX variant has __ANDROID_APEX__ defined
2849 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002850 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002851 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002852 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002853
Jooyung Hanc87a0592020-03-02 17:44:33 +09002854 // APEX variant has __ANDROID_APEX__ defined
2855 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002856 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002857 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002858 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002859
2860 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002861 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002862 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2863 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002864}
Jiyong Park7e636d02019-01-28 16:16:54 +09002865
2866func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002867 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002868 apex {
2869 name: "myapex",
2870 key: "myapex.key",
2871 native_shared_libs: ["mylib"],
2872 }
2873
2874 apex_key {
2875 name: "myapex.key",
2876 public_key: "testkey.avbpubkey",
2877 private_key: "testkey.pem",
2878 }
2879
2880 cc_library_headers {
2881 name: "mylib_headers",
2882 export_include_dirs: ["my_include"],
2883 system_shared_libs: [],
2884 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002885 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002886 }
2887
2888 cc_library {
2889 name: "mylib",
2890 srcs: ["mylib.cpp"],
2891 system_shared_libs: [],
2892 stl: "none",
2893 header_libs: ["mylib_headers"],
2894 export_header_lib_headers: ["mylib_headers"],
2895 stubs: {
2896 versions: ["1", "2", "3"],
2897 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002898 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002899 }
2900
2901 cc_library {
2902 name: "otherlib",
2903 srcs: ["mylib.cpp"],
2904 system_shared_libs: [],
2905 stl: "none",
2906 shared_libs: ["mylib"],
2907 }
2908 `)
2909
Colin Cross7113d202019-11-20 16:39:12 -08002910 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002911
2912 // Ensure that the include path of the header lib is exported to 'otherlib'
2913 ensureContains(t, cFlags, "-Imy_include")
2914}
Alex Light9670d332019-01-29 18:07:33 -08002915
Jiyong Park7cd10e32020-01-14 09:22:18 +09002916type fileInApex struct {
2917 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002918 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002919 isLink bool
2920}
2921
Jooyung Hana57af4a2020-01-23 05:36:59 +00002922func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002923 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002924 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002925 copyCmds := apexRule.Args["copy_commands"]
2926 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002927 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002928 for _, cmd := range strings.Split(copyCmds, "&&") {
2929 cmd = strings.TrimSpace(cmd)
2930 if cmd == "" {
2931 continue
2932 }
2933 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002934 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002935 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002936 switch terms[0] {
2937 case "mkdir":
2938 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002939 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002940 t.Fatal("copyCmds contains invalid cp command", cmd)
2941 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002942 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002943 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002944 isLink = false
2945 case "ln":
2946 if len(terms) != 3 && len(terms) != 4 {
2947 // ln LINK TARGET or ln -s LINK TARGET
2948 t.Fatal("copyCmds contains invalid ln command", cmd)
2949 }
2950 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002951 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002952 isLink = true
2953 default:
2954 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2955 }
2956 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002957 index := strings.Index(dst, imageApexDir)
2958 if index == -1 {
2959 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2960 }
2961 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002962 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002963 }
2964 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002965 return ret
2966}
2967
Jooyung Hana57af4a2020-01-23 05:36:59 +00002968func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2969 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002970 var failed bool
2971 var surplus []string
2972 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002973 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002974 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002975 for _, expected := range files {
2976 if matched, _ := path.Match(expected, file.path); matched {
2977 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002978 mactchFound = true
2979 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002980 }
2981 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002982 if !mactchFound {
2983 surplus = append(surplus, file.path)
2984 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002985 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002986
Jooyung Han31c470b2019-10-18 16:26:59 +09002987 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002988 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002989 t.Log("surplus files", surplus)
2990 failed = true
2991 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002992
2993 if len(files) > len(filesMatched) {
2994 var missing []string
2995 for _, expected := range files {
2996 if !filesMatched[expected] {
2997 missing = append(missing, expected)
2998 }
2999 }
3000 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003001 t.Log("missing files", missing)
3002 failed = true
3003 }
3004 if failed {
3005 t.Fail()
3006 }
3007}
3008
Jooyung Han344d5432019-08-23 11:17:39 +09003009func TestVndkApexCurrent(t *testing.T) {
3010 ctx, _ := testApex(t, `
3011 apex_vndk {
3012 name: "myapex",
3013 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003014 }
3015
3016 apex_key {
3017 name: "myapex.key",
3018 public_key: "testkey.avbpubkey",
3019 private_key: "testkey.pem",
3020 }
3021
3022 cc_library {
3023 name: "libvndk",
3024 srcs: ["mylib.cpp"],
3025 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003026 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003027 vndk: {
3028 enabled: true,
3029 },
3030 system_shared_libs: [],
3031 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003032 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003033 }
3034
3035 cc_library {
3036 name: "libvndksp",
3037 srcs: ["mylib.cpp"],
3038 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003039 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003040 vndk: {
3041 enabled: true,
3042 support_system_process: true,
3043 },
3044 system_shared_libs: [],
3045 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003046 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003047 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003048 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003049
Jooyung Hana57af4a2020-01-23 05:36:59 +00003050 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003051 "lib/libvndk.so",
3052 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003053 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003054 "lib64/libvndk.so",
3055 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003056 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003057 "etc/llndk.libraries.VER.txt",
3058 "etc/vndkcore.libraries.VER.txt",
3059 "etc/vndksp.libraries.VER.txt",
3060 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003061 })
Jooyung Han344d5432019-08-23 11:17:39 +09003062}
3063
3064func TestVndkApexWithPrebuilt(t *testing.T) {
3065 ctx, _ := testApex(t, `
3066 apex_vndk {
3067 name: "myapex",
3068 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003069 }
3070
3071 apex_key {
3072 name: "myapex.key",
3073 public_key: "testkey.avbpubkey",
3074 private_key: "testkey.pem",
3075 }
3076
3077 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003078 name: "libvndk",
3079 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003080 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003081 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003082 vndk: {
3083 enabled: true,
3084 },
3085 system_shared_libs: [],
3086 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003087 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003088 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003089
3090 cc_prebuilt_library_shared {
3091 name: "libvndk.arm",
3092 srcs: ["libvndk.arm.so"],
3093 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003094 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003095 vndk: {
3096 enabled: true,
3097 },
3098 enabled: false,
3099 arch: {
3100 arm: {
3101 enabled: true,
3102 },
3103 },
3104 system_shared_libs: [],
3105 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003106 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003107 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003108 `+vndkLibrariesTxtFiles("current"),
3109 withFiles(map[string][]byte{
3110 "libvndk.so": nil,
3111 "libvndk.arm.so": nil,
3112 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003113
Jooyung Hana57af4a2020-01-23 05:36:59 +00003114 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003115 "lib/libvndk.so",
3116 "lib/libvndk.arm.so",
3117 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003118 "lib/libc++.so",
3119 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003120 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003121 })
Jooyung Han344d5432019-08-23 11:17:39 +09003122}
3123
Jooyung Han39edb6c2019-11-06 16:53:07 +09003124func vndkLibrariesTxtFiles(vers ...string) (result string) {
3125 for _, v := range vers {
3126 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003127 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003128 result += `
3129 vndk_libraries_txt {
3130 name: "` + txt + `.libraries.txt",
3131 }
3132 `
3133 }
3134 } else {
3135 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3136 result += `
3137 prebuilt_etc {
3138 name: "` + txt + `.libraries.` + v + `.txt",
3139 src: "dummy.txt",
3140 }
3141 `
3142 }
3143 }
3144 }
3145 return
3146}
3147
Jooyung Han344d5432019-08-23 11:17:39 +09003148func TestVndkApexVersion(t *testing.T) {
3149 ctx, _ := testApex(t, `
3150 apex_vndk {
3151 name: "myapex_v27",
3152 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003153 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003154 vndk_version: "27",
3155 }
3156
3157 apex_key {
3158 name: "myapex.key",
3159 public_key: "testkey.avbpubkey",
3160 private_key: "testkey.pem",
3161 }
3162
Jooyung Han31c470b2019-10-18 16:26:59 +09003163 vndk_prebuilt_shared {
3164 name: "libvndk27",
3165 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003166 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003167 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003168 vndk: {
3169 enabled: true,
3170 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003171 target_arch: "arm64",
3172 arch: {
3173 arm: {
3174 srcs: ["libvndk27_arm.so"],
3175 },
3176 arm64: {
3177 srcs: ["libvndk27_arm64.so"],
3178 },
3179 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003180 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003181 }
3182
3183 vndk_prebuilt_shared {
3184 name: "libvndk27",
3185 version: "27",
3186 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003187 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003188 vndk: {
3189 enabled: true,
3190 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003191 target_arch: "x86_64",
3192 arch: {
3193 x86: {
3194 srcs: ["libvndk27_x86.so"],
3195 },
3196 x86_64: {
3197 srcs: ["libvndk27_x86_64.so"],
3198 },
3199 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003200 }
3201 `+vndkLibrariesTxtFiles("27"),
3202 withFiles(map[string][]byte{
3203 "libvndk27_arm.so": nil,
3204 "libvndk27_arm64.so": nil,
3205 "libvndk27_x86.so": nil,
3206 "libvndk27_x86_64.so": nil,
3207 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003208
Jooyung Hana57af4a2020-01-23 05:36:59 +00003209 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003210 "lib/libvndk27_arm.so",
3211 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003212 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003213 })
Jooyung Han344d5432019-08-23 11:17:39 +09003214}
3215
3216func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3217 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3218 apex_vndk {
3219 name: "myapex_v27",
3220 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003221 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003222 vndk_version: "27",
3223 }
3224 apex_vndk {
3225 name: "myapex_v27_other",
3226 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003227 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003228 vndk_version: "27",
3229 }
3230
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }
3236
3237 cc_library {
3238 name: "libvndk",
3239 srcs: ["mylib.cpp"],
3240 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003241 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003242 vndk: {
3243 enabled: true,
3244 },
3245 system_shared_libs: [],
3246 stl: "none",
3247 }
3248
3249 vndk_prebuilt_shared {
3250 name: "libvndk",
3251 version: "27",
3252 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003253 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003254 vndk: {
3255 enabled: true,
3256 },
3257 srcs: ["libvndk.so"],
3258 }
3259 `, withFiles(map[string][]byte{
3260 "libvndk.so": nil,
3261 }))
3262}
3263
Jooyung Han90eee022019-10-01 20:02:42 +09003264func TestVndkApexNameRule(t *testing.T) {
3265 ctx, _ := testApex(t, `
3266 apex_vndk {
3267 name: "myapex",
3268 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003269 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003270 }
3271 apex_vndk {
3272 name: "myapex_v28",
3273 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003274 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003275 vndk_version: "28",
3276 }
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003281 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003282
3283 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003284 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003285 actual := proptools.String(bundle.properties.Apex_name)
3286 if !reflect.DeepEqual(actual, expected) {
3287 t.Errorf("Got '%v', expected '%v'", actual, expected)
3288 }
3289 }
3290
3291 assertApexName("com.android.vndk.vVER", "myapex")
3292 assertApexName("com.android.vndk.v28", "myapex_v28")
3293}
3294
Jooyung Han344d5432019-08-23 11:17:39 +09003295func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3296 ctx, _ := testApex(t, `
3297 apex_vndk {
3298 name: "myapex",
3299 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003300 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003301 }
3302
3303 apex_key {
3304 name: "myapex.key",
3305 public_key: "testkey.avbpubkey",
3306 private_key: "testkey.pem",
3307 }
3308
3309 cc_library {
3310 name: "libvndk",
3311 srcs: ["mylib.cpp"],
3312 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003313 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003314 native_bridge_supported: true,
3315 host_supported: true,
3316 vndk: {
3317 enabled: true,
3318 },
3319 system_shared_libs: [],
3320 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003321 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003322 }
Jooyung Han35155c42020-02-06 17:33:20 +09003323 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003324
Jooyung Hana57af4a2020-01-23 05:36:59 +00003325 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003326 "lib/libvndk.so",
3327 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003328 "lib/libc++.so",
3329 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003330 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003331 })
Jooyung Han344d5432019-08-23 11:17:39 +09003332}
3333
3334func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3335 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3336 apex_vndk {
3337 name: "myapex",
3338 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003339 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003340 native_bridge_supported: true,
3341 }
3342
3343 apex_key {
3344 name: "myapex.key",
3345 public_key: "testkey.avbpubkey",
3346 private_key: "testkey.pem",
3347 }
3348
3349 cc_library {
3350 name: "libvndk",
3351 srcs: ["mylib.cpp"],
3352 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003353 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003354 native_bridge_supported: true,
3355 host_supported: true,
3356 vndk: {
3357 enabled: true,
3358 },
3359 system_shared_libs: [],
3360 stl: "none",
3361 }
3362 `)
3363}
3364
Jooyung Han31c470b2019-10-18 16:26:59 +09003365func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003366 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003367 apex_vndk {
3368 name: "myapex_v27",
3369 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003370 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003371 vndk_version: "27",
3372 }
3373
3374 apex_key {
3375 name: "myapex.key",
3376 public_key: "testkey.avbpubkey",
3377 private_key: "testkey.pem",
3378 }
3379
3380 vndk_prebuilt_shared {
3381 name: "libvndk27",
3382 version: "27",
3383 target_arch: "arm",
3384 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003385 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003386 vndk: {
3387 enabled: true,
3388 },
3389 arch: {
3390 arm: {
3391 srcs: ["libvndk27.so"],
3392 }
3393 },
3394 }
3395
3396 vndk_prebuilt_shared {
3397 name: "libvndk27",
3398 version: "27",
3399 target_arch: "arm",
3400 binder32bit: true,
3401 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003402 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003403 vndk: {
3404 enabled: true,
3405 },
3406 arch: {
3407 arm: {
3408 srcs: ["libvndk27binder32.so"],
3409 }
3410 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003411 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003412 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003413 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003414 withFiles(map[string][]byte{
3415 "libvndk27.so": nil,
3416 "libvndk27binder32.so": nil,
3417 }),
3418 withBinder32bit,
3419 withTargets(map[android.OsType][]android.Target{
3420 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003421 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3422 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003423 },
3424 }),
3425 )
3426
Jooyung Hana57af4a2020-01-23 05:36:59 +00003427 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003428 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003429 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003430 })
3431}
3432
Jooyung Han45a96772020-06-15 14:59:42 +09003433func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3434 ctx, _ := testApex(t, `
3435 apex_vndk {
3436 name: "myapex",
3437 key: "myapex.key",
3438 file_contexts: ":myapex-file_contexts",
3439 }
3440
3441 apex_key {
3442 name: "myapex.key",
3443 public_key: "testkey.avbpubkey",
3444 private_key: "testkey.pem",
3445 }
3446
3447 cc_library {
3448 name: "libz",
3449 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003450 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003451 vndk: {
3452 enabled: true,
3453 },
3454 stubs: {
3455 symbol_file: "libz.map.txt",
3456 versions: ["30"],
3457 }
3458 }
3459 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3460 "libz.map.txt": nil,
3461 }))
3462
3463 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3464 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3465 ensureListEmpty(t, provideNativeLibs)
3466}
3467
Jooyung Hane1633032019-08-01 17:41:43 +09003468func TestDependenciesInApexManifest(t *testing.T) {
3469 ctx, _ := testApex(t, `
3470 apex {
3471 name: "myapex_nodep",
3472 key: "myapex.key",
3473 native_shared_libs: ["lib_nodep"],
3474 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003475 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003476 }
3477
3478 apex {
3479 name: "myapex_dep",
3480 key: "myapex.key",
3481 native_shared_libs: ["lib_dep"],
3482 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003483 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003484 }
3485
3486 apex {
3487 name: "myapex_provider",
3488 key: "myapex.key",
3489 native_shared_libs: ["libfoo"],
3490 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003491 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003492 }
3493
3494 apex {
3495 name: "myapex_selfcontained",
3496 key: "myapex.key",
3497 native_shared_libs: ["lib_dep", "libfoo"],
3498 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003499 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003500 }
3501
3502 apex_key {
3503 name: "myapex.key",
3504 public_key: "testkey.avbpubkey",
3505 private_key: "testkey.pem",
3506 }
3507
3508 cc_library {
3509 name: "lib_nodep",
3510 srcs: ["mylib.cpp"],
3511 system_shared_libs: [],
3512 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003513 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003514 }
3515
3516 cc_library {
3517 name: "lib_dep",
3518 srcs: ["mylib.cpp"],
3519 shared_libs: ["libfoo"],
3520 system_shared_libs: [],
3521 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003522 apex_available: [
3523 "myapex_dep",
3524 "myapex_provider",
3525 "myapex_selfcontained",
3526 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003527 }
3528
3529 cc_library {
3530 name: "libfoo",
3531 srcs: ["mytest.cpp"],
3532 stubs: {
3533 versions: ["1"],
3534 },
3535 system_shared_libs: [],
3536 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003537 apex_available: [
3538 "myapex_provider",
3539 "myapex_selfcontained",
3540 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003541 }
3542 `)
3543
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003544 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003545 var provideNativeLibs, requireNativeLibs []string
3546
Sundong Ahnabb64432019-10-22 13:58:29 +09003547 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003548 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3549 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003550 ensureListEmpty(t, provideNativeLibs)
3551 ensureListEmpty(t, requireNativeLibs)
3552
Sundong Ahnabb64432019-10-22 13:58:29 +09003553 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003554 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3555 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003556 ensureListEmpty(t, provideNativeLibs)
3557 ensureListContains(t, requireNativeLibs, "libfoo.so")
3558
Sundong Ahnabb64432019-10-22 13:58:29 +09003559 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003560 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3561 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003562 ensureListContains(t, provideNativeLibs, "libfoo.so")
3563 ensureListEmpty(t, requireNativeLibs)
3564
Sundong Ahnabb64432019-10-22 13:58:29 +09003565 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003566 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3567 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003568 ensureListContains(t, provideNativeLibs, "libfoo.so")
3569 ensureListEmpty(t, requireNativeLibs)
3570}
3571
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003572func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003573 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003574 apex {
3575 name: "myapex",
3576 key: "myapex.key",
3577 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003578 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003579 }
3580
3581 apex_key {
3582 name: "myapex.key",
3583 public_key: "testkey.avbpubkey",
3584 private_key: "testkey.pem",
3585 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003586
3587 cc_library {
3588 name: "mylib",
3589 srcs: ["mylib.cpp"],
3590 system_shared_libs: [],
3591 stl: "none",
3592 apex_available: [
3593 "//apex_available:platform",
3594 "myapex",
3595 ],
3596 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003597 `)
3598
Sundong Ahnabb64432019-10-22 13:58:29 +09003599 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003600 apexManifestRule := module.Rule("apexManifestRule")
3601 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3602 apexRule := module.Rule("apexRule")
3603 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003604
3605 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3606 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3607 name := apexBundle.BaseModuleName()
3608 prefix := "TARGET_"
3609 var builder strings.Builder
3610 data.Custom(&builder, name, prefix, "", data)
3611 androidMk := builder.String()
3612 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3613 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003614}
3615
Alex Light0851b882019-02-07 13:20:53 -08003616func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003617 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003618 apex {
3619 name: "myapex",
3620 key: "myapex.key",
3621 native_shared_libs: ["mylib_common"],
3622 }
3623
3624 apex_key {
3625 name: "myapex.key",
3626 public_key: "testkey.avbpubkey",
3627 private_key: "testkey.pem",
3628 }
3629
3630 cc_library {
3631 name: "mylib_common",
3632 srcs: ["mylib.cpp"],
3633 system_shared_libs: [],
3634 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003635 apex_available: [
3636 "//apex_available:platform",
3637 "myapex",
3638 ],
Alex Light0851b882019-02-07 13:20:53 -08003639 }
3640 `)
3641
Sundong Ahnabb64432019-10-22 13:58:29 +09003642 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003643 apexRule := module.Rule("apexRule")
3644 copyCmds := apexRule.Args["copy_commands"]
3645
3646 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3647 t.Log("Apex was a test apex!")
3648 t.Fail()
3649 }
3650 // Ensure that main rule creates an output
3651 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3652
3653 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003654 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003655
3656 // Ensure that both direct and indirect deps are copied into apex
3657 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3658
Colin Cross7113d202019-11-20 16:39:12 -08003659 // Ensure that the platform variant ends with _shared
3660 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003661
Colin Cross56a83212020-09-15 18:30:11 -07003662 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003663 t.Log("Found mylib_common not in any apex!")
3664 t.Fail()
3665 }
3666}
3667
3668func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003669 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003670 apex_test {
3671 name: "myapex",
3672 key: "myapex.key",
3673 native_shared_libs: ["mylib_common_test"],
3674 }
3675
3676 apex_key {
3677 name: "myapex.key",
3678 public_key: "testkey.avbpubkey",
3679 private_key: "testkey.pem",
3680 }
3681
3682 cc_library {
3683 name: "mylib_common_test",
3684 srcs: ["mylib.cpp"],
3685 system_shared_libs: [],
3686 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003687 // TODO: remove //apex_available:platform
3688 apex_available: [
3689 "//apex_available:platform",
3690 "myapex",
3691 ],
Alex Light0851b882019-02-07 13:20:53 -08003692 }
3693 `)
3694
Sundong Ahnabb64432019-10-22 13:58:29 +09003695 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003696 apexRule := module.Rule("apexRule")
3697 copyCmds := apexRule.Args["copy_commands"]
3698
3699 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3700 t.Log("Apex was not a test apex!")
3701 t.Fail()
3702 }
3703 // Ensure that main rule creates an output
3704 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3705
3706 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003707 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003708
3709 // Ensure that both direct and indirect deps are copied into apex
3710 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3711
Colin Cross7113d202019-11-20 16:39:12 -08003712 // Ensure that the platform variant ends with _shared
3713 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003714}
3715
Alex Light9670d332019-01-29 18:07:33 -08003716func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003717 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003718 apex {
3719 name: "myapex",
3720 key: "myapex.key",
3721 multilib: {
3722 first: {
3723 native_shared_libs: ["mylib_common"],
3724 }
3725 },
3726 target: {
3727 android: {
3728 multilib: {
3729 first: {
3730 native_shared_libs: ["mylib"],
3731 }
3732 }
3733 },
3734 host: {
3735 multilib: {
3736 first: {
3737 native_shared_libs: ["mylib2"],
3738 }
3739 }
3740 }
3741 }
3742 }
3743
3744 apex_key {
3745 name: "myapex.key",
3746 public_key: "testkey.avbpubkey",
3747 private_key: "testkey.pem",
3748 }
3749
3750 cc_library {
3751 name: "mylib",
3752 srcs: ["mylib.cpp"],
3753 system_shared_libs: [],
3754 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003755 // TODO: remove //apex_available:platform
3756 apex_available: [
3757 "//apex_available:platform",
3758 "myapex",
3759 ],
Alex Light9670d332019-01-29 18:07:33 -08003760 }
3761
3762 cc_library {
3763 name: "mylib_common",
3764 srcs: ["mylib.cpp"],
3765 system_shared_libs: [],
3766 stl: "none",
3767 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003768 // TODO: remove //apex_available:platform
3769 apex_available: [
3770 "//apex_available:platform",
3771 "myapex",
3772 ],
Alex Light9670d332019-01-29 18:07:33 -08003773 }
3774
3775 cc_library {
3776 name: "mylib2",
3777 srcs: ["mylib.cpp"],
3778 system_shared_libs: [],
3779 stl: "none",
3780 compile_multilib: "first",
3781 }
3782 `)
3783
Sundong Ahnabb64432019-10-22 13:58:29 +09003784 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003785 copyCmds := apexRule.Args["copy_commands"]
3786
3787 // Ensure that main rule creates an output
3788 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3789
3790 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003791 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3792 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3793 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003794
3795 // Ensure that both direct and indirect deps are copied into apex
3796 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3797 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3798 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3799
Colin Cross7113d202019-11-20 16:39:12 -08003800 // Ensure that the platform variant ends with _shared
3801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3802 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3803 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003804}
Jiyong Park04480cf2019-02-06 00:16:29 +09003805
3806func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003807 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003808 apex {
3809 name: "myapex",
3810 key: "myapex.key",
3811 binaries: ["myscript"],
3812 }
3813
3814 apex_key {
3815 name: "myapex.key",
3816 public_key: "testkey.avbpubkey",
3817 private_key: "testkey.pem",
3818 }
3819
3820 sh_binary {
3821 name: "myscript",
3822 src: "mylib.cpp",
3823 filename: "myscript.sh",
3824 sub_dir: "script",
3825 }
3826 `)
3827
Sundong Ahnabb64432019-10-22 13:58:29 +09003828 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003829 copyCmds := apexRule.Args["copy_commands"]
3830
3831 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3832}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003833
Jooyung Han91df2082019-11-20 01:49:42 +09003834func TestApexInVariousPartition(t *testing.T) {
3835 testcases := []struct {
3836 propName, parition, flattenedPartition string
3837 }{
3838 {"", "system", "system_ext"},
3839 {"product_specific: true", "product", "product"},
3840 {"soc_specific: true", "vendor", "vendor"},
3841 {"proprietary: true", "vendor", "vendor"},
3842 {"vendor: true", "vendor", "vendor"},
3843 {"system_ext_specific: true", "system_ext", "system_ext"},
3844 }
3845 for _, tc := range testcases {
3846 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3847 ctx, _ := testApex(t, `
3848 apex {
3849 name: "myapex",
3850 key: "myapex.key",
3851 `+tc.propName+`
3852 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003853
Jooyung Han91df2082019-11-20 01:49:42 +09003854 apex_key {
3855 name: "myapex.key",
3856 public_key: "testkey.avbpubkey",
3857 private_key: "testkey.pem",
3858 }
3859 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003860
Jooyung Han91df2082019-11-20 01:49:42 +09003861 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3862 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3863 actual := apex.installDir.String()
3864 if actual != expected {
3865 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3866 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003867
Jooyung Han91df2082019-11-20 01:49:42 +09003868 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3869 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3870 actual = flattened.installDir.String()
3871 if actual != expected {
3872 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3873 }
3874 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003875 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003876}
Jiyong Park67882562019-03-21 01:11:21 +09003877
Jooyung Han580eb4f2020-06-24 19:33:06 +09003878func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003879 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003880 apex {
3881 name: "myapex",
3882 key: "myapex.key",
3883 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003884
Jooyung Han580eb4f2020-06-24 19:33:06 +09003885 apex_key {
3886 name: "myapex.key",
3887 public_key: "testkey.avbpubkey",
3888 private_key: "testkey.pem",
3889 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003890 `)
3891 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003892 rule := module.Output("file_contexts")
3893 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3894}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003895
Jooyung Han580eb4f2020-06-24 19:33:06 +09003896func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003897 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003898 apex {
3899 name: "myapex",
3900 key: "myapex.key",
3901 file_contexts: "my_own_file_contexts",
3902 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003903
Jooyung Han580eb4f2020-06-24 19:33:06 +09003904 apex_key {
3905 name: "myapex.key",
3906 public_key: "testkey.avbpubkey",
3907 private_key: "testkey.pem",
3908 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003909 `, withFiles(map[string][]byte{
3910 "my_own_file_contexts": nil,
3911 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003912}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003913
Jooyung Han580eb4f2020-06-24 19:33:06 +09003914func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003915 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003916 apex {
3917 name: "myapex",
3918 key: "myapex.key",
3919 product_specific: true,
3920 file_contexts: "product_specific_file_contexts",
3921 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003922
Jooyung Han580eb4f2020-06-24 19:33:06 +09003923 apex_key {
3924 name: "myapex.key",
3925 public_key: "testkey.avbpubkey",
3926 private_key: "testkey.pem",
3927 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003928 `)
3929
Jooyung Han580eb4f2020-06-24 19:33:06 +09003930 ctx, _ := testApex(t, `
3931 apex {
3932 name: "myapex",
3933 key: "myapex.key",
3934 product_specific: true,
3935 file_contexts: "product_specific_file_contexts",
3936 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003937
Jooyung Han580eb4f2020-06-24 19:33:06 +09003938 apex_key {
3939 name: "myapex.key",
3940 public_key: "testkey.avbpubkey",
3941 private_key: "testkey.pem",
3942 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003943 `, withFiles(map[string][]byte{
3944 "product_specific_file_contexts": nil,
3945 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003946 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3947 rule := module.Output("file_contexts")
3948 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3949}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003950
Jooyung Han580eb4f2020-06-24 19:33:06 +09003951func TestFileContexts_SetViaFileGroup(t *testing.T) {
3952 ctx, _ := testApex(t, `
3953 apex {
3954 name: "myapex",
3955 key: "myapex.key",
3956 product_specific: true,
3957 file_contexts: ":my-file-contexts",
3958 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003959
Jooyung Han580eb4f2020-06-24 19:33:06 +09003960 apex_key {
3961 name: "myapex.key",
3962 public_key: "testkey.avbpubkey",
3963 private_key: "testkey.pem",
3964 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003965
Jooyung Han580eb4f2020-06-24 19:33:06 +09003966 filegroup {
3967 name: "my-file-contexts",
3968 srcs: ["product_specific_file_contexts"],
3969 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003970 `, withFiles(map[string][]byte{
3971 "product_specific_file_contexts": nil,
3972 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003973 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3974 rule := module.Output("file_contexts")
3975 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003976}
3977
Jiyong Park67882562019-03-21 01:11:21 +09003978func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003979 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003980 apex_key {
3981 name: "myapex.key",
3982 public_key: ":my.avbpubkey",
3983 private_key: ":my.pem",
3984 product_specific: true,
3985 }
3986
3987 filegroup {
3988 name: "my.avbpubkey",
3989 srcs: ["testkey2.avbpubkey"],
3990 }
3991
3992 filegroup {
3993 name: "my.pem",
3994 srcs: ["testkey2.pem"],
3995 }
3996 `)
3997
3998 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3999 expected_pubkey := "testkey2.avbpubkey"
4000 actual_pubkey := apex_key.public_key_file.String()
4001 if actual_pubkey != expected_pubkey {
4002 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4003 }
4004 expected_privkey := "testkey2.pem"
4005 actual_privkey := apex_key.private_key_file.String()
4006 if actual_privkey != expected_privkey {
4007 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4008 }
4009}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004010
4011func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004012 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004013 prebuilt_apex {
4014 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004015 arch: {
4016 arm64: {
4017 src: "myapex-arm64.apex",
4018 },
4019 arm: {
4020 src: "myapex-arm.apex",
4021 },
4022 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004023 }
4024 `)
4025
4026 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4027
Jiyong Parkc95714e2019-03-29 14:23:10 +09004028 expectedInput := "myapex-arm64.apex"
4029 if prebuilt.inputApex.String() != expectedInput {
4030 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4031 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004032}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004033
4034func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004035 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004036 prebuilt_apex {
4037 name: "myapex",
4038 src: "myapex-arm.apex",
4039 filename: "notmyapex.apex",
4040 }
4041 `)
4042
4043 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4044
4045 expected := "notmyapex.apex"
4046 if p.installFilename != expected {
4047 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4048 }
4049}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004050
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004051func TestPrebuiltOverrides(t *testing.T) {
4052 ctx, config := testApex(t, `
4053 prebuilt_apex {
4054 name: "myapex.prebuilt",
4055 src: "myapex-arm.apex",
4056 overrides: [
4057 "myapex",
4058 ],
4059 }
4060 `)
4061
4062 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4063
4064 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004065 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004066 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004067 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004068 }
4069}
4070
Roland Levillain630846d2019-06-26 12:48:34 +01004071func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004072 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004073 apex_test {
4074 name: "myapex",
4075 key: "myapex.key",
4076 tests: [
4077 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004078 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004079 ],
4080 }
4081
4082 apex_key {
4083 name: "myapex.key",
4084 public_key: "testkey.avbpubkey",
4085 private_key: "testkey.pem",
4086 }
4087
Liz Kammer1c14a212020-05-12 15:26:55 -07004088 filegroup {
4089 name: "fg",
4090 srcs: [
4091 "baz",
4092 "bar/baz"
4093 ],
4094 }
4095
Roland Levillain630846d2019-06-26 12:48:34 +01004096 cc_test {
4097 name: "mytest",
4098 gtest: false,
4099 srcs: ["mytest.cpp"],
4100 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004101 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004102 system_shared_libs: [],
4103 static_executable: true,
4104 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004105 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004106 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004107
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004108 cc_library {
4109 name: "mylib",
4110 srcs: ["mylib.cpp"],
4111 system_shared_libs: [],
4112 stl: "none",
4113 }
4114
Liz Kammer5bd365f2020-05-27 15:15:11 -07004115 filegroup {
4116 name: "fg2",
4117 srcs: [
4118 "testdata/baz"
4119 ],
4120 }
4121
Roland Levillain9b5fde92019-06-28 15:41:19 +01004122 cc_test {
4123 name: "mytests",
4124 gtest: false,
4125 srcs: [
4126 "mytest1.cpp",
4127 "mytest2.cpp",
4128 "mytest3.cpp",
4129 ],
4130 test_per_src: true,
4131 relative_install_path: "test",
4132 system_shared_libs: [],
4133 static_executable: true,
4134 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004135 data: [
4136 ":fg",
4137 ":fg2",
4138 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004139 }
Roland Levillain630846d2019-06-26 12:48:34 +01004140 `)
4141
Sundong Ahnabb64432019-10-22 13:58:29 +09004142 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004143 copyCmds := apexRule.Args["copy_commands"]
4144
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004145 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004146 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004147 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004148
Liz Kammer1c14a212020-05-12 15:26:55 -07004149 //Ensure that test data are copied into apex.
4150 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4151 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4152
Roland Levillain9b5fde92019-06-28 15:41:19 +01004153 // Ensure that test deps built with `test_per_src` are copied into apex.
4154 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4155 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4156 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004157
4158 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004159 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4160 data := android.AndroidMkDataForTest(t, config, "", bundle)
4161 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004162 prefix := "TARGET_"
4163 var builder strings.Builder
4164 data.Custom(&builder, name, prefix, "", data)
4165 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004166 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4167 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4168 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4169 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004170 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004171 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004172 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004173
4174 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4175 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4176 data.Custom(&builder, name, prefix, "", data)
4177 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004178 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4179 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004180}
4181
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004182func TestInstallExtraFlattenedApexes(t *testing.T) {
4183 ctx, config := testApex(t, `
4184 apex {
4185 name: "myapex",
4186 key: "myapex.key",
4187 }
4188 apex_key {
4189 name: "myapex.key",
4190 public_key: "testkey.avbpubkey",
4191 private_key: "testkey.pem",
4192 }
4193 `, func(fs map[string][]byte, config android.Config) {
4194 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4195 })
4196 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004197 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004198 mk := android.AndroidMkDataForTest(t, config, "", ab)
4199 var builder strings.Builder
4200 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4201 androidMk := builder.String()
4202 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4203}
4204
Jooyung Han5c998b92019-06-27 11:30:33 +09004205func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004206 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004207 apex {
4208 name: "myapex",
4209 key: "myapex.key",
4210 native_shared_libs: ["mylib"],
4211 uses: ["commonapex"],
4212 }
4213
4214 apex {
4215 name: "commonapex",
4216 key: "myapex.key",
4217 native_shared_libs: ["libcommon"],
4218 provide_cpp_shared_libs: true,
4219 }
4220
4221 apex_key {
4222 name: "myapex.key",
4223 public_key: "testkey.avbpubkey",
4224 private_key: "testkey.pem",
4225 }
4226
4227 cc_library {
4228 name: "mylib",
4229 srcs: ["mylib.cpp"],
4230 shared_libs: ["libcommon"],
4231 system_shared_libs: [],
4232 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004234 }
4235
4236 cc_library {
4237 name: "libcommon",
4238 srcs: ["mylib_common.cpp"],
4239 system_shared_libs: [],
4240 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004241 // TODO: remove //apex_available:platform
4242 apex_available: [
4243 "//apex_available:platform",
4244 "commonapex",
4245 "myapex",
4246 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004247 }
4248 `)
4249
Sundong Ahnabb64432019-10-22 13:58:29 +09004250 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004251 apexRule1 := module1.Rule("apexRule")
4252 copyCmds1 := apexRule1.Args["copy_commands"]
4253
Sundong Ahnabb64432019-10-22 13:58:29 +09004254 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004255 apexRule2 := module2.Rule("apexRule")
4256 copyCmds2 := apexRule2.Args["copy_commands"]
4257
Colin Crossaede88c2020-08-11 12:17:01 -07004258 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4259 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004260 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4261 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4262 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4263}
4264
4265func TestApexUsesFailsIfNotProvided(t *testing.T) {
4266 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4267 apex {
4268 name: "myapex",
4269 key: "myapex.key",
4270 uses: ["commonapex"],
4271 }
4272
4273 apex {
4274 name: "commonapex",
4275 key: "myapex.key",
4276 }
4277
4278 apex_key {
4279 name: "myapex.key",
4280 public_key: "testkey.avbpubkey",
4281 private_key: "testkey.pem",
4282 }
4283 `)
4284 testApexError(t, `uses: "commonapex" is not a provider`, `
4285 apex {
4286 name: "myapex",
4287 key: "myapex.key",
4288 uses: ["commonapex"],
4289 }
4290
4291 cc_library {
4292 name: "commonapex",
4293 system_shared_libs: [],
4294 stl: "none",
4295 }
4296
4297 apex_key {
4298 name: "myapex.key",
4299 public_key: "testkey.avbpubkey",
4300 private_key: "testkey.pem",
4301 }
4302 `)
4303}
4304
4305func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4306 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4307 apex {
4308 name: "myapex",
4309 key: "myapex.key",
4310 use_vendor: true,
4311 uses: ["commonapex"],
4312 }
4313
4314 apex {
4315 name: "commonapex",
4316 key: "myapex.key",
4317 provide_cpp_shared_libs: true,
4318 }
4319
4320 apex_key {
4321 name: "myapex.key",
4322 public_key: "testkey.avbpubkey",
4323 private_key: "testkey.pem",
4324 }
Jooyung Handc782442019-11-01 03:14:38 +09004325 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004326 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004327 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004328}
4329
Jooyung Hand48f3c32019-08-23 11:18:57 +09004330func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4331 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4332 apex {
4333 name: "myapex",
4334 key: "myapex.key",
4335 native_shared_libs: ["libfoo"],
4336 }
4337
4338 apex_key {
4339 name: "myapex.key",
4340 public_key: "testkey.avbpubkey",
4341 private_key: "testkey.pem",
4342 }
4343
4344 cc_library {
4345 name: "libfoo",
4346 stl: "none",
4347 system_shared_libs: [],
4348 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004349 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004350 }
4351 `)
4352 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4353 apex {
4354 name: "myapex",
4355 key: "myapex.key",
4356 java_libs: ["myjar"],
4357 }
4358
4359 apex_key {
4360 name: "myapex.key",
4361 public_key: "testkey.avbpubkey",
4362 private_key: "testkey.pem",
4363 }
4364
4365 java_library {
4366 name: "myjar",
4367 srcs: ["foo/bar/MyClass.java"],
4368 sdk_version: "none",
4369 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004370 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004371 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004372 }
4373 `)
4374}
4375
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004376func TestApexWithApps(t *testing.T) {
4377 ctx, _ := testApex(t, `
4378 apex {
4379 name: "myapex",
4380 key: "myapex.key",
4381 apps: [
4382 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004383 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004384 ],
4385 }
4386
4387 apex_key {
4388 name: "myapex.key",
4389 public_key: "testkey.avbpubkey",
4390 private_key: "testkey.pem",
4391 }
4392
4393 android_app {
4394 name: "AppFoo",
4395 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004396 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004397 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004398 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004399 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004400 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004401 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004402
4403 android_app {
4404 name: "AppFooPriv",
4405 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004406 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004407 system_modules: "none",
4408 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004409 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004410 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004411 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004412
4413 cc_library_shared {
4414 name: "libjni",
4415 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004416 shared_libs: ["libfoo"],
4417 stl: "none",
4418 system_shared_libs: [],
4419 apex_available: [ "myapex" ],
4420 sdk_version: "current",
4421 }
4422
4423 cc_library_shared {
4424 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004425 stl: "none",
4426 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004427 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004428 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004429 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004430 `)
4431
Sundong Ahnabb64432019-10-22 13:58:29 +09004432 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004433 apexRule := module.Rule("apexRule")
4434 copyCmds := apexRule.Args["copy_commands"]
4435
4436 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004437 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004438
Colin Crossaede88c2020-08-11 12:17:01 -07004439 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004440 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004441 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004442 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004443 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004444 // JNI libraries including transitive deps are
4445 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004446 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004447 // ... embedded inside APK (jnilibs.zip)
4448 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4449 // ... and not directly inside the APEX
4450 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4451 }
Dario Frenicde2a032019-10-27 00:29:22 +01004452}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004453
Dario Frenicde2a032019-10-27 00:29:22 +01004454func TestApexWithAppImports(t *testing.T) {
4455 ctx, _ := testApex(t, `
4456 apex {
4457 name: "myapex",
4458 key: "myapex.key",
4459 apps: [
4460 "AppFooPrebuilt",
4461 "AppFooPrivPrebuilt",
4462 ],
4463 }
4464
4465 apex_key {
4466 name: "myapex.key",
4467 public_key: "testkey.avbpubkey",
4468 private_key: "testkey.pem",
4469 }
4470
4471 android_app_import {
4472 name: "AppFooPrebuilt",
4473 apk: "PrebuiltAppFoo.apk",
4474 presigned: true,
4475 dex_preopt: {
4476 enabled: false,
4477 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004478 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004479 }
4480
4481 android_app_import {
4482 name: "AppFooPrivPrebuilt",
4483 apk: "PrebuiltAppFooPriv.apk",
4484 privileged: true,
4485 presigned: true,
4486 dex_preopt: {
4487 enabled: false,
4488 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004489 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004490 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004491 }
4492 `)
4493
Sundong Ahnabb64432019-10-22 13:58:29 +09004494 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004495 apexRule := module.Rule("apexRule")
4496 copyCmds := apexRule.Args["copy_commands"]
4497
4498 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004499 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4500}
4501
4502func TestApexWithAppImportsPrefer(t *testing.T) {
4503 ctx, _ := testApex(t, `
4504 apex {
4505 name: "myapex",
4506 key: "myapex.key",
4507 apps: [
4508 "AppFoo",
4509 ],
4510 }
4511
4512 apex_key {
4513 name: "myapex.key",
4514 public_key: "testkey.avbpubkey",
4515 private_key: "testkey.pem",
4516 }
4517
4518 android_app {
4519 name: "AppFoo",
4520 srcs: ["foo/bar/MyClass.java"],
4521 sdk_version: "none",
4522 system_modules: "none",
4523 apex_available: [ "myapex" ],
4524 }
4525
4526 android_app_import {
4527 name: "AppFoo",
4528 apk: "AppFooPrebuilt.apk",
4529 filename: "AppFooPrebuilt.apk",
4530 presigned: true,
4531 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004532 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004533 }
4534 `, withFiles(map[string][]byte{
4535 "AppFooPrebuilt.apk": nil,
4536 }))
4537
4538 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4539 "app/AppFoo/AppFooPrebuilt.apk",
4540 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004541}
4542
Dario Freni6f3937c2019-12-20 22:58:03 +00004543func TestApexWithTestHelperApp(t *testing.T) {
4544 ctx, _ := testApex(t, `
4545 apex {
4546 name: "myapex",
4547 key: "myapex.key",
4548 apps: [
4549 "TesterHelpAppFoo",
4550 ],
4551 }
4552
4553 apex_key {
4554 name: "myapex.key",
4555 public_key: "testkey.avbpubkey",
4556 private_key: "testkey.pem",
4557 }
4558
4559 android_test_helper_app {
4560 name: "TesterHelpAppFoo",
4561 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004562 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004563 }
4564
4565 `)
4566
4567 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4568 apexRule := module.Rule("apexRule")
4569 copyCmds := apexRule.Args["copy_commands"]
4570
4571 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4572}
4573
Jooyung Han18020ea2019-11-13 10:50:48 +09004574func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4575 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004576 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004577 apex {
4578 name: "myapex",
4579 key: "myapex.key",
4580 native_shared_libs: ["libfoo"],
4581 }
4582
4583 apex_key {
4584 name: "myapex.key",
4585 public_key: "testkey.avbpubkey",
4586 private_key: "testkey.pem",
4587 }
4588
4589 apex {
4590 name: "otherapex",
4591 key: "myapex.key",
4592 native_shared_libs: ["libfoo"],
4593 }
4594
4595 cc_defaults {
4596 name: "libfoo-defaults",
4597 apex_available: ["otherapex"],
4598 }
4599
4600 cc_library {
4601 name: "libfoo",
4602 defaults: ["libfoo-defaults"],
4603 stl: "none",
4604 system_shared_libs: [],
4605 }`)
4606}
4607
Paul Duffine52e66f2020-03-30 17:54:29 +01004608func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004609 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004610 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004611 apex {
4612 name: "myapex",
4613 key: "myapex.key",
4614 native_shared_libs: ["libfoo"],
4615 }
4616
4617 apex_key {
4618 name: "myapex.key",
4619 public_key: "testkey.avbpubkey",
4620 private_key: "testkey.pem",
4621 }
4622
4623 apex {
4624 name: "otherapex",
4625 key: "otherapex.key",
4626 native_shared_libs: ["libfoo"],
4627 }
4628
4629 apex_key {
4630 name: "otherapex.key",
4631 public_key: "testkey.avbpubkey",
4632 private_key: "testkey.pem",
4633 }
4634
4635 cc_library {
4636 name: "libfoo",
4637 stl: "none",
4638 system_shared_libs: [],
4639 apex_available: ["otherapex"],
4640 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004641}
Jiyong Park127b40b2019-09-30 16:04:35 +09004642
Paul Duffine52e66f2020-03-30 17:54:29 +01004643func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004644 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004645 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004646.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004647.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004648.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004649.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004650.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004651.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004652 apex {
4653 name: "myapex",
4654 key: "myapex.key",
4655 native_shared_libs: ["libfoo"],
4656 }
4657
4658 apex_key {
4659 name: "myapex.key",
4660 public_key: "testkey.avbpubkey",
4661 private_key: "testkey.pem",
4662 }
4663
Jiyong Park127b40b2019-09-30 16:04:35 +09004664 cc_library {
4665 name: "libfoo",
4666 stl: "none",
4667 shared_libs: ["libbar"],
4668 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004669 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004670 }
4671
4672 cc_library {
4673 name: "libbar",
4674 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004675 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004676 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004677 apex_available: ["myapex"],
4678 }
4679
4680 cc_library {
4681 name: "libbaz",
4682 stl: "none",
4683 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004684 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004685}
Jiyong Park127b40b2019-09-30 16:04:35 +09004686
Paul Duffine52e66f2020-03-30 17:54:29 +01004687func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004688 testApexError(t, "\"otherapex\" is not a valid module name", `
4689 apex {
4690 name: "myapex",
4691 key: "myapex.key",
4692 native_shared_libs: ["libfoo"],
4693 }
4694
4695 apex_key {
4696 name: "myapex.key",
4697 public_key: "testkey.avbpubkey",
4698 private_key: "testkey.pem",
4699 }
4700
4701 cc_library {
4702 name: "libfoo",
4703 stl: "none",
4704 system_shared_libs: [],
4705 apex_available: ["otherapex"],
4706 }`)
4707
Paul Duffine52e66f2020-03-30 17:54:29 +01004708 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004709 apex {
4710 name: "myapex",
4711 key: "myapex.key",
4712 native_shared_libs: ["libfoo", "libbar"],
4713 }
4714
4715 apex_key {
4716 name: "myapex.key",
4717 public_key: "testkey.avbpubkey",
4718 private_key: "testkey.pem",
4719 }
4720
4721 cc_library {
4722 name: "libfoo",
4723 stl: "none",
4724 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004725 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004726 apex_available: ["myapex"],
4727 }
4728
4729 cc_library {
4730 name: "libbar",
4731 stl: "none",
4732 system_shared_libs: [],
4733 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004734 }
4735
4736 cc_library {
4737 name: "libbaz",
4738 stl: "none",
4739 system_shared_libs: [],
4740 stubs: {
4741 versions: ["10", "20", "30"],
4742 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004743 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004744}
Jiyong Park127b40b2019-09-30 16:04:35 +09004745
Jiyong Park89e850a2020-04-07 16:37:39 +09004746func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004747 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004748 apex {
4749 name: "myapex",
4750 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004751 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004752 }
4753
4754 apex_key {
4755 name: "myapex.key",
4756 public_key: "testkey.avbpubkey",
4757 private_key: "testkey.pem",
4758 }
4759
4760 cc_library {
4761 name: "libfoo",
4762 stl: "none",
4763 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004764 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004765 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004766 }
4767
4768 cc_library {
4769 name: "libfoo2",
4770 stl: "none",
4771 system_shared_libs: [],
4772 shared_libs: ["libbaz"],
4773 apex_available: ["//apex_available:platform"],
4774 }
4775
4776 cc_library {
4777 name: "libbar",
4778 stl: "none",
4779 system_shared_libs: [],
4780 apex_available: ["myapex"],
4781 }
4782
4783 cc_library {
4784 name: "libbaz",
4785 stl: "none",
4786 system_shared_libs: [],
4787 apex_available: ["myapex"],
4788 stubs: {
4789 versions: ["1"],
4790 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004791 }`)
4792
Jiyong Park89e850a2020-04-07 16:37:39 +09004793 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4794 // because it depends on libbar which isn't available to platform
4795 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4796 if libfoo.NotAvailableForPlatform() != true {
4797 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4798 }
4799
4800 // libfoo2 however can be available to platform because it depends on libbaz which provides
4801 // stubs
4802 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4803 if libfoo2.NotAvailableForPlatform() == true {
4804 t.Errorf("%q should be available to platform", libfoo2.String())
4805 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004806}
Jiyong Parka90ca002019-10-07 15:47:24 +09004807
Paul Duffine52e66f2020-03-30 17:54:29 +01004808func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004809 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004810 apex {
4811 name: "myapex",
4812 key: "myapex.key",
4813 native_shared_libs: ["libfoo"],
4814 }
4815
4816 apex_key {
4817 name: "myapex.key",
4818 public_key: "testkey.avbpubkey",
4819 private_key: "testkey.pem",
4820 }
4821
4822 cc_library {
4823 name: "libfoo",
4824 stl: "none",
4825 system_shared_libs: [],
4826 apex_available: ["myapex"],
4827 static: {
4828 apex_available: ["//apex_available:platform"],
4829 },
4830 }`)
4831
Jiyong Park89e850a2020-04-07 16:37:39 +09004832 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4833 if libfooShared.NotAvailableForPlatform() != true {
4834 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4835 }
4836 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4837 if libfooStatic.NotAvailableForPlatform() != false {
4838 t.Errorf("%q should be available to platform", libfooStatic.String())
4839 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004840}
4841
Jiyong Park5d790c32019-11-15 18:40:32 +09004842func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004843 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004844 apex {
4845 name: "myapex",
4846 key: "myapex.key",
4847 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004848 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004849 }
4850
4851 override_apex {
4852 name: "override_myapex",
4853 base: "myapex",
4854 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004855 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004856 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004857 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004858 }
4859
4860 apex_key {
4861 name: "myapex.key",
4862 public_key: "testkey.avbpubkey",
4863 private_key: "testkey.pem",
4864 }
4865
4866 android_app {
4867 name: "app",
4868 srcs: ["foo/bar/MyClass.java"],
4869 package_name: "foo",
4870 sdk_version: "none",
4871 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004872 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004873 }
4874
4875 override_android_app {
4876 name: "override_app",
4877 base: "app",
4878 package_name: "bar",
4879 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004880 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004881
Jiyong Park317645e2019-12-05 13:20:58 +09004882 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4883 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4884 if originalVariant.GetOverriddenBy() != "" {
4885 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4886 }
4887 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4888 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4889 }
4890
Jiyong Park5d790c32019-11-15 18:40:32 +09004891 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4892 apexRule := module.Rule("apexRule")
4893 copyCmds := apexRule.Args["copy_commands"]
4894
4895 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004896 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004897
4898 apexBundle := module.Module().(*apexBundle)
4899 name := apexBundle.Name()
4900 if name != "override_myapex" {
4901 t.Errorf("name should be \"override_myapex\", but was %q", name)
4902 }
4903
Baligh Uddin004d7172020-02-19 21:29:28 -08004904 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4905 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4906 }
4907
Jiyong Park20bacab2020-03-03 11:45:41 +09004908 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004909 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004910
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004911 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4912 var builder strings.Builder
4913 data.Custom(&builder, name, "TARGET_", "", data)
4914 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004915 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004916 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4917 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004918 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004919 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004920 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004921 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4922 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004923}
4924
Jooyung Han214bf372019-11-12 13:03:50 +09004925func TestLegacyAndroid10Support(t *testing.T) {
4926 ctx, _ := testApex(t, `
4927 apex {
4928 name: "myapex",
4929 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004930 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004931 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004932 }
4933
4934 apex_key {
4935 name: "myapex.key",
4936 public_key: "testkey.avbpubkey",
4937 private_key: "testkey.pem",
4938 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004939
4940 cc_library {
4941 name: "mylib",
4942 srcs: ["mylib.cpp"],
4943 stl: "libc++",
4944 system_shared_libs: [],
4945 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004946 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004947 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004948 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004949
4950 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4951 args := module.Rule("apexRule").Args
4952 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004953 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004954
4955 // The copies of the libraries in the apex should have one more dependency than
4956 // the ones outside the apex, namely the unwinder. Ideally we should check
4957 // the dependency names directly here but for some reason the names are blank in
4958 // this test.
4959 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004960 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004961 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4962 if len(apexImplicits) != len(nonApexImplicits)+1 {
4963 t.Errorf("%q missing unwinder dep", lib)
4964 }
4965 }
Jooyung Han214bf372019-11-12 13:03:50 +09004966}
4967
Paul Duffin9b879592020-05-26 13:21:35 +01004968var filesForSdkLibrary = map[string][]byte{
4969 "api/current.txt": nil,
4970 "api/removed.txt": nil,
4971 "api/system-current.txt": nil,
4972 "api/system-removed.txt": nil,
4973 "api/test-current.txt": nil,
4974 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004975
4976 // For java_sdk_library_import
4977 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004978}
4979
Jooyung Han58f26ab2019-12-18 15:34:32 +09004980func TestJavaSDKLibrary(t *testing.T) {
4981 ctx, _ := testApex(t, `
4982 apex {
4983 name: "myapex",
4984 key: "myapex.key",
4985 java_libs: ["foo"],
4986 }
4987
4988 apex_key {
4989 name: "myapex.key",
4990 public_key: "testkey.avbpubkey",
4991 private_key: "testkey.pem",
4992 }
4993
4994 java_sdk_library {
4995 name: "foo",
4996 srcs: ["a.java"],
4997 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004998 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004999 }
Paul Duffin9b879592020-05-26 13:21:35 +01005000 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005001
5002 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005003 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005004 "javalib/foo.jar",
5005 "etc/permissions/foo.xml",
5006 })
5007 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005008 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5009 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005010}
5011
Paul Duffin9b879592020-05-26 13:21:35 +01005012func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5013 ctx, _ := testApex(t, `
5014 apex {
5015 name: "myapex",
5016 key: "myapex.key",
5017 java_libs: ["foo", "bar"],
5018 }
5019
5020 apex_key {
5021 name: "myapex.key",
5022 public_key: "testkey.avbpubkey",
5023 private_key: "testkey.pem",
5024 }
5025
5026 java_sdk_library {
5027 name: "foo",
5028 srcs: ["a.java"],
5029 api_packages: ["foo"],
5030 apex_available: ["myapex"],
5031 sdk_version: "none",
5032 system_modules: "none",
5033 }
5034
5035 java_library {
5036 name: "bar",
5037 srcs: ["a.java"],
5038 libs: ["foo"],
5039 apex_available: ["myapex"],
5040 sdk_version: "none",
5041 system_modules: "none",
5042 }
5043 `, withFiles(filesForSdkLibrary))
5044
5045 // java_sdk_library installs both impl jar and permission XML
5046 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5047 "javalib/bar.jar",
5048 "javalib/foo.jar",
5049 "etc/permissions/foo.xml",
5050 })
5051
5052 // The bar library should depend on the implementation jar.
5053 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5054 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5055 t.Errorf("expected %q, found %#q", expected, actual)
5056 }
5057}
5058
5059func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5060 ctx, _ := testApex(t, `
5061 apex {
5062 name: "myapex",
5063 key: "myapex.key",
5064 java_libs: ["foo"],
5065 }
5066
5067 apex_key {
5068 name: "myapex.key",
5069 public_key: "testkey.avbpubkey",
5070 private_key: "testkey.pem",
5071 }
5072
5073 java_sdk_library {
5074 name: "foo",
5075 srcs: ["a.java"],
5076 api_packages: ["foo"],
5077 apex_available: ["myapex"],
5078 sdk_version: "none",
5079 system_modules: "none",
5080 }
5081
5082 java_library {
5083 name: "bar",
5084 srcs: ["a.java"],
5085 libs: ["foo"],
5086 sdk_version: "none",
5087 system_modules: "none",
5088 }
5089 `, withFiles(filesForSdkLibrary))
5090
5091 // java_sdk_library installs both impl jar and permission XML
5092 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5093 "javalib/foo.jar",
5094 "etc/permissions/foo.xml",
5095 })
5096
5097 // The bar library should depend on the stubs jar.
5098 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5099 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5100 t.Errorf("expected %q, found %#q", expected, actual)
5101 }
5102}
5103
Paul Duffineedc5d52020-06-12 17:46:39 +01005104func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5105 ctx, _ := testApex(t, ``,
5106 withFiles(map[string][]byte{
5107 "apex/a.java": nil,
5108 "apex/apex_manifest.json": nil,
5109 "apex/Android.bp": []byte(`
5110 package {
5111 default_visibility: ["//visibility:private"],
5112 }
5113
5114 apex {
5115 name: "myapex",
5116 key: "myapex.key",
5117 java_libs: ["foo", "bar"],
5118 }
5119
5120 apex_key {
5121 name: "myapex.key",
5122 public_key: "testkey.avbpubkey",
5123 private_key: "testkey.pem",
5124 }
5125
5126 java_library {
5127 name: "bar",
5128 srcs: ["a.java"],
5129 libs: ["foo"],
5130 apex_available: ["myapex"],
5131 sdk_version: "none",
5132 system_modules: "none",
5133 }
5134`),
5135 "source/a.java": nil,
5136 "source/api/current.txt": nil,
5137 "source/api/removed.txt": nil,
5138 "source/Android.bp": []byte(`
5139 package {
5140 default_visibility: ["//visibility:private"],
5141 }
5142
5143 java_sdk_library {
5144 name: "foo",
5145 visibility: ["//apex"],
5146 srcs: ["a.java"],
5147 api_packages: ["foo"],
5148 apex_available: ["myapex"],
5149 sdk_version: "none",
5150 system_modules: "none",
5151 public: {
5152 enabled: true,
5153 },
5154 }
5155`),
5156 "prebuilt/a.jar": nil,
5157 "prebuilt/Android.bp": []byte(`
5158 package {
5159 default_visibility: ["//visibility:private"],
5160 }
5161
5162 java_sdk_library_import {
5163 name: "foo",
5164 visibility: ["//apex", "//source"],
5165 apex_available: ["myapex"],
5166 prefer: true,
5167 public: {
5168 jars: ["a.jar"],
5169 },
5170 }
5171`),
5172 }),
5173 )
5174
5175 // java_sdk_library installs both impl jar and permission XML
5176 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5177 "javalib/bar.jar",
5178 "javalib/foo.jar",
5179 "etc/permissions/foo.xml",
5180 })
5181
5182 // The bar library should depend on the implementation jar.
5183 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5184 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5185 t.Errorf("expected %q, found %#q", expected, actual)
5186 }
5187}
5188
5189func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5190 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5191 apex {
5192 name: "myapex",
5193 key: "myapex.key",
5194 java_libs: ["foo"],
5195 }
5196
5197 apex_key {
5198 name: "myapex.key",
5199 public_key: "testkey.avbpubkey",
5200 private_key: "testkey.pem",
5201 }
5202
5203 java_sdk_library_import {
5204 name: "foo",
5205 apex_available: ["myapex"],
5206 prefer: true,
5207 public: {
5208 jars: ["a.jar"],
5209 },
5210 }
5211
5212 `, withFiles(filesForSdkLibrary))
5213}
5214
atrost6e126252020-01-27 17:01:16 +00005215func TestCompatConfig(t *testing.T) {
5216 ctx, _ := testApex(t, `
5217 apex {
5218 name: "myapex",
5219 key: "myapex.key",
5220 prebuilts: ["myjar-platform-compat-config"],
5221 java_libs: ["myjar"],
5222 }
5223
5224 apex_key {
5225 name: "myapex.key",
5226 public_key: "testkey.avbpubkey",
5227 private_key: "testkey.pem",
5228 }
5229
5230 platform_compat_config {
5231 name: "myjar-platform-compat-config",
5232 src: ":myjar",
5233 }
5234
5235 java_library {
5236 name: "myjar",
5237 srcs: ["foo/bar/MyClass.java"],
5238 sdk_version: "none",
5239 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005240 apex_available: [ "myapex" ],
5241 }
5242 `)
5243 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5244 "etc/compatconfig/myjar-platform-compat-config.xml",
5245 "javalib/myjar.jar",
5246 })
5247}
5248
Jiyong Park479321d2019-12-16 11:47:12 +09005249func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5250 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5251 apex {
5252 name: "myapex",
5253 key: "myapex.key",
5254 java_libs: ["myjar"],
5255 }
5256
5257 apex_key {
5258 name: "myapex.key",
5259 public_key: "testkey.avbpubkey",
5260 private_key: "testkey.pem",
5261 }
5262
5263 java_library {
5264 name: "myjar",
5265 srcs: ["foo/bar/MyClass.java"],
5266 sdk_version: "none",
5267 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005268 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005269 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005270 }
5271 `)
5272}
5273
Jiyong Park7afd1072019-12-30 16:56:33 +09005274func TestCarryRequiredModuleNames(t *testing.T) {
5275 ctx, config := testApex(t, `
5276 apex {
5277 name: "myapex",
5278 key: "myapex.key",
5279 native_shared_libs: ["mylib"],
5280 }
5281
5282 apex_key {
5283 name: "myapex.key",
5284 public_key: "testkey.avbpubkey",
5285 private_key: "testkey.pem",
5286 }
5287
5288 cc_library {
5289 name: "mylib",
5290 srcs: ["mylib.cpp"],
5291 system_shared_libs: [],
5292 stl: "none",
5293 required: ["a", "b"],
5294 host_required: ["c", "d"],
5295 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005296 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005297 }
5298 `)
5299
5300 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5301 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5302 name := apexBundle.BaseModuleName()
5303 prefix := "TARGET_"
5304 var builder strings.Builder
5305 data.Custom(&builder, name, prefix, "", data)
5306 androidMk := builder.String()
5307 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5308 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5309 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5310}
5311
Jiyong Park7cd10e32020-01-14 09:22:18 +09005312func TestSymlinksFromApexToSystem(t *testing.T) {
5313 bp := `
5314 apex {
5315 name: "myapex",
5316 key: "myapex.key",
5317 native_shared_libs: ["mylib"],
5318 java_libs: ["myjar"],
5319 }
5320
Jiyong Park9d677202020-02-19 16:29:35 +09005321 apex {
5322 name: "myapex.updatable",
5323 key: "myapex.key",
5324 native_shared_libs: ["mylib"],
5325 java_libs: ["myjar"],
5326 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005327 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005328 }
5329
Jiyong Park7cd10e32020-01-14 09:22:18 +09005330 apex_key {
5331 name: "myapex.key",
5332 public_key: "testkey.avbpubkey",
5333 private_key: "testkey.pem",
5334 }
5335
5336 cc_library {
5337 name: "mylib",
5338 srcs: ["mylib.cpp"],
5339 shared_libs: ["myotherlib"],
5340 system_shared_libs: [],
5341 stl: "none",
5342 apex_available: [
5343 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005344 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005345 "//apex_available:platform",
5346 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005347 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005348 }
5349
5350 cc_library {
5351 name: "myotherlib",
5352 srcs: ["mylib.cpp"],
5353 system_shared_libs: [],
5354 stl: "none",
5355 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: "myjar",
5365 srcs: ["foo/bar/MyClass.java"],
5366 sdk_version: "none",
5367 system_modules: "none",
5368 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005369 apex_available: [
5370 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005371 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005372 "//apex_available:platform",
5373 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005374 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005375 }
5376
5377 java_library {
5378 name: "myotherjar",
5379 srcs: ["foo/bar/MyClass.java"],
5380 sdk_version: "none",
5381 system_modules: "none",
5382 apex_available: [
5383 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005384 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005385 "//apex_available:platform",
5386 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005387 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005388 }
5389 `
5390
5391 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5392 for _, f := range files {
5393 if f.path == file {
5394 if f.isLink {
5395 t.Errorf("%q is not a real file", file)
5396 }
5397 return
5398 }
5399 }
5400 t.Errorf("%q is not found", file)
5401 }
5402
5403 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5404 for _, f := range files {
5405 if f.path == file {
5406 if !f.isLink {
5407 t.Errorf("%q is not a symlink", file)
5408 }
5409 return
5410 }
5411 }
5412 t.Errorf("%q is not found", file)
5413 }
5414
Jiyong Park9d677202020-02-19 16:29:35 +09005415 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5416 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005417 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005418 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005419 ensureRealfileExists(t, files, "javalib/myjar.jar")
5420 ensureRealfileExists(t, files, "lib64/mylib.so")
5421 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5422
Jiyong Park9d677202020-02-19 16:29:35 +09005423 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5424 ensureRealfileExists(t, files, "javalib/myjar.jar")
5425 ensureRealfileExists(t, files, "lib64/mylib.so")
5426 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5427
5428 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005429 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005430 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005431 ensureRealfileExists(t, files, "javalib/myjar.jar")
5432 ensureRealfileExists(t, files, "lib64/mylib.so")
5433 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005434
5435 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5436 ensureRealfileExists(t, files, "javalib/myjar.jar")
5437 ensureRealfileExists(t, files, "lib64/mylib.so")
5438 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005439}
5440
Yo Chiange8128052020-07-23 20:09:18 +08005441func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5442 ctx, config := testApex(t, `
5443 apex {
5444 name: "myapex",
5445 key: "myapex.key",
5446 native_shared_libs: ["mylib"],
5447 }
5448
5449 apex_key {
5450 name: "myapex.key",
5451 public_key: "testkey.avbpubkey",
5452 private_key: "testkey.pem",
5453 }
5454
5455 cc_library_shared {
5456 name: "mylib",
5457 srcs: ["mylib.cpp"],
5458 shared_libs: ["myotherlib"],
5459 system_shared_libs: [],
5460 stl: "none",
5461 apex_available: [
5462 "myapex",
5463 "//apex_available:platform",
5464 ],
5465 }
5466
5467 cc_prebuilt_library_shared {
5468 name: "myotherlib",
5469 srcs: ["prebuilt.so"],
5470 system_shared_libs: [],
5471 stl: "none",
5472 apex_available: [
5473 "myapex",
5474 "//apex_available:platform",
5475 ],
5476 }
5477 `)
5478
5479 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5480 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5481 var builder strings.Builder
5482 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5483 androidMk := builder.String()
5484 // `myotherlib` is added to `myapex` as symlink
5485 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5486 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5487 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5488 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5489 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5490}
5491
Jooyung Han643adc42020-02-27 13:50:06 +09005492func TestApexWithJniLibs(t *testing.T) {
5493 ctx, _ := testApex(t, `
5494 apex {
5495 name: "myapex",
5496 key: "myapex.key",
5497 jni_libs: ["mylib"],
5498 }
5499
5500 apex_key {
5501 name: "myapex.key",
5502 public_key: "testkey.avbpubkey",
5503 private_key: "testkey.pem",
5504 }
5505
5506 cc_library {
5507 name: "mylib",
5508 srcs: ["mylib.cpp"],
5509 shared_libs: ["mylib2"],
5510 system_shared_libs: [],
5511 stl: "none",
5512 apex_available: [ "myapex" ],
5513 }
5514
5515 cc_library {
5516 name: "mylib2",
5517 srcs: ["mylib.cpp"],
5518 system_shared_libs: [],
5519 stl: "none",
5520 apex_available: [ "myapex" ],
5521 }
5522 `)
5523
5524 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5525 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5526 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5527 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5528 "lib64/mylib.so",
5529 "lib64/mylib2.so",
5530 })
5531}
5532
Jooyung Han49f67012020-04-17 13:43:10 +09005533func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5534 ctx, _ := testApex(t, `
5535 apex {
5536 name: "myapex",
5537 key: "myapex.key",
5538 }
5539 apex_key {
5540 name: "myapex.key",
5541 public_key: "testkey.avbpubkey",
5542 private_key: "testkey.pem",
5543 }
5544 `, func(fs map[string][]byte, config android.Config) {
5545 delete(config.Targets, android.Android)
5546 config.AndroidCommonTarget = android.Target{}
5547 })
5548
5549 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5550 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5551 }
5552}
5553
Jiyong Parkbd159612020-02-28 15:22:21 +09005554func TestAppBundle(t *testing.T) {
5555 ctx, _ := testApex(t, `
5556 apex {
5557 name: "myapex",
5558 key: "myapex.key",
5559 apps: ["AppFoo"],
5560 }
5561
5562 apex_key {
5563 name: "myapex.key",
5564 public_key: "testkey.avbpubkey",
5565 private_key: "testkey.pem",
5566 }
5567
5568 android_app {
5569 name: "AppFoo",
5570 srcs: ["foo/bar/MyClass.java"],
5571 sdk_version: "none",
5572 system_modules: "none",
5573 apex_available: [ "myapex" ],
5574 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005575 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005576
5577 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5578 content := bundleConfigRule.Args["content"]
5579
5580 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005581 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 +09005582}
5583
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005584func TestAppSetBundle(t *testing.T) {
5585 ctx, _ := testApex(t, `
5586 apex {
5587 name: "myapex",
5588 key: "myapex.key",
5589 apps: ["AppSet"],
5590 }
5591
5592 apex_key {
5593 name: "myapex.key",
5594 public_key: "testkey.avbpubkey",
5595 private_key: "testkey.pem",
5596 }
5597
5598 android_app_set {
5599 name: "AppSet",
5600 set: "AppSet.apks",
5601 }`)
5602 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5603 bundleConfigRule := mod.Description("Bundle Config")
5604 content := bundleConfigRule.Args["content"]
5605 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5606 s := mod.Rule("apexRule").Args["copy_commands"]
5607 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5608 if len(copyCmds) != 3 {
5609 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5610 }
5611 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5612 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5613 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5614}
5615
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005616func TestAppSetBundlePrebuilt(t *testing.T) {
5617 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5618 bp := `
5619 apex_set {
5620 name: "myapex",
5621 filename: "foo_v2.apex",
5622 sanitized: {
5623 none: { set: "myapex.apks", },
5624 hwaddress: { set: "myapex.hwasan.apks", },
5625 },
5626 }`
5627 fs["Android.bp"] = []byte(bp)
5628
5629 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5630 })
5631
5632 m := ctx.ModuleForTests("myapex", "android_common")
5633 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5634
5635 actual := extractedApex.Inputs
5636 if len(actual) != 1 {
5637 t.Errorf("expected a single input")
5638 }
5639
5640 expected := "myapex.hwasan.apks"
5641 if actual[0].String() != expected {
5642 t.Errorf("expected %s, got %s", expected, actual[0].String())
5643 }
5644}
5645
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005646func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005647 t.Helper()
5648
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005649 bp := `
5650 java_library {
5651 name: "some-updatable-apex-lib",
5652 srcs: ["a.java"],
5653 sdk_version: "current",
5654 apex_available: [
5655 "some-updatable-apex",
5656 ],
5657 }
5658
5659 java_library {
5660 name: "some-non-updatable-apex-lib",
5661 srcs: ["a.java"],
5662 apex_available: [
5663 "some-non-updatable-apex",
5664 ],
5665 }
5666
5667 java_library {
5668 name: "some-platform-lib",
5669 srcs: ["a.java"],
5670 sdk_version: "current",
5671 installable: true,
5672 }
5673
5674 java_library {
5675 name: "some-art-lib",
5676 srcs: ["a.java"],
5677 sdk_version: "current",
5678 apex_available: [
5679 "com.android.art.something",
5680 ],
5681 hostdex: true,
5682 }
5683
5684 apex {
5685 name: "some-updatable-apex",
5686 key: "some-updatable-apex.key",
5687 java_libs: ["some-updatable-apex-lib"],
5688 updatable: true,
5689 min_sdk_version: "current",
5690 }
5691
5692 apex {
5693 name: "some-non-updatable-apex",
5694 key: "some-non-updatable-apex.key",
5695 java_libs: ["some-non-updatable-apex-lib"],
5696 }
5697
5698 apex_key {
5699 name: "some-updatable-apex.key",
5700 }
5701
5702 apex_key {
5703 name: "some-non-updatable-apex.key",
5704 }
5705
5706 apex {
5707 name: "com.android.art.something",
5708 key: "com.android.art.something.key",
5709 java_libs: ["some-art-lib"],
5710 updatable: true,
5711 min_sdk_version: "current",
5712 }
5713
5714 apex_key {
5715 name: "com.android.art.something.key",
5716 }
5717
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005718 filegroup {
5719 name: "some-updatable-apex-file_contexts",
5720 srcs: [
5721 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5722 ],
5723 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005724
5725 filegroup {
5726 name: "some-non-updatable-apex-file_contexts",
5727 srcs: [
5728 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5729 ],
5730 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005731 `
5732 bp += cc.GatherRequiredDepsForTest(android.Android)
5733 bp += java.GatherRequiredDepsForTest()
5734 bp += dexpreopt.BpToolModulesForTest()
5735
5736 fs := map[string][]byte{
5737 "a.java": nil,
5738 "a.jar": nil,
5739 "build/make/target/product/security": nil,
5740 "apex_manifest.json": nil,
5741 "AndroidManifest.xml": nil,
5742 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005743 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005744 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5745 "framework/aidl/a.aidl": nil,
5746 }
5747 cc.GatherRequiredFilesForTest(fs)
5748
Colin Crossae8600b2020-10-29 17:09:13 -07005749 config := android.TestArchConfig(buildDir, nil, bp, fs)
5750
5751 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005752 ctx.RegisterModuleType("apex", BundleFactory)
5753 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5754 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005755 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005756 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005757 cc.RegisterRequiredBuildComponentsForTest(ctx)
5758 java.RegisterJavaBuildComponents(ctx)
5759 java.RegisterSystemModulesBuildComponents(ctx)
5760 java.RegisterAppBuildComponents(ctx)
5761 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005762 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5763 ctx.PreDepsMutators(RegisterPreDepsMutators)
5764 ctx.PostDepsMutators(RegisterPostDepsMutators)
5765
Colin Crossae8600b2020-10-29 17:09:13 -07005766 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005767
5768 _ = dexpreopt.GlobalSoongConfigForTests(config)
5769 dexpreopt.RegisterToolModulesForTest(ctx)
5770 pathCtx := android.PathContextForTesting(config)
5771 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5772 transformDexpreoptConfig(dexpreoptConfig)
5773 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5774
5775 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5776 android.FailIfErrored(t, errs)
5777
5778 _, errs = ctx.PrepareBuildActions(config)
5779 if errmsg == "" {
5780 android.FailIfErrored(t, errs)
5781 } else if len(errs) > 0 {
5782 android.FailIfNoMatchingErrors(t, errmsg, errs)
5783 return
5784 } else {
5785 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5786 }
5787}
5788
Jooyung Han548640b2020-04-27 12:10:30 +09005789func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5790 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5791 apex {
5792 name: "myapex",
5793 key: "myapex.key",
5794 updatable: true,
5795 }
5796
5797 apex_key {
5798 name: "myapex.key",
5799 public_key: "testkey.avbpubkey",
5800 private_key: "testkey.pem",
5801 }
5802 `)
5803}
5804
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005805func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005806 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005807 var transform func(*dexpreopt.GlobalConfig)
5808
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005809 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5810 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005811 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005812 }
5813 testNoUpdatableJarsInBootImage(t, "", transform)
5814 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005815
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005816 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005817 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 +01005818 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005819 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005820 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005821 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005822 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005823
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005824 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 -07005825 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 +01005826 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005827 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005828 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005829 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005830 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005831
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005832 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 -07005833 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005834 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005835 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005836 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005837 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005838 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005839
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005840 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 -07005841 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 +01005842 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005843 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
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("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5849 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005850 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005851 }
5852 testNoUpdatableJarsInBootImage(t, "", transform)
5853 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005854
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005855 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005856 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005857 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005858 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005859 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005860 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005861 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005862
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005863 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005864 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005865 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005866 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005867 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005868 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005869 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005870
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005871 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005872 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005873 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005874 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005875 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005876 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005877 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005878
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005879 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5880 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005881 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005882 }
5883 testNoUpdatableJarsInBootImage(t, "", transform)
5884 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005885}
5886
Andrei Onea115e7e72020-06-05 21:14:03 +01005887func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5888 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005889 bp += `
5890 apex_key {
5891 name: "myapex.key",
5892 public_key: "testkey.avbpubkey",
5893 private_key: "testkey.pem",
5894 }`
5895 fs := map[string][]byte{
5896 "lib1/src/A.java": nil,
5897 "lib2/src/B.java": nil,
5898 "system/sepolicy/apex/myapex-file_contexts": nil,
5899 }
5900
Colin Crossae8600b2020-10-29 17:09:13 -07005901 config := android.TestArchConfig(buildDir, nil, bp, fs)
5902 android.SetTestNeverallowRules(config, rules)
5903 updatableBootJars := make([]string, 0, len(apexBootJars))
5904 for _, apexBootJar := range apexBootJars {
5905 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5906 }
5907 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5908
5909 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005910 ctx.RegisterModuleType("apex", BundleFactory)
5911 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5912 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5913 cc.RegisterRequiredBuildComponentsForTest(ctx)
5914 java.RegisterJavaBuildComponents(ctx)
5915 java.RegisterSystemModulesBuildComponents(ctx)
5916 java.RegisterDexpreoptBootJarsComponents(ctx)
5917 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5918 ctx.PreDepsMutators(RegisterPreDepsMutators)
5919 ctx.PostDepsMutators(RegisterPostDepsMutators)
5920 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5921
Colin Crossae8600b2020-10-29 17:09:13 -07005922 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005923
5924 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5925 android.FailIfErrored(t, errs)
5926
5927 _, errs = ctx.PrepareBuildActions(config)
5928 if errmsg == "" {
5929 android.FailIfErrored(t, errs)
5930 } else if len(errs) > 0 {
5931 android.FailIfNoMatchingErrors(t, errmsg, errs)
5932 return
5933 } else {
5934 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5935 }
5936}
5937
5938func TestApexPermittedPackagesRules(t *testing.T) {
5939 testcases := []struct {
5940 name string
5941 expectedError string
5942 bp string
5943 bootJars []string
5944 modulesPackages map[string][]string
5945 }{
5946
5947 {
5948 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5949 expectedError: "",
5950 bp: `
5951 java_library {
5952 name: "bcp_lib1",
5953 srcs: ["lib1/src/*.java"],
5954 permitted_packages: ["foo.bar"],
5955 apex_available: ["myapex"],
5956 sdk_version: "none",
5957 system_modules: "none",
5958 }
5959 java_library {
5960 name: "nonbcp_lib2",
5961 srcs: ["lib2/src/*.java"],
5962 apex_available: ["myapex"],
5963 permitted_packages: ["a.b"],
5964 sdk_version: "none",
5965 system_modules: "none",
5966 }
5967 apex {
5968 name: "myapex",
5969 key: "myapex.key",
5970 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5971 }`,
5972 bootJars: []string{"bcp_lib1"},
5973 modulesPackages: map[string][]string{
5974 "myapex": []string{
5975 "foo.bar",
5976 },
5977 },
5978 },
5979 {
5980 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5981 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.`,
5982 bp: `
5983 java_library {
5984 name: "bcp_lib1",
5985 srcs: ["lib1/src/*.java"],
5986 apex_available: ["myapex"],
5987 permitted_packages: ["foo.bar"],
5988 sdk_version: "none",
5989 system_modules: "none",
5990 }
5991 java_library {
5992 name: "bcp_lib2",
5993 srcs: ["lib2/src/*.java"],
5994 apex_available: ["myapex"],
5995 permitted_packages: ["foo.bar", "bar.baz"],
5996 sdk_version: "none",
5997 system_modules: "none",
5998 }
5999 apex {
6000 name: "myapex",
6001 key: "myapex.key",
6002 java_libs: ["bcp_lib1", "bcp_lib2"],
6003 }
6004 `,
6005 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6006 modulesPackages: map[string][]string{
6007 "myapex": []string{
6008 "foo.bar",
6009 },
6010 },
6011 },
6012 }
6013 for _, tc := range testcases {
6014 t.Run(tc.name, func(t *testing.T) {
6015 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6016 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6017 })
6018 }
6019}
6020
Jiyong Park62304bb2020-04-13 16:19:48 +09006021func TestTestFor(t *testing.T) {
6022 ctx, _ := testApex(t, `
6023 apex {
6024 name: "myapex",
6025 key: "myapex.key",
6026 native_shared_libs: ["mylib", "myprivlib"],
6027 }
6028
6029 apex_key {
6030 name: "myapex.key",
6031 public_key: "testkey.avbpubkey",
6032 private_key: "testkey.pem",
6033 }
6034
6035 cc_library {
6036 name: "mylib",
6037 srcs: ["mylib.cpp"],
6038 system_shared_libs: [],
6039 stl: "none",
6040 stubs: {
6041 versions: ["1"],
6042 },
6043 apex_available: ["myapex"],
6044 }
6045
6046 cc_library {
6047 name: "myprivlib",
6048 srcs: ["mylib.cpp"],
6049 system_shared_libs: [],
6050 stl: "none",
6051 apex_available: ["myapex"],
6052 }
6053
6054
6055 cc_test {
6056 name: "mytest",
6057 gtest: false,
6058 srcs: ["mylib.cpp"],
6059 system_shared_libs: [],
6060 stl: "none",
6061 shared_libs: ["mylib", "myprivlib"],
6062 test_for: ["myapex"]
6063 }
6064 `)
6065
6066 // the test 'mytest' is a test for the apex, therefore is linked to the
6067 // actual implementation of mylib instead of its stub.
6068 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6069 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6070 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6071}
6072
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006073// TODO(jungjw): Move this to proptools
6074func intPtr(i int) *int {
6075 return &i
6076}
6077
6078func TestApexSet(t *testing.T) {
6079 ctx, config := testApex(t, `
6080 apex_set {
6081 name: "myapex",
6082 set: "myapex.apks",
6083 filename: "foo_v2.apex",
6084 overrides: ["foo"],
6085 }
6086 `, func(fs map[string][]byte, config android.Config) {
6087 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006088 config.Targets[android.Android] = []android.Target{
6089 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6090 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6091 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006092 })
6093
6094 m := ctx.ModuleForTests("myapex", "android_common")
6095
6096 // Check extract_apks tool parameters.
6097 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6098 actual := extractedApex.Args["abis"]
6099 expected := "ARMEABI_V7A,ARM64_V8A"
6100 if actual != expected {
6101 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6102 }
6103 actual = extractedApex.Args["sdk-version"]
6104 expected = "30"
6105 if actual != expected {
6106 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6107 }
6108
6109 a := m.Module().(*ApexSet)
6110 expectedOverrides := []string{"foo"}
6111 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6112 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6113 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6114 }
6115}
6116
Jiyong Park7d95a512020-05-10 15:16:24 +09006117func TestNoStaticLinkingToStubsLib(t *testing.T) {
6118 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 native_shared_libs: ["mylib"],
6123 }
6124
6125 apex_key {
6126 name: "myapex.key",
6127 public_key: "testkey.avbpubkey",
6128 private_key: "testkey.pem",
6129 }
6130
6131 cc_library {
6132 name: "mylib",
6133 srcs: ["mylib.cpp"],
6134 static_libs: ["otherlib"],
6135 system_shared_libs: [],
6136 stl: "none",
6137 apex_available: [ "myapex" ],
6138 }
6139
6140 cc_library {
6141 name: "otherlib",
6142 srcs: ["mylib.cpp"],
6143 system_shared_libs: [],
6144 stl: "none",
6145 stubs: {
6146 versions: ["1", "2", "3"],
6147 },
6148 apex_available: [ "myapex" ],
6149 }
6150 `)
6151}
6152
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006153func TestApexKeysTxt(t *testing.T) {
6154 ctx, _ := testApex(t, `
6155 apex {
6156 name: "myapex",
6157 key: "myapex.key",
6158 }
6159
6160 apex_key {
6161 name: "myapex.key",
6162 public_key: "testkey.avbpubkey",
6163 private_key: "testkey.pem",
6164 }
6165
6166 prebuilt_apex {
6167 name: "myapex",
6168 prefer: true,
6169 arch: {
6170 arm64: {
6171 src: "myapex-arm64.apex",
6172 },
6173 arm: {
6174 src: "myapex-arm.apex",
6175 },
6176 },
6177 }
6178
6179 apex_set {
6180 name: "myapex_set",
6181 set: "myapex.apks",
6182 filename: "myapex_set.apex",
6183 overrides: ["myapex"],
6184 }
6185 `)
6186
6187 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6188 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6189 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 +09006190 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 +09006191}
6192
Jooyung Han938b5932020-06-20 12:47:47 +09006193func TestAllowedFiles(t *testing.T) {
6194 ctx, _ := testApex(t, `
6195 apex {
6196 name: "myapex",
6197 key: "myapex.key",
6198 apps: ["app"],
6199 allowed_files: "allowed.txt",
6200 }
6201
6202 apex_key {
6203 name: "myapex.key",
6204 public_key: "testkey.avbpubkey",
6205 private_key: "testkey.pem",
6206 }
6207
6208 android_app {
6209 name: "app",
6210 srcs: ["foo/bar/MyClass.java"],
6211 package_name: "foo",
6212 sdk_version: "none",
6213 system_modules: "none",
6214 apex_available: [ "myapex" ],
6215 }
6216 `, withFiles(map[string][]byte{
6217 "sub/Android.bp": []byte(`
6218 override_apex {
6219 name: "override_myapex",
6220 base: "myapex",
6221 apps: ["override_app"],
6222 allowed_files: ":allowed",
6223 }
6224 // Overridable "path" property should be referenced indirectly
6225 filegroup {
6226 name: "allowed",
6227 srcs: ["allowed.txt"],
6228 }
6229 override_android_app {
6230 name: "override_app",
6231 base: "app",
6232 package_name: "bar",
6233 }
6234 `),
6235 }))
6236
6237 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6238 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6239 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6240 }
6241
6242 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6243 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6244 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6245 }
6246}
6247
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006248func TestNonPreferredPrebuiltDependency(t *testing.T) {
6249 _, _ = testApex(t, `
6250 apex {
6251 name: "myapex",
6252 key: "myapex.key",
6253 native_shared_libs: ["mylib"],
6254 }
6255
6256 apex_key {
6257 name: "myapex.key",
6258 public_key: "testkey.avbpubkey",
6259 private_key: "testkey.pem",
6260 }
6261
6262 cc_library {
6263 name: "mylib",
6264 srcs: ["mylib.cpp"],
6265 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006266 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006267 },
6268 apex_available: ["myapex"],
6269 }
6270
6271 cc_prebuilt_library_shared {
6272 name: "mylib",
6273 prefer: false,
6274 srcs: ["prebuilt.so"],
6275 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006276 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006277 },
6278 apex_available: ["myapex"],
6279 }
6280 `)
6281}
6282
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006283func TestMain(m *testing.M) {
6284 run := func() int {
6285 setUp()
6286 defer tearDown()
6287
6288 return m.Run()
6289 }
6290
6291 os.Exit(run())
6292}