blob: c52fd0452416848b7c6c5e151f7f0762081d6c13 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080030 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000032 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070033 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090034 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090036)
37
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070038var buildDir string
39
Jooyung Hand3639552019-08-09 12:57:43 +090040// names returns name list from white space separated string
41func names(s string) (ns []string) {
42 for _, n := range strings.Split(s, " ") {
43 if len(n) > 0 {
44 ns = append(ns, n)
45 }
46 }
47 return
48}
49
Jooyung Han344d5432019-08-23 11:17:39 +090050func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
51 t.Helper()
52 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090053 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
54 if len(errs) > 0 {
55 android.FailIfNoMatchingErrors(t, pattern, errs)
56 return
57 }
58 _, errs = ctx.PrepareBuildActions(config)
59 if len(errs) > 0 {
60 android.FailIfNoMatchingErrors(t, pattern, errs)
61 return
62 }
63
64 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
65}
66
Jooyung Han344d5432019-08-23 11:17:39 +090067func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
68 t.Helper()
69 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010070 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090071 android.FailIfErrored(t, errs)
72 _, errs = ctx.PrepareBuildActions(config)
73 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070074 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090075}
76
Jooyung Han344d5432019-08-23 11:17:39 +090077type testCustomizer func(fs map[string][]byte, config android.Config)
78
79func withFiles(files map[string][]byte) testCustomizer {
80 return func(fs map[string][]byte, config android.Config) {
81 for k, v := range files {
82 fs[k] = v
83 }
84 }
85}
86
87func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
88 return func(fs map[string][]byte, config android.Config) {
89 for k, v := range targets {
90 config.Targets[k] = v
91 }
92 }
93}
94
Jooyung Han35155c42020-02-06 17:33:20 +090095// withNativeBridgeTargets sets configuration with targets including:
96// - X86_64 (primary)
97// - X86 (secondary)
98// - Arm64 on X86_64 (native bridge)
99// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700100func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900101 config.Targets[android.Android] = []android.Target{
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
110 }
111}
112
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900113func withManifestPackageNameOverrides(specs []string) testCustomizer {
114 return func(fs map[string][]byte, config android.Config) {
115 config.TestProductVariables.ManifestPackageNameOverrides = specs
116 }
117}
118
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700119func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900120 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
121}
122
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700123func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900124 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
125}
126
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700127func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900129 filegroup {
130 name: "myapex-file_contexts",
131 srcs: [
132 "system/sepolicy/apex/myapex-file_contexts",
133 ],
134 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900135 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800136
Colin Crossf9aabd72020-02-15 11:29:50 -0800137 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
138
Dario Frenicde2a032019-10-27 00:29:22 +0100139 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900140
Jooyung Han344d5432019-08-23 11:17:39 +0900141 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900142 "a.java": nil,
143 "PrebuiltAppFoo.apk": nil,
144 "PrebuiltAppFooPriv.apk": nil,
145 "build/make/target/product/security": nil,
146 "apex_manifest.json": nil,
147 "AndroidManifest.xml": nil,
148 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900149 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900150 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900151 "system/sepolicy/apex/otherapex-file_contexts": nil,
152 "system/sepolicy/apex/commonapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800154 "mylib.cpp": nil,
155 "mylib_common.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100164 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900175 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700180 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "build/make/core/proguard.flags": nil,
184 "build/make/core/proguard_basic_keeps.flags": nil,
185 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700186 "baz": nil,
187 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700188 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700189 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900190 }
191
Colin Crossf9aabd72020-02-15 11:29:50 -0800192 cc.GatherRequiredFilesForTest(fs)
193
Jooyung Han344d5432019-08-23 11:17:39 +0900194 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800195 // The fs now needs to be populated before creating the config, call handlers twice
196 // for now, once to get any fs changes, and later after the config was created to
197 // set product variables or targets.
198 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
199 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900200 }
201
Colin Cross98be1bb2019-12-13 20:41:13 -0800202 config := android.TestArchConfig(buildDir, nil, bp, fs)
203 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
204 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
205 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
206 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
207 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700208 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800209 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
210
211 for _, handler := range handlers {
212 // The fs now needs to be populated before creating the config, call handlers twice
213 // for now, earlier to get any fs changes, and now after the config was created to
214 // set product variables or targets.
215 tempFS := map[string][]byte{}
216 handler(tempFS, config)
217 }
218
219 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100220
221 // from android package
222 android.RegisterPackageBuildComponents(ctx)
223 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
224
Colin Cross98be1bb2019-12-13 20:41:13 -0800225 ctx.RegisterModuleType("apex", BundleFactory)
226 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
227 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
228 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
229 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
230 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
231 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700232 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800233
Jooyung Hana57af4a2020-01-23 05:36:59 +0000234 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100235 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
237
Paul Duffin021f4e52020-07-30 16:04:17 +0100238 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 // Register these after the prebuilt mutators have been registered to match what
241 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100242 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
243 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
244
Paul Duffin021f4e52020-07-30 16:04:17 +0100245 cc.RegisterRequiredBuildComponentsForTest(ctx)
246
Colin Cross98be1bb2019-12-13 20:41:13 -0800247 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800248 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
249 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900250 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000251 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700252 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800253 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000254 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000255 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000256 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100257 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900258 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800259 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260
Colin Cross98be1bb2019-12-13 20:41:13 -0800261 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
264 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267}
268
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700269func setUp() {
270 var err error
271 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700273 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275}
276
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700278 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279}
280
Jooyung Han643adc42020-02-27 13:50:06 +0900281// ensure that 'result' equals 'expected'
282func ensureEquals(t *testing.T, result string, expected string) {
283 t.Helper()
284 if result != expected {
285 t.Errorf("%q != %q", expected, result)
286 }
287}
288
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289// ensure that 'result' contains 'expected'
290func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900291 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292 if !strings.Contains(result, expected) {
293 t.Errorf("%q is not found in %q", expected, result)
294 }
295}
296
Liz Kammer5bd365f2020-05-27 15:15:11 -0700297// ensure that 'result' contains 'expected' exactly one time
298func ensureContainsOnce(t *testing.T, result string, expected string) {
299 t.Helper()
300 count := strings.Count(result, expected)
301 if count != 1 {
302 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// ensures that 'result' does not contain 'notExpected'
307func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900308 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309 if strings.Contains(result, notExpected) {
310 t.Errorf("%q is found in %q", notExpected, result)
311 }
312}
313
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700314func ensureMatches(t *testing.T, result string, expectedRex string) {
315 ok, err := regexp.MatchString(expectedRex, result)
316 if err != nil {
317 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
318 return
319 }
320 if !ok {
321 t.Errorf("%s does not match regular expession %s", result, expectedRex)
322 }
323}
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900326 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 if !android.InList(expected, result) {
328 t.Errorf("%q is not found in %v", expected, result)
329 }
330}
331
332func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900333 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 if android.InList(notExpected, result) {
335 t.Errorf("%q is found in %v", notExpected, result)
336 }
337}
338
Jooyung Hane1633032019-08-01 17:41:43 +0900339func ensureListEmpty(t *testing.T, result []string) {
340 t.Helper()
341 if len(result) > 0 {
342 t.Errorf("%q is expected to be empty", result)
343 }
344}
345
Jiyong Park25fc6a92018-11-18 18:02:45 +0900346// Minimal test
347func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900348 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900349 apex_defaults {
350 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900351 manifest: ":myapex.manifest",
352 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 key: "myapex.key",
354 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800355 multilib: {
356 both: {
357 binaries: ["foo",],
358 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900359 },
Jiyong Park77acec62020-06-01 21:39:15 +0900360 java_libs: [
361 "myjar",
362 "myjar_dex",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 }
365
Jiyong Park30ca9372019-02-07 16:27:23 +0900366 apex {
367 name: "myapex",
368 defaults: ["myapex-defaults"],
369 }
370
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 apex_key {
372 name: "myapex.key",
373 public_key: "testkey.avbpubkey",
374 private_key: "testkey.pem",
375 }
376
Jiyong Park809bb722019-02-13 21:33:49 +0900377 filegroup {
378 name: "myapex.manifest",
379 srcs: ["apex_manifest.json"],
380 }
381
382 filegroup {
383 name: "myapex.androidmanifest",
384 srcs: ["AndroidManifest.xml"],
385 }
386
Jiyong Park25fc6a92018-11-18 18:02:45 +0900387 cc_library {
388 name: "mylib",
389 srcs: ["mylib.cpp"],
390 shared_libs: ["mylib2"],
391 system_shared_libs: [],
392 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000393 // TODO: remove //apex_available:platform
394 apex_available: [
395 "//apex_available:platform",
396 "myapex",
397 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900398 }
399
Alex Light3d673592019-01-18 14:37:31 -0800400 cc_binary {
401 name: "foo",
402 srcs: ["mylib.cpp"],
403 compile_multilib: "both",
404 multilib: {
405 lib32: {
406 suffix: "32",
407 },
408 lib64: {
409 suffix: "64",
410 },
411 },
412 symlinks: ["foo_link_"],
413 symlink_preferred_arch: true,
414 system_shared_libs: [],
415 static_executable: true,
416 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700417 apex_available: [ "myapex", "com.android.gki.*" ],
418 }
419
420 apex {
421 name: "com.android.gki.fake",
422 binaries: ["foo"],
423 key: "myapex.key",
424 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800425 }
426
Paul Duffindddd5462020-04-07 15:25:44 +0100427 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900428 name: "mylib2",
429 srcs: ["mylib.cpp"],
430 system_shared_libs: [],
431 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900432 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900433 static_libs: ["libstatic"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_prebuilt_library_shared {
442 name: "mylib2",
443 srcs: ["prebuilt.so"],
444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
449 }
450
Jiyong Park9918e1a2020-03-17 19:16:40 +0900451 cc_library_static {
452 name: "libstatic",
453 srcs: ["mylib.cpp"],
454 system_shared_libs: [],
455 stl: "none",
456 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900462 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463
464 java_library {
465 name: "myjar",
466 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900467 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 sdk_version: "none",
469 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900471 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 }
478
Jiyong Park77acec62020-06-01 21:39:15 +0900479 dex_import {
480 name: "myjar_dex",
481 jars: ["prebuilt.jar"],
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 java_library {
489 name: "myotherjar",
490 srcs: ["foo/bar/MyClass.java"],
491 sdk_version: "none",
492 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900499
500 java_library {
501 name: "mysharedjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900506 `)
507
Sundong Ahnabb64432019-10-22 13:58:29 +0900508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900509
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900510 // Make sure that Android.mk is created
511 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
512 data := android.AndroidMkDataForTest(t, config, "", ab)
513 var builder strings.Builder
514 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
515
516 androidMk := builder.String()
517 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
518 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
519
Jiyong Park42cca6c2019-04-01 11:15:50 +0900520 optFlags := apexRule.Args["opt_flags"]
521 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700522 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900523 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 copyCmds := apexRule.Args["copy_commands"]
526
527 // Ensure that main rule creates an output
528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
529
530 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
533 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534
535 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700536 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
537 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800540 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
541 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900542 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900543 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900544 // .. but not for java libs
545 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900546 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800547
Colin Cross7113d202019-11-20 16:39:12 -0800548 // Ensure that the platform variant ends with _shared or _common
549 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
554
555 // Ensure that dynamic dependency to java libs are not included
556 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800557
558 // Ensure that all symlinks are present.
559 found_foo_link_64 := false
560 found_foo := false
561 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900562 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800563 if strings.HasSuffix(cmd, "bin/foo") {
564 found_foo = true
565 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
566 found_foo_link_64 = true
567 }
568 }
569 }
570 good := found_foo && found_foo_link_64
571 if !good {
572 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
573 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900574
Sundong Ahnabb64432019-10-22 13:58:29 +0900575 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700576 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900577 if len(noticeInputs) != 3 {
578 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900579 }
580 ensureListContains(t, noticeInputs, "NOTICE")
581 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900582 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900583
Artur Satayeva8bd1132020-04-27 18:07:06 +0100584 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100585 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
586 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
587 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
588 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
589 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100590
591 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
593 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
594 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800597}
598
Jooyung Hanf21c7972019-12-16 22:32:06 +0900599func TestDefaults(t *testing.T) {
600 ctx, _ := testApex(t, `
601 apex_defaults {
602 name: "myapex-defaults",
603 key: "myapex.key",
604 prebuilts: ["myetc"],
605 native_shared_libs: ["mylib"],
606 java_libs: ["myjar"],
607 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900608 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800609 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610 }
611
612 prebuilt_etc {
613 name: "myetc",
614 src: "myprebuilt",
615 }
616
617 apex {
618 name: "myapex",
619 defaults: ["myapex-defaults"],
620 }
621
622 apex_key {
623 name: "myapex.key",
624 public_key: "testkey.avbpubkey",
625 private_key: "testkey.pem",
626 }
627
628 cc_library {
629 name: "mylib",
630 system_shared_libs: [],
631 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000632 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900633 }
634
635 java_library {
636 name: "myjar",
637 srcs: ["foo/bar/MyClass.java"],
638 sdk_version: "none",
639 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
642
643 android_app {
644 name: "AppFoo",
645 srcs: ["foo/bar/MyClass.java"],
646 sdk_version: "none",
647 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900650
651 runtime_resource_overlay {
652 name: "rro",
653 theme: "blue",
654 }
655
markchien2f59ec92020-09-02 16:23:38 +0800656 bpf {
657 name: "bpf",
658 srcs: ["bpf.c", "bpf2.c"],
659 }
660
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000662 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 "etc/myetc",
664 "javalib/myjar.jar",
665 "lib64/mylib.so",
666 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900667 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800668 "etc/bpf/bpf.o",
669 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900670 })
671}
672
Jooyung Han01a3ee22019-11-02 02:52:25 +0900673func TestApexManifest(t *testing.T) {
674 ctx, _ := testApex(t, `
675 apex {
676 name: "myapex",
677 key: "myapex.key",
678 }
679
680 apex_key {
681 name: "myapex.key",
682 public_key: "testkey.avbpubkey",
683 private_key: "testkey.pem",
684 }
685 `)
686
687 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900688 args := module.Rule("apexRule").Args
689 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
690 t.Error("manifest should be apex_manifest.pb, but " + manifest)
691 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692}
693
Alex Light5098a612018-11-29 17:12:15 -0800694func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700695 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800696 apex {
697 name: "myapex",
698 key: "myapex.key",
699 payload_type: "zip",
700 native_shared_libs: ["mylib"],
701 }
702
703 apex_key {
704 name: "myapex.key",
705 public_key: "testkey.avbpubkey",
706 private_key: "testkey.pem",
707 }
708
709 cc_library {
710 name: "mylib",
711 srcs: ["mylib.cpp"],
712 shared_libs: ["mylib2"],
713 system_shared_libs: [],
714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000715 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800716 }
717
718 cc_library {
719 name: "mylib2",
720 srcs: ["mylib.cpp"],
721 system_shared_libs: [],
722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000723 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800724 }
725 `)
726
Sundong Ahnabb64432019-10-22 13:58:29 +0900727 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800728 copyCmds := zipApexRule.Args["copy_commands"]
729
730 // Ensure that main rule creates an output
731 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
732
733 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700734 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800735
736 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700737 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800738
739 // Ensure that both direct and indirect deps are copied into apex
740 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
741 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900742}
743
744func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700745 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900746 apex {
747 name: "myapex",
748 key: "myapex.key",
749 native_shared_libs: ["mylib", "mylib3"],
750 }
751
752 apex_key {
753 name: "myapex.key",
754 public_key: "testkey.avbpubkey",
755 private_key: "testkey.pem",
756 }
757
758 cc_library {
759 name: "mylib",
760 srcs: ["mylib.cpp"],
761 shared_libs: ["mylib2", "mylib3"],
762 system_shared_libs: [],
763 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000764 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900765 }
766
767 cc_library {
768 name: "mylib2",
769 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900770 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900771 system_shared_libs: [],
772 stl: "none",
773 stubs: {
774 versions: ["1", "2", "3"],
775 },
776 }
777
778 cc_library {
779 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900780 srcs: ["mylib.cpp"],
781 shared_libs: ["mylib4"],
782 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900783 stl: "none",
784 stubs: {
785 versions: ["10", "11", "12"],
786 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000787 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900788 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900789
790 cc_library {
791 name: "mylib4",
792 srcs: ["mylib.cpp"],
793 system_shared_libs: [],
794 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000795 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900796 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797 `)
798
Sundong Ahnabb64432019-10-22 13:58:29 +0900799 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900800 copyCmds := apexRule.Args["copy_commands"]
801
802 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800803 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804
805 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800806 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807
808 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800809 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900810
Colin Crossaede88c2020-08-11 12:17:01 -0700811 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812
813 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900814 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900815 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900816 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817
818 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700819 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900820 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700821 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900822
823 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900824 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900825 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900826
827 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900828 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_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
923 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
924 ensureNotContains(t, mylib2Cflags, "-include ")
925
926 // Ensure that genstub is invoked with --apex
927 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_29").Rule("genStubSrc").Args["flags"])
928
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"] },
1273 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001274
Jooyung Han61b66e92020-03-21 14:21:46 +00001275 llndk_library {
1276 name: "libbar",
1277 symbol_file: "",
1278 }
1279 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001280 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001281 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001282
Jooyung Han61b66e92020-03-21 14:21:46 +00001283 // Ensure that LLNDK dep is not included
1284 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1285 "lib64/mylib.so",
1286 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001287
Jooyung Han61b66e92020-03-21 14:21:46 +00001288 // Ensure that LLNDK dep is required
1289 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1290 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1291 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001292
Colin Crossaede88c2020-08-11 12:17:01 -07001293 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001294 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1295 for _, ver := range tc.shouldNotLink {
1296 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1297 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001298
Colin Crossaede88c2020-08-11 12:17:01 -07001299 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001300 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1301 })
1302 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001303}
1304
Jiyong Park25fc6a92018-11-18 18:02:45 +09001305func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001306 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001307 apex {
1308 name: "myapex",
1309 key: "myapex.key",
1310 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1311 }
1312
1313 apex_key {
1314 name: "myapex.key",
1315 public_key: "testkey.avbpubkey",
1316 private_key: "testkey.pem",
1317 }
1318
1319 cc_library {
1320 name: "mylib",
1321 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001322 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001323 shared_libs: ["libdl#27"],
1324 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001325 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001326 }
1327
1328 cc_library_shared {
1329 name: "mylib_shared",
1330 srcs: ["mylib.cpp"],
1331 shared_libs: ["libdl#27"],
1332 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001333 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001334 }
1335
1336 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001337 name: "libBootstrap",
1338 srcs: ["mylib.cpp"],
1339 stl: "none",
1340 bootstrap: true,
1341 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001342 `)
1343
Sundong Ahnabb64432019-10-22 13:58:29 +09001344 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001345 copyCmds := apexRule.Args["copy_commands"]
1346
1347 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001348 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001349 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1350 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001351
1352 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001353 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001354
Colin Crossaede88c2020-08-11 12:17:01 -07001355 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1356 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1357 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001358
1359 // For dependency to libc
1360 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001361 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001362 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001363 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001364 // ... Cflags from stub is correctly exported to mylib
1365 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1366 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1367
1368 // For dependency to libm
1369 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001370 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001371 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001372 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001373 // ... and is not compiling with the stub
1374 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1375 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1376
1377 // For dependency to libdl
1378 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001379 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001380 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001381 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1382 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001383 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001384 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001385 // ... Cflags from stub is correctly exported to mylib
1386 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1387 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001388
1389 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001390 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1391 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1392 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1393 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001394}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001395
Jooyung Han749dc692020-04-15 11:03:39 +09001396func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001397 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001398 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1399 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001400 // 3) (platform) -> liba -> libz : this should be non-stub link
1401 ctx, _ := testApex(t, `
1402 apex {
1403 name: "myapex",
1404 key: "myapex.key",
1405 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001406 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001407 }
1408
1409 apex {
1410 name: "otherapex",
1411 key: "myapex.key",
1412 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001413 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001414 }
1415
1416 apex_key {
1417 name: "myapex.key",
1418 public_key: "testkey.avbpubkey",
1419 private_key: "testkey.pem",
1420 }
1421
1422 cc_library {
1423 name: "libx",
1424 shared_libs: ["liba"],
1425 system_shared_libs: [],
1426 stl: "none",
1427 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001428 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001429 }
1430
1431 cc_library {
1432 name: "liby",
1433 shared_libs: ["liba"],
1434 system_shared_libs: [],
1435 stl: "none",
1436 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001437 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001438 }
1439
1440 cc_library {
1441 name: "liba",
1442 shared_libs: ["libz"],
1443 system_shared_libs: [],
1444 stl: "none",
1445 apex_available: [
1446 "//apex_available:anyapex",
1447 "//apex_available:platform",
1448 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001449 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001450 }
1451
1452 cc_library {
1453 name: "libz",
1454 system_shared_libs: [],
1455 stl: "none",
1456 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001457 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001458 },
1459 }
Jooyung Han749dc692020-04-15 11:03:39 +09001460 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001461
1462 expectLink := func(from, from_variant, to, to_variant string) {
1463 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1464 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1465 }
1466 expectNoLink := func(from, from_variant, to, to_variant string) {
1467 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1468 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1469 }
1470 // platform liba is linked to non-stub version
1471 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001472 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001473 expectLink("liba", "shared_apex29", "libz", "shared_28")
1474 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1475 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001476 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001477 expectLink("liba", "shared_apex30", "libz", "shared_30")
1478 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1479 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001480}
1481
Jooyung Hanaed150d2020-04-02 01:41:41 +09001482func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1483 ctx, _ := testApex(t, `
1484 apex {
1485 name: "myapex",
1486 key: "myapex.key",
1487 native_shared_libs: ["libx"],
1488 min_sdk_version: "R",
1489 }
1490
1491 apex_key {
1492 name: "myapex.key",
1493 public_key: "testkey.avbpubkey",
1494 private_key: "testkey.pem",
1495 }
1496
1497 cc_library {
1498 name: "libx",
1499 shared_libs: ["libz"],
1500 system_shared_libs: [],
1501 stl: "none",
1502 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001503 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001504 }
1505
1506 cc_library {
1507 name: "libz",
1508 system_shared_libs: [],
1509 stl: "none",
1510 stubs: {
1511 versions: ["29", "R"],
1512 },
1513 }
1514 `, func(fs map[string][]byte, config android.Config) {
1515 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1516 })
1517
1518 expectLink := func(from, from_variant, to, to_variant string) {
1519 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1520 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1521 }
1522 expectNoLink := func(from, from_variant, to, to_variant string) {
1523 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1524 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1525 }
Dan Albertc8060532020-07-22 22:32:17 -07001526 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001527 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1528 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001529}
1530
Jooyung Han749dc692020-04-15 11:03:39 +09001531func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001532 ctx, _ := testApex(t, `
1533 apex {
1534 name: "myapex",
1535 key: "myapex.key",
1536 native_shared_libs: ["libx"],
1537 }
1538
1539 apex_key {
1540 name: "myapex.key",
1541 public_key: "testkey.avbpubkey",
1542 private_key: "testkey.pem",
1543 }
1544
1545 cc_library {
1546 name: "libx",
1547 shared_libs: ["libz"],
1548 system_shared_libs: [],
1549 stl: "none",
1550 apex_available: [ "myapex" ],
1551 }
1552
1553 cc_library {
1554 name: "libz",
1555 system_shared_libs: [],
1556 stl: "none",
1557 stubs: {
1558 versions: ["1", "2"],
1559 },
1560 }
1561 `)
1562
1563 expectLink := func(from, from_variant, to, to_variant string) {
1564 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1565 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1566 }
1567 expectNoLink := func(from, from_variant, to, to_variant string) {
1568 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1569 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1570 }
Colin Crossaede88c2020-08-11 12:17:01 -07001571 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1572 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1573 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001574}
1575
1576func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1577 ctx, _ := testApex(t, `
1578 apex {
1579 name: "myapex",
1580 key: "myapex.key",
1581 native_shared_libs: ["libx"],
1582 }
1583
1584 apex_key {
1585 name: "myapex.key",
1586 public_key: "testkey.avbpubkey",
1587 private_key: "testkey.pem",
1588 }
1589
1590 cc_library {
1591 name: "libx",
1592 system_shared_libs: [],
1593 stl: "none",
1594 apex_available: [ "myapex" ],
1595 stubs: {
1596 versions: ["1", "2"],
1597 },
1598 }
1599
1600 cc_library {
1601 name: "libz",
1602 shared_libs: ["libx"],
1603 system_shared_libs: [],
1604 stl: "none",
1605 }
1606 `)
1607
1608 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001609 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001610 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1611 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1612 }
1613 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001614 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001615 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1616 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1617 }
1618 expectLink("libz", "shared", "libx", "shared_2")
1619 expectNoLink("libz", "shared", "libz", "shared_1")
1620 expectNoLink("libz", "shared", "libz", "shared")
1621}
1622
Jooyung Han75568392020-03-20 04:29:24 +09001623func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001624 ctx, _ := testApex(t, `
1625 apex {
1626 name: "myapex",
1627 key: "myapex.key",
1628 native_shared_libs: ["libx"],
1629 min_sdk_version: "29",
1630 }
1631
1632 apex_key {
1633 name: "myapex.key",
1634 public_key: "testkey.avbpubkey",
1635 private_key: "testkey.pem",
1636 }
1637
1638 cc_library {
1639 name: "libx",
1640 shared_libs: ["libbar"],
1641 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001642 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001643 }
1644
1645 cc_library {
1646 name: "libbar",
1647 stubs: {
1648 versions: ["29", "30"],
1649 },
1650 }
Jooyung Han75568392020-03-20 04:29:24 +09001651 `, func(fs map[string][]byte, config android.Config) {
1652 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1653 })
Jooyung Han03b51852020-02-26 22:45:42 +09001654 expectLink := func(from, from_variant, to, to_variant string) {
1655 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1656 libFlags := ld.Args["libFlags"]
1657 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1658 }
Colin Crossaede88c2020-08-11 12:17:01 -07001659 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001660}
1661
Jooyung Han75568392020-03-20 04:29:24 +09001662func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001663 ctx, _ := testApex(t, `
1664 apex {
1665 name: "myapex",
1666 key: "myapex.key",
1667 native_shared_libs: ["libx"],
1668 min_sdk_version: "29",
1669 }
1670
1671 apex_key {
1672 name: "myapex.key",
1673 public_key: "testkey.avbpubkey",
1674 private_key: "testkey.pem",
1675 }
1676
1677 cc_library {
1678 name: "libx",
1679 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001680 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001681 }
Jooyung Han75568392020-03-20 04:29:24 +09001682 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001683
1684 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001685 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001686 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1687 // note that platform variant is not.
1688 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1689 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001690}
1691
Jooyung Han749dc692020-04-15 11:03:39 +09001692func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001693 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001694 apex {
1695 name: "myapex",
1696 key: "myapex.key",
1697 native_shared_libs: ["libx"],
1698 min_sdk_version: "29",
1699 }
1700
1701 apex_key {
1702 name: "myapex.key",
1703 public_key: "testkey.avbpubkey",
1704 private_key: "testkey.pem",
1705 }
1706
1707 cc_library {
1708 name: "libx",
1709 shared_libs: ["libz"],
1710 system_shared_libs: [],
1711 stl: "none",
1712 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001713 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001714 }
1715
1716 cc_library {
1717 name: "libz",
1718 system_shared_libs: [],
1719 stl: "none",
1720 stubs: {
1721 versions: ["30"],
1722 },
1723 }
Jooyung Han75568392020-03-20 04:29:24 +09001724 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001725}
Jooyung Han03b51852020-02-26 22:45:42 +09001726
Jooyung Han749dc692020-04-15 11:03:39 +09001727func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1728 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001729 apex {
1730 name: "myapex",
1731 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001732 native_shared_libs: ["mylib"],
1733 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001734 }
1735
1736 apex_key {
1737 name: "myapex.key",
1738 public_key: "testkey.avbpubkey",
1739 private_key: "testkey.pem",
1740 }
Jooyung Han749dc692020-04-15 11:03:39 +09001741
1742 cc_library {
1743 name: "mylib",
1744 srcs: ["mylib.cpp"],
1745 system_shared_libs: [],
1746 stl: "none",
1747 apex_available: [
1748 "myapex",
1749 ],
1750 min_sdk_version: "30",
1751 }
1752 `)
1753}
1754
1755func TestApexMinSdkVersion_Okay(t *testing.T) {
1756 testApex(t, `
1757 apex {
1758 name: "myapex",
1759 key: "myapex.key",
1760 native_shared_libs: ["libfoo"],
1761 java_libs: ["libbar"],
1762 min_sdk_version: "29",
1763 }
1764
1765 apex_key {
1766 name: "myapex.key",
1767 public_key: "testkey.avbpubkey",
1768 private_key: "testkey.pem",
1769 }
1770
1771 cc_library {
1772 name: "libfoo",
1773 srcs: ["mylib.cpp"],
1774 shared_libs: ["libfoo_dep"],
1775 apex_available: ["myapex"],
1776 min_sdk_version: "29",
1777 }
1778
1779 cc_library {
1780 name: "libfoo_dep",
1781 srcs: ["mylib.cpp"],
1782 apex_available: ["myapex"],
1783 min_sdk_version: "29",
1784 }
1785
1786 java_library {
1787 name: "libbar",
1788 sdk_version: "current",
1789 srcs: ["a.java"],
1790 static_libs: ["libbar_dep"],
1791 apex_available: ["myapex"],
1792 min_sdk_version: "29",
1793 }
1794
1795 java_library {
1796 name: "libbar_dep",
1797 sdk_version: "current",
1798 srcs: ["a.java"],
1799 apex_available: ["myapex"],
1800 min_sdk_version: "29",
1801 }
Jooyung Han03b51852020-02-26 22:45:42 +09001802 `)
1803}
1804
Artur Satayev8cf899a2020-04-15 17:29:42 +01001805func TestJavaStableSdkVersion(t *testing.T) {
1806 testCases := []struct {
1807 name string
1808 expectedError string
1809 bp string
1810 }{
1811 {
1812 name: "Non-updatable apex with non-stable dep",
1813 bp: `
1814 apex {
1815 name: "myapex",
1816 java_libs: ["myjar"],
1817 key: "myapex.key",
1818 }
1819 apex_key {
1820 name: "myapex.key",
1821 public_key: "testkey.avbpubkey",
1822 private_key: "testkey.pem",
1823 }
1824 java_library {
1825 name: "myjar",
1826 srcs: ["foo/bar/MyClass.java"],
1827 sdk_version: "core_platform",
1828 apex_available: ["myapex"],
1829 }
1830 `,
1831 },
1832 {
1833 name: "Updatable apex with stable dep",
1834 bp: `
1835 apex {
1836 name: "myapex",
1837 java_libs: ["myjar"],
1838 key: "myapex.key",
1839 updatable: true,
1840 min_sdk_version: "29",
1841 }
1842 apex_key {
1843 name: "myapex.key",
1844 public_key: "testkey.avbpubkey",
1845 private_key: "testkey.pem",
1846 }
1847 java_library {
1848 name: "myjar",
1849 srcs: ["foo/bar/MyClass.java"],
1850 sdk_version: "current",
1851 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001852 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001853 }
1854 `,
1855 },
1856 {
1857 name: "Updatable apex with non-stable dep",
1858 expectedError: "cannot depend on \"myjar\"",
1859 bp: `
1860 apex {
1861 name: "myapex",
1862 java_libs: ["myjar"],
1863 key: "myapex.key",
1864 updatable: true,
1865 }
1866 apex_key {
1867 name: "myapex.key",
1868 public_key: "testkey.avbpubkey",
1869 private_key: "testkey.pem",
1870 }
1871 java_library {
1872 name: "myjar",
1873 srcs: ["foo/bar/MyClass.java"],
1874 sdk_version: "core_platform",
1875 apex_available: ["myapex"],
1876 }
1877 `,
1878 },
1879 {
1880 name: "Updatable apex with non-stable transitive dep",
1881 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1882 bp: `
1883 apex {
1884 name: "myapex",
1885 java_libs: ["myjar"],
1886 key: "myapex.key",
1887 updatable: true,
1888 }
1889 apex_key {
1890 name: "myapex.key",
1891 public_key: "testkey.avbpubkey",
1892 private_key: "testkey.pem",
1893 }
1894 java_library {
1895 name: "myjar",
1896 srcs: ["foo/bar/MyClass.java"],
1897 sdk_version: "current",
1898 apex_available: ["myapex"],
1899 static_libs: ["transitive-jar"],
1900 }
1901 java_library {
1902 name: "transitive-jar",
1903 srcs: ["foo/bar/MyClass.java"],
1904 sdk_version: "core_platform",
1905 apex_available: ["myapex"],
1906 }
1907 `,
1908 },
1909 }
1910
1911 for _, test := range testCases {
1912 t.Run(test.name, func(t *testing.T) {
1913 if test.expectedError == "" {
1914 testApex(t, test.bp)
1915 } else {
1916 testApexError(t, test.expectedError, test.bp)
1917 }
1918 })
1919 }
1920}
1921
Jooyung Han749dc692020-04-15 11:03:39 +09001922func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1923 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1924 apex {
1925 name: "myapex",
1926 key: "myapex.key",
1927 native_shared_libs: ["mylib"],
1928 min_sdk_version: "29",
1929 }
1930
1931 apex_key {
1932 name: "myapex.key",
1933 public_key: "testkey.avbpubkey",
1934 private_key: "testkey.pem",
1935 }
1936
1937 cc_library {
1938 name: "mylib",
1939 srcs: ["mylib.cpp"],
1940 shared_libs: ["mylib2"],
1941 system_shared_libs: [],
1942 stl: "none",
1943 apex_available: [
1944 "myapex",
1945 ],
1946 min_sdk_version: "29",
1947 }
1948
1949 // indirect part of the apex
1950 cc_library {
1951 name: "mylib2",
1952 srcs: ["mylib.cpp"],
1953 system_shared_libs: [],
1954 stl: "none",
1955 apex_available: [
1956 "myapex",
1957 ],
1958 min_sdk_version: "30",
1959 }
1960 `)
1961}
1962
1963func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1964 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1965 apex {
1966 name: "myapex",
1967 key: "myapex.key",
1968 apps: ["AppFoo"],
1969 min_sdk_version: "29",
1970 }
1971
1972 apex_key {
1973 name: "myapex.key",
1974 public_key: "testkey.avbpubkey",
1975 private_key: "testkey.pem",
1976 }
1977
1978 android_app {
1979 name: "AppFoo",
1980 srcs: ["foo/bar/MyClass.java"],
1981 sdk_version: "current",
1982 min_sdk_version: "29",
1983 system_modules: "none",
1984 stl: "none",
1985 static_libs: ["bar"],
1986 apex_available: [ "myapex" ],
1987 }
1988
1989 java_library {
1990 name: "bar",
1991 sdk_version: "current",
1992 srcs: ["a.java"],
1993 apex_available: [ "myapex" ],
1994 }
1995 `)
1996}
1997
1998func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1999 ctx, _ := testApex(t, `
2000 apex {
2001 name: "myapex",
2002 key: "myapex.key",
2003 native_shared_libs: ["mylib"],
2004 min_sdk_version: "29",
2005 }
2006
2007 apex_key {
2008 name: "myapex.key",
2009 public_key: "testkey.avbpubkey",
2010 private_key: "testkey.pem",
2011 }
2012
2013 // mylib in myapex will link to mylib2#29
2014 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2015 cc_library {
2016 name: "mylib",
2017 srcs: ["mylib.cpp"],
2018 shared_libs: ["mylib2"],
2019 system_shared_libs: [],
2020 stl: "none",
2021 apex_available: ["myapex", "otherapex"],
2022 min_sdk_version: "29",
2023 }
2024
2025 cc_library {
2026 name: "mylib2",
2027 srcs: ["mylib.cpp"],
2028 system_shared_libs: [],
2029 stl: "none",
2030 apex_available: ["otherapex"],
2031 stubs: { versions: ["29", "30"] },
2032 min_sdk_version: "30",
2033 }
2034
2035 apex {
2036 name: "otherapex",
2037 key: "myapex.key",
2038 native_shared_libs: ["mylib", "mylib2"],
2039 min_sdk_version: "30",
2040 }
2041 `)
2042 expectLink := func(from, from_variant, to, to_variant string) {
2043 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2044 libFlags := ld.Args["libFlags"]
2045 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2046 }
Colin Crossaede88c2020-08-11 12:17:01 -07002047 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2048 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002049}
2050
Jiyong Park7c2ee712018-12-07 00:42:25 +09002051func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002052 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002056 native_shared_libs: ["mylib"],
2057 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002058 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002059 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002060 }
2061
2062 apex_key {
2063 name: "myapex.key",
2064 public_key: "testkey.avbpubkey",
2065 private_key: "testkey.pem",
2066 }
2067
2068 prebuilt_etc {
2069 name: "myetc",
2070 src: "myprebuilt",
2071 sub_dir: "foo/bar",
2072 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002073
2074 cc_library {
2075 name: "mylib",
2076 srcs: ["mylib.cpp"],
2077 relative_install_path: "foo/bar",
2078 system_shared_libs: [],
2079 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002080 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002081 }
2082
2083 cc_binary {
2084 name: "mybin",
2085 srcs: ["mylib.cpp"],
2086 relative_install_path: "foo/bar",
2087 system_shared_libs: [],
2088 static_executable: true,
2089 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002090 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002091 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002092 `)
2093
Sundong Ahnabb64432019-10-22 13:58:29 +09002094 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002095 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2096
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002097 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002098 ensureListContains(t, dirs, "etc")
2099 ensureListContains(t, dirs, "etc/foo")
2100 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002101 ensureListContains(t, dirs, "lib64")
2102 ensureListContains(t, dirs, "lib64/foo")
2103 ensureListContains(t, dirs, "lib64/foo/bar")
2104 ensureListContains(t, dirs, "lib")
2105 ensureListContains(t, dirs, "lib/foo")
2106 ensureListContains(t, dirs, "lib/foo/bar")
2107
Jiyong Parkbd13e442019-03-15 18:10:35 +09002108 ensureListContains(t, dirs, "bin")
2109 ensureListContains(t, dirs, "bin/foo")
2110 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002111}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002112
Jooyung Han35155c42020-02-06 17:33:20 +09002113func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2114 ctx, _ := testApex(t, `
2115 apex {
2116 name: "myapex",
2117 key: "myapex.key",
2118 multilib: {
2119 both: {
2120 native_shared_libs: ["mylib"],
2121 binaries: ["mybin"],
2122 },
2123 },
2124 compile_multilib: "both",
2125 native_bridge_supported: true,
2126 }
2127
2128 apex_key {
2129 name: "myapex.key",
2130 public_key: "testkey.avbpubkey",
2131 private_key: "testkey.pem",
2132 }
2133
2134 cc_library {
2135 name: "mylib",
2136 relative_install_path: "foo/bar",
2137 system_shared_libs: [],
2138 stl: "none",
2139 apex_available: [ "myapex" ],
2140 native_bridge_supported: true,
2141 }
2142
2143 cc_binary {
2144 name: "mybin",
2145 relative_install_path: "foo/bar",
2146 system_shared_libs: [],
2147 static_executable: true,
2148 stl: "none",
2149 apex_available: [ "myapex" ],
2150 native_bridge_supported: true,
2151 compile_multilib: "both", // default is "first" for binary
2152 multilib: {
2153 lib64: {
2154 suffix: "64",
2155 },
2156 },
2157 }
2158 `, withNativeBridgeEnabled)
2159 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2160 "bin/foo/bar/mybin",
2161 "bin/foo/bar/mybin64",
2162 "bin/arm/foo/bar/mybin",
2163 "bin/arm64/foo/bar/mybin64",
2164 "lib/foo/bar/mylib.so",
2165 "lib/arm/foo/bar/mylib.so",
2166 "lib64/foo/bar/mylib.so",
2167 "lib64/arm64/foo/bar/mylib.so",
2168 })
2169}
2170
Jiyong Parkda6eb592018-12-19 17:12:36 +09002171func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002172 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002173 apex {
2174 name: "myapex",
2175 key: "myapex.key",
2176 native_shared_libs: ["mylib"],
2177 use_vendor: true,
2178 }
2179
2180 apex_key {
2181 name: "myapex.key",
2182 public_key: "testkey.avbpubkey",
2183 private_key: "testkey.pem",
2184 }
2185
2186 cc_library {
2187 name: "mylib",
2188 srcs: ["mylib.cpp"],
2189 shared_libs: ["mylib2"],
2190 system_shared_libs: [],
2191 vendor_available: true,
2192 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002193 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002194 }
2195
2196 cc_library {
2197 name: "mylib2",
2198 srcs: ["mylib.cpp"],
2199 system_shared_libs: [],
2200 vendor_available: true,
2201 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002202 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002203 }
Jooyung Handc782442019-11-01 03:14:38 +09002204 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002205 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002206 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002207
2208 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002209 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002210 for _, implicit := range i.Implicits {
2211 inputsList = append(inputsList, implicit.String())
2212 }
2213 }
2214 inputsString := strings.Join(inputsList, " ")
2215
2216 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002217 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2218 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002219
2220 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002221 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2222 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002223}
Jiyong Park16e91a02018-12-20 18:18:08 +09002224
Jooyung Han85d61762020-06-24 23:50:26 +09002225func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002226 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2227 apex {
2228 name: "myapex",
2229 key: "myapex.key",
2230 use_vendor: true,
2231 }
2232 apex_key {
2233 name: "myapex.key",
2234 public_key: "testkey.avbpubkey",
2235 private_key: "testkey.pem",
2236 }
2237 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002238 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002239 })
Colin Cross440e0d02020-06-11 11:32:11 -07002240 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002241 testApex(t, `
2242 apex {
2243 name: "myapex",
2244 key: "myapex.key",
2245 use_vendor: true,
2246 }
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
2252 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002253 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002254 })
2255}
2256
Jooyung Han5c998b92019-06-27 11:30:33 +09002257func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2258 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2259 apex {
2260 name: "myapex",
2261 key: "myapex.key",
2262 native_shared_libs: ["mylib"],
2263 use_vendor: true,
2264 }
2265
2266 apex_key {
2267 name: "myapex.key",
2268 public_key: "testkey.avbpubkey",
2269 private_key: "testkey.pem",
2270 }
2271
2272 cc_library {
2273 name: "mylib",
2274 srcs: ["mylib.cpp"],
2275 system_shared_libs: [],
2276 stl: "none",
2277 }
2278 `)
2279}
2280
Jooyung Han85d61762020-06-24 23:50:26 +09002281func TestVendorApex(t *testing.T) {
2282 ctx, config := testApex(t, `
2283 apex {
2284 name: "myapex",
2285 key: "myapex.key",
2286 binaries: ["mybin"],
2287 vendor: true,
2288 }
2289 apex_key {
2290 name: "myapex.key",
2291 public_key: "testkey.avbpubkey",
2292 private_key: "testkey.pem",
2293 }
2294 cc_binary {
2295 name: "mybin",
2296 vendor: true,
2297 shared_libs: ["libfoo"],
2298 }
2299 cc_library {
2300 name: "libfoo",
2301 proprietary: true,
2302 }
2303 `)
2304
2305 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2306 "bin/mybin",
2307 "lib64/libfoo.so",
2308 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2309 "lib64/libc++.so",
2310 })
2311
2312 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2313 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2314 name := apexBundle.BaseModuleName()
2315 prefix := "TARGET_"
2316 var builder strings.Builder
2317 data.Custom(&builder, name, prefix, "", data)
2318 androidMk := builder.String()
2319 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002320
2321 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2322 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2323 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002324}
2325
Jooyung Handf78e212020-07-22 15:54:47 +09002326func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2327 ctx, _ := testApex(t, `
2328 apex {
2329 name: "myapex",
2330 key: "myapex.key",
2331 binaries: ["mybin"],
2332 vendor: true,
2333 use_vndk_as_stable: true,
2334 }
2335 apex_key {
2336 name: "myapex.key",
2337 public_key: "testkey.avbpubkey",
2338 private_key: "testkey.pem",
2339 }
2340 cc_binary {
2341 name: "mybin",
2342 vendor: true,
2343 shared_libs: ["libvndk", "libvendor"],
2344 }
2345 cc_library {
2346 name: "libvndk",
2347 vndk: {
2348 enabled: true,
2349 },
2350 vendor_available: true,
2351 }
2352 cc_library {
2353 name: "libvendor",
2354 vendor: true,
2355 }
2356 `)
2357
2358 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2359
Colin Crossaede88c2020-08-11 12:17:01 -07002360 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002361 libs := names(ldRule.Args["libFlags"])
2362 // VNDK libs(libvndk/libc++) as they are
2363 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2364 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2365 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002366 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002367
2368 // VNDK libs are not included when use_vndk_as_stable: true
2369 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2370 "bin/mybin",
2371 "lib64/libvendor.so",
2372 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002373
2374 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2375 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2376 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002377}
2378
Jooyung Han8e5685d2020-09-21 11:02:57 +09002379func TestApex_withPrebuiltFirmware(t *testing.T) {
2380 testCases := []struct {
2381 name string
2382 additionalProp string
2383 }{
2384 {"system apex with prebuilt_firmware", ""},
2385 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2386 }
2387 for _, tc := range testCases {
2388 t.Run(tc.name, func(t *testing.T) {
2389 ctx, _ := testApex(t, `
2390 apex {
2391 name: "myapex",
2392 key: "myapex.key",
2393 prebuilts: ["myfirmware"],
2394 `+tc.additionalProp+`
2395 }
2396 apex_key {
2397 name: "myapex.key",
2398 public_key: "testkey.avbpubkey",
2399 private_key: "testkey.pem",
2400 }
2401 prebuilt_firmware {
2402 name: "myfirmware",
2403 src: "myfirmware.bin",
2404 filename_from_src: true,
2405 `+tc.additionalProp+`
2406 }
2407 `)
2408 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2409 "etc/firmware/myfirmware.bin",
2410 })
2411 })
2412 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002413}
2414
Jooyung Hanefb184e2020-06-25 17:14:25 +09002415func TestAndroidMk_UseVendorRequired(t *testing.T) {
2416 ctx, config := testApex(t, `
2417 apex {
2418 name: "myapex",
2419 key: "myapex.key",
2420 use_vendor: true,
2421 native_shared_libs: ["mylib"],
2422 }
2423
2424 apex_key {
2425 name: "myapex.key",
2426 public_key: "testkey.avbpubkey",
2427 private_key: "testkey.pem",
2428 }
2429
2430 cc_library {
2431 name: "mylib",
2432 vendor_available: true,
2433 apex_available: ["myapex"],
2434 }
2435 `, func(fs map[string][]byte, config android.Config) {
2436 setUseVendorAllowListForTest(config, []string{"myapex"})
2437 })
2438
2439 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2440 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2441 name := apexBundle.BaseModuleName()
2442 prefix := "TARGET_"
2443 var builder strings.Builder
2444 data.Custom(&builder, name, prefix, "", data)
2445 androidMk := builder.String()
2446 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2447}
2448
2449func TestAndroidMk_VendorApexRequired(t *testing.T) {
2450 ctx, config := testApex(t, `
2451 apex {
2452 name: "myapex",
2453 key: "myapex.key",
2454 vendor: true,
2455 native_shared_libs: ["mylib"],
2456 }
2457
2458 apex_key {
2459 name: "myapex.key",
2460 public_key: "testkey.avbpubkey",
2461 private_key: "testkey.pem",
2462 }
2463
2464 cc_library {
2465 name: "mylib",
2466 vendor_available: true,
2467 }
2468 `)
2469
2470 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2471 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2472 name := apexBundle.BaseModuleName()
2473 prefix := "TARGET_"
2474 var builder strings.Builder
2475 data.Custom(&builder, name, prefix, "", data)
2476 androidMk := builder.String()
2477 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2478}
2479
Jooyung Han2ed99d02020-06-24 23:26:26 +09002480func TestAndroidMkWritesCommonProperties(t *testing.T) {
2481 ctx, config := testApex(t, `
2482 apex {
2483 name: "myapex",
2484 key: "myapex.key",
2485 vintf_fragments: ["fragment.xml"],
2486 init_rc: ["init.rc"],
2487 }
2488 apex_key {
2489 name: "myapex.key",
2490 public_key: "testkey.avbpubkey",
2491 private_key: "testkey.pem",
2492 }
2493 cc_binary {
2494 name: "mybin",
2495 }
2496 `)
2497
2498 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2499 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2500 name := apexBundle.BaseModuleName()
2501 prefix := "TARGET_"
2502 var builder strings.Builder
2503 data.Custom(&builder, name, prefix, "", data)
2504 androidMk := builder.String()
2505 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2506 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2507}
2508
Jiyong Park16e91a02018-12-20 18:18:08 +09002509func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002510 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002511 apex {
2512 name: "myapex",
2513 key: "myapex.key",
2514 native_shared_libs: ["mylib"],
2515 }
2516
2517 apex_key {
2518 name: "myapex.key",
2519 public_key: "testkey.avbpubkey",
2520 private_key: "testkey.pem",
2521 }
2522
2523 cc_library {
2524 name: "mylib",
2525 srcs: ["mylib.cpp"],
2526 system_shared_libs: [],
2527 stl: "none",
2528 stubs: {
2529 versions: ["1", "2", "3"],
2530 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002531 apex_available: [
2532 "//apex_available:platform",
2533 "myapex",
2534 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002535 }
2536
2537 cc_binary {
2538 name: "not_in_apex",
2539 srcs: ["mylib.cpp"],
2540 static_libs: ["mylib"],
2541 static_executable: true,
2542 system_shared_libs: [],
2543 stl: "none",
2544 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002545 `)
2546
Colin Cross7113d202019-11-20 16:39:12 -08002547 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002548
2549 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002550 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002551}
Jiyong Park9335a262018-12-24 11:31:58 +09002552
2553func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002554 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002555 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002556 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002557 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002558 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002559 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002560 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002561 }
2562
2563 cc_library {
2564 name: "mylib",
2565 srcs: ["mylib.cpp"],
2566 system_shared_libs: [],
2567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002568 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002569 }
2570
2571 apex_key {
2572 name: "myapex.key",
2573 public_key: "testkey.avbpubkey",
2574 private_key: "testkey.pem",
2575 }
2576
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002577 android_app_certificate {
2578 name: "myapex.certificate",
2579 certificate: "testkey",
2580 }
2581
2582 android_app_certificate {
2583 name: "myapex.certificate.override",
2584 certificate: "testkey.override",
2585 }
2586
Jiyong Park9335a262018-12-24 11:31:58 +09002587 `)
2588
2589 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002590 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002591
2592 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2593 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2594 "vendor/foo/devkeys/testkey.avbpubkey")
2595 }
2596 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2597 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2598 "vendor/foo/devkeys/testkey.pem")
2599 }
2600
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002601 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002602 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002603 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002604 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002605 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002606 }
2607}
Jiyong Park58e364a2019-01-19 19:24:06 +09002608
Jooyung Hanf121a652019-12-17 14:30:11 +09002609func TestCertificate(t *testing.T) {
2610 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2611 ctx, _ := testApex(t, `
2612 apex {
2613 name: "myapex",
2614 key: "myapex.key",
2615 }
2616 apex_key {
2617 name: "myapex.key",
2618 public_key: "testkey.avbpubkey",
2619 private_key: "testkey.pem",
2620 }`)
2621 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2622 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2623 if actual := rule.Args["certificates"]; actual != expected {
2624 t.Errorf("certificates should be %q, not %q", expected, actual)
2625 }
2626 })
2627 t.Run("override when unspecified", func(t *testing.T) {
2628 ctx, _ := testApex(t, `
2629 apex {
2630 name: "myapex_keytest",
2631 key: "myapex.key",
2632 file_contexts: ":myapex-file_contexts",
2633 }
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639 android_app_certificate {
2640 name: "myapex.certificate.override",
2641 certificate: "testkey.override",
2642 }`)
2643 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2644 expected := "testkey.override.x509.pem testkey.override.pk8"
2645 if actual := rule.Args["certificates"]; actual != expected {
2646 t.Errorf("certificates should be %q, not %q", expected, actual)
2647 }
2648 })
2649 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2650 ctx, _ := testApex(t, `
2651 apex {
2652 name: "myapex",
2653 key: "myapex.key",
2654 certificate: ":myapex.certificate",
2655 }
2656 apex_key {
2657 name: "myapex.key",
2658 public_key: "testkey.avbpubkey",
2659 private_key: "testkey.pem",
2660 }
2661 android_app_certificate {
2662 name: "myapex.certificate",
2663 certificate: "testkey",
2664 }`)
2665 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2666 expected := "testkey.x509.pem testkey.pk8"
2667 if actual := rule.Args["certificates"]; actual != expected {
2668 t.Errorf("certificates should be %q, not %q", expected, actual)
2669 }
2670 })
2671 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2672 ctx, _ := testApex(t, `
2673 apex {
2674 name: "myapex_keytest",
2675 key: "myapex.key",
2676 file_contexts: ":myapex-file_contexts",
2677 certificate: ":myapex.certificate",
2678 }
2679 apex_key {
2680 name: "myapex.key",
2681 public_key: "testkey.avbpubkey",
2682 private_key: "testkey.pem",
2683 }
2684 android_app_certificate {
2685 name: "myapex.certificate.override",
2686 certificate: "testkey.override",
2687 }`)
2688 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2689 expected := "testkey.override.x509.pem testkey.override.pk8"
2690 if actual := rule.Args["certificates"]; actual != expected {
2691 t.Errorf("certificates should be %q, not %q", expected, actual)
2692 }
2693 })
2694 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2695 ctx, _ := testApex(t, `
2696 apex {
2697 name: "myapex",
2698 key: "myapex.key",
2699 certificate: "testkey",
2700 }
2701 apex_key {
2702 name: "myapex.key",
2703 public_key: "testkey.avbpubkey",
2704 private_key: "testkey.pem",
2705 }`)
2706 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2707 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2708 if actual := rule.Args["certificates"]; actual != expected {
2709 t.Errorf("certificates should be %q, not %q", expected, actual)
2710 }
2711 })
2712 t.Run("override when specified as <name>", func(t *testing.T) {
2713 ctx, _ := testApex(t, `
2714 apex {
2715 name: "myapex_keytest",
2716 key: "myapex.key",
2717 file_contexts: ":myapex-file_contexts",
2718 certificate: "testkey",
2719 }
2720 apex_key {
2721 name: "myapex.key",
2722 public_key: "testkey.avbpubkey",
2723 private_key: "testkey.pem",
2724 }
2725 android_app_certificate {
2726 name: "myapex.certificate.override",
2727 certificate: "testkey.override",
2728 }`)
2729 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2730 expected := "testkey.override.x509.pem testkey.override.pk8"
2731 if actual := rule.Args["certificates"]; actual != expected {
2732 t.Errorf("certificates should be %q, not %q", expected, actual)
2733 }
2734 })
2735}
2736
Jiyong Park58e364a2019-01-19 19:24:06 +09002737func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002738 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002739 apex {
2740 name: "myapex",
2741 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002742 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002743 }
2744
2745 apex {
2746 name: "otherapex",
2747 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002748 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002749 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002750 }
2751
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757
2758 cc_library {
2759 name: "mylib",
2760 srcs: ["mylib.cpp"],
2761 system_shared_libs: [],
2762 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002763 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002764 "myapex",
2765 "otherapex",
2766 ],
Jooyung Han24282772020-03-21 23:20:55 +09002767 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002768 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002769 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002770 cc_library {
2771 name: "mylib2",
2772 srcs: ["mylib.cpp"],
2773 system_shared_libs: [],
2774 stl: "none",
2775 apex_available: [
2776 "myapex",
2777 "otherapex",
2778 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002779 static_libs: ["mylib3"],
2780 recovery_available: true,
2781 min_sdk_version: "29",
2782 }
2783 cc_library {
2784 name: "mylib3",
2785 srcs: ["mylib.cpp"],
2786 system_shared_libs: [],
2787 stl: "none",
2788 apex_available: [
2789 "myapex",
2790 "otherapex",
2791 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002792 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002793 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002794 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002795 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002796 `)
2797
Jooyung Hanc87a0592020-03-02 17:44:33 +09002798 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002799 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002800 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002801 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002802
Jooyung Hanccce2f22020-03-07 03:45:53 +09002803 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002804 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002805 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002806 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002807 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002808
Jooyung Hanccce2f22020-03-07 03:45:53 +09002809 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002810 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002811 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002812 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002813 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002814
Colin Crossaede88c2020-08-11 12:17:01 -07002815 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2816 // each variant defines additional macros to distinguish which apex variant it is built for
2817
2818 // non-APEX variant does not have __ANDROID_APEX__ defined
2819 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2820 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2821
2822 // APEX variant has __ANDROID_APEX__ defined
2823 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2824 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2825 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2826 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2827
2828 // APEX variant has __ANDROID_APEX__ defined
2829 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2830 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2831 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2832 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2833
2834 // recovery variant does not set __ANDROID_SDK_VERSION__
2835 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2836 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2837 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2838
2839 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2840 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002841
2842 // non-APEX variant does not have __ANDROID_APEX__ defined
2843 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2844 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2845
2846 // APEX variant has __ANDROID_APEX__ defined
2847 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002848 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002849 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002850 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002851
Jooyung Hanc87a0592020-03-02 17:44:33 +09002852 // APEX variant has __ANDROID_APEX__ defined
2853 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002854 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002855 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002856 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002857
2858 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002859 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002860 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2861 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002862}
Jiyong Park7e636d02019-01-28 16:16:54 +09002863
2864func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002865 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002866 apex {
2867 name: "myapex",
2868 key: "myapex.key",
2869 native_shared_libs: ["mylib"],
2870 }
2871
2872 apex_key {
2873 name: "myapex.key",
2874 public_key: "testkey.avbpubkey",
2875 private_key: "testkey.pem",
2876 }
2877
2878 cc_library_headers {
2879 name: "mylib_headers",
2880 export_include_dirs: ["my_include"],
2881 system_shared_libs: [],
2882 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002883 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002884 }
2885
2886 cc_library {
2887 name: "mylib",
2888 srcs: ["mylib.cpp"],
2889 system_shared_libs: [],
2890 stl: "none",
2891 header_libs: ["mylib_headers"],
2892 export_header_lib_headers: ["mylib_headers"],
2893 stubs: {
2894 versions: ["1", "2", "3"],
2895 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002896 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002897 }
2898
2899 cc_library {
2900 name: "otherlib",
2901 srcs: ["mylib.cpp"],
2902 system_shared_libs: [],
2903 stl: "none",
2904 shared_libs: ["mylib"],
2905 }
2906 `)
2907
Colin Cross7113d202019-11-20 16:39:12 -08002908 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002909
2910 // Ensure that the include path of the header lib is exported to 'otherlib'
2911 ensureContains(t, cFlags, "-Imy_include")
2912}
Alex Light9670d332019-01-29 18:07:33 -08002913
Jiyong Park7cd10e32020-01-14 09:22:18 +09002914type fileInApex struct {
2915 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002916 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002917 isLink bool
2918}
2919
Jooyung Hana57af4a2020-01-23 05:36:59 +00002920func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002921 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002922 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002923 copyCmds := apexRule.Args["copy_commands"]
2924 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002925 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002926 for _, cmd := range strings.Split(copyCmds, "&&") {
2927 cmd = strings.TrimSpace(cmd)
2928 if cmd == "" {
2929 continue
2930 }
2931 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002932 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002933 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002934 switch terms[0] {
2935 case "mkdir":
2936 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002937 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002938 t.Fatal("copyCmds contains invalid cp command", cmd)
2939 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002940 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002941 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002942 isLink = false
2943 case "ln":
2944 if len(terms) != 3 && len(terms) != 4 {
2945 // ln LINK TARGET or ln -s LINK TARGET
2946 t.Fatal("copyCmds contains invalid ln command", cmd)
2947 }
2948 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002949 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002950 isLink = true
2951 default:
2952 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2953 }
2954 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002955 index := strings.Index(dst, imageApexDir)
2956 if index == -1 {
2957 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2958 }
2959 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002960 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002961 }
2962 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002963 return ret
2964}
2965
Jooyung Hana57af4a2020-01-23 05:36:59 +00002966func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2967 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002968 var failed bool
2969 var surplus []string
2970 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002971 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002972 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002973 for _, expected := range files {
2974 if matched, _ := path.Match(expected, file.path); matched {
2975 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002976 mactchFound = true
2977 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002978 }
2979 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002980 if !mactchFound {
2981 surplus = append(surplus, file.path)
2982 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002983 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002984
Jooyung Han31c470b2019-10-18 16:26:59 +09002985 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002986 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002987 t.Log("surplus files", surplus)
2988 failed = true
2989 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002990
2991 if len(files) > len(filesMatched) {
2992 var missing []string
2993 for _, expected := range files {
2994 if !filesMatched[expected] {
2995 missing = append(missing, expected)
2996 }
2997 }
2998 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002999 t.Log("missing files", missing)
3000 failed = true
3001 }
3002 if failed {
3003 t.Fail()
3004 }
3005}
3006
Jooyung Han344d5432019-08-23 11:17:39 +09003007func TestVndkApexCurrent(t *testing.T) {
3008 ctx, _ := testApex(t, `
3009 apex_vndk {
3010 name: "myapex",
3011 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003012 }
3013
3014 apex_key {
3015 name: "myapex.key",
3016 public_key: "testkey.avbpubkey",
3017 private_key: "testkey.pem",
3018 }
3019
3020 cc_library {
3021 name: "libvndk",
3022 srcs: ["mylib.cpp"],
3023 vendor_available: true,
3024 vndk: {
3025 enabled: true,
3026 },
3027 system_shared_libs: [],
3028 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003029 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003030 }
3031
3032 cc_library {
3033 name: "libvndksp",
3034 srcs: ["mylib.cpp"],
3035 vendor_available: true,
3036 vndk: {
3037 enabled: true,
3038 support_system_process: true,
3039 },
3040 system_shared_libs: [],
3041 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003042 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003043 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003044 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003045
Jooyung Hana57af4a2020-01-23 05:36:59 +00003046 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003047 "lib/libvndk.so",
3048 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003049 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003050 "lib64/libvndk.so",
3051 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003052 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003053 "etc/llndk.libraries.VER.txt",
3054 "etc/vndkcore.libraries.VER.txt",
3055 "etc/vndksp.libraries.VER.txt",
3056 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003057 })
Jooyung Han344d5432019-08-23 11:17:39 +09003058}
3059
3060func TestVndkApexWithPrebuilt(t *testing.T) {
3061 ctx, _ := testApex(t, `
3062 apex_vndk {
3063 name: "myapex",
3064 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003065 }
3066
3067 apex_key {
3068 name: "myapex.key",
3069 public_key: "testkey.avbpubkey",
3070 private_key: "testkey.pem",
3071 }
3072
3073 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003074 name: "libvndk",
3075 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003076 vendor_available: true,
3077 vndk: {
3078 enabled: true,
3079 },
3080 system_shared_libs: [],
3081 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003082 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003083 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003084
3085 cc_prebuilt_library_shared {
3086 name: "libvndk.arm",
3087 srcs: ["libvndk.arm.so"],
3088 vendor_available: true,
3089 vndk: {
3090 enabled: true,
3091 },
3092 enabled: false,
3093 arch: {
3094 arm: {
3095 enabled: true,
3096 },
3097 },
3098 system_shared_libs: [],
3099 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003100 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003101 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003102 `+vndkLibrariesTxtFiles("current"),
3103 withFiles(map[string][]byte{
3104 "libvndk.so": nil,
3105 "libvndk.arm.so": nil,
3106 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003107
Jooyung Hana57af4a2020-01-23 05:36:59 +00003108 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003109 "lib/libvndk.so",
3110 "lib/libvndk.arm.so",
3111 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003112 "lib/libc++.so",
3113 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003114 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003115 })
Jooyung Han344d5432019-08-23 11:17:39 +09003116}
3117
Jooyung Han39edb6c2019-11-06 16:53:07 +09003118func vndkLibrariesTxtFiles(vers ...string) (result string) {
3119 for _, v := range vers {
3120 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003121 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003122 result += `
3123 vndk_libraries_txt {
3124 name: "` + txt + `.libraries.txt",
3125 }
3126 `
3127 }
3128 } else {
3129 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3130 result += `
3131 prebuilt_etc {
3132 name: "` + txt + `.libraries.` + v + `.txt",
3133 src: "dummy.txt",
3134 }
3135 `
3136 }
3137 }
3138 }
3139 return
3140}
3141
Jooyung Han344d5432019-08-23 11:17:39 +09003142func TestVndkApexVersion(t *testing.T) {
3143 ctx, _ := testApex(t, `
3144 apex_vndk {
3145 name: "myapex_v27",
3146 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003147 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003148 vndk_version: "27",
3149 }
3150
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156
Jooyung Han31c470b2019-10-18 16:26:59 +09003157 vndk_prebuilt_shared {
3158 name: "libvndk27",
3159 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003160 vendor_available: true,
3161 vndk: {
3162 enabled: true,
3163 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003164 target_arch: "arm64",
3165 arch: {
3166 arm: {
3167 srcs: ["libvndk27_arm.so"],
3168 },
3169 arm64: {
3170 srcs: ["libvndk27_arm64.so"],
3171 },
3172 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003173 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003174 }
3175
3176 vndk_prebuilt_shared {
3177 name: "libvndk27",
3178 version: "27",
3179 vendor_available: true,
3180 vndk: {
3181 enabled: true,
3182 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003183 target_arch: "x86_64",
3184 arch: {
3185 x86: {
3186 srcs: ["libvndk27_x86.so"],
3187 },
3188 x86_64: {
3189 srcs: ["libvndk27_x86_64.so"],
3190 },
3191 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003192 }
3193 `+vndkLibrariesTxtFiles("27"),
3194 withFiles(map[string][]byte{
3195 "libvndk27_arm.so": nil,
3196 "libvndk27_arm64.so": nil,
3197 "libvndk27_x86.so": nil,
3198 "libvndk27_x86_64.so": nil,
3199 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003200
Jooyung Hana57af4a2020-01-23 05:36:59 +00003201 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003202 "lib/libvndk27_arm.so",
3203 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003204 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003205 })
Jooyung Han344d5432019-08-23 11:17:39 +09003206}
3207
3208func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3209 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3210 apex_vndk {
3211 name: "myapex_v27",
3212 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003213 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003214 vndk_version: "27",
3215 }
3216 apex_vndk {
3217 name: "myapex_v27_other",
3218 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003219 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003220 vndk_version: "27",
3221 }
3222
3223 apex_key {
3224 name: "myapex.key",
3225 public_key: "testkey.avbpubkey",
3226 private_key: "testkey.pem",
3227 }
3228
3229 cc_library {
3230 name: "libvndk",
3231 srcs: ["mylib.cpp"],
3232 vendor_available: true,
3233 vndk: {
3234 enabled: true,
3235 },
3236 system_shared_libs: [],
3237 stl: "none",
3238 }
3239
3240 vndk_prebuilt_shared {
3241 name: "libvndk",
3242 version: "27",
3243 vendor_available: true,
3244 vndk: {
3245 enabled: true,
3246 },
3247 srcs: ["libvndk.so"],
3248 }
3249 `, withFiles(map[string][]byte{
3250 "libvndk.so": nil,
3251 }))
3252}
3253
Jooyung Han90eee022019-10-01 20:02:42 +09003254func TestVndkApexNameRule(t *testing.T) {
3255 ctx, _ := testApex(t, `
3256 apex_vndk {
3257 name: "myapex",
3258 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003259 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003260 }
3261 apex_vndk {
3262 name: "myapex_v28",
3263 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003264 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003265 vndk_version: "28",
3266 }
3267 apex_key {
3268 name: "myapex.key",
3269 public_key: "testkey.avbpubkey",
3270 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003271 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003272
3273 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003274 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003275 actual := proptools.String(bundle.properties.Apex_name)
3276 if !reflect.DeepEqual(actual, expected) {
3277 t.Errorf("Got '%v', expected '%v'", actual, expected)
3278 }
3279 }
3280
3281 assertApexName("com.android.vndk.vVER", "myapex")
3282 assertApexName("com.android.vndk.v28", "myapex_v28")
3283}
3284
Jooyung Han344d5432019-08-23 11:17:39 +09003285func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3286 ctx, _ := testApex(t, `
3287 apex_vndk {
3288 name: "myapex",
3289 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003290 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003291 }
3292
3293 apex_key {
3294 name: "myapex.key",
3295 public_key: "testkey.avbpubkey",
3296 private_key: "testkey.pem",
3297 }
3298
3299 cc_library {
3300 name: "libvndk",
3301 srcs: ["mylib.cpp"],
3302 vendor_available: true,
3303 native_bridge_supported: true,
3304 host_supported: true,
3305 vndk: {
3306 enabled: true,
3307 },
3308 system_shared_libs: [],
3309 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003310 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003311 }
Jooyung Han35155c42020-02-06 17:33:20 +09003312 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003313
Jooyung Hana57af4a2020-01-23 05:36:59 +00003314 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003315 "lib/libvndk.so",
3316 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003317 "lib/libc++.so",
3318 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003319 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003320 })
Jooyung Han344d5432019-08-23 11:17:39 +09003321}
3322
3323func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3324 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3325 apex_vndk {
3326 name: "myapex",
3327 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003328 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003329 native_bridge_supported: true,
3330 }
3331
3332 apex_key {
3333 name: "myapex.key",
3334 public_key: "testkey.avbpubkey",
3335 private_key: "testkey.pem",
3336 }
3337
3338 cc_library {
3339 name: "libvndk",
3340 srcs: ["mylib.cpp"],
3341 vendor_available: true,
3342 native_bridge_supported: true,
3343 host_supported: true,
3344 vndk: {
3345 enabled: true,
3346 },
3347 system_shared_libs: [],
3348 stl: "none",
3349 }
3350 `)
3351}
3352
Jooyung Han31c470b2019-10-18 16:26:59 +09003353func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003354 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003355 apex_vndk {
3356 name: "myapex_v27",
3357 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003358 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003359 vndk_version: "27",
3360 }
3361
3362 apex_key {
3363 name: "myapex.key",
3364 public_key: "testkey.avbpubkey",
3365 private_key: "testkey.pem",
3366 }
3367
3368 vndk_prebuilt_shared {
3369 name: "libvndk27",
3370 version: "27",
3371 target_arch: "arm",
3372 vendor_available: true,
3373 vndk: {
3374 enabled: true,
3375 },
3376 arch: {
3377 arm: {
3378 srcs: ["libvndk27.so"],
3379 }
3380 },
3381 }
3382
3383 vndk_prebuilt_shared {
3384 name: "libvndk27",
3385 version: "27",
3386 target_arch: "arm",
3387 binder32bit: true,
3388 vendor_available: true,
3389 vndk: {
3390 enabled: true,
3391 },
3392 arch: {
3393 arm: {
3394 srcs: ["libvndk27binder32.so"],
3395 }
3396 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003397 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003398 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003399 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003400 withFiles(map[string][]byte{
3401 "libvndk27.so": nil,
3402 "libvndk27binder32.so": nil,
3403 }),
3404 withBinder32bit,
3405 withTargets(map[android.OsType][]android.Target{
3406 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003407 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3408 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003409 },
3410 }),
3411 )
3412
Jooyung Hana57af4a2020-01-23 05:36:59 +00003413 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003414 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003415 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003416 })
3417}
3418
Jooyung Han45a96772020-06-15 14:59:42 +09003419func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3420 ctx, _ := testApex(t, `
3421 apex_vndk {
3422 name: "myapex",
3423 key: "myapex.key",
3424 file_contexts: ":myapex-file_contexts",
3425 }
3426
3427 apex_key {
3428 name: "myapex.key",
3429 public_key: "testkey.avbpubkey",
3430 private_key: "testkey.pem",
3431 }
3432
3433 cc_library {
3434 name: "libz",
3435 vendor_available: true,
3436 vndk: {
3437 enabled: true,
3438 },
3439 stubs: {
3440 symbol_file: "libz.map.txt",
3441 versions: ["30"],
3442 }
3443 }
3444 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3445 "libz.map.txt": nil,
3446 }))
3447
3448 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3449 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3450 ensureListEmpty(t, provideNativeLibs)
3451}
3452
Jooyung Hane1633032019-08-01 17:41:43 +09003453func TestDependenciesInApexManifest(t *testing.T) {
3454 ctx, _ := testApex(t, `
3455 apex {
3456 name: "myapex_nodep",
3457 key: "myapex.key",
3458 native_shared_libs: ["lib_nodep"],
3459 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003460 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003461 }
3462
3463 apex {
3464 name: "myapex_dep",
3465 key: "myapex.key",
3466 native_shared_libs: ["lib_dep"],
3467 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003468 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003469 }
3470
3471 apex {
3472 name: "myapex_provider",
3473 key: "myapex.key",
3474 native_shared_libs: ["libfoo"],
3475 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003476 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003477 }
3478
3479 apex {
3480 name: "myapex_selfcontained",
3481 key: "myapex.key",
3482 native_shared_libs: ["lib_dep", "libfoo"],
3483 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003484 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003485 }
3486
3487 apex_key {
3488 name: "myapex.key",
3489 public_key: "testkey.avbpubkey",
3490 private_key: "testkey.pem",
3491 }
3492
3493 cc_library {
3494 name: "lib_nodep",
3495 srcs: ["mylib.cpp"],
3496 system_shared_libs: [],
3497 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003498 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003499 }
3500
3501 cc_library {
3502 name: "lib_dep",
3503 srcs: ["mylib.cpp"],
3504 shared_libs: ["libfoo"],
3505 system_shared_libs: [],
3506 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003507 apex_available: [
3508 "myapex_dep",
3509 "myapex_provider",
3510 "myapex_selfcontained",
3511 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003512 }
3513
3514 cc_library {
3515 name: "libfoo",
3516 srcs: ["mytest.cpp"],
3517 stubs: {
3518 versions: ["1"],
3519 },
3520 system_shared_libs: [],
3521 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003522 apex_available: [
3523 "myapex_provider",
3524 "myapex_selfcontained",
3525 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003526 }
3527 `)
3528
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003529 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003530 var provideNativeLibs, requireNativeLibs []string
3531
Sundong Ahnabb64432019-10-22 13:58:29 +09003532 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003533 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3534 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003535 ensureListEmpty(t, provideNativeLibs)
3536 ensureListEmpty(t, requireNativeLibs)
3537
Sundong Ahnabb64432019-10-22 13:58:29 +09003538 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003539 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3540 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003541 ensureListEmpty(t, provideNativeLibs)
3542 ensureListContains(t, requireNativeLibs, "libfoo.so")
3543
Sundong Ahnabb64432019-10-22 13:58:29 +09003544 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003545 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3546 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003547 ensureListContains(t, provideNativeLibs, "libfoo.so")
3548 ensureListEmpty(t, requireNativeLibs)
3549
Sundong Ahnabb64432019-10-22 13:58:29 +09003550 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003551 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3552 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003553 ensureListContains(t, provideNativeLibs, "libfoo.so")
3554 ensureListEmpty(t, requireNativeLibs)
3555}
3556
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003557func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003558 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003559 apex {
3560 name: "myapex",
3561 key: "myapex.key",
3562 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003563 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003564 }
3565
3566 apex_key {
3567 name: "myapex.key",
3568 public_key: "testkey.avbpubkey",
3569 private_key: "testkey.pem",
3570 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003571
3572 cc_library {
3573 name: "mylib",
3574 srcs: ["mylib.cpp"],
3575 system_shared_libs: [],
3576 stl: "none",
3577 apex_available: [
3578 "//apex_available:platform",
3579 "myapex",
3580 ],
3581 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003582 `)
3583
Sundong Ahnabb64432019-10-22 13:58:29 +09003584 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003585 apexManifestRule := module.Rule("apexManifestRule")
3586 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3587 apexRule := module.Rule("apexRule")
3588 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003589
3590 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3591 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3592 name := apexBundle.BaseModuleName()
3593 prefix := "TARGET_"
3594 var builder strings.Builder
3595 data.Custom(&builder, name, prefix, "", data)
3596 androidMk := builder.String()
3597 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3598 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003599}
3600
Alex Light0851b882019-02-07 13:20:53 -08003601func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003602 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003603 apex {
3604 name: "myapex",
3605 key: "myapex.key",
3606 native_shared_libs: ["mylib_common"],
3607 }
3608
3609 apex_key {
3610 name: "myapex.key",
3611 public_key: "testkey.avbpubkey",
3612 private_key: "testkey.pem",
3613 }
3614
3615 cc_library {
3616 name: "mylib_common",
3617 srcs: ["mylib.cpp"],
3618 system_shared_libs: [],
3619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003620 apex_available: [
3621 "//apex_available:platform",
3622 "myapex",
3623 ],
Alex Light0851b882019-02-07 13:20:53 -08003624 }
3625 `)
3626
Sundong Ahnabb64432019-10-22 13:58:29 +09003627 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003628 apexRule := module.Rule("apexRule")
3629 copyCmds := apexRule.Args["copy_commands"]
3630
3631 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3632 t.Log("Apex was a test apex!")
3633 t.Fail()
3634 }
3635 // Ensure that main rule creates an output
3636 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3637
3638 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003639 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003640
3641 // Ensure that both direct and indirect deps are copied into apex
3642 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3643
Colin Cross7113d202019-11-20 16:39:12 -08003644 // Ensure that the platform variant ends with _shared
3645 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003646
Colin Cross56a83212020-09-15 18:30:11 -07003647 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003648 t.Log("Found mylib_common not in any apex!")
3649 t.Fail()
3650 }
3651}
3652
3653func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003654 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003655 apex_test {
3656 name: "myapex",
3657 key: "myapex.key",
3658 native_shared_libs: ["mylib_common_test"],
3659 }
3660
3661 apex_key {
3662 name: "myapex.key",
3663 public_key: "testkey.avbpubkey",
3664 private_key: "testkey.pem",
3665 }
3666
3667 cc_library {
3668 name: "mylib_common_test",
3669 srcs: ["mylib.cpp"],
3670 system_shared_libs: [],
3671 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003672 // TODO: remove //apex_available:platform
3673 apex_available: [
3674 "//apex_available:platform",
3675 "myapex",
3676 ],
Alex Light0851b882019-02-07 13:20:53 -08003677 }
3678 `)
3679
Sundong Ahnabb64432019-10-22 13:58:29 +09003680 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003681 apexRule := module.Rule("apexRule")
3682 copyCmds := apexRule.Args["copy_commands"]
3683
3684 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3685 t.Log("Apex was not a test apex!")
3686 t.Fail()
3687 }
3688 // Ensure that main rule creates an output
3689 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3690
3691 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003692 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003693
3694 // Ensure that both direct and indirect deps are copied into apex
3695 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3696
Colin Cross7113d202019-11-20 16:39:12 -08003697 // Ensure that the platform variant ends with _shared
3698 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003699}
3700
Alex Light9670d332019-01-29 18:07:33 -08003701func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003702 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003703 apex {
3704 name: "myapex",
3705 key: "myapex.key",
3706 multilib: {
3707 first: {
3708 native_shared_libs: ["mylib_common"],
3709 }
3710 },
3711 target: {
3712 android: {
3713 multilib: {
3714 first: {
3715 native_shared_libs: ["mylib"],
3716 }
3717 }
3718 },
3719 host: {
3720 multilib: {
3721 first: {
3722 native_shared_libs: ["mylib2"],
3723 }
3724 }
3725 }
3726 }
3727 }
3728
3729 apex_key {
3730 name: "myapex.key",
3731 public_key: "testkey.avbpubkey",
3732 private_key: "testkey.pem",
3733 }
3734
3735 cc_library {
3736 name: "mylib",
3737 srcs: ["mylib.cpp"],
3738 system_shared_libs: [],
3739 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003740 // TODO: remove //apex_available:platform
3741 apex_available: [
3742 "//apex_available:platform",
3743 "myapex",
3744 ],
Alex Light9670d332019-01-29 18:07:33 -08003745 }
3746
3747 cc_library {
3748 name: "mylib_common",
3749 srcs: ["mylib.cpp"],
3750 system_shared_libs: [],
3751 stl: "none",
3752 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003753 // TODO: remove //apex_available:platform
3754 apex_available: [
3755 "//apex_available:platform",
3756 "myapex",
3757 ],
Alex Light9670d332019-01-29 18:07:33 -08003758 }
3759
3760 cc_library {
3761 name: "mylib2",
3762 srcs: ["mylib.cpp"],
3763 system_shared_libs: [],
3764 stl: "none",
3765 compile_multilib: "first",
3766 }
3767 `)
3768
Sundong Ahnabb64432019-10-22 13:58:29 +09003769 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003770 copyCmds := apexRule.Args["copy_commands"]
3771
3772 // Ensure that main rule creates an output
3773 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3774
3775 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003776 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3777 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3778 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003779
3780 // Ensure that both direct and indirect deps are copied into apex
3781 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3782 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3783 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3784
Colin Cross7113d202019-11-20 16:39:12 -08003785 // Ensure that the platform variant ends with _shared
3786 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3787 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3788 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003789}
Jiyong Park04480cf2019-02-06 00:16:29 +09003790
3791func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003792 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003793 apex {
3794 name: "myapex",
3795 key: "myapex.key",
3796 binaries: ["myscript"],
3797 }
3798
3799 apex_key {
3800 name: "myapex.key",
3801 public_key: "testkey.avbpubkey",
3802 private_key: "testkey.pem",
3803 }
3804
3805 sh_binary {
3806 name: "myscript",
3807 src: "mylib.cpp",
3808 filename: "myscript.sh",
3809 sub_dir: "script",
3810 }
3811 `)
3812
Sundong Ahnabb64432019-10-22 13:58:29 +09003813 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003814 copyCmds := apexRule.Args["copy_commands"]
3815
3816 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3817}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003818
Jooyung Han91df2082019-11-20 01:49:42 +09003819func TestApexInVariousPartition(t *testing.T) {
3820 testcases := []struct {
3821 propName, parition, flattenedPartition string
3822 }{
3823 {"", "system", "system_ext"},
3824 {"product_specific: true", "product", "product"},
3825 {"soc_specific: true", "vendor", "vendor"},
3826 {"proprietary: true", "vendor", "vendor"},
3827 {"vendor: true", "vendor", "vendor"},
3828 {"system_ext_specific: true", "system_ext", "system_ext"},
3829 }
3830 for _, tc := range testcases {
3831 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3832 ctx, _ := testApex(t, `
3833 apex {
3834 name: "myapex",
3835 key: "myapex.key",
3836 `+tc.propName+`
3837 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003838
Jooyung Han91df2082019-11-20 01:49:42 +09003839 apex_key {
3840 name: "myapex.key",
3841 public_key: "testkey.avbpubkey",
3842 private_key: "testkey.pem",
3843 }
3844 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003845
Jooyung Han91df2082019-11-20 01:49:42 +09003846 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3847 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3848 actual := apex.installDir.String()
3849 if actual != expected {
3850 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3851 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003852
Jooyung Han91df2082019-11-20 01:49:42 +09003853 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3854 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3855 actual = flattened.installDir.String()
3856 if actual != expected {
3857 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3858 }
3859 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003860 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003861}
Jiyong Park67882562019-03-21 01:11:21 +09003862
Jooyung Han580eb4f2020-06-24 19:33:06 +09003863func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003864 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003865 apex {
3866 name: "myapex",
3867 key: "myapex.key",
3868 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003869
Jooyung Han580eb4f2020-06-24 19:33:06 +09003870 apex_key {
3871 name: "myapex.key",
3872 public_key: "testkey.avbpubkey",
3873 private_key: "testkey.pem",
3874 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003875 `)
3876 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003877 rule := module.Output("file_contexts")
3878 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3879}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003880
Jooyung Han580eb4f2020-06-24 19:33:06 +09003881func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003882 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003883 apex {
3884 name: "myapex",
3885 key: "myapex.key",
3886 file_contexts: "my_own_file_contexts",
3887 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003888
Jooyung Han580eb4f2020-06-24 19:33:06 +09003889 apex_key {
3890 name: "myapex.key",
3891 public_key: "testkey.avbpubkey",
3892 private_key: "testkey.pem",
3893 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 `, withFiles(map[string][]byte{
3895 "my_own_file_contexts": nil,
3896 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003897}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003898
Jooyung Han580eb4f2020-06-24 19:33:06 +09003899func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003900 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003901 apex {
3902 name: "myapex",
3903 key: "myapex.key",
3904 product_specific: true,
3905 file_contexts: "product_specific_file_contexts",
3906 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003907
Jooyung Han580eb4f2020-06-24 19:33:06 +09003908 apex_key {
3909 name: "myapex.key",
3910 public_key: "testkey.avbpubkey",
3911 private_key: "testkey.pem",
3912 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003913 `)
3914
Jooyung Han580eb4f2020-06-24 19:33:06 +09003915 ctx, _ := testApex(t, `
3916 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 `, withFiles(map[string][]byte{
3929 "product_specific_file_contexts": nil,
3930 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003931 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3932 rule := module.Output("file_contexts")
3933 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3934}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003935
Jooyung Han580eb4f2020-06-24 19:33:06 +09003936func TestFileContexts_SetViaFileGroup(t *testing.T) {
3937 ctx, _ := testApex(t, `
3938 apex {
3939 name: "myapex",
3940 key: "myapex.key",
3941 product_specific: true,
3942 file_contexts: ":my-file-contexts",
3943 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003944
Jooyung Han580eb4f2020-06-24 19:33:06 +09003945 apex_key {
3946 name: "myapex.key",
3947 public_key: "testkey.avbpubkey",
3948 private_key: "testkey.pem",
3949 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003950
Jooyung Han580eb4f2020-06-24 19:33:06 +09003951 filegroup {
3952 name: "my-file-contexts",
3953 srcs: ["product_specific_file_contexts"],
3954 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003955 `, withFiles(map[string][]byte{
3956 "product_specific_file_contexts": nil,
3957 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003958 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3959 rule := module.Output("file_contexts")
3960 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003961}
3962
Jiyong Park67882562019-03-21 01:11:21 +09003963func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003964 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003965 apex_key {
3966 name: "myapex.key",
3967 public_key: ":my.avbpubkey",
3968 private_key: ":my.pem",
3969 product_specific: true,
3970 }
3971
3972 filegroup {
3973 name: "my.avbpubkey",
3974 srcs: ["testkey2.avbpubkey"],
3975 }
3976
3977 filegroup {
3978 name: "my.pem",
3979 srcs: ["testkey2.pem"],
3980 }
3981 `)
3982
3983 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3984 expected_pubkey := "testkey2.avbpubkey"
3985 actual_pubkey := apex_key.public_key_file.String()
3986 if actual_pubkey != expected_pubkey {
3987 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3988 }
3989 expected_privkey := "testkey2.pem"
3990 actual_privkey := apex_key.private_key_file.String()
3991 if actual_privkey != expected_privkey {
3992 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3993 }
3994}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003995
3996func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003997 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003998 prebuilt_apex {
3999 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004000 arch: {
4001 arm64: {
4002 src: "myapex-arm64.apex",
4003 },
4004 arm: {
4005 src: "myapex-arm.apex",
4006 },
4007 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004008 }
4009 `)
4010
4011 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4012
Jiyong Parkc95714e2019-03-29 14:23:10 +09004013 expectedInput := "myapex-arm64.apex"
4014 if prebuilt.inputApex.String() != expectedInput {
4015 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4016 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004017}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004018
4019func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004020 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004021 prebuilt_apex {
4022 name: "myapex",
4023 src: "myapex-arm.apex",
4024 filename: "notmyapex.apex",
4025 }
4026 `)
4027
4028 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4029
4030 expected := "notmyapex.apex"
4031 if p.installFilename != expected {
4032 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4033 }
4034}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004035
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004036func TestPrebuiltOverrides(t *testing.T) {
4037 ctx, config := testApex(t, `
4038 prebuilt_apex {
4039 name: "myapex.prebuilt",
4040 src: "myapex-arm.apex",
4041 overrides: [
4042 "myapex",
4043 ],
4044 }
4045 `)
4046
4047 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4048
4049 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004050 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004051 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004052 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004053 }
4054}
4055
Roland Levillain630846d2019-06-26 12:48:34 +01004056func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004057 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004058 apex_test {
4059 name: "myapex",
4060 key: "myapex.key",
4061 tests: [
4062 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004063 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004064 ],
4065 }
4066
4067 apex_key {
4068 name: "myapex.key",
4069 public_key: "testkey.avbpubkey",
4070 private_key: "testkey.pem",
4071 }
4072
Liz Kammer1c14a212020-05-12 15:26:55 -07004073 filegroup {
4074 name: "fg",
4075 srcs: [
4076 "baz",
4077 "bar/baz"
4078 ],
4079 }
4080
Roland Levillain630846d2019-06-26 12:48:34 +01004081 cc_test {
4082 name: "mytest",
4083 gtest: false,
4084 srcs: ["mytest.cpp"],
4085 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004086 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004087 system_shared_libs: [],
4088 static_executable: true,
4089 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004090 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004091 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004092
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004093 cc_library {
4094 name: "mylib",
4095 srcs: ["mylib.cpp"],
4096 system_shared_libs: [],
4097 stl: "none",
4098 }
4099
Liz Kammer5bd365f2020-05-27 15:15:11 -07004100 filegroup {
4101 name: "fg2",
4102 srcs: [
4103 "testdata/baz"
4104 ],
4105 }
4106
Roland Levillain9b5fde92019-06-28 15:41:19 +01004107 cc_test {
4108 name: "mytests",
4109 gtest: false,
4110 srcs: [
4111 "mytest1.cpp",
4112 "mytest2.cpp",
4113 "mytest3.cpp",
4114 ],
4115 test_per_src: true,
4116 relative_install_path: "test",
4117 system_shared_libs: [],
4118 static_executable: true,
4119 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004120 data: [
4121 ":fg",
4122 ":fg2",
4123 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004124 }
Roland Levillain630846d2019-06-26 12:48:34 +01004125 `)
4126
Sundong Ahnabb64432019-10-22 13:58:29 +09004127 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004128 copyCmds := apexRule.Args["copy_commands"]
4129
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004130 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004131 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004132 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004133
Liz Kammer1c14a212020-05-12 15:26:55 -07004134 //Ensure that test data are copied into apex.
4135 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4136 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4137
Roland Levillain9b5fde92019-06-28 15:41:19 +01004138 // Ensure that test deps built with `test_per_src` are copied into apex.
4139 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4140 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4141 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004142
4143 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004144 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4145 data := android.AndroidMkDataForTest(t, config, "", bundle)
4146 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004147 prefix := "TARGET_"
4148 var builder strings.Builder
4149 data.Custom(&builder, name, prefix, "", data)
4150 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004151 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4152 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4153 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4154 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004155 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004156 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004157 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004158
4159 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4160 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4161 data.Custom(&builder, name, prefix, "", data)
4162 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004163 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4164 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004165}
4166
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004167func TestInstallExtraFlattenedApexes(t *testing.T) {
4168 ctx, config := testApex(t, `
4169 apex {
4170 name: "myapex",
4171 key: "myapex.key",
4172 }
4173 apex_key {
4174 name: "myapex.key",
4175 public_key: "testkey.avbpubkey",
4176 private_key: "testkey.pem",
4177 }
4178 `, func(fs map[string][]byte, config android.Config) {
4179 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4180 })
4181 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004182 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004183 mk := android.AndroidMkDataForTest(t, config, "", ab)
4184 var builder strings.Builder
4185 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4186 androidMk := builder.String()
4187 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4188}
4189
Jooyung Han5c998b92019-06-27 11:30:33 +09004190func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004191 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004192 apex {
4193 name: "myapex",
4194 key: "myapex.key",
4195 native_shared_libs: ["mylib"],
4196 uses: ["commonapex"],
4197 }
4198
4199 apex {
4200 name: "commonapex",
4201 key: "myapex.key",
4202 native_shared_libs: ["libcommon"],
4203 provide_cpp_shared_libs: true,
4204 }
4205
4206 apex_key {
4207 name: "myapex.key",
4208 public_key: "testkey.avbpubkey",
4209 private_key: "testkey.pem",
4210 }
4211
4212 cc_library {
4213 name: "mylib",
4214 srcs: ["mylib.cpp"],
4215 shared_libs: ["libcommon"],
4216 system_shared_libs: [],
4217 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004218 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004219 }
4220
4221 cc_library {
4222 name: "libcommon",
4223 srcs: ["mylib_common.cpp"],
4224 system_shared_libs: [],
4225 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004226 // TODO: remove //apex_available:platform
4227 apex_available: [
4228 "//apex_available:platform",
4229 "commonapex",
4230 "myapex",
4231 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004232 }
4233 `)
4234
Sundong Ahnabb64432019-10-22 13:58:29 +09004235 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004236 apexRule1 := module1.Rule("apexRule")
4237 copyCmds1 := apexRule1.Args["copy_commands"]
4238
Sundong Ahnabb64432019-10-22 13:58:29 +09004239 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004240 apexRule2 := module2.Rule("apexRule")
4241 copyCmds2 := apexRule2.Args["copy_commands"]
4242
Colin Crossaede88c2020-08-11 12:17:01 -07004243 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4244 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004245 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4246 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4247 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4248}
4249
4250func TestApexUsesFailsIfNotProvided(t *testing.T) {
4251 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4252 apex {
4253 name: "myapex",
4254 key: "myapex.key",
4255 uses: ["commonapex"],
4256 }
4257
4258 apex {
4259 name: "commonapex",
4260 key: "myapex.key",
4261 }
4262
4263 apex_key {
4264 name: "myapex.key",
4265 public_key: "testkey.avbpubkey",
4266 private_key: "testkey.pem",
4267 }
4268 `)
4269 testApexError(t, `uses: "commonapex" is not a provider`, `
4270 apex {
4271 name: "myapex",
4272 key: "myapex.key",
4273 uses: ["commonapex"],
4274 }
4275
4276 cc_library {
4277 name: "commonapex",
4278 system_shared_libs: [],
4279 stl: "none",
4280 }
4281
4282 apex_key {
4283 name: "myapex.key",
4284 public_key: "testkey.avbpubkey",
4285 private_key: "testkey.pem",
4286 }
4287 `)
4288}
4289
4290func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4291 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4292 apex {
4293 name: "myapex",
4294 key: "myapex.key",
4295 use_vendor: true,
4296 uses: ["commonapex"],
4297 }
4298
4299 apex {
4300 name: "commonapex",
4301 key: "myapex.key",
4302 provide_cpp_shared_libs: true,
4303 }
4304
4305 apex_key {
4306 name: "myapex.key",
4307 public_key: "testkey.avbpubkey",
4308 private_key: "testkey.pem",
4309 }
Jooyung Handc782442019-11-01 03:14:38 +09004310 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004311 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004312 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004313}
4314
Jooyung Hand48f3c32019-08-23 11:18:57 +09004315func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4316 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4317 apex {
4318 name: "myapex",
4319 key: "myapex.key",
4320 native_shared_libs: ["libfoo"],
4321 }
4322
4323 apex_key {
4324 name: "myapex.key",
4325 public_key: "testkey.avbpubkey",
4326 private_key: "testkey.pem",
4327 }
4328
4329 cc_library {
4330 name: "libfoo",
4331 stl: "none",
4332 system_shared_libs: [],
4333 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004334 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004335 }
4336 `)
4337 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4338 apex {
4339 name: "myapex",
4340 key: "myapex.key",
4341 java_libs: ["myjar"],
4342 }
4343
4344 apex_key {
4345 name: "myapex.key",
4346 public_key: "testkey.avbpubkey",
4347 private_key: "testkey.pem",
4348 }
4349
4350 java_library {
4351 name: "myjar",
4352 srcs: ["foo/bar/MyClass.java"],
4353 sdk_version: "none",
4354 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004355 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004356 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004357 }
4358 `)
4359}
4360
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004361func TestApexWithApps(t *testing.T) {
4362 ctx, _ := testApex(t, `
4363 apex {
4364 name: "myapex",
4365 key: "myapex.key",
4366 apps: [
4367 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004368 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004369 ],
4370 }
4371
4372 apex_key {
4373 name: "myapex.key",
4374 public_key: "testkey.avbpubkey",
4375 private_key: "testkey.pem",
4376 }
4377
4378 android_app {
4379 name: "AppFoo",
4380 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004381 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004382 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004383 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004384 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004385 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004386 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004387
4388 android_app {
4389 name: "AppFooPriv",
4390 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004391 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004392 system_modules: "none",
4393 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004394 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004395 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004396 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004397
4398 cc_library_shared {
4399 name: "libjni",
4400 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004401 shared_libs: ["libfoo"],
4402 stl: "none",
4403 system_shared_libs: [],
4404 apex_available: [ "myapex" ],
4405 sdk_version: "current",
4406 }
4407
4408 cc_library_shared {
4409 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004410 stl: "none",
4411 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004412 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004413 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004414 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004415 `)
4416
Sundong Ahnabb64432019-10-22 13:58:29 +09004417 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004418 apexRule := module.Rule("apexRule")
4419 copyCmds := apexRule.Args["copy_commands"]
4420
4421 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004422 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004423
Colin Crossaede88c2020-08-11 12:17:01 -07004424 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004425 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004426 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004427 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004428 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004429 // JNI libraries including transitive deps are
4430 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004431 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004432 // ... embedded inside APK (jnilibs.zip)
4433 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4434 // ... and not directly inside the APEX
4435 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4436 }
Dario Frenicde2a032019-10-27 00:29:22 +01004437}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004438
Dario Frenicde2a032019-10-27 00:29:22 +01004439func TestApexWithAppImports(t *testing.T) {
4440 ctx, _ := testApex(t, `
4441 apex {
4442 name: "myapex",
4443 key: "myapex.key",
4444 apps: [
4445 "AppFooPrebuilt",
4446 "AppFooPrivPrebuilt",
4447 ],
4448 }
4449
4450 apex_key {
4451 name: "myapex.key",
4452 public_key: "testkey.avbpubkey",
4453 private_key: "testkey.pem",
4454 }
4455
4456 android_app_import {
4457 name: "AppFooPrebuilt",
4458 apk: "PrebuiltAppFoo.apk",
4459 presigned: true,
4460 dex_preopt: {
4461 enabled: false,
4462 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004463 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004464 }
4465
4466 android_app_import {
4467 name: "AppFooPrivPrebuilt",
4468 apk: "PrebuiltAppFooPriv.apk",
4469 privileged: true,
4470 presigned: true,
4471 dex_preopt: {
4472 enabled: false,
4473 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004474 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004475 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004476 }
4477 `)
4478
Sundong Ahnabb64432019-10-22 13:58:29 +09004479 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004480 apexRule := module.Rule("apexRule")
4481 copyCmds := apexRule.Args["copy_commands"]
4482
4483 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004484 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4485}
4486
4487func TestApexWithAppImportsPrefer(t *testing.T) {
4488 ctx, _ := testApex(t, `
4489 apex {
4490 name: "myapex",
4491 key: "myapex.key",
4492 apps: [
4493 "AppFoo",
4494 ],
4495 }
4496
4497 apex_key {
4498 name: "myapex.key",
4499 public_key: "testkey.avbpubkey",
4500 private_key: "testkey.pem",
4501 }
4502
4503 android_app {
4504 name: "AppFoo",
4505 srcs: ["foo/bar/MyClass.java"],
4506 sdk_version: "none",
4507 system_modules: "none",
4508 apex_available: [ "myapex" ],
4509 }
4510
4511 android_app_import {
4512 name: "AppFoo",
4513 apk: "AppFooPrebuilt.apk",
4514 filename: "AppFooPrebuilt.apk",
4515 presigned: true,
4516 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004517 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004518 }
4519 `, withFiles(map[string][]byte{
4520 "AppFooPrebuilt.apk": nil,
4521 }))
4522
4523 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4524 "app/AppFoo/AppFooPrebuilt.apk",
4525 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004526}
4527
Dario Freni6f3937c2019-12-20 22:58:03 +00004528func TestApexWithTestHelperApp(t *testing.T) {
4529 ctx, _ := testApex(t, `
4530 apex {
4531 name: "myapex",
4532 key: "myapex.key",
4533 apps: [
4534 "TesterHelpAppFoo",
4535 ],
4536 }
4537
4538 apex_key {
4539 name: "myapex.key",
4540 public_key: "testkey.avbpubkey",
4541 private_key: "testkey.pem",
4542 }
4543
4544 android_test_helper_app {
4545 name: "TesterHelpAppFoo",
4546 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004547 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004548 }
4549
4550 `)
4551
4552 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4553 apexRule := module.Rule("apexRule")
4554 copyCmds := apexRule.Args["copy_commands"]
4555
4556 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4557}
4558
Jooyung Han18020ea2019-11-13 10:50:48 +09004559func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4560 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004561 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004562 apex {
4563 name: "myapex",
4564 key: "myapex.key",
4565 native_shared_libs: ["libfoo"],
4566 }
4567
4568 apex_key {
4569 name: "myapex.key",
4570 public_key: "testkey.avbpubkey",
4571 private_key: "testkey.pem",
4572 }
4573
4574 apex {
4575 name: "otherapex",
4576 key: "myapex.key",
4577 native_shared_libs: ["libfoo"],
4578 }
4579
4580 cc_defaults {
4581 name: "libfoo-defaults",
4582 apex_available: ["otherapex"],
4583 }
4584
4585 cc_library {
4586 name: "libfoo",
4587 defaults: ["libfoo-defaults"],
4588 stl: "none",
4589 system_shared_libs: [],
4590 }`)
4591}
4592
Paul Duffine52e66f2020-03-30 17:54:29 +01004593func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004594 // libfoo is not available to myapex, but only to otherapex
4595 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4596 apex {
4597 name: "myapex",
4598 key: "myapex.key",
4599 native_shared_libs: ["libfoo"],
4600 }
4601
4602 apex_key {
4603 name: "myapex.key",
4604 public_key: "testkey.avbpubkey",
4605 private_key: "testkey.pem",
4606 }
4607
4608 apex {
4609 name: "otherapex",
4610 key: "otherapex.key",
4611 native_shared_libs: ["libfoo"],
4612 }
4613
4614 apex_key {
4615 name: "otherapex.key",
4616 public_key: "testkey.avbpubkey",
4617 private_key: "testkey.pem",
4618 }
4619
4620 cc_library {
4621 name: "libfoo",
4622 stl: "none",
4623 system_shared_libs: [],
4624 apex_available: ["otherapex"],
4625 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004626}
Jiyong Park127b40b2019-09-30 16:04:35 +09004627
Paul Duffine52e66f2020-03-30 17:54:29 +01004628func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004629 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004630 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004631.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004632.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004633.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004634.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004635.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004636.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004637 apex {
4638 name: "myapex",
4639 key: "myapex.key",
4640 native_shared_libs: ["libfoo"],
4641 }
4642
4643 apex_key {
4644 name: "myapex.key",
4645 public_key: "testkey.avbpubkey",
4646 private_key: "testkey.pem",
4647 }
4648
Jiyong Park127b40b2019-09-30 16:04:35 +09004649 cc_library {
4650 name: "libfoo",
4651 stl: "none",
4652 shared_libs: ["libbar"],
4653 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004654 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004655 }
4656
4657 cc_library {
4658 name: "libbar",
4659 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004660 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004661 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004662 apex_available: ["myapex"],
4663 }
4664
4665 cc_library {
4666 name: "libbaz",
4667 stl: "none",
4668 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004669 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004670}
Jiyong Park127b40b2019-09-30 16:04:35 +09004671
Paul Duffine52e66f2020-03-30 17:54:29 +01004672func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004673 testApexError(t, "\"otherapex\" is not a valid module name", `
4674 apex {
4675 name: "myapex",
4676 key: "myapex.key",
4677 native_shared_libs: ["libfoo"],
4678 }
4679
4680 apex_key {
4681 name: "myapex.key",
4682 public_key: "testkey.avbpubkey",
4683 private_key: "testkey.pem",
4684 }
4685
4686 cc_library {
4687 name: "libfoo",
4688 stl: "none",
4689 system_shared_libs: [],
4690 apex_available: ["otherapex"],
4691 }`)
4692
Paul Duffine52e66f2020-03-30 17:54:29 +01004693 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004694 apex {
4695 name: "myapex",
4696 key: "myapex.key",
4697 native_shared_libs: ["libfoo", "libbar"],
4698 }
4699
4700 apex_key {
4701 name: "myapex.key",
4702 public_key: "testkey.avbpubkey",
4703 private_key: "testkey.pem",
4704 }
4705
4706 cc_library {
4707 name: "libfoo",
4708 stl: "none",
4709 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004710 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004711 apex_available: ["myapex"],
4712 }
4713
4714 cc_library {
4715 name: "libbar",
4716 stl: "none",
4717 system_shared_libs: [],
4718 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004719 }
4720
4721 cc_library {
4722 name: "libbaz",
4723 stl: "none",
4724 system_shared_libs: [],
4725 stubs: {
4726 versions: ["10", "20", "30"],
4727 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004728 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004729}
Jiyong Park127b40b2019-09-30 16:04:35 +09004730
Jiyong Park89e850a2020-04-07 16:37:39 +09004731func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004732 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004733 apex {
4734 name: "myapex",
4735 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004736 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004737 }
4738
4739 apex_key {
4740 name: "myapex.key",
4741 public_key: "testkey.avbpubkey",
4742 private_key: "testkey.pem",
4743 }
4744
4745 cc_library {
4746 name: "libfoo",
4747 stl: "none",
4748 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004749 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004750 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004751 }
4752
4753 cc_library {
4754 name: "libfoo2",
4755 stl: "none",
4756 system_shared_libs: [],
4757 shared_libs: ["libbaz"],
4758 apex_available: ["//apex_available:platform"],
4759 }
4760
4761 cc_library {
4762 name: "libbar",
4763 stl: "none",
4764 system_shared_libs: [],
4765 apex_available: ["myapex"],
4766 }
4767
4768 cc_library {
4769 name: "libbaz",
4770 stl: "none",
4771 system_shared_libs: [],
4772 apex_available: ["myapex"],
4773 stubs: {
4774 versions: ["1"],
4775 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004776 }`)
4777
Jiyong Park89e850a2020-04-07 16:37:39 +09004778 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4779 // because it depends on libbar which isn't available to platform
4780 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4781 if libfoo.NotAvailableForPlatform() != true {
4782 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4783 }
4784
4785 // libfoo2 however can be available to platform because it depends on libbaz which provides
4786 // stubs
4787 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4788 if libfoo2.NotAvailableForPlatform() == true {
4789 t.Errorf("%q should be available to platform", libfoo2.String())
4790 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004791}
Jiyong Parka90ca002019-10-07 15:47:24 +09004792
Paul Duffine52e66f2020-03-30 17:54:29 +01004793func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004794 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004795 apex {
4796 name: "myapex",
4797 key: "myapex.key",
4798 native_shared_libs: ["libfoo"],
4799 }
4800
4801 apex_key {
4802 name: "myapex.key",
4803 public_key: "testkey.avbpubkey",
4804 private_key: "testkey.pem",
4805 }
4806
4807 cc_library {
4808 name: "libfoo",
4809 stl: "none",
4810 system_shared_libs: [],
4811 apex_available: ["myapex"],
4812 static: {
4813 apex_available: ["//apex_available:platform"],
4814 },
4815 }`)
4816
Jiyong Park89e850a2020-04-07 16:37:39 +09004817 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4818 if libfooShared.NotAvailableForPlatform() != true {
4819 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4820 }
4821 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4822 if libfooStatic.NotAvailableForPlatform() != false {
4823 t.Errorf("%q should be available to platform", libfooStatic.String())
4824 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004825}
4826
Jiyong Park5d790c32019-11-15 18:40:32 +09004827func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004828 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004829 apex {
4830 name: "myapex",
4831 key: "myapex.key",
4832 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004833 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004834 }
4835
4836 override_apex {
4837 name: "override_myapex",
4838 base: "myapex",
4839 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004840 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004841 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004842 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004843 }
4844
4845 apex_key {
4846 name: "myapex.key",
4847 public_key: "testkey.avbpubkey",
4848 private_key: "testkey.pem",
4849 }
4850
4851 android_app {
4852 name: "app",
4853 srcs: ["foo/bar/MyClass.java"],
4854 package_name: "foo",
4855 sdk_version: "none",
4856 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004857 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004858 }
4859
4860 override_android_app {
4861 name: "override_app",
4862 base: "app",
4863 package_name: "bar",
4864 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004865 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004866
Jiyong Park317645e2019-12-05 13:20:58 +09004867 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4868 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4869 if originalVariant.GetOverriddenBy() != "" {
4870 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4871 }
4872 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4873 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4874 }
4875
Jiyong Park5d790c32019-11-15 18:40:32 +09004876 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4877 apexRule := module.Rule("apexRule")
4878 copyCmds := apexRule.Args["copy_commands"]
4879
4880 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004881 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004882
4883 apexBundle := module.Module().(*apexBundle)
4884 name := apexBundle.Name()
4885 if name != "override_myapex" {
4886 t.Errorf("name should be \"override_myapex\", but was %q", name)
4887 }
4888
Baligh Uddin004d7172020-02-19 21:29:28 -08004889 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4890 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4891 }
4892
Jiyong Park20bacab2020-03-03 11:45:41 +09004893 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004894 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004895
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004896 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4897 var builder strings.Builder
4898 data.Custom(&builder, name, "TARGET_", "", data)
4899 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004900 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004901 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4902 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004903 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004904 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004905 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004906 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4907 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004908}
4909
Jooyung Han214bf372019-11-12 13:03:50 +09004910func TestLegacyAndroid10Support(t *testing.T) {
4911 ctx, _ := testApex(t, `
4912 apex {
4913 name: "myapex",
4914 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004915 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004916 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004917 }
4918
4919 apex_key {
4920 name: "myapex.key",
4921 public_key: "testkey.avbpubkey",
4922 private_key: "testkey.pem",
4923 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004924
4925 cc_library {
4926 name: "mylib",
4927 srcs: ["mylib.cpp"],
4928 stl: "libc++",
4929 system_shared_libs: [],
4930 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004931 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004932 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004933 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004934
4935 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4936 args := module.Rule("apexRule").Args
4937 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004938 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004939
4940 // The copies of the libraries in the apex should have one more dependency than
4941 // the ones outside the apex, namely the unwinder. Ideally we should check
4942 // the dependency names directly here but for some reason the names are blank in
4943 // this test.
4944 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004945 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004946 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4947 if len(apexImplicits) != len(nonApexImplicits)+1 {
4948 t.Errorf("%q missing unwinder dep", lib)
4949 }
4950 }
Jooyung Han214bf372019-11-12 13:03:50 +09004951}
4952
Paul Duffin9b879592020-05-26 13:21:35 +01004953var filesForSdkLibrary = map[string][]byte{
4954 "api/current.txt": nil,
4955 "api/removed.txt": nil,
4956 "api/system-current.txt": nil,
4957 "api/system-removed.txt": nil,
4958 "api/test-current.txt": nil,
4959 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004960
4961 // For java_sdk_library_import
4962 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004963}
4964
Jooyung Han58f26ab2019-12-18 15:34:32 +09004965func TestJavaSDKLibrary(t *testing.T) {
4966 ctx, _ := testApex(t, `
4967 apex {
4968 name: "myapex",
4969 key: "myapex.key",
4970 java_libs: ["foo"],
4971 }
4972
4973 apex_key {
4974 name: "myapex.key",
4975 public_key: "testkey.avbpubkey",
4976 private_key: "testkey.pem",
4977 }
4978
4979 java_sdk_library {
4980 name: "foo",
4981 srcs: ["a.java"],
4982 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004983 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004984 }
Paul Duffin9b879592020-05-26 13:21:35 +01004985 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004986
4987 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004988 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004989 "javalib/foo.jar",
4990 "etc/permissions/foo.xml",
4991 })
4992 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004993 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4994 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004995}
4996
Paul Duffin9b879592020-05-26 13:21:35 +01004997func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4998 ctx, _ := testApex(t, `
4999 apex {
5000 name: "myapex",
5001 key: "myapex.key",
5002 java_libs: ["foo", "bar"],
5003 }
5004
5005 apex_key {
5006 name: "myapex.key",
5007 public_key: "testkey.avbpubkey",
5008 private_key: "testkey.pem",
5009 }
5010
5011 java_sdk_library {
5012 name: "foo",
5013 srcs: ["a.java"],
5014 api_packages: ["foo"],
5015 apex_available: ["myapex"],
5016 sdk_version: "none",
5017 system_modules: "none",
5018 }
5019
5020 java_library {
5021 name: "bar",
5022 srcs: ["a.java"],
5023 libs: ["foo"],
5024 apex_available: ["myapex"],
5025 sdk_version: "none",
5026 system_modules: "none",
5027 }
5028 `, withFiles(filesForSdkLibrary))
5029
5030 // java_sdk_library installs both impl jar and permission XML
5031 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5032 "javalib/bar.jar",
5033 "javalib/foo.jar",
5034 "etc/permissions/foo.xml",
5035 })
5036
5037 // The bar library should depend on the implementation jar.
5038 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5039 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5040 t.Errorf("expected %q, found %#q", expected, actual)
5041 }
5042}
5043
5044func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5045 ctx, _ := testApex(t, `
5046 apex {
5047 name: "myapex",
5048 key: "myapex.key",
5049 java_libs: ["foo"],
5050 }
5051
5052 apex_key {
5053 name: "myapex.key",
5054 public_key: "testkey.avbpubkey",
5055 private_key: "testkey.pem",
5056 }
5057
5058 java_sdk_library {
5059 name: "foo",
5060 srcs: ["a.java"],
5061 api_packages: ["foo"],
5062 apex_available: ["myapex"],
5063 sdk_version: "none",
5064 system_modules: "none",
5065 }
5066
5067 java_library {
5068 name: "bar",
5069 srcs: ["a.java"],
5070 libs: ["foo"],
5071 sdk_version: "none",
5072 system_modules: "none",
5073 }
5074 `, withFiles(filesForSdkLibrary))
5075
5076 // java_sdk_library installs both impl jar and permission XML
5077 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5078 "javalib/foo.jar",
5079 "etc/permissions/foo.xml",
5080 })
5081
5082 // The bar library should depend on the stubs jar.
5083 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5084 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5085 t.Errorf("expected %q, found %#q", expected, actual)
5086 }
5087}
5088
Paul Duffineedc5d52020-06-12 17:46:39 +01005089func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5090 ctx, _ := testApex(t, ``,
5091 withFiles(map[string][]byte{
5092 "apex/a.java": nil,
5093 "apex/apex_manifest.json": nil,
5094 "apex/Android.bp": []byte(`
5095 package {
5096 default_visibility: ["//visibility:private"],
5097 }
5098
5099 apex {
5100 name: "myapex",
5101 key: "myapex.key",
5102 java_libs: ["foo", "bar"],
5103 }
5104
5105 apex_key {
5106 name: "myapex.key",
5107 public_key: "testkey.avbpubkey",
5108 private_key: "testkey.pem",
5109 }
5110
5111 java_library {
5112 name: "bar",
5113 srcs: ["a.java"],
5114 libs: ["foo"],
5115 apex_available: ["myapex"],
5116 sdk_version: "none",
5117 system_modules: "none",
5118 }
5119`),
5120 "source/a.java": nil,
5121 "source/api/current.txt": nil,
5122 "source/api/removed.txt": nil,
5123 "source/Android.bp": []byte(`
5124 package {
5125 default_visibility: ["//visibility:private"],
5126 }
5127
5128 java_sdk_library {
5129 name: "foo",
5130 visibility: ["//apex"],
5131 srcs: ["a.java"],
5132 api_packages: ["foo"],
5133 apex_available: ["myapex"],
5134 sdk_version: "none",
5135 system_modules: "none",
5136 public: {
5137 enabled: true,
5138 },
5139 }
5140`),
5141 "prebuilt/a.jar": nil,
5142 "prebuilt/Android.bp": []byte(`
5143 package {
5144 default_visibility: ["//visibility:private"],
5145 }
5146
5147 java_sdk_library_import {
5148 name: "foo",
5149 visibility: ["//apex", "//source"],
5150 apex_available: ["myapex"],
5151 prefer: true,
5152 public: {
5153 jars: ["a.jar"],
5154 },
5155 }
5156`),
5157 }),
5158 )
5159
5160 // java_sdk_library installs both impl jar and permission XML
5161 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5162 "javalib/bar.jar",
5163 "javalib/foo.jar",
5164 "etc/permissions/foo.xml",
5165 })
5166
5167 // The bar library should depend on the implementation jar.
5168 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5169 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5170 t.Errorf("expected %q, found %#q", expected, actual)
5171 }
5172}
5173
5174func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5175 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5176 apex {
5177 name: "myapex",
5178 key: "myapex.key",
5179 java_libs: ["foo"],
5180 }
5181
5182 apex_key {
5183 name: "myapex.key",
5184 public_key: "testkey.avbpubkey",
5185 private_key: "testkey.pem",
5186 }
5187
5188 java_sdk_library_import {
5189 name: "foo",
5190 apex_available: ["myapex"],
5191 prefer: true,
5192 public: {
5193 jars: ["a.jar"],
5194 },
5195 }
5196
5197 `, withFiles(filesForSdkLibrary))
5198}
5199
atrost6e126252020-01-27 17:01:16 +00005200func TestCompatConfig(t *testing.T) {
5201 ctx, _ := testApex(t, `
5202 apex {
5203 name: "myapex",
5204 key: "myapex.key",
5205 prebuilts: ["myjar-platform-compat-config"],
5206 java_libs: ["myjar"],
5207 }
5208
5209 apex_key {
5210 name: "myapex.key",
5211 public_key: "testkey.avbpubkey",
5212 private_key: "testkey.pem",
5213 }
5214
5215 platform_compat_config {
5216 name: "myjar-platform-compat-config",
5217 src: ":myjar",
5218 }
5219
5220 java_library {
5221 name: "myjar",
5222 srcs: ["foo/bar/MyClass.java"],
5223 sdk_version: "none",
5224 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005225 apex_available: [ "myapex" ],
5226 }
5227 `)
5228 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5229 "etc/compatconfig/myjar-platform-compat-config.xml",
5230 "javalib/myjar.jar",
5231 })
5232}
5233
Jiyong Park479321d2019-12-16 11:47:12 +09005234func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5235 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5236 apex {
5237 name: "myapex",
5238 key: "myapex.key",
5239 java_libs: ["myjar"],
5240 }
5241
5242 apex_key {
5243 name: "myapex.key",
5244 public_key: "testkey.avbpubkey",
5245 private_key: "testkey.pem",
5246 }
5247
5248 java_library {
5249 name: "myjar",
5250 srcs: ["foo/bar/MyClass.java"],
5251 sdk_version: "none",
5252 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005253 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005254 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005255 }
5256 `)
5257}
5258
Jiyong Park7afd1072019-12-30 16:56:33 +09005259func TestCarryRequiredModuleNames(t *testing.T) {
5260 ctx, config := testApex(t, `
5261 apex {
5262 name: "myapex",
5263 key: "myapex.key",
5264 native_shared_libs: ["mylib"],
5265 }
5266
5267 apex_key {
5268 name: "myapex.key",
5269 public_key: "testkey.avbpubkey",
5270 private_key: "testkey.pem",
5271 }
5272
5273 cc_library {
5274 name: "mylib",
5275 srcs: ["mylib.cpp"],
5276 system_shared_libs: [],
5277 stl: "none",
5278 required: ["a", "b"],
5279 host_required: ["c", "d"],
5280 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005281 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005282 }
5283 `)
5284
5285 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5286 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5287 name := apexBundle.BaseModuleName()
5288 prefix := "TARGET_"
5289 var builder strings.Builder
5290 data.Custom(&builder, name, prefix, "", data)
5291 androidMk := builder.String()
5292 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5293 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5294 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5295}
5296
Jiyong Park7cd10e32020-01-14 09:22:18 +09005297func TestSymlinksFromApexToSystem(t *testing.T) {
5298 bp := `
5299 apex {
5300 name: "myapex",
5301 key: "myapex.key",
5302 native_shared_libs: ["mylib"],
5303 java_libs: ["myjar"],
5304 }
5305
Jiyong Park9d677202020-02-19 16:29:35 +09005306 apex {
5307 name: "myapex.updatable",
5308 key: "myapex.key",
5309 native_shared_libs: ["mylib"],
5310 java_libs: ["myjar"],
5311 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005312 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005313 }
5314
Jiyong Park7cd10e32020-01-14 09:22:18 +09005315 apex_key {
5316 name: "myapex.key",
5317 public_key: "testkey.avbpubkey",
5318 private_key: "testkey.pem",
5319 }
5320
5321 cc_library {
5322 name: "mylib",
5323 srcs: ["mylib.cpp"],
5324 shared_libs: ["myotherlib"],
5325 system_shared_libs: [],
5326 stl: "none",
5327 apex_available: [
5328 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005329 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005330 "//apex_available:platform",
5331 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005332 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005333 }
5334
5335 cc_library {
5336 name: "myotherlib",
5337 srcs: ["mylib.cpp"],
5338 system_shared_libs: [],
5339 stl: "none",
5340 apex_available: [
5341 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005342 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005343 "//apex_available:platform",
5344 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005345 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005346 }
5347
5348 java_library {
5349 name: "myjar",
5350 srcs: ["foo/bar/MyClass.java"],
5351 sdk_version: "none",
5352 system_modules: "none",
5353 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005354 apex_available: [
5355 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005356 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005357 "//apex_available:platform",
5358 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005359 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005360 }
5361
5362 java_library {
5363 name: "myotherjar",
5364 srcs: ["foo/bar/MyClass.java"],
5365 sdk_version: "none",
5366 system_modules: "none",
5367 apex_available: [
5368 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005369 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005370 "//apex_available:platform",
5371 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005372 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005373 }
5374 `
5375
5376 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5377 for _, f := range files {
5378 if f.path == file {
5379 if f.isLink {
5380 t.Errorf("%q is not a real file", file)
5381 }
5382 return
5383 }
5384 }
5385 t.Errorf("%q is not found", file)
5386 }
5387
5388 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5389 for _, f := range files {
5390 if f.path == file {
5391 if !f.isLink {
5392 t.Errorf("%q is not a symlink", file)
5393 }
5394 return
5395 }
5396 }
5397 t.Errorf("%q is not found", file)
5398 }
5399
Jiyong Park9d677202020-02-19 16:29:35 +09005400 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5401 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005402 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005403 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005404 ensureRealfileExists(t, files, "javalib/myjar.jar")
5405 ensureRealfileExists(t, files, "lib64/mylib.so")
5406 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5407
Jiyong Park9d677202020-02-19 16:29:35 +09005408 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5409 ensureRealfileExists(t, files, "javalib/myjar.jar")
5410 ensureRealfileExists(t, files, "lib64/mylib.so")
5411 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5412
5413 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005414 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005415 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005416 ensureRealfileExists(t, files, "javalib/myjar.jar")
5417 ensureRealfileExists(t, files, "lib64/mylib.so")
5418 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005419
5420 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5421 ensureRealfileExists(t, files, "javalib/myjar.jar")
5422 ensureRealfileExists(t, files, "lib64/mylib.so")
5423 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005424}
5425
Yo Chiange8128052020-07-23 20:09:18 +08005426func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5427 ctx, config := testApex(t, `
5428 apex {
5429 name: "myapex",
5430 key: "myapex.key",
5431 native_shared_libs: ["mylib"],
5432 }
5433
5434 apex_key {
5435 name: "myapex.key",
5436 public_key: "testkey.avbpubkey",
5437 private_key: "testkey.pem",
5438 }
5439
5440 cc_library_shared {
5441 name: "mylib",
5442 srcs: ["mylib.cpp"],
5443 shared_libs: ["myotherlib"],
5444 system_shared_libs: [],
5445 stl: "none",
5446 apex_available: [
5447 "myapex",
5448 "//apex_available:platform",
5449 ],
5450 }
5451
5452 cc_prebuilt_library_shared {
5453 name: "myotherlib",
5454 srcs: ["prebuilt.so"],
5455 system_shared_libs: [],
5456 stl: "none",
5457 apex_available: [
5458 "myapex",
5459 "//apex_available:platform",
5460 ],
5461 }
5462 `)
5463
5464 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5465 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5466 var builder strings.Builder
5467 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5468 androidMk := builder.String()
5469 // `myotherlib` is added to `myapex` as symlink
5470 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5471 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5472 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5473 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5474 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5475}
5476
Jooyung Han643adc42020-02-27 13:50:06 +09005477func TestApexWithJniLibs(t *testing.T) {
5478 ctx, _ := testApex(t, `
5479 apex {
5480 name: "myapex",
5481 key: "myapex.key",
5482 jni_libs: ["mylib"],
5483 }
5484
5485 apex_key {
5486 name: "myapex.key",
5487 public_key: "testkey.avbpubkey",
5488 private_key: "testkey.pem",
5489 }
5490
5491 cc_library {
5492 name: "mylib",
5493 srcs: ["mylib.cpp"],
5494 shared_libs: ["mylib2"],
5495 system_shared_libs: [],
5496 stl: "none",
5497 apex_available: [ "myapex" ],
5498 }
5499
5500 cc_library {
5501 name: "mylib2",
5502 srcs: ["mylib.cpp"],
5503 system_shared_libs: [],
5504 stl: "none",
5505 apex_available: [ "myapex" ],
5506 }
5507 `)
5508
5509 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5510 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5511 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5512 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5513 "lib64/mylib.so",
5514 "lib64/mylib2.so",
5515 })
5516}
5517
Jooyung Han49f67012020-04-17 13:43:10 +09005518func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5519 ctx, _ := testApex(t, `
5520 apex {
5521 name: "myapex",
5522 key: "myapex.key",
5523 }
5524 apex_key {
5525 name: "myapex.key",
5526 public_key: "testkey.avbpubkey",
5527 private_key: "testkey.pem",
5528 }
5529 `, func(fs map[string][]byte, config android.Config) {
5530 delete(config.Targets, android.Android)
5531 config.AndroidCommonTarget = android.Target{}
5532 })
5533
5534 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5535 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5536 }
5537}
5538
Jiyong Parkbd159612020-02-28 15:22:21 +09005539func TestAppBundle(t *testing.T) {
5540 ctx, _ := testApex(t, `
5541 apex {
5542 name: "myapex",
5543 key: "myapex.key",
5544 apps: ["AppFoo"],
5545 }
5546
5547 apex_key {
5548 name: "myapex.key",
5549 public_key: "testkey.avbpubkey",
5550 private_key: "testkey.pem",
5551 }
5552
5553 android_app {
5554 name: "AppFoo",
5555 srcs: ["foo/bar/MyClass.java"],
5556 sdk_version: "none",
5557 system_modules: "none",
5558 apex_available: [ "myapex" ],
5559 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005560 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005561
5562 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5563 content := bundleConfigRule.Args["content"]
5564
5565 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005566 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 +09005567}
5568
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005569func TestAppSetBundle(t *testing.T) {
5570 ctx, _ := testApex(t, `
5571 apex {
5572 name: "myapex",
5573 key: "myapex.key",
5574 apps: ["AppSet"],
5575 }
5576
5577 apex_key {
5578 name: "myapex.key",
5579 public_key: "testkey.avbpubkey",
5580 private_key: "testkey.pem",
5581 }
5582
5583 android_app_set {
5584 name: "AppSet",
5585 set: "AppSet.apks",
5586 }`)
5587 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5588 bundleConfigRule := mod.Description("Bundle Config")
5589 content := bundleConfigRule.Args["content"]
5590 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5591 s := mod.Rule("apexRule").Args["copy_commands"]
5592 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5593 if len(copyCmds) != 3 {
5594 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5595 }
5596 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5597 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5598 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5599}
5600
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005601func TestAppSetBundlePrebuilt(t *testing.T) {
5602 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5603 bp := `
5604 apex_set {
5605 name: "myapex",
5606 filename: "foo_v2.apex",
5607 sanitized: {
5608 none: { set: "myapex.apks", },
5609 hwaddress: { set: "myapex.hwasan.apks", },
5610 },
5611 }`
5612 fs["Android.bp"] = []byte(bp)
5613
5614 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5615 })
5616
5617 m := ctx.ModuleForTests("myapex", "android_common")
5618 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5619
5620 actual := extractedApex.Inputs
5621 if len(actual) != 1 {
5622 t.Errorf("expected a single input")
5623 }
5624
5625 expected := "myapex.hwasan.apks"
5626 if actual[0].String() != expected {
5627 t.Errorf("expected %s, got %s", expected, actual[0].String())
5628 }
5629}
5630
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005631func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005632 t.Helper()
5633
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005634 bp := `
5635 java_library {
5636 name: "some-updatable-apex-lib",
5637 srcs: ["a.java"],
5638 sdk_version: "current",
5639 apex_available: [
5640 "some-updatable-apex",
5641 ],
5642 }
5643
5644 java_library {
5645 name: "some-non-updatable-apex-lib",
5646 srcs: ["a.java"],
5647 apex_available: [
5648 "some-non-updatable-apex",
5649 ],
5650 }
5651
5652 java_library {
5653 name: "some-platform-lib",
5654 srcs: ["a.java"],
5655 sdk_version: "current",
5656 installable: true,
5657 }
5658
5659 java_library {
5660 name: "some-art-lib",
5661 srcs: ["a.java"],
5662 sdk_version: "current",
5663 apex_available: [
5664 "com.android.art.something",
5665 ],
5666 hostdex: true,
5667 }
5668
5669 apex {
5670 name: "some-updatable-apex",
5671 key: "some-updatable-apex.key",
5672 java_libs: ["some-updatable-apex-lib"],
5673 updatable: true,
5674 min_sdk_version: "current",
5675 }
5676
5677 apex {
5678 name: "some-non-updatable-apex",
5679 key: "some-non-updatable-apex.key",
5680 java_libs: ["some-non-updatable-apex-lib"],
5681 }
5682
5683 apex_key {
5684 name: "some-updatable-apex.key",
5685 }
5686
5687 apex_key {
5688 name: "some-non-updatable-apex.key",
5689 }
5690
5691 apex {
5692 name: "com.android.art.something",
5693 key: "com.android.art.something.key",
5694 java_libs: ["some-art-lib"],
5695 updatable: true,
5696 min_sdk_version: "current",
5697 }
5698
5699 apex_key {
5700 name: "com.android.art.something.key",
5701 }
5702
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005703 filegroup {
5704 name: "some-updatable-apex-file_contexts",
5705 srcs: [
5706 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5707 ],
5708 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005709
5710 filegroup {
5711 name: "some-non-updatable-apex-file_contexts",
5712 srcs: [
5713 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5714 ],
5715 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005716 `
5717 bp += cc.GatherRequiredDepsForTest(android.Android)
5718 bp += java.GatherRequiredDepsForTest()
5719 bp += dexpreopt.BpToolModulesForTest()
5720
5721 fs := map[string][]byte{
5722 "a.java": nil,
5723 "a.jar": nil,
5724 "build/make/target/product/security": nil,
5725 "apex_manifest.json": nil,
5726 "AndroidManifest.xml": nil,
5727 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005728 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005729 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5730 "framework/aidl/a.aidl": nil,
5731 }
5732 cc.GatherRequiredFilesForTest(fs)
5733
5734 ctx := android.NewTestArchContext()
5735 ctx.RegisterModuleType("apex", BundleFactory)
5736 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5737 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005738 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005739 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005740 cc.RegisterRequiredBuildComponentsForTest(ctx)
5741 java.RegisterJavaBuildComponents(ctx)
5742 java.RegisterSystemModulesBuildComponents(ctx)
5743 java.RegisterAppBuildComponents(ctx)
5744 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005745 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5746 ctx.PreDepsMutators(RegisterPreDepsMutators)
5747 ctx.PostDepsMutators(RegisterPostDepsMutators)
5748
5749 config := android.TestArchConfig(buildDir, nil, bp, fs)
5750 ctx.Register(config)
5751
5752 _ = dexpreopt.GlobalSoongConfigForTests(config)
5753 dexpreopt.RegisterToolModulesForTest(ctx)
5754 pathCtx := android.PathContextForTesting(config)
5755 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5756 transformDexpreoptConfig(dexpreoptConfig)
5757 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5758
5759 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5760 android.FailIfErrored(t, errs)
5761
5762 _, errs = ctx.PrepareBuildActions(config)
5763 if errmsg == "" {
5764 android.FailIfErrored(t, errs)
5765 } else if len(errs) > 0 {
5766 android.FailIfNoMatchingErrors(t, errmsg, errs)
5767 return
5768 } else {
5769 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5770 }
5771}
5772
Jooyung Han548640b2020-04-27 12:10:30 +09005773func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5774 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5775 apex {
5776 name: "myapex",
5777 key: "myapex.key",
5778 updatable: true,
5779 }
5780
5781 apex_key {
5782 name: "myapex.key",
5783 public_key: "testkey.avbpubkey",
5784 private_key: "testkey.pem",
5785 }
5786 `)
5787}
5788
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005789func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005790 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005791 var transform func(*dexpreopt.GlobalConfig)
5792
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005793 config := android.TestArchConfig(buildDir, nil, "", nil)
5794 ctx := android.PathContextForTesting(config)
5795
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005796 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5797 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005798 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005799 }
5800 testNoUpdatableJarsInBootImage(t, "", transform)
5801 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005802
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005803 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005804 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 +01005805 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005806 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005807 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005808 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005809 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005810
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005811 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 -07005812 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 +01005813 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005814 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005815 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005816 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005817 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005818
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005819 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 -07005820 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005821 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005822 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005823 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005824 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005825 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005826
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005827 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 -07005828 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 +01005829 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005830 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005831 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005832 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005833 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005834
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005835 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5836 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005837 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005838 }
5839 testNoUpdatableJarsInBootImage(t, "", transform)
5840 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005841
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005842 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005843 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005844 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005845 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005846 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005847 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005848 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005849
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005850 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005851 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005852 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005853 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005854 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005855 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005856 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005857
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005858 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005859 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005860 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005861 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005862 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005863 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005864 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005865
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005866 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5867 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005868 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005869 }
5870 testNoUpdatableJarsInBootImage(t, "", transform)
5871 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005872}
5873
Andrei Onea115e7e72020-06-05 21:14:03 +01005874func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5875 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005876 bp += `
5877 apex_key {
5878 name: "myapex.key",
5879 public_key: "testkey.avbpubkey",
5880 private_key: "testkey.pem",
5881 }`
5882 fs := map[string][]byte{
5883 "lib1/src/A.java": nil,
5884 "lib2/src/B.java": nil,
5885 "system/sepolicy/apex/myapex-file_contexts": nil,
5886 }
5887
5888 ctx := android.NewTestArchContext()
5889 ctx.RegisterModuleType("apex", BundleFactory)
5890 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5891 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5892 cc.RegisterRequiredBuildComponentsForTest(ctx)
5893 java.RegisterJavaBuildComponents(ctx)
5894 java.RegisterSystemModulesBuildComponents(ctx)
5895 java.RegisterDexpreoptBootJarsComponents(ctx)
5896 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5897 ctx.PreDepsMutators(RegisterPreDepsMutators)
5898 ctx.PostDepsMutators(RegisterPostDepsMutators)
5899 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5900
5901 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 = updatableBootJars
5908
5909 ctx.Register(config)
5910
5911 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5912 android.FailIfErrored(t, errs)
5913
5914 _, errs = ctx.PrepareBuildActions(config)
5915 if errmsg == "" {
5916 android.FailIfErrored(t, errs)
5917 } else if len(errs) > 0 {
5918 android.FailIfNoMatchingErrors(t, errmsg, errs)
5919 return
5920 } else {
5921 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5922 }
5923}
5924
5925func TestApexPermittedPackagesRules(t *testing.T) {
5926 testcases := []struct {
5927 name string
5928 expectedError string
5929 bp string
5930 bootJars []string
5931 modulesPackages map[string][]string
5932 }{
5933
5934 {
5935 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5936 expectedError: "",
5937 bp: `
5938 java_library {
5939 name: "bcp_lib1",
5940 srcs: ["lib1/src/*.java"],
5941 permitted_packages: ["foo.bar"],
5942 apex_available: ["myapex"],
5943 sdk_version: "none",
5944 system_modules: "none",
5945 }
5946 java_library {
5947 name: "nonbcp_lib2",
5948 srcs: ["lib2/src/*.java"],
5949 apex_available: ["myapex"],
5950 permitted_packages: ["a.b"],
5951 sdk_version: "none",
5952 system_modules: "none",
5953 }
5954 apex {
5955 name: "myapex",
5956 key: "myapex.key",
5957 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5958 }`,
5959 bootJars: []string{"bcp_lib1"},
5960 modulesPackages: map[string][]string{
5961 "myapex": []string{
5962 "foo.bar",
5963 },
5964 },
5965 },
5966 {
5967 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5968 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.`,
5969 bp: `
5970 java_library {
5971 name: "bcp_lib1",
5972 srcs: ["lib1/src/*.java"],
5973 apex_available: ["myapex"],
5974 permitted_packages: ["foo.bar"],
5975 sdk_version: "none",
5976 system_modules: "none",
5977 }
5978 java_library {
5979 name: "bcp_lib2",
5980 srcs: ["lib2/src/*.java"],
5981 apex_available: ["myapex"],
5982 permitted_packages: ["foo.bar", "bar.baz"],
5983 sdk_version: "none",
5984 system_modules: "none",
5985 }
5986 apex {
5987 name: "myapex",
5988 key: "myapex.key",
5989 java_libs: ["bcp_lib1", "bcp_lib2"],
5990 }
5991 `,
5992 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5993 modulesPackages: map[string][]string{
5994 "myapex": []string{
5995 "foo.bar",
5996 },
5997 },
5998 },
5999 }
6000 for _, tc := range testcases {
6001 t.Run(tc.name, func(t *testing.T) {
6002 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6003 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6004 })
6005 }
6006}
6007
Jiyong Park62304bb2020-04-13 16:19:48 +09006008func TestTestFor(t *testing.T) {
6009 ctx, _ := testApex(t, `
6010 apex {
6011 name: "myapex",
6012 key: "myapex.key",
6013 native_shared_libs: ["mylib", "myprivlib"],
6014 }
6015
6016 apex_key {
6017 name: "myapex.key",
6018 public_key: "testkey.avbpubkey",
6019 private_key: "testkey.pem",
6020 }
6021
6022 cc_library {
6023 name: "mylib",
6024 srcs: ["mylib.cpp"],
6025 system_shared_libs: [],
6026 stl: "none",
6027 stubs: {
6028 versions: ["1"],
6029 },
6030 apex_available: ["myapex"],
6031 }
6032
6033 cc_library {
6034 name: "myprivlib",
6035 srcs: ["mylib.cpp"],
6036 system_shared_libs: [],
6037 stl: "none",
6038 apex_available: ["myapex"],
6039 }
6040
6041
6042 cc_test {
6043 name: "mytest",
6044 gtest: false,
6045 srcs: ["mylib.cpp"],
6046 system_shared_libs: [],
6047 stl: "none",
6048 shared_libs: ["mylib", "myprivlib"],
6049 test_for: ["myapex"]
6050 }
6051 `)
6052
6053 // the test 'mytest' is a test for the apex, therefore is linked to the
6054 // actual implementation of mylib instead of its stub.
6055 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6056 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6057 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6058}
6059
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006060// TODO(jungjw): Move this to proptools
6061func intPtr(i int) *int {
6062 return &i
6063}
6064
6065func TestApexSet(t *testing.T) {
6066 ctx, config := testApex(t, `
6067 apex_set {
6068 name: "myapex",
6069 set: "myapex.apks",
6070 filename: "foo_v2.apex",
6071 overrides: ["foo"],
6072 }
6073 `, func(fs map[string][]byte, config android.Config) {
6074 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006075 config.Targets[android.Android] = []android.Target{
6076 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6077 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6078 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006079 })
6080
6081 m := ctx.ModuleForTests("myapex", "android_common")
6082
6083 // Check extract_apks tool parameters.
6084 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6085 actual := extractedApex.Args["abis"]
6086 expected := "ARMEABI_V7A,ARM64_V8A"
6087 if actual != expected {
6088 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6089 }
6090 actual = extractedApex.Args["sdk-version"]
6091 expected = "30"
6092 if actual != expected {
6093 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6094 }
6095
6096 a := m.Module().(*ApexSet)
6097 expectedOverrides := []string{"foo"}
6098 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6099 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6100 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6101 }
6102}
6103
Jiyong Park7d95a512020-05-10 15:16:24 +09006104func TestNoStaticLinkingToStubsLib(t *testing.T) {
6105 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6106 apex {
6107 name: "myapex",
6108 key: "myapex.key",
6109 native_shared_libs: ["mylib"],
6110 }
6111
6112 apex_key {
6113 name: "myapex.key",
6114 public_key: "testkey.avbpubkey",
6115 private_key: "testkey.pem",
6116 }
6117
6118 cc_library {
6119 name: "mylib",
6120 srcs: ["mylib.cpp"],
6121 static_libs: ["otherlib"],
6122 system_shared_libs: [],
6123 stl: "none",
6124 apex_available: [ "myapex" ],
6125 }
6126
6127 cc_library {
6128 name: "otherlib",
6129 srcs: ["mylib.cpp"],
6130 system_shared_libs: [],
6131 stl: "none",
6132 stubs: {
6133 versions: ["1", "2", "3"],
6134 },
6135 apex_available: [ "myapex" ],
6136 }
6137 `)
6138}
6139
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006140func TestApexKeysTxt(t *testing.T) {
6141 ctx, _ := testApex(t, `
6142 apex {
6143 name: "myapex",
6144 key: "myapex.key",
6145 }
6146
6147 apex_key {
6148 name: "myapex.key",
6149 public_key: "testkey.avbpubkey",
6150 private_key: "testkey.pem",
6151 }
6152
6153 prebuilt_apex {
6154 name: "myapex",
6155 prefer: true,
6156 arch: {
6157 arm64: {
6158 src: "myapex-arm64.apex",
6159 },
6160 arm: {
6161 src: "myapex-arm.apex",
6162 },
6163 },
6164 }
6165
6166 apex_set {
6167 name: "myapex_set",
6168 set: "myapex.apks",
6169 filename: "myapex_set.apex",
6170 overrides: ["myapex"],
6171 }
6172 `)
6173
6174 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6175 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6176 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 +09006177 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 +09006178}
6179
Jooyung Han938b5932020-06-20 12:47:47 +09006180func TestAllowedFiles(t *testing.T) {
6181 ctx, _ := testApex(t, `
6182 apex {
6183 name: "myapex",
6184 key: "myapex.key",
6185 apps: ["app"],
6186 allowed_files: "allowed.txt",
6187 }
6188
6189 apex_key {
6190 name: "myapex.key",
6191 public_key: "testkey.avbpubkey",
6192 private_key: "testkey.pem",
6193 }
6194
6195 android_app {
6196 name: "app",
6197 srcs: ["foo/bar/MyClass.java"],
6198 package_name: "foo",
6199 sdk_version: "none",
6200 system_modules: "none",
6201 apex_available: [ "myapex" ],
6202 }
6203 `, withFiles(map[string][]byte{
6204 "sub/Android.bp": []byte(`
6205 override_apex {
6206 name: "override_myapex",
6207 base: "myapex",
6208 apps: ["override_app"],
6209 allowed_files: ":allowed",
6210 }
6211 // Overridable "path" property should be referenced indirectly
6212 filegroup {
6213 name: "allowed",
6214 srcs: ["allowed.txt"],
6215 }
6216 override_android_app {
6217 name: "override_app",
6218 base: "app",
6219 package_name: "bar",
6220 }
6221 `),
6222 }))
6223
6224 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6225 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6226 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6227 }
6228
6229 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6230 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6231 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6232 }
6233}
6234
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006235func TestNonPreferredPrebuiltDependency(t *testing.T) {
6236 _, _ = testApex(t, `
6237 apex {
6238 name: "myapex",
6239 key: "myapex.key",
6240 native_shared_libs: ["mylib"],
6241 }
6242
6243 apex_key {
6244 name: "myapex.key",
6245 public_key: "testkey.avbpubkey",
6246 private_key: "testkey.pem",
6247 }
6248
6249 cc_library {
6250 name: "mylib",
6251 srcs: ["mylib.cpp"],
6252 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006253 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006254 },
6255 apex_available: ["myapex"],
6256 }
6257
6258 cc_prebuilt_library_shared {
6259 name: "mylib",
6260 prefer: false,
6261 srcs: ["prebuilt.so"],
6262 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006263 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006264 },
6265 apex_available: ["myapex"],
6266 }
6267 `)
6268}
6269
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006270func TestMain(m *testing.M) {
6271 run := func() int {
6272 setUp()
6273 defer tearDown()
6274
6275 return m.Run()
6276 }
6277
6278 os.Exit(run())
6279}