blob: 750e68bca1b40af0fffb398289e48024bc0f470c [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 Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "io/ioutil"
20 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090021 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
28 "github.com/google/blueprint/proptools"
29
30 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080031 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090032 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000033 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090035 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090036 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090038)
39
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070040var buildDir string
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Jooyung Han344d5432019-08-23 11:17:39 +090052func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
53 t.Helper()
54 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090055 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
56 if len(errs) > 0 {
57 android.FailIfNoMatchingErrors(t, pattern, errs)
58 return
59 }
60 _, errs = ctx.PrepareBuildActions(config)
61 if len(errs) > 0 {
62 android.FailIfNoMatchingErrors(t, pattern, errs)
63 return
64 }
65
66 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
67}
68
Jooyung Han344d5432019-08-23 11:17:39 +090069func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
70 t.Helper()
71 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010072 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090073 android.FailIfErrored(t, errs)
74 _, errs = ctx.PrepareBuildActions(config)
75 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070076 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Jooyung Han344d5432019-08-23 11:17:39 +090079type testCustomizer func(fs map[string][]byte, config android.Config)
80
81func withFiles(files map[string][]byte) testCustomizer {
82 return func(fs map[string][]byte, config android.Config) {
83 for k, v := range files {
84 fs[k] = v
85 }
86 }
87}
88
89func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
90 return func(fs map[string][]byte, config android.Config) {
91 for k, v := range targets {
92 config.Targets[k] = v
93 }
94 }
95}
96
Jooyung Han35155c42020-02-06 17:33:20 +090097// withNativeBridgeTargets sets configuration with targets including:
98// - X86_64 (primary)
99// - X86 (secondary)
100// - Arm64 on X86_64 (native bridge)
101// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700102func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900103 config.Targets[android.Android] = []android.Target{
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
107 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
110 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
111 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
112 }
113}
114
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900115func withManifestPackageNameOverrides(specs []string) testCustomizer {
116 return func(fs map[string][]byte, config android.Config) {
117 config.TestProductVariables.ManifestPackageNameOverrides = specs
118 }
119}
120
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700121func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900122 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
123}
124
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700125func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900126 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
127}
128
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700129func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900130 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900131 filegroup {
132 name: "myapex-file_contexts",
133 srcs: [
134 "system/sepolicy/apex/myapex-file_contexts",
135 ],
136 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900137 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800138
Colin Crossf9aabd72020-02-15 11:29:50 -0800139 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
140
Jiyong Park99644e92020-11-17 22:21:02 +0900141 bp = bp + rust.GatherRequiredDepsForTest()
142
Dario Frenicde2a032019-10-27 00:29:22 +0100143 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900144
Jooyung Han344d5432019-08-23 11:17:39 +0900145 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900146 "a.java": nil,
147 "PrebuiltAppFoo.apk": nil,
148 "PrebuiltAppFooPriv.apk": nil,
149 "build/make/target/product/security": nil,
150 "apex_manifest.json": nil,
151 "AndroidManifest.xml": nil,
152 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900153 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900154 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900155 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900156 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800158 "mytest.cpp": nil,
159 "mytest1.cpp": nil,
160 "mytest2.cpp": nil,
161 "mytest3.cpp": nil,
162 "myprebuilt": nil,
163 "my_include": nil,
164 "foo/bar/MyClass.java": nil,
165 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100166 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800167 "vendor/foo/devkeys/test.x509.pem": nil,
168 "vendor/foo/devkeys/test.pk8": nil,
169 "testkey.x509.pem": nil,
170 "testkey.pk8": nil,
171 "testkey.override.x509.pem": nil,
172 "testkey.override.pk8": nil,
173 "vendor/foo/devkeys/testkey.avbpubkey": nil,
174 "vendor/foo/devkeys/testkey.pem": nil,
175 "NOTICE": nil,
176 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900177 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800178 "testkey2.avbpubkey": nil,
179 "testkey2.pem": nil,
180 "myapex-arm64.apex": nil,
181 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700182 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800183 "frameworks/base/api/current.txt": nil,
184 "framework/aidl/a.aidl": nil,
185 "build/make/core/proguard.flags": nil,
186 "build/make/core/proguard_basic_keeps.flags": nil,
187 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700188 "baz": nil,
189 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700190 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700191 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900192 "foo.rs": nil,
Paul Duffin064b70c2020-11-02 17:32:38 +0000193 "libfoo.jar": nil,
Paul Duffin39853512021-02-26 11:09:39 +0000194 "libbar.jar": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900195 }
196
Colin Crossf9aabd72020-02-15 11:29:50 -0800197 cc.GatherRequiredFilesForTest(fs)
198
Jooyung Han344d5432019-08-23 11:17:39 +0900199 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800200 // The fs now needs to be populated before creating the config, call handlers twice
201 // for now, once to get any fs changes, and later after the config was created to
202 // set product variables or targets.
203 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
204 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900205 }
206
Colin Cross98be1bb2019-12-13 20:41:13 -0800207 config := android.TestArchConfig(buildDir, nil, bp, fs)
208 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
209 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
210 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
211 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
212 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700213 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800214 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
215
216 for _, handler := range handlers {
217 // The fs now needs to be populated before creating the config, call handlers twice
218 // for now, earlier to get any fs changes, and now after the config was created to
219 // set product variables or targets.
220 tempFS := map[string][]byte{}
221 handler(tempFS, config)
222 }
223
Colin Crossae8600b2020-10-29 17:09:13 -0700224 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100225
226 // from android package
227 android.RegisterPackageBuildComponents(ctx)
228 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
229
Colin Cross98be1bb2019-12-13 20:41:13 -0800230 ctx.RegisterModuleType("apex", BundleFactory)
231 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
232 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
233 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
234 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
235 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
236 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700237 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800238
Jooyung Hana57af4a2020-01-23 05:36:59 +0000239 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100240 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000241 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
242
Paul Duffin021f4e52020-07-30 16:04:17 +0100243 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100244
Paul Duffin021f4e52020-07-30 16:04:17 +0100245 // Register these after the prebuilt mutators have been registered to match what
246 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100247 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
248 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
249
Paul Duffin021f4e52020-07-30 16:04:17 +0100250 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900251 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +0000252 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100253
Colin Cross98be1bb2019-12-13 20:41:13 -0800254 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800255 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800256 cc.RegisterVndkLibraryTxtTypes(ctx)
Jooyung Han0703fd82020-08-26 22:11:53 +0900257 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000258 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700259 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900261 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800262 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800266
Colin Crossae8600b2020-10-29 17:09:13 -0700267 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900268
Jooyung Han5c998b92019-06-27 11:30:33 +0900269 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270}
271
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700272func setUp() {
273 var err error
274 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700276 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278}
279
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700280func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700281 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282}
283
Jooyung Han643adc42020-02-27 13:50:06 +0900284// ensure that 'result' equals 'expected'
285func ensureEquals(t *testing.T, result string, expected string) {
286 t.Helper()
287 if result != expected {
288 t.Errorf("%q != %q", expected, result)
289 }
290}
291
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292// ensure that 'result' contains 'expected'
293func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900294 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295 if !strings.Contains(result, expected) {
296 t.Errorf("%q is not found in %q", expected, result)
297 }
298}
299
Liz Kammer5bd365f2020-05-27 15:15:11 -0700300// ensure that 'result' contains 'expected' exactly one time
301func ensureContainsOnce(t *testing.T, result string, expected string) {
302 t.Helper()
303 count := strings.Count(result, expected)
304 if count != 1 {
305 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// ensures that 'result' does not contain 'notExpected'
310func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900311 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 if strings.Contains(result, notExpected) {
313 t.Errorf("%q is found in %q", notExpected, result)
314 }
315}
316
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700317func ensureMatches(t *testing.T, result string, expectedRex string) {
318 ok, err := regexp.MatchString(expectedRex, result)
319 if err != nil {
320 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
321 return
322 }
323 if !ok {
324 t.Errorf("%s does not match regular expession %s", result, expectedRex)
325 }
326}
327
Jiyong Park25fc6a92018-11-18 18:02:45 +0900328func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900329 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 if !android.InList(expected, result) {
331 t.Errorf("%q is not found in %v", expected, result)
332 }
333}
334
335func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900336 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 if android.InList(notExpected, result) {
338 t.Errorf("%q is found in %v", notExpected, result)
339 }
340}
341
Jooyung Hane1633032019-08-01 17:41:43 +0900342func ensureListEmpty(t *testing.T, result []string) {
343 t.Helper()
344 if len(result) > 0 {
345 t.Errorf("%q is expected to be empty", result)
346 }
347}
348
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000349func ensureListNotEmpty(t *testing.T, result []string) {
350 t.Helper()
351 if len(result) == 0 {
352 t.Errorf("%q is expected to be not empty", result)
353 }
354}
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356// Minimal test
357func TestBasicApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -0700358 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900359 apex_defaults {
360 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900361 manifest: ":myapex.manifest",
362 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900364 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900365 native_shared_libs: [
366 "mylib",
367 "libfoo.ffi",
368 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900369 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800370 multilib: {
371 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900372 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800373 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900374 },
Jiyong Park77acec62020-06-01 21:39:15 +0900375 java_libs: [
376 "myjar",
377 "myjar_dex",
378 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900379 }
380
Jiyong Park30ca9372019-02-07 16:27:23 +0900381 apex {
382 name: "myapex",
383 defaults: ["myapex-defaults"],
384 }
385
Jiyong Park25fc6a92018-11-18 18:02:45 +0900386 apex_key {
387 name: "myapex.key",
388 public_key: "testkey.avbpubkey",
389 private_key: "testkey.pem",
390 }
391
Jiyong Park809bb722019-02-13 21:33:49 +0900392 filegroup {
393 name: "myapex.manifest",
394 srcs: ["apex_manifest.json"],
395 }
396
397 filegroup {
398 name: "myapex.androidmanifest",
399 srcs: ["AndroidManifest.xml"],
400 }
401
Jiyong Park25fc6a92018-11-18 18:02:45 +0900402 cc_library {
403 name: "mylib",
404 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900405 shared_libs: [
406 "mylib2",
407 "libbar.ffi",
408 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900409 system_shared_libs: [],
410 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000411 // TODO: remove //apex_available:platform
412 apex_available: [
413 "//apex_available:platform",
414 "myapex",
415 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900416 }
417
Alex Light3d673592019-01-18 14:37:31 -0800418 cc_binary {
419 name: "foo",
420 srcs: ["mylib.cpp"],
421 compile_multilib: "both",
422 multilib: {
423 lib32: {
424 suffix: "32",
425 },
426 lib64: {
427 suffix: "64",
428 },
429 },
430 symlinks: ["foo_link_"],
431 symlink_preferred_arch: true,
432 system_shared_libs: [],
433 static_executable: true,
434 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700435 apex_available: [ "myapex", "com.android.gki.*" ],
436 }
437
Jiyong Park99644e92020-11-17 22:21:02 +0900438 rust_binary {
439 name: "foo.rust",
440 srcs: ["foo.rs"],
441 rlibs: ["libfoo.rlib.rust"],
442 dylibs: ["libfoo.dylib.rust"],
443 apex_available: ["myapex"],
444 }
445
446 rust_library_rlib {
447 name: "libfoo.rlib.rust",
448 srcs: ["foo.rs"],
449 crate_name: "foo",
450 apex_available: ["myapex"],
451 }
452
453 rust_library_dylib {
454 name: "libfoo.dylib.rust",
455 srcs: ["foo.rs"],
456 crate_name: "foo",
457 apex_available: ["myapex"],
458 }
459
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900460 rust_ffi_shared {
461 name: "libfoo.ffi",
462 srcs: ["foo.rs"],
463 crate_name: "foo",
464 apex_available: ["myapex"],
465 }
466
467 rust_ffi_shared {
468 name: "libbar.ffi",
469 srcs: ["foo.rs"],
470 crate_name: "bar",
471 apex_available: ["myapex"],
472 }
473
Yifan Hongd22a84a2020-07-28 17:37:46 -0700474 apex {
475 name: "com.android.gki.fake",
476 binaries: ["foo"],
477 key: "myapex.key",
478 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800479 }
480
Paul Duffindddd5462020-04-07 15:25:44 +0100481 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900482 name: "mylib2",
483 srcs: ["mylib.cpp"],
484 system_shared_libs: [],
485 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900486 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900487 static_libs: ["libstatic"],
488 // TODO: remove //apex_available:platform
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
493 }
494
Paul Duffindddd5462020-04-07 15:25:44 +0100495 cc_prebuilt_library_shared {
496 name: "mylib2",
497 srcs: ["prebuilt.so"],
498 // TODO: remove //apex_available:platform
499 apex_available: [
500 "//apex_available:platform",
501 "myapex",
502 ],
503 }
504
Jiyong Park9918e1a2020-03-17 19:16:40 +0900505 cc_library_static {
506 name: "libstatic",
507 srcs: ["mylib.cpp"],
508 system_shared_libs: [],
509 stl: "none",
510 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000511 // TODO: remove //apex_available:platform
512 apex_available: [
513 "//apex_available:platform",
514 "myapex",
515 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900516 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900517
518 java_library {
519 name: "myjar",
520 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900521 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 sdk_version: "none",
523 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900524 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900525 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000526 // TODO: remove //apex_available:platform
527 apex_available: [
528 "//apex_available:platform",
529 "myapex",
530 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900531 }
532
Jiyong Park77acec62020-06-01 21:39:15 +0900533 dex_import {
534 name: "myjar_dex",
535 jars: ["prebuilt.jar"],
536 apex_available: [
537 "//apex_available:platform",
538 "myapex",
539 ],
540 }
541
Jiyong Park7f7766d2019-07-25 22:02:35 +0900542 java_library {
543 name: "myotherjar",
544 srcs: ["foo/bar/MyClass.java"],
545 sdk_version: "none",
546 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900547 // TODO: remove //apex_available:platform
548 apex_available: [
549 "//apex_available:platform",
550 "myapex",
551 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900552 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900553
554 java_library {
555 name: "mysharedjar",
556 srcs: ["foo/bar/MyClass.java"],
557 sdk_version: "none",
558 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900559 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560 `)
561
Sundong Ahnabb64432019-10-22 13:58:29 +0900562 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900563
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900564 // Make sure that Android.mk is created
565 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700566 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900567 var builder strings.Builder
568 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
569
570 androidMk := builder.String()
571 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
572 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
573
Jiyong Park42cca6c2019-04-01 11:15:50 +0900574 optFlags := apexRule.Args["opt_flags"]
575 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700576 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900577 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900578
Jiyong Park25fc6a92018-11-18 18:02:45 +0900579 copyCmds := apexRule.Args["copy_commands"]
580
581 // Ensure that main rule creates an output
582 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
583
584 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700585 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
587 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900588 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900589 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900590
591 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700592 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
593 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900594 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
595 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900596 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900597
598 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800599 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
600 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900601 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900602 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900603 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900604 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
605 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900606 // .. but not for java libs
607 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900608 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800609
Colin Cross7113d202019-11-20 16:39:12 -0800610 // Ensure that the platform variant ends with _shared or _common
611 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
612 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900613 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
614 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900615 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
616
617 // Ensure that dynamic dependency to java libs are not included
618 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800619
620 // Ensure that all symlinks are present.
621 found_foo_link_64 := false
622 found_foo := false
623 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900624 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800625 if strings.HasSuffix(cmd, "bin/foo") {
626 found_foo = true
627 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
628 found_foo_link_64 = true
629 }
630 }
631 }
632 good := found_foo && found_foo_link_64
633 if !good {
634 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
635 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900636
Sundong Ahnabb64432019-10-22 13:58:29 +0900637 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700638 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900639 if len(noticeInputs) != 3 {
640 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900641 }
642 ensureListContains(t, noticeInputs, "NOTICE")
643 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900644 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900645
Artur Satayeva8bd1132020-04-27 18:07:06 +0100646 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100647 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
648 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
649 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
650 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
651 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100652
653 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100654 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
655 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
656 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
657 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
658 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800659}
660
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661func TestDefaults(t *testing.T) {
662 ctx, _ := testApex(t, `
663 apex_defaults {
664 name: "myapex-defaults",
665 key: "myapex.key",
666 prebuilts: ["myetc"],
667 native_shared_libs: ["mylib"],
668 java_libs: ["myjar"],
669 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900670 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800671 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900672 }
673
674 prebuilt_etc {
675 name: "myetc",
676 src: "myprebuilt",
677 }
678
679 apex {
680 name: "myapex",
681 defaults: ["myapex-defaults"],
682 }
683
684 apex_key {
685 name: "myapex.key",
686 public_key: "testkey.avbpubkey",
687 private_key: "testkey.pem",
688 }
689
690 cc_library {
691 name: "mylib",
692 system_shared_libs: [],
693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000694 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 }
696
697 java_library {
698 name: "myjar",
699 srcs: ["foo/bar/MyClass.java"],
700 sdk_version: "none",
701 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000702 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900703 }
704
705 android_app {
706 name: "AppFoo",
707 srcs: ["foo/bar/MyClass.java"],
708 sdk_version: "none",
709 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000710 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900711 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900712
713 runtime_resource_overlay {
714 name: "rro",
715 theme: "blue",
716 }
717
markchien2f59ec92020-09-02 16:23:38 +0800718 bpf {
719 name: "bpf",
720 srcs: ["bpf.c", "bpf2.c"],
721 }
722
Jooyung Hanf21c7972019-12-16 22:32:06 +0900723 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000724 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900725 "etc/myetc",
726 "javalib/myjar.jar",
727 "lib64/mylib.so",
728 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900729 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800730 "etc/bpf/bpf.o",
731 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900732 })
733}
734
Jooyung Han01a3ee22019-11-02 02:52:25 +0900735func TestApexManifest(t *testing.T) {
736 ctx, _ := testApex(t, `
737 apex {
738 name: "myapex",
739 key: "myapex.key",
740 }
741
742 apex_key {
743 name: "myapex.key",
744 public_key: "testkey.avbpubkey",
745 private_key: "testkey.pem",
746 }
747 `)
748
749 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900750 args := module.Rule("apexRule").Args
751 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
752 t.Error("manifest should be apex_manifest.pb, but " + manifest)
753 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900754}
755
Alex Light5098a612018-11-29 17:12:15 -0800756func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700757 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800758 apex {
759 name: "myapex",
760 key: "myapex.key",
761 payload_type: "zip",
762 native_shared_libs: ["mylib"],
763 }
764
765 apex_key {
766 name: "myapex.key",
767 public_key: "testkey.avbpubkey",
768 private_key: "testkey.pem",
769 }
770
771 cc_library {
772 name: "mylib",
773 srcs: ["mylib.cpp"],
774 shared_libs: ["mylib2"],
775 system_shared_libs: [],
776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000777 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800778 }
779
780 cc_library {
781 name: "mylib2",
782 srcs: ["mylib.cpp"],
783 system_shared_libs: [],
784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000785 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800786 }
787 `)
788
Sundong Ahnabb64432019-10-22 13:58:29 +0900789 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800790 copyCmds := zipApexRule.Args["copy_commands"]
791
792 // Ensure that main rule creates an output
793 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
794
795 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700796 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800797
798 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800800
801 // Ensure that both direct and indirect deps are copied into apex
802 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
803 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804}
805
806func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700807 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900808 apex {
809 name: "myapex",
810 key: "myapex.key",
811 native_shared_libs: ["mylib", "mylib3"],
812 }
813
814 apex_key {
815 name: "myapex.key",
816 public_key: "testkey.avbpubkey",
817 private_key: "testkey.pem",
818 }
819
820 cc_library {
821 name: "mylib",
822 srcs: ["mylib.cpp"],
823 shared_libs: ["mylib2", "mylib3"],
824 system_shared_libs: [],
825 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000826 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827 }
828
829 cc_library {
830 name: "mylib2",
831 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900832 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900833 system_shared_libs: [],
834 stl: "none",
835 stubs: {
836 versions: ["1", "2", "3"],
837 },
838 }
839
840 cc_library {
841 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib4"],
844 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 stl: "none",
846 stubs: {
847 versions: ["10", "11", "12"],
848 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000849 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900851
852 cc_library {
853 name: "mylib4",
854 srcs: ["mylib.cpp"],
855 system_shared_libs: [],
856 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000857 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900858 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900859 `)
860
Sundong Ahnabb64432019-10-22 13:58:29 +0900861 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862 copyCmds := apexRule.Args["copy_commands"]
863
864 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800865 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900866
867 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800868 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900869
870 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800871 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900872
Colin Crossaede88c2020-08-11 12:17:01 -0700873 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874
875 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900876 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900878 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879
880 // 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 -0700881 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900882 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700883 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900884
885 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900886 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900887 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900888
889 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700890 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900891
Jooyung Hana57af4a2020-01-23 05:36:59 +0000892 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900893 "lib64/mylib.so",
894 "lib64/mylib3.so",
895 "lib64/mylib4.so",
896 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897}
898
Colin Cross7812fd32020-09-25 12:35:10 -0700899func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
900 t.Parallel()
901 ctx, _ := testApex(t, `
902 apex {
903 name: "myapex",
904 key: "myapex.key",
905 native_shared_libs: ["mylib", "mylib3"],
906 min_sdk_version: "29",
907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
918 shared_libs: ["mylib2", "mylib3"],
919 system_shared_libs: [],
920 stl: "none",
921 apex_available: [ "myapex" ],
922 min_sdk_version: "28",
923 }
924
925 cc_library {
926 name: "mylib2",
927 srcs: ["mylib.cpp"],
928 cflags: ["-include mylib.h"],
929 system_shared_libs: [],
930 stl: "none",
931 stubs: {
932 versions: ["28", "29", "30", "current"],
933 },
934 min_sdk_version: "28",
935 }
936
937 cc_library {
938 name: "mylib3",
939 srcs: ["mylib.cpp"],
940 shared_libs: ["mylib4"],
941 system_shared_libs: [],
942 stl: "none",
943 stubs: {
944 versions: ["28", "29", "30", "current"],
945 },
946 apex_available: [ "myapex" ],
947 min_sdk_version: "28",
948 }
949
950 cc_library {
951 name: "mylib4",
952 srcs: ["mylib.cpp"],
953 system_shared_libs: [],
954 stl: "none",
955 apex_available: [ "myapex" ],
956 min_sdk_version: "28",
957 }
958 `)
959
960 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
961 copyCmds := apexRule.Args["copy_commands"]
962
963 // Ensure that direct non-stubs dep is always included
964 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
965
966 // Ensure that indirect stubs dep is not included
967 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
968
969 // Ensure that direct stubs dep is included
970 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
971
972 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
973
974 // Ensure that mylib is linking with the version 29 stubs for mylib2
975 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
976 // ... and not linking to the non-stub (impl) variant of mylib2
977 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
978
979 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
980 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
981 // .. and not linking to the stubs variant of mylib3
982 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
983
984 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700985 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700986 ensureNotContains(t, mylib2Cflags, "-include ")
987
988 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700989 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700990
991 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
992 "lib64/mylib.so",
993 "lib64/mylib3.so",
994 "lib64/mylib4.so",
995 })
996}
997
Jooyung Han11b0fbd2021-02-05 02:28:22 +0900998func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
999 t.Parallel()
1000 // myapex (Z)
1001 // mylib -----------------.
1002 // |
1003 // otherapex (29) |
1004 // libstub's versions: 29 Z current
1005 // |
1006 // <platform> |
1007 // libplatform ----------------'
1008 ctx, _ := testApex(t, `
1009 apex {
1010 name: "myapex",
1011 key: "myapex.key",
1012 native_shared_libs: ["mylib"],
1013 min_sdk_version: "Z", // non-final
1014 }
1015
1016 cc_library {
1017 name: "mylib",
1018 srcs: ["mylib.cpp"],
1019 shared_libs: ["libstub"],
1020 apex_available: ["myapex"],
1021 min_sdk_version: "Z",
1022 }
1023
1024 apex_key {
1025 name: "myapex.key",
1026 public_key: "testkey.avbpubkey",
1027 private_key: "testkey.pem",
1028 }
1029
1030 apex {
1031 name: "otherapex",
1032 key: "myapex.key",
1033 native_shared_libs: ["libstub"],
1034 min_sdk_version: "29",
1035 }
1036
1037 cc_library {
1038 name: "libstub",
1039 srcs: ["mylib.cpp"],
1040 stubs: {
1041 versions: ["29", "Z", "current"],
1042 },
1043 apex_available: ["otherapex"],
1044 min_sdk_version: "29",
1045 }
1046
1047 // platform module depending on libstub from otherapex should use the latest stub("current")
1048 cc_library {
1049 name: "libplatform",
1050 srcs: ["mylib.cpp"],
1051 shared_libs: ["libstub"],
1052 }
1053 `, func(fs map[string][]byte, config android.Config) {
1054 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1055 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1056 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1057 })
1058
1059 // Ensure that mylib from myapex is built against "min_sdk_version" stub ("Z"), which is non-final
1060 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1061 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=9000 ")
1062 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1063 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_Z/libstub.so ")
1064
1065 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1066 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1067 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1068 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1069 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1070}
1071
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001072func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001073 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001074 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001075 name: "myapex2",
1076 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001077 native_shared_libs: ["mylib"],
1078 }
1079
1080 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001081 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001082 public_key: "testkey.avbpubkey",
1083 private_key: "testkey.pem",
1084 }
1085
1086 cc_library {
1087 name: "mylib",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001090 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001091 system_shared_libs: [],
1092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001093 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001094 }
1095
1096 cc_library {
1097 name: "libfoo",
1098 srcs: ["mylib.cpp"],
1099 shared_libs: ["libbar"],
1100 system_shared_libs: [],
1101 stl: "none",
1102 stubs: {
1103 versions: ["10", "20", "30"],
1104 },
1105 }
1106
1107 cc_library {
1108 name: "libbar",
1109 srcs: ["mylib.cpp"],
1110 system_shared_libs: [],
1111 stl: "none",
1112 }
1113
Jiyong Park678c8812020-02-07 17:25:49 +09001114 cc_library_static {
1115 name: "libbaz",
1116 srcs: ["mylib.cpp"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [ "myapex2" ],
1120 }
1121
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001122 `)
1123
Jiyong Park83dc74b2020-01-14 18:38:44 +09001124 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001125 copyCmds := apexRule.Args["copy_commands"]
1126
1127 // Ensure that direct non-stubs dep is always included
1128 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1129
1130 // Ensure that indirect stubs dep is not included
1131 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1132
1133 // Ensure that dependency of stubs is not included
1134 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1135
Colin Crossaede88c2020-08-11 12:17:01 -07001136 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001137
1138 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001139 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001140 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001141 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001142
Jiyong Park3ff16992019-12-27 14:11:47 +09001143 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001144
1145 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1146 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001147
Artur Satayeva8bd1132020-04-27 18:07:06 +01001148 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001149 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1150 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1151 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001152
Artur Satayeva8bd1132020-04-27 18:07:06 +01001153 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001154 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1155 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1156 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001157}
1158
Jooyung Hand3639552019-08-09 12:57:43 +09001159func TestApexWithRuntimeLibsDependency(t *testing.T) {
1160 /*
1161 myapex
1162 |
1163 v (runtime_libs)
1164 mylib ------+------> libfoo [provides stub]
1165 |
1166 `------> libbar
1167 */
1168 ctx, _ := testApex(t, `
1169 apex {
1170 name: "myapex",
1171 key: "myapex.key",
1172 native_shared_libs: ["mylib"],
1173 }
1174
1175 apex_key {
1176 name: "myapex.key",
1177 public_key: "testkey.avbpubkey",
1178 private_key: "testkey.pem",
1179 }
1180
1181 cc_library {
1182 name: "mylib",
1183 srcs: ["mylib.cpp"],
1184 runtime_libs: ["libfoo", "libbar"],
1185 system_shared_libs: [],
1186 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001187 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001188 }
1189
1190 cc_library {
1191 name: "libfoo",
1192 srcs: ["mylib.cpp"],
1193 system_shared_libs: [],
1194 stl: "none",
1195 stubs: {
1196 versions: ["10", "20", "30"],
1197 },
1198 }
1199
1200 cc_library {
1201 name: "libbar",
1202 srcs: ["mylib.cpp"],
1203 system_shared_libs: [],
1204 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001205 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001206 }
1207
1208 `)
1209
Sundong Ahnabb64432019-10-22 13:58:29 +09001210 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001211 copyCmds := apexRule.Args["copy_commands"]
1212
1213 // Ensure that direct non-stubs dep is always included
1214 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1215
1216 // Ensure that indirect stubs dep is not included
1217 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1218
1219 // Ensure that runtime_libs dep in included
1220 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1221
Sundong Ahnabb64432019-10-22 13:58:29 +09001222 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001223 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1224 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001225
1226}
1227
Jooyung Han8ce8db92020-05-15 19:05:05 +09001228func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1229 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1230 bp := `
1231 apex {
1232 name: "com.android.runtime",
1233 key: "com.android.runtime.key",
1234 native_shared_libs: ["libc"],
1235 }
1236
1237 apex_key {
1238 name: "com.android.runtime.key",
1239 public_key: "testkey.avbpubkey",
1240 private_key: "testkey.pem",
1241 }
1242
1243 cc_library {
1244 name: "libc",
1245 no_libcrt: true,
1246 nocrt: true,
1247 stl: "none",
1248 system_shared_libs: [],
1249 stubs: { versions: ["1"] },
1250 apex_available: ["com.android.runtime"],
1251
1252 sanitize: {
1253 hwaddress: true,
1254 }
1255 }
1256
1257 cc_prebuilt_library_shared {
1258 name: "libclang_rt.hwasan-aarch64-android",
1259 no_libcrt: true,
1260 nocrt: true,
1261 stl: "none",
1262 system_shared_libs: [],
1263 srcs: [""],
1264 stubs: { versions: ["1"] },
1265
1266 sanitize: {
1267 never: true,
1268 },
1269 }
1270 `
1271 // override bp to use hard-coded names: com.android.runtime and libc
1272 fs["Android.bp"] = []byte(bp)
1273 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1274 })
1275
1276 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1277 "lib64/bionic/libc.so",
1278 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1279 })
1280
1281 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1282
1283 installed := hwasan.Description("install libclang_rt.hwasan")
1284 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1285
1286 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1287 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1288 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1289}
1290
1291func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1292 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1293 bp := `
1294 apex {
1295 name: "com.android.runtime",
1296 key: "com.android.runtime.key",
1297 native_shared_libs: ["libc"],
1298 }
1299
1300 apex_key {
1301 name: "com.android.runtime.key",
1302 public_key: "testkey.avbpubkey",
1303 private_key: "testkey.pem",
1304 }
1305
1306 cc_library {
1307 name: "libc",
1308 no_libcrt: true,
1309 nocrt: true,
1310 stl: "none",
1311 system_shared_libs: [],
1312 stubs: { versions: ["1"] },
1313 apex_available: ["com.android.runtime"],
1314 }
1315
1316 cc_prebuilt_library_shared {
1317 name: "libclang_rt.hwasan-aarch64-android",
1318 no_libcrt: true,
1319 nocrt: true,
1320 stl: "none",
1321 system_shared_libs: [],
1322 srcs: [""],
1323 stubs: { versions: ["1"] },
1324
1325 sanitize: {
1326 never: true,
1327 },
1328 }
1329 `
1330 // override bp to use hard-coded names: com.android.runtime and libc
1331 fs["Android.bp"] = []byte(bp)
1332 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1333
1334 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1335 })
1336
1337 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1338 "lib64/bionic/libc.so",
1339 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1340 })
1341
1342 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1343
1344 installed := hwasan.Description("install libclang_rt.hwasan")
1345 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1346
1347 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1348 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1349 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1350}
1351
Jooyung Han61b66e92020-03-21 14:21:46 +00001352func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1353 testcases := []struct {
1354 name string
1355 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001356 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001357 shouldLink string
1358 shouldNotLink []string
1359 }{
1360 {
Jooyung Han75568392020-03-20 04:29:24 +09001361 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001362 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001363 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001364 shouldLink: "30",
1365 shouldNotLink: []string{"29"},
1366 },
1367 {
1368 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001369 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001370 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001371 shouldLink: "29",
1372 shouldNotLink: []string{"30"},
1373 },
1374 }
1375 for _, tc := range testcases {
1376 t.Run(tc.name, func(t *testing.T) {
1377 ctx, _ := testApex(t, `
1378 apex {
1379 name: "myapex",
1380 key: "myapex.key",
1381 use_vendor: true,
1382 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001383 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001384 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001385
Jooyung Han61b66e92020-03-21 14:21:46 +00001386 apex_key {
1387 name: "myapex.key",
1388 public_key: "testkey.avbpubkey",
1389 private_key: "testkey.pem",
1390 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001391
Jooyung Han61b66e92020-03-21 14:21:46 +00001392 cc_library {
1393 name: "mylib",
1394 srcs: ["mylib.cpp"],
1395 vendor_available: true,
1396 shared_libs: ["libbar"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001400 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001401 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001402
Jooyung Han61b66e92020-03-21 14:21:46 +00001403 cc_library {
1404 name: "libbar",
1405 srcs: ["mylib.cpp"],
1406 system_shared_libs: [],
1407 stl: "none",
1408 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001409 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001410 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001411
Jooyung Han61b66e92020-03-21 14:21:46 +00001412 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001413 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001414 symbol_file: "",
1415 }
1416 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001417 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001418 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001419
Jooyung Han61b66e92020-03-21 14:21:46 +00001420 // Ensure that LLNDK dep is not included
1421 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1422 "lib64/mylib.so",
1423 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001424
Jooyung Han61b66e92020-03-21 14:21:46 +00001425 // Ensure that LLNDK dep is required
1426 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1427 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1428 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001429
Colin Crossaede88c2020-08-11 12:17:01 -07001430 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001431 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001432 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001433 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001434 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001435
Colin Crossaede88c2020-08-11 12:17:01 -07001436 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001437 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1438 })
1439 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001440}
1441
Jiyong Park25fc6a92018-11-18 18:02:45 +09001442func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001443 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001444 apex {
1445 name: "myapex",
1446 key: "myapex.key",
1447 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1448 }
1449
1450 apex_key {
1451 name: "myapex.key",
1452 public_key: "testkey.avbpubkey",
1453 private_key: "testkey.pem",
1454 }
1455
1456 cc_library {
1457 name: "mylib",
1458 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001459 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001460 shared_libs: ["libdl#27"],
1461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001462 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001463 }
1464
1465 cc_library_shared {
1466 name: "mylib_shared",
1467 srcs: ["mylib.cpp"],
1468 shared_libs: ["libdl#27"],
1469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001470 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001471 }
1472
1473 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001474 name: "libBootstrap",
1475 srcs: ["mylib.cpp"],
1476 stl: "none",
1477 bootstrap: true,
1478 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001479 `)
1480
Sundong Ahnabb64432019-10-22 13:58:29 +09001481 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001482 copyCmds := apexRule.Args["copy_commands"]
1483
1484 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001485 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001486 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1487 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001488
1489 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001490 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001491
Colin Crossaede88c2020-08-11 12:17:01 -07001492 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1493 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1494 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001495
1496 // For dependency to libc
1497 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001498 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001499 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001500 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001501 // ... Cflags from stub is correctly exported to mylib
1502 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1503 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1504
1505 // For dependency to libm
1506 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001507 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001508 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001509 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001510 // ... and is not compiling with the stub
1511 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1512 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1513
1514 // For dependency to libdl
1515 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001516 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001517 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001518 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1519 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001520 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001521 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001522 // ... Cflags from stub is correctly exported to mylib
1523 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1524 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001525
1526 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001527 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1528 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1529 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1530 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001531}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001532
Jooyung Han749dc692020-04-15 11:03:39 +09001533func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001534 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001535 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1536 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001537 // 3) (platform) -> liba -> libz : this should be non-stub link
1538 ctx, _ := testApex(t, `
1539 apex {
1540 name: "myapex",
1541 key: "myapex.key",
1542 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001543 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001544 }
1545
1546 apex {
1547 name: "otherapex",
1548 key: "myapex.key",
1549 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001550 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001551 }
1552
1553 apex_key {
1554 name: "myapex.key",
1555 public_key: "testkey.avbpubkey",
1556 private_key: "testkey.pem",
1557 }
1558
1559 cc_library {
1560 name: "libx",
1561 shared_libs: ["liba"],
1562 system_shared_libs: [],
1563 stl: "none",
1564 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001565 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001566 }
1567
1568 cc_library {
1569 name: "liby",
1570 shared_libs: ["liba"],
1571 system_shared_libs: [],
1572 stl: "none",
1573 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001574 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001575 }
1576
1577 cc_library {
1578 name: "liba",
1579 shared_libs: ["libz"],
1580 system_shared_libs: [],
1581 stl: "none",
1582 apex_available: [
1583 "//apex_available:anyapex",
1584 "//apex_available:platform",
1585 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001586 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001587 }
1588
1589 cc_library {
1590 name: "libz",
1591 system_shared_libs: [],
1592 stl: "none",
1593 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001594 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001595 },
1596 }
Jooyung Han749dc692020-04-15 11:03:39 +09001597 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001598
1599 expectLink := func(from, from_variant, to, to_variant string) {
1600 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1601 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1602 }
1603 expectNoLink := func(from, from_variant, to, to_variant string) {
1604 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1605 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1606 }
1607 // platform liba is linked to non-stub version
1608 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001609 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001610 expectLink("liba", "shared_apex29", "libz", "shared_28")
1611 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1612 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001613 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001614 expectLink("liba", "shared_apex30", "libz", "shared_30")
1615 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1616 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001617}
1618
Jooyung Hanaed150d2020-04-02 01:41:41 +09001619func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1620 ctx, _ := testApex(t, `
1621 apex {
1622 name: "myapex",
1623 key: "myapex.key",
1624 native_shared_libs: ["libx"],
1625 min_sdk_version: "R",
1626 }
1627
1628 apex_key {
1629 name: "myapex.key",
1630 public_key: "testkey.avbpubkey",
1631 private_key: "testkey.pem",
1632 }
1633
1634 cc_library {
1635 name: "libx",
1636 shared_libs: ["libz"],
1637 system_shared_libs: [],
1638 stl: "none",
1639 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001640 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001641 }
1642
1643 cc_library {
1644 name: "libz",
1645 system_shared_libs: [],
1646 stl: "none",
1647 stubs: {
1648 versions: ["29", "R"],
1649 },
1650 }
1651 `, func(fs map[string][]byte, config android.Config) {
1652 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1653 })
1654
1655 expectLink := func(from, from_variant, to, to_variant string) {
1656 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1657 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1658 }
1659 expectNoLink := func(from, from_variant, to, to_variant string) {
1660 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1661 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1662 }
Dan Albertc8060532020-07-22 22:32:17 -07001663 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001664 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1665 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001666}
1667
Jooyung Han749dc692020-04-15 11:03:39 +09001668func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001669 ctx, _ := testApex(t, `
1670 apex {
1671 name: "myapex",
1672 key: "myapex.key",
1673 native_shared_libs: ["libx"],
1674 }
1675
1676 apex_key {
1677 name: "myapex.key",
1678 public_key: "testkey.avbpubkey",
1679 private_key: "testkey.pem",
1680 }
1681
1682 cc_library {
1683 name: "libx",
1684 shared_libs: ["libz"],
1685 system_shared_libs: [],
1686 stl: "none",
1687 apex_available: [ "myapex" ],
1688 }
1689
1690 cc_library {
1691 name: "libz",
1692 system_shared_libs: [],
1693 stl: "none",
1694 stubs: {
1695 versions: ["1", "2"],
1696 },
1697 }
1698 `)
1699
1700 expectLink := func(from, from_variant, to, to_variant string) {
1701 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1702 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1703 }
1704 expectNoLink := func(from, from_variant, to, to_variant string) {
1705 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1706 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1707 }
Colin Crossaede88c2020-08-11 12:17:01 -07001708 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1709 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1710 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001711}
1712
1713func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1714 ctx, _ := testApex(t, `
1715 apex {
1716 name: "myapex",
1717 key: "myapex.key",
1718 native_shared_libs: ["libx"],
1719 }
1720
1721 apex_key {
1722 name: "myapex.key",
1723 public_key: "testkey.avbpubkey",
1724 private_key: "testkey.pem",
1725 }
1726
1727 cc_library {
1728 name: "libx",
1729 system_shared_libs: [],
1730 stl: "none",
1731 apex_available: [ "myapex" ],
1732 stubs: {
1733 versions: ["1", "2"],
1734 },
1735 }
1736
1737 cc_library {
1738 name: "libz",
1739 shared_libs: ["libx"],
1740 system_shared_libs: [],
1741 stl: "none",
1742 }
1743 `)
1744
1745 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001746 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001751 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001752 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1753 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1754 }
1755 expectLink("libz", "shared", "libx", "shared_2")
1756 expectNoLink("libz", "shared", "libz", "shared_1")
1757 expectNoLink("libz", "shared", "libz", "shared")
1758}
1759
Jooyung Han75568392020-03-20 04:29:24 +09001760func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001761 ctx, _ := testApex(t, `
1762 apex {
1763 name: "myapex",
1764 key: "myapex.key",
1765 native_shared_libs: ["libx"],
1766 min_sdk_version: "29",
1767 }
1768
1769 apex_key {
1770 name: "myapex.key",
1771 public_key: "testkey.avbpubkey",
1772 private_key: "testkey.pem",
1773 }
1774
1775 cc_library {
1776 name: "libx",
1777 shared_libs: ["libbar"],
1778 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001779 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001780 }
1781
1782 cc_library {
1783 name: "libbar",
1784 stubs: {
1785 versions: ["29", "30"],
1786 },
1787 }
Jooyung Han75568392020-03-20 04:29:24 +09001788 `, func(fs map[string][]byte, config android.Config) {
1789 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1790 })
Jooyung Han03b51852020-02-26 22:45:42 +09001791 expectLink := func(from, from_variant, to, to_variant string) {
1792 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1793 libFlags := ld.Args["libFlags"]
1794 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1795 }
Colin Crossaede88c2020-08-11 12:17:01 -07001796 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001797}
1798
Jooyung Han75568392020-03-20 04:29:24 +09001799func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001800 ctx, _ := testApex(t, `
1801 apex {
1802 name: "myapex",
1803 key: "myapex.key",
1804 native_shared_libs: ["libx"],
1805 min_sdk_version: "29",
1806 }
1807
1808 apex_key {
1809 name: "myapex.key",
1810 public_key: "testkey.avbpubkey",
1811 private_key: "testkey.pem",
1812 }
1813
1814 cc_library {
1815 name: "libx",
1816 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001817 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001818 }
Jooyung Han75568392020-03-20 04:29:24 +09001819 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001820
1821 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001822 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001823 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001824 // note that platform variant is not.
1825 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001826 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001827}
1828
Jooyung Han749dc692020-04-15 11:03:39 +09001829func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001830 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001831 apex {
1832 name: "myapex",
1833 key: "myapex.key",
1834 native_shared_libs: ["libx"],
1835 min_sdk_version: "29",
1836 }
1837
1838 apex_key {
1839 name: "myapex.key",
1840 public_key: "testkey.avbpubkey",
1841 private_key: "testkey.pem",
1842 }
1843
1844 cc_library {
1845 name: "libx",
1846 shared_libs: ["libz"],
1847 system_shared_libs: [],
1848 stl: "none",
1849 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001850 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001851 }
1852
1853 cc_library {
1854 name: "libz",
1855 system_shared_libs: [],
1856 stl: "none",
1857 stubs: {
1858 versions: ["30"],
1859 },
1860 }
Jooyung Han75568392020-03-20 04:29:24 +09001861 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001862}
Jooyung Han03b51852020-02-26 22:45:42 +09001863
Jooyung Han749dc692020-04-15 11:03:39 +09001864func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1865 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001866 apex {
1867 name: "myapex",
1868 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001869 native_shared_libs: ["mylib"],
1870 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001871 }
1872
1873 apex_key {
1874 name: "myapex.key",
1875 public_key: "testkey.avbpubkey",
1876 private_key: "testkey.pem",
1877 }
Jooyung Han749dc692020-04-15 11:03:39 +09001878
1879 cc_library {
1880 name: "mylib",
1881 srcs: ["mylib.cpp"],
1882 system_shared_libs: [],
1883 stl: "none",
1884 apex_available: [
1885 "myapex",
1886 ],
1887 min_sdk_version: "30",
1888 }
1889 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001890
1891 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1892 apex {
1893 name: "myapex",
1894 key: "myapex.key",
1895 native_shared_libs: ["libfoo.ffi"],
1896 min_sdk_version: "29",
1897 }
1898
1899 apex_key {
1900 name: "myapex.key",
1901 public_key: "testkey.avbpubkey",
1902 private_key: "testkey.pem",
1903 }
1904
1905 rust_ffi_shared {
1906 name: "libfoo.ffi",
1907 srcs: ["foo.rs"],
1908 crate_name: "foo",
1909 apex_available: [
1910 "myapex",
1911 ],
1912 min_sdk_version: "30",
1913 }
1914 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001915}
1916
1917func TestApexMinSdkVersion_Okay(t *testing.T) {
1918 testApex(t, `
1919 apex {
1920 name: "myapex",
1921 key: "myapex.key",
1922 native_shared_libs: ["libfoo"],
1923 java_libs: ["libbar"],
1924 min_sdk_version: "29",
1925 }
1926
1927 apex_key {
1928 name: "myapex.key",
1929 public_key: "testkey.avbpubkey",
1930 private_key: "testkey.pem",
1931 }
1932
1933 cc_library {
1934 name: "libfoo",
1935 srcs: ["mylib.cpp"],
1936 shared_libs: ["libfoo_dep"],
1937 apex_available: ["myapex"],
1938 min_sdk_version: "29",
1939 }
1940
1941 cc_library {
1942 name: "libfoo_dep",
1943 srcs: ["mylib.cpp"],
1944 apex_available: ["myapex"],
1945 min_sdk_version: "29",
1946 }
1947
1948 java_library {
1949 name: "libbar",
1950 sdk_version: "current",
1951 srcs: ["a.java"],
1952 static_libs: ["libbar_dep"],
1953 apex_available: ["myapex"],
1954 min_sdk_version: "29",
1955 }
1956
1957 java_library {
1958 name: "libbar_dep",
1959 sdk_version: "current",
1960 srcs: ["a.java"],
1961 apex_available: ["myapex"],
1962 min_sdk_version: "29",
1963 }
Jooyung Han03b51852020-02-26 22:45:42 +09001964 `)
1965}
1966
Artur Satayev8cf899a2020-04-15 17:29:42 +01001967func TestJavaStableSdkVersion(t *testing.T) {
1968 testCases := []struct {
1969 name string
1970 expectedError string
1971 bp string
1972 }{
1973 {
1974 name: "Non-updatable apex with non-stable dep",
1975 bp: `
1976 apex {
1977 name: "myapex",
1978 java_libs: ["myjar"],
1979 key: "myapex.key",
1980 }
1981 apex_key {
1982 name: "myapex.key",
1983 public_key: "testkey.avbpubkey",
1984 private_key: "testkey.pem",
1985 }
1986 java_library {
1987 name: "myjar",
1988 srcs: ["foo/bar/MyClass.java"],
1989 sdk_version: "core_platform",
1990 apex_available: ["myapex"],
1991 }
1992 `,
1993 },
1994 {
1995 name: "Updatable apex with stable dep",
1996 bp: `
1997 apex {
1998 name: "myapex",
1999 java_libs: ["myjar"],
2000 key: "myapex.key",
2001 updatable: true,
2002 min_sdk_version: "29",
2003 }
2004 apex_key {
2005 name: "myapex.key",
2006 public_key: "testkey.avbpubkey",
2007 private_key: "testkey.pem",
2008 }
2009 java_library {
2010 name: "myjar",
2011 srcs: ["foo/bar/MyClass.java"],
2012 sdk_version: "current",
2013 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002014 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002015 }
2016 `,
2017 },
2018 {
2019 name: "Updatable apex with non-stable dep",
2020 expectedError: "cannot depend on \"myjar\"",
2021 bp: `
2022 apex {
2023 name: "myapex",
2024 java_libs: ["myjar"],
2025 key: "myapex.key",
2026 updatable: true,
2027 }
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033 java_library {
2034 name: "myjar",
2035 srcs: ["foo/bar/MyClass.java"],
2036 sdk_version: "core_platform",
2037 apex_available: ["myapex"],
2038 }
2039 `,
2040 },
2041 {
2042 name: "Updatable apex with non-stable transitive dep",
Jiyong Park670e0f62021-02-18 13:10:18 +09002043 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002044 bp: `
2045 apex {
2046 name: "myapex",
2047 java_libs: ["myjar"],
2048 key: "myapex.key",
2049 updatable: true,
2050 }
2051 apex_key {
2052 name: "myapex.key",
2053 public_key: "testkey.avbpubkey",
2054 private_key: "testkey.pem",
2055 }
2056 java_library {
2057 name: "myjar",
2058 srcs: ["foo/bar/MyClass.java"],
2059 sdk_version: "current",
2060 apex_available: ["myapex"],
2061 static_libs: ["transitive-jar"],
2062 }
2063 java_library {
2064 name: "transitive-jar",
2065 srcs: ["foo/bar/MyClass.java"],
2066 sdk_version: "core_platform",
2067 apex_available: ["myapex"],
2068 }
2069 `,
2070 },
2071 }
2072
2073 for _, test := range testCases {
2074 t.Run(test.name, func(t *testing.T) {
2075 if test.expectedError == "" {
2076 testApex(t, test.bp)
2077 } else {
2078 testApexError(t, test.expectedError, test.bp)
2079 }
2080 })
2081 }
2082}
2083
Jooyung Han749dc692020-04-15 11:03:39 +09002084func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2085 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2086 apex {
2087 name: "myapex",
2088 key: "myapex.key",
2089 native_shared_libs: ["mylib"],
2090 min_sdk_version: "29",
2091 }
2092
2093 apex_key {
2094 name: "myapex.key",
2095 public_key: "testkey.avbpubkey",
2096 private_key: "testkey.pem",
2097 }
2098
2099 cc_library {
2100 name: "mylib",
2101 srcs: ["mylib.cpp"],
2102 shared_libs: ["mylib2"],
2103 system_shared_libs: [],
2104 stl: "none",
2105 apex_available: [
2106 "myapex",
2107 ],
2108 min_sdk_version: "29",
2109 }
2110
2111 // indirect part of the apex
2112 cc_library {
2113 name: "mylib2",
2114 srcs: ["mylib.cpp"],
2115 system_shared_libs: [],
2116 stl: "none",
2117 apex_available: [
2118 "myapex",
2119 ],
2120 min_sdk_version: "30",
2121 }
2122 `)
2123}
2124
2125func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2126 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
2130 apps: ["AppFoo"],
2131 min_sdk_version: "29",
2132 }
2133
2134 apex_key {
2135 name: "myapex.key",
2136 public_key: "testkey.avbpubkey",
2137 private_key: "testkey.pem",
2138 }
2139
2140 android_app {
2141 name: "AppFoo",
2142 srcs: ["foo/bar/MyClass.java"],
2143 sdk_version: "current",
2144 min_sdk_version: "29",
2145 system_modules: "none",
2146 stl: "none",
2147 static_libs: ["bar"],
2148 apex_available: [ "myapex" ],
2149 }
2150
2151 java_library {
2152 name: "bar",
2153 sdk_version: "current",
2154 srcs: ["a.java"],
2155 apex_available: [ "myapex" ],
2156 }
2157 `)
2158}
2159
2160func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2161 ctx, _ := testApex(t, `
2162 apex {
2163 name: "myapex",
2164 key: "myapex.key",
2165 native_shared_libs: ["mylib"],
2166 min_sdk_version: "29",
2167 }
2168
2169 apex_key {
2170 name: "myapex.key",
2171 public_key: "testkey.avbpubkey",
2172 private_key: "testkey.pem",
2173 }
2174
2175 // mylib in myapex will link to mylib2#29
2176 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2177 cc_library {
2178 name: "mylib",
2179 srcs: ["mylib.cpp"],
2180 shared_libs: ["mylib2"],
2181 system_shared_libs: [],
2182 stl: "none",
2183 apex_available: ["myapex", "otherapex"],
2184 min_sdk_version: "29",
2185 }
2186
2187 cc_library {
2188 name: "mylib2",
2189 srcs: ["mylib.cpp"],
2190 system_shared_libs: [],
2191 stl: "none",
2192 apex_available: ["otherapex"],
2193 stubs: { versions: ["29", "30"] },
2194 min_sdk_version: "30",
2195 }
2196
2197 apex {
2198 name: "otherapex",
2199 key: "myapex.key",
2200 native_shared_libs: ["mylib", "mylib2"],
2201 min_sdk_version: "30",
2202 }
2203 `)
2204 expectLink := func(from, from_variant, to, to_variant string) {
2205 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2206 libFlags := ld.Args["libFlags"]
2207 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2208 }
Colin Crossaede88c2020-08-11 12:17:01 -07002209 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2210 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002211}
2212
Jooyung Haned124c32021-01-26 11:43:46 +09002213func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2214 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2215 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2216 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2217 }
2218 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2219 apex {
2220 name: "myapex",
2221 key: "myapex.key",
2222 native_shared_libs: ["libfoo"],
2223 min_sdk_version: "S",
2224 }
2225 apex_key {
2226 name: "myapex.key",
2227 public_key: "testkey.avbpubkey",
2228 private_key: "testkey.pem",
2229 }
2230 cc_library {
2231 name: "libfoo",
2232 shared_libs: ["libbar"],
2233 apex_available: ["myapex"],
2234 min_sdk_version: "29",
2235 }
2236 cc_library {
2237 name: "libbar",
2238 apex_available: ["myapex"],
2239 }
2240 `, withSAsActiveCodeNames)
2241}
2242
2243func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2244 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2245 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2246 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2247 }
2248 ctx, _ := testApex(t, `
2249 apex {
2250 name: "myapex",
2251 key: "myapex.key",
2252 native_shared_libs: ["libfoo"],
2253 min_sdk_version: "S",
2254 }
2255 apex_key {
2256 name: "myapex.key",
2257 public_key: "testkey.avbpubkey",
2258 private_key: "testkey.pem",
2259 }
2260 cc_library {
2261 name: "libfoo",
2262 shared_libs: ["libbar"],
2263 apex_available: ["myapex"],
2264 min_sdk_version: "S",
2265 }
2266 cc_library {
2267 name: "libbar",
2268 stubs: {
2269 symbol_file: "libbar.map.txt",
2270 versions: ["30", "S", "T"],
2271 },
2272 }
2273 `, withSAsActiveCodeNames)
2274
2275 // ensure libfoo is linked with "S" version of libbar stub
2276 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2277 libFlags := libfoo.Rule("ld").Args["libFlags"]
2278 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_S/libbar.so")
2279}
2280
Jiyong Park7c2ee712018-12-07 00:42:25 +09002281func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002282 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002283 apex {
2284 name: "myapex",
2285 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002286 native_shared_libs: ["mylib"],
2287 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002288 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002289 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002290 }
2291
2292 apex_key {
2293 name: "myapex.key",
2294 public_key: "testkey.avbpubkey",
2295 private_key: "testkey.pem",
2296 }
2297
2298 prebuilt_etc {
2299 name: "myetc",
2300 src: "myprebuilt",
2301 sub_dir: "foo/bar",
2302 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002303
2304 cc_library {
2305 name: "mylib",
2306 srcs: ["mylib.cpp"],
2307 relative_install_path: "foo/bar",
2308 system_shared_libs: [],
2309 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002310 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002311 }
2312
2313 cc_binary {
2314 name: "mybin",
2315 srcs: ["mylib.cpp"],
2316 relative_install_path: "foo/bar",
2317 system_shared_libs: [],
2318 static_executable: true,
2319 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002320 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002321 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002322 `)
2323
Sundong Ahnabb64432019-10-22 13:58:29 +09002324 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002325 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2326
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002327 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002328 ensureListContains(t, dirs, "etc")
2329 ensureListContains(t, dirs, "etc/foo")
2330 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002331 ensureListContains(t, dirs, "lib64")
2332 ensureListContains(t, dirs, "lib64/foo")
2333 ensureListContains(t, dirs, "lib64/foo/bar")
2334 ensureListContains(t, dirs, "lib")
2335 ensureListContains(t, dirs, "lib/foo")
2336 ensureListContains(t, dirs, "lib/foo/bar")
2337
Jiyong Parkbd13e442019-03-15 18:10:35 +09002338 ensureListContains(t, dirs, "bin")
2339 ensureListContains(t, dirs, "bin/foo")
2340 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002341}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002342
Jooyung Han35155c42020-02-06 17:33:20 +09002343func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2344 ctx, _ := testApex(t, `
2345 apex {
2346 name: "myapex",
2347 key: "myapex.key",
2348 multilib: {
2349 both: {
2350 native_shared_libs: ["mylib"],
2351 binaries: ["mybin"],
2352 },
2353 },
2354 compile_multilib: "both",
2355 native_bridge_supported: true,
2356 }
2357
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363
2364 cc_library {
2365 name: "mylib",
2366 relative_install_path: "foo/bar",
2367 system_shared_libs: [],
2368 stl: "none",
2369 apex_available: [ "myapex" ],
2370 native_bridge_supported: true,
2371 }
2372
2373 cc_binary {
2374 name: "mybin",
2375 relative_install_path: "foo/bar",
2376 system_shared_libs: [],
2377 static_executable: true,
2378 stl: "none",
2379 apex_available: [ "myapex" ],
2380 native_bridge_supported: true,
2381 compile_multilib: "both", // default is "first" for binary
2382 multilib: {
2383 lib64: {
2384 suffix: "64",
2385 },
2386 },
2387 }
2388 `, withNativeBridgeEnabled)
2389 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2390 "bin/foo/bar/mybin",
2391 "bin/foo/bar/mybin64",
2392 "bin/arm/foo/bar/mybin",
2393 "bin/arm64/foo/bar/mybin64",
2394 "lib/foo/bar/mylib.so",
2395 "lib/arm/foo/bar/mylib.so",
2396 "lib64/foo/bar/mylib.so",
2397 "lib64/arm64/foo/bar/mylib.so",
2398 })
2399}
2400
Jiyong Parkda6eb592018-12-19 17:12:36 +09002401func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002402 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002403 apex {
2404 name: "myapex",
2405 key: "myapex.key",
2406 native_shared_libs: ["mylib"],
2407 use_vendor: true,
2408 }
2409
2410 apex_key {
2411 name: "myapex.key",
2412 public_key: "testkey.avbpubkey",
2413 private_key: "testkey.pem",
2414 }
2415
2416 cc_library {
2417 name: "mylib",
2418 srcs: ["mylib.cpp"],
2419 shared_libs: ["mylib2"],
2420 system_shared_libs: [],
2421 vendor_available: true,
2422 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002423 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002424 }
2425
2426 cc_library {
2427 name: "mylib2",
2428 srcs: ["mylib.cpp"],
2429 system_shared_libs: [],
2430 vendor_available: true,
2431 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002432 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002433 }
Jooyung Handc782442019-11-01 03:14:38 +09002434 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002435 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002436 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002437
2438 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002439 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002440 for _, implicit := range i.Implicits {
2441 inputsList = append(inputsList, implicit.String())
2442 }
2443 }
2444 inputsString := strings.Join(inputsList, " ")
2445
2446 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002447 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2448 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002449
2450 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002451 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2452 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002453}
Jiyong Park16e91a02018-12-20 18:18:08 +09002454
Jooyung Han85d61762020-06-24 23:50:26 +09002455func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002456 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2457 apex {
2458 name: "myapex",
2459 key: "myapex.key",
2460 use_vendor: true,
2461 }
2462 apex_key {
2463 name: "myapex.key",
2464 public_key: "testkey.avbpubkey",
2465 private_key: "testkey.pem",
2466 }
2467 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002468 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002469 })
Colin Cross440e0d02020-06-11 11:32:11 -07002470 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002471 testApex(t, `
2472 apex {
2473 name: "myapex",
2474 key: "myapex.key",
2475 use_vendor: true,
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002483 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002484 })
2485}
2486
Jooyung Han5c998b92019-06-27 11:30:33 +09002487func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2488 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2489 apex {
2490 name: "myapex",
2491 key: "myapex.key",
2492 native_shared_libs: ["mylib"],
2493 use_vendor: true,
2494 }
2495
2496 apex_key {
2497 name: "myapex.key",
2498 public_key: "testkey.avbpubkey",
2499 private_key: "testkey.pem",
2500 }
2501
2502 cc_library {
2503 name: "mylib",
2504 srcs: ["mylib.cpp"],
2505 system_shared_libs: [],
2506 stl: "none",
2507 }
2508 `)
2509}
2510
Jooyung Han85d61762020-06-24 23:50:26 +09002511func TestVendorApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002512 ctx, _ := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002513 apex {
2514 name: "myapex",
2515 key: "myapex.key",
2516 binaries: ["mybin"],
2517 vendor: true,
2518 }
2519 apex_key {
2520 name: "myapex.key",
2521 public_key: "testkey.avbpubkey",
2522 private_key: "testkey.pem",
2523 }
2524 cc_binary {
2525 name: "mybin",
2526 vendor: true,
2527 shared_libs: ["libfoo"],
2528 }
2529 cc_library {
2530 name: "libfoo",
2531 proprietary: true,
2532 }
2533 `)
2534
2535 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2536 "bin/mybin",
2537 "lib64/libfoo.so",
2538 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2539 "lib64/libc++.so",
2540 })
2541
2542 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002543 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002544 name := apexBundle.BaseModuleName()
2545 prefix := "TARGET_"
2546 var builder strings.Builder
2547 data.Custom(&builder, name, prefix, "", data)
2548 androidMk := builder.String()
2549 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002550
2551 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2552 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2553 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002554}
2555
Jooyung Handf78e212020-07-22 15:54:47 +09002556func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2557 ctx, _ := testApex(t, `
2558 apex {
2559 name: "myapex",
2560 key: "myapex.key",
2561 binaries: ["mybin"],
2562 vendor: true,
2563 use_vndk_as_stable: true,
2564 }
2565 apex_key {
2566 name: "myapex.key",
2567 public_key: "testkey.avbpubkey",
2568 private_key: "testkey.pem",
2569 }
2570 cc_binary {
2571 name: "mybin",
2572 vendor: true,
2573 shared_libs: ["libvndk", "libvendor"],
2574 }
2575 cc_library {
2576 name: "libvndk",
2577 vndk: {
2578 enabled: true,
2579 },
2580 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002581 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002582 }
2583 cc_library {
2584 name: "libvendor",
2585 vendor: true,
2586 }
2587 `)
2588
2589 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2590
Colin Crossaede88c2020-08-11 12:17:01 -07002591 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002592 libs := names(ldRule.Args["libFlags"])
2593 // VNDK libs(libvndk/libc++) as they are
2594 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2595 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2596 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002597 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002598
2599 // VNDK libs are not included when use_vndk_as_stable: true
2600 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2601 "bin/mybin",
2602 "lib64/libvendor.so",
2603 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002604
2605 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2606 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2607 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002608}
2609
Jooyung Han8e5685d2020-09-21 11:02:57 +09002610func TestApex_withPrebuiltFirmware(t *testing.T) {
2611 testCases := []struct {
2612 name string
2613 additionalProp string
2614 }{
2615 {"system apex with prebuilt_firmware", ""},
2616 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2617 }
2618 for _, tc := range testCases {
2619 t.Run(tc.name, func(t *testing.T) {
2620 ctx, _ := testApex(t, `
2621 apex {
2622 name: "myapex",
2623 key: "myapex.key",
2624 prebuilts: ["myfirmware"],
2625 `+tc.additionalProp+`
2626 }
2627 apex_key {
2628 name: "myapex.key",
2629 public_key: "testkey.avbpubkey",
2630 private_key: "testkey.pem",
2631 }
2632 prebuilt_firmware {
2633 name: "myfirmware",
2634 src: "myfirmware.bin",
2635 filename_from_src: true,
2636 `+tc.additionalProp+`
2637 }
2638 `)
2639 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2640 "etc/firmware/myfirmware.bin",
2641 })
2642 })
2643 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002644}
2645
Jooyung Hanefb184e2020-06-25 17:14:25 +09002646func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002647 ctx, _ := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002648 apex {
2649 name: "myapex",
2650 key: "myapex.key",
2651 use_vendor: true,
2652 native_shared_libs: ["mylib"],
2653 }
2654
2655 apex_key {
2656 name: "myapex.key",
2657 public_key: "testkey.avbpubkey",
2658 private_key: "testkey.pem",
2659 }
2660
2661 cc_library {
2662 name: "mylib",
2663 vendor_available: true,
2664 apex_available: ["myapex"],
2665 }
2666 `, func(fs map[string][]byte, config android.Config) {
2667 setUseVendorAllowListForTest(config, []string{"myapex"})
2668 })
2669
2670 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002671 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002672 name := apexBundle.BaseModuleName()
2673 prefix := "TARGET_"
2674 var builder strings.Builder
2675 data.Custom(&builder, name, prefix, "", data)
2676 androidMk := builder.String()
2677 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2678}
2679
2680func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002681 ctx, _ := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002682 apex {
2683 name: "myapex",
2684 key: "myapex.key",
2685 vendor: true,
2686 native_shared_libs: ["mylib"],
2687 }
2688
2689 apex_key {
2690 name: "myapex.key",
2691 public_key: "testkey.avbpubkey",
2692 private_key: "testkey.pem",
2693 }
2694
2695 cc_library {
2696 name: "mylib",
2697 vendor_available: true,
2698 }
2699 `)
2700
2701 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002702 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002703 name := apexBundle.BaseModuleName()
2704 prefix := "TARGET_"
2705 var builder strings.Builder
2706 data.Custom(&builder, name, prefix, "", data)
2707 androidMk := builder.String()
2708 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2709}
2710
Jooyung Han2ed99d02020-06-24 23:26:26 +09002711func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002712 ctx, _ := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002713 apex {
2714 name: "myapex",
2715 key: "myapex.key",
2716 vintf_fragments: ["fragment.xml"],
2717 init_rc: ["init.rc"],
2718 }
2719 apex_key {
2720 name: "myapex.key",
2721 public_key: "testkey.avbpubkey",
2722 private_key: "testkey.pem",
2723 }
2724 cc_binary {
2725 name: "mybin",
2726 }
2727 `)
2728
2729 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002730 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002731 name := apexBundle.BaseModuleName()
2732 prefix := "TARGET_"
2733 var builder strings.Builder
2734 data.Custom(&builder, name, prefix, "", data)
2735 androidMk := builder.String()
2736 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2737 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2738}
2739
Jiyong Park16e91a02018-12-20 18:18:08 +09002740func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002741 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
2745 native_shared_libs: ["mylib"],
2746 }
2747
2748 apex_key {
2749 name: "myapex.key",
2750 public_key: "testkey.avbpubkey",
2751 private_key: "testkey.pem",
2752 }
2753
2754 cc_library {
2755 name: "mylib",
2756 srcs: ["mylib.cpp"],
2757 system_shared_libs: [],
2758 stl: "none",
2759 stubs: {
2760 versions: ["1", "2", "3"],
2761 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002762 apex_available: [
2763 "//apex_available:platform",
2764 "myapex",
2765 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002766 }
2767
2768 cc_binary {
2769 name: "not_in_apex",
2770 srcs: ["mylib.cpp"],
2771 static_libs: ["mylib"],
2772 static_executable: true,
2773 system_shared_libs: [],
2774 stl: "none",
2775 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002776 `)
2777
Colin Cross7113d202019-11-20 16:39:12 -08002778 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002779
2780 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002781 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002782}
Jiyong Park9335a262018-12-24 11:31:58 +09002783
2784func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002785 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002786 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002787 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002788 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002789 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002790 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002791 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002792 }
2793
2794 cc_library {
2795 name: "mylib",
2796 srcs: ["mylib.cpp"],
2797 system_shared_libs: [],
2798 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002799 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002800 }
2801
2802 apex_key {
2803 name: "myapex.key",
2804 public_key: "testkey.avbpubkey",
2805 private_key: "testkey.pem",
2806 }
2807
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002808 android_app_certificate {
2809 name: "myapex.certificate",
2810 certificate: "testkey",
2811 }
2812
2813 android_app_certificate {
2814 name: "myapex.certificate.override",
2815 certificate: "testkey.override",
2816 }
2817
Jiyong Park9335a262018-12-24 11:31:58 +09002818 `)
2819
2820 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002821 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002822
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002823 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2824 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002825 "vendor/foo/devkeys/testkey.avbpubkey")
2826 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002827 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2828 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002829 "vendor/foo/devkeys/testkey.pem")
2830 }
2831
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002832 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002833 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002834 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002835 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002836 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002837 }
2838}
Jiyong Park58e364a2019-01-19 19:24:06 +09002839
Jooyung Hanf121a652019-12-17 14:30:11 +09002840func TestCertificate(t *testing.T) {
2841 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2842 ctx, _ := testApex(t, `
2843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
2846 }
2847 apex_key {
2848 name: "myapex.key",
2849 public_key: "testkey.avbpubkey",
2850 private_key: "testkey.pem",
2851 }`)
2852 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2853 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2854 if actual := rule.Args["certificates"]; actual != expected {
2855 t.Errorf("certificates should be %q, not %q", expected, actual)
2856 }
2857 })
2858 t.Run("override when unspecified", func(t *testing.T) {
2859 ctx, _ := testApex(t, `
2860 apex {
2861 name: "myapex_keytest",
2862 key: "myapex.key",
2863 file_contexts: ":myapex-file_contexts",
2864 }
2865 apex_key {
2866 name: "myapex.key",
2867 public_key: "testkey.avbpubkey",
2868 private_key: "testkey.pem",
2869 }
2870 android_app_certificate {
2871 name: "myapex.certificate.override",
2872 certificate: "testkey.override",
2873 }`)
2874 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2875 expected := "testkey.override.x509.pem testkey.override.pk8"
2876 if actual := rule.Args["certificates"]; actual != expected {
2877 t.Errorf("certificates should be %q, not %q", expected, actual)
2878 }
2879 })
2880 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2881 ctx, _ := testApex(t, `
2882 apex {
2883 name: "myapex",
2884 key: "myapex.key",
2885 certificate: ":myapex.certificate",
2886 }
2887 apex_key {
2888 name: "myapex.key",
2889 public_key: "testkey.avbpubkey",
2890 private_key: "testkey.pem",
2891 }
2892 android_app_certificate {
2893 name: "myapex.certificate",
2894 certificate: "testkey",
2895 }`)
2896 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2897 expected := "testkey.x509.pem testkey.pk8"
2898 if actual := rule.Args["certificates"]; actual != expected {
2899 t.Errorf("certificates should be %q, not %q", expected, actual)
2900 }
2901 })
2902 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2903 ctx, _ := testApex(t, `
2904 apex {
2905 name: "myapex_keytest",
2906 key: "myapex.key",
2907 file_contexts: ":myapex-file_contexts",
2908 certificate: ":myapex.certificate",
2909 }
2910 apex_key {
2911 name: "myapex.key",
2912 public_key: "testkey.avbpubkey",
2913 private_key: "testkey.pem",
2914 }
2915 android_app_certificate {
2916 name: "myapex.certificate.override",
2917 certificate: "testkey.override",
2918 }`)
2919 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2920 expected := "testkey.override.x509.pem testkey.override.pk8"
2921 if actual := rule.Args["certificates"]; actual != expected {
2922 t.Errorf("certificates should be %q, not %q", expected, actual)
2923 }
2924 })
2925 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2926 ctx, _ := testApex(t, `
2927 apex {
2928 name: "myapex",
2929 key: "myapex.key",
2930 certificate: "testkey",
2931 }
2932 apex_key {
2933 name: "myapex.key",
2934 public_key: "testkey.avbpubkey",
2935 private_key: "testkey.pem",
2936 }`)
2937 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2938 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2939 if actual := rule.Args["certificates"]; actual != expected {
2940 t.Errorf("certificates should be %q, not %q", expected, actual)
2941 }
2942 })
2943 t.Run("override when specified as <name>", func(t *testing.T) {
2944 ctx, _ := testApex(t, `
2945 apex {
2946 name: "myapex_keytest",
2947 key: "myapex.key",
2948 file_contexts: ":myapex-file_contexts",
2949 certificate: "testkey",
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 android_app_certificate {
2957 name: "myapex.certificate.override",
2958 certificate: "testkey.override",
2959 }`)
2960 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2961 expected := "testkey.override.x509.pem testkey.override.pk8"
2962 if actual := rule.Args["certificates"]; actual != expected {
2963 t.Errorf("certificates should be %q, not %q", expected, actual)
2964 }
2965 })
2966}
2967
Jiyong Park58e364a2019-01-19 19:24:06 +09002968func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002969 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002970 apex {
2971 name: "myapex",
2972 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002973 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002974 }
2975
2976 apex {
2977 name: "otherapex",
2978 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002979 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002980 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002981 }
2982
2983 apex_key {
2984 name: "myapex.key",
2985 public_key: "testkey.avbpubkey",
2986 private_key: "testkey.pem",
2987 }
2988
2989 cc_library {
2990 name: "mylib",
2991 srcs: ["mylib.cpp"],
2992 system_shared_libs: [],
2993 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002994 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002995 "myapex",
2996 "otherapex",
2997 ],
Jooyung Han24282772020-03-21 23:20:55 +09002998 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002999 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003000 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003001 cc_library {
3002 name: "mylib2",
3003 srcs: ["mylib.cpp"],
3004 system_shared_libs: [],
3005 stl: "none",
3006 apex_available: [
3007 "myapex",
3008 "otherapex",
3009 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003010 static_libs: ["mylib3"],
3011 recovery_available: true,
3012 min_sdk_version: "29",
3013 }
3014 cc_library {
3015 name: "mylib3",
3016 srcs: ["mylib.cpp"],
3017 system_shared_libs: [],
3018 stl: "none",
3019 apex_available: [
3020 "myapex",
3021 "otherapex",
3022 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003023 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003024 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003025 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003026 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003027 `)
3028
Jooyung Hanc87a0592020-03-02 17:44:33 +09003029 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003030 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003031 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003032 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003033
Jooyung Hanccce2f22020-03-07 03:45:53 +09003034 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003035 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003036 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003037 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003038 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003039
Jooyung Hanccce2f22020-03-07 03:45:53 +09003040 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003041 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003042 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003043 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003044 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003045
Colin Crossaede88c2020-08-11 12:17:01 -07003046 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3047 // each variant defines additional macros to distinguish which apex variant it is built for
3048
3049 // non-APEX variant does not have __ANDROID_APEX__ defined
3050 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3051 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3052
3053 // APEX variant has __ANDROID_APEX__ defined
3054 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3055 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3056 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3057 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3058
3059 // APEX variant has __ANDROID_APEX__ defined
3060 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3061 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3062 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3063 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3064
Dan Albertb19953d2020-11-17 15:29:36 -08003065 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003066 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3067 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003068 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003069
3070 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3071 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003072
3073 // non-APEX variant does not have __ANDROID_APEX__ defined
3074 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3075 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3076
3077 // APEX variant has __ANDROID_APEX__ defined
3078 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003079 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003080 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003081 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003082
Jooyung Hanc87a0592020-03-02 17:44:33 +09003083 // APEX variant has __ANDROID_APEX__ defined
3084 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003085 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003086 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003087 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003088
Dan Albertb19953d2020-11-17 15:29:36 -08003089 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003090 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003091 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003092 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003093}
Jiyong Park7e636d02019-01-28 16:16:54 +09003094
3095func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003096 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003097 apex {
3098 name: "myapex",
3099 key: "myapex.key",
3100 native_shared_libs: ["mylib"],
3101 }
3102
3103 apex_key {
3104 name: "myapex.key",
3105 public_key: "testkey.avbpubkey",
3106 private_key: "testkey.pem",
3107 }
3108
3109 cc_library_headers {
3110 name: "mylib_headers",
3111 export_include_dirs: ["my_include"],
3112 system_shared_libs: [],
3113 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003114 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003115 }
3116
3117 cc_library {
3118 name: "mylib",
3119 srcs: ["mylib.cpp"],
3120 system_shared_libs: [],
3121 stl: "none",
3122 header_libs: ["mylib_headers"],
3123 export_header_lib_headers: ["mylib_headers"],
3124 stubs: {
3125 versions: ["1", "2", "3"],
3126 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003127 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003128 }
3129
3130 cc_library {
3131 name: "otherlib",
3132 srcs: ["mylib.cpp"],
3133 system_shared_libs: [],
3134 stl: "none",
3135 shared_libs: ["mylib"],
3136 }
3137 `)
3138
Colin Cross7113d202019-11-20 16:39:12 -08003139 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003140
3141 // Ensure that the include path of the header lib is exported to 'otherlib'
3142 ensureContains(t, cFlags, "-Imy_include")
3143}
Alex Light9670d332019-01-29 18:07:33 -08003144
Jiyong Park7cd10e32020-01-14 09:22:18 +09003145type fileInApex struct {
3146 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003147 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003148 isLink bool
3149}
3150
Jooyung Hana57af4a2020-01-23 05:36:59 +00003151func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003152 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003153 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003154 copyCmds := apexRule.Args["copy_commands"]
3155 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003156 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003157 for _, cmd := range strings.Split(copyCmds, "&&") {
3158 cmd = strings.TrimSpace(cmd)
3159 if cmd == "" {
3160 continue
3161 }
3162 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003163 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003164 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003165 switch terms[0] {
3166 case "mkdir":
3167 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003168 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003169 t.Fatal("copyCmds contains invalid cp command", cmd)
3170 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003171 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003172 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003173 isLink = false
3174 case "ln":
3175 if len(terms) != 3 && len(terms) != 4 {
3176 // ln LINK TARGET or ln -s LINK TARGET
3177 t.Fatal("copyCmds contains invalid ln command", cmd)
3178 }
3179 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003180 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003181 isLink = true
3182 default:
3183 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3184 }
3185 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003186 index := strings.Index(dst, imageApexDir)
3187 if index == -1 {
3188 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3189 }
3190 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003191 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003192 }
3193 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003194 return ret
3195}
3196
Jooyung Hana57af4a2020-01-23 05:36:59 +00003197func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3198 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003199 var failed bool
3200 var surplus []string
3201 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003202 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003203 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003204 for _, expected := range files {
3205 if matched, _ := path.Match(expected, file.path); matched {
3206 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003207 mactchFound = true
3208 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003209 }
3210 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003211 if !mactchFound {
3212 surplus = append(surplus, file.path)
3213 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003214 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003215
Jooyung Han31c470b2019-10-18 16:26:59 +09003216 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003217 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003218 t.Log("surplus files", surplus)
3219 failed = true
3220 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003221
3222 if len(files) > len(filesMatched) {
3223 var missing []string
3224 for _, expected := range files {
3225 if !filesMatched[expected] {
3226 missing = append(missing, expected)
3227 }
3228 }
3229 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003230 t.Log("missing files", missing)
3231 failed = true
3232 }
3233 if failed {
3234 t.Fail()
3235 }
3236}
3237
Jooyung Han344d5432019-08-23 11:17:39 +09003238func TestVndkApexCurrent(t *testing.T) {
3239 ctx, _ := testApex(t, `
3240 apex_vndk {
3241 name: "myapex",
3242 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003243 }
3244
3245 apex_key {
3246 name: "myapex.key",
3247 public_key: "testkey.avbpubkey",
3248 private_key: "testkey.pem",
3249 }
3250
3251 cc_library {
3252 name: "libvndk",
3253 srcs: ["mylib.cpp"],
3254 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003255 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003256 vndk: {
3257 enabled: true,
3258 },
3259 system_shared_libs: [],
3260 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003261 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003262 }
3263
3264 cc_library {
3265 name: "libvndksp",
3266 srcs: ["mylib.cpp"],
3267 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003268 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003269 vndk: {
3270 enabled: true,
3271 support_system_process: true,
3272 },
3273 system_shared_libs: [],
3274 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003275 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003276 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003277 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003278
Jooyung Hana57af4a2020-01-23 05:36:59 +00003279 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003280 "lib/libvndk.so",
3281 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003282 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003283 "lib64/libvndk.so",
3284 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003285 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003286 "etc/llndk.libraries.VER.txt",
3287 "etc/vndkcore.libraries.VER.txt",
3288 "etc/vndksp.libraries.VER.txt",
3289 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003290 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003291 })
Jooyung Han344d5432019-08-23 11:17:39 +09003292}
3293
3294func TestVndkApexWithPrebuilt(t *testing.T) {
3295 ctx, _ := testApex(t, `
3296 apex_vndk {
3297 name: "myapex",
3298 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003299 }
3300
3301 apex_key {
3302 name: "myapex.key",
3303 public_key: "testkey.avbpubkey",
3304 private_key: "testkey.pem",
3305 }
3306
3307 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003308 name: "libvndk",
3309 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003310 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003311 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003312 vndk: {
3313 enabled: true,
3314 },
3315 system_shared_libs: [],
3316 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003317 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003318 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003319
3320 cc_prebuilt_library_shared {
3321 name: "libvndk.arm",
3322 srcs: ["libvndk.arm.so"],
3323 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003324 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003325 vndk: {
3326 enabled: true,
3327 },
3328 enabled: false,
3329 arch: {
3330 arm: {
3331 enabled: true,
3332 },
3333 },
3334 system_shared_libs: [],
3335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003336 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003337 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003338 `+vndkLibrariesTxtFiles("current"),
3339 withFiles(map[string][]byte{
3340 "libvndk.so": nil,
3341 "libvndk.arm.so": nil,
3342 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003343
Jooyung Hana57af4a2020-01-23 05:36:59 +00003344 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003345 "lib/libvndk.so",
3346 "lib/libvndk.arm.so",
3347 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003348 "lib/libc++.so",
3349 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003350 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003351 })
Jooyung Han344d5432019-08-23 11:17:39 +09003352}
3353
Jooyung Han39edb6c2019-11-06 16:53:07 +09003354func vndkLibrariesTxtFiles(vers ...string) (result string) {
3355 for _, v := range vers {
3356 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003357 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003358 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003359 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003360 name: "` + txt + `.libraries.txt",
3361 }
3362 `
3363 }
3364 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003365 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003366 result += `
3367 prebuilt_etc {
3368 name: "` + txt + `.libraries.` + v + `.txt",
3369 src: "dummy.txt",
3370 }
3371 `
3372 }
3373 }
3374 }
3375 return
3376}
3377
Jooyung Han344d5432019-08-23 11:17:39 +09003378func TestVndkApexVersion(t *testing.T) {
3379 ctx, _ := testApex(t, `
3380 apex_vndk {
3381 name: "myapex_v27",
3382 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003383 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003384 vndk_version: "27",
3385 }
3386
3387 apex_key {
3388 name: "myapex.key",
3389 public_key: "testkey.avbpubkey",
3390 private_key: "testkey.pem",
3391 }
3392
Jooyung Han31c470b2019-10-18 16:26:59 +09003393 vndk_prebuilt_shared {
3394 name: "libvndk27",
3395 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003396 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003397 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003398 vndk: {
3399 enabled: true,
3400 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003401 target_arch: "arm64",
3402 arch: {
3403 arm: {
3404 srcs: ["libvndk27_arm.so"],
3405 },
3406 arm64: {
3407 srcs: ["libvndk27_arm64.so"],
3408 },
3409 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003410 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003411 }
3412
3413 vndk_prebuilt_shared {
3414 name: "libvndk27",
3415 version: "27",
3416 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003417 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003418 vndk: {
3419 enabled: true,
3420 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003421 target_arch: "x86_64",
3422 arch: {
3423 x86: {
3424 srcs: ["libvndk27_x86.so"],
3425 },
3426 x86_64: {
3427 srcs: ["libvndk27_x86_64.so"],
3428 },
3429 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003430 }
3431 `+vndkLibrariesTxtFiles("27"),
3432 withFiles(map[string][]byte{
3433 "libvndk27_arm.so": nil,
3434 "libvndk27_arm64.so": nil,
3435 "libvndk27_x86.so": nil,
3436 "libvndk27_x86_64.so": nil,
3437 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003438
Jooyung Hana57af4a2020-01-23 05:36:59 +00003439 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003440 "lib/libvndk27_arm.so",
3441 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003442 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003443 })
Jooyung Han344d5432019-08-23 11:17:39 +09003444}
3445
3446func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3447 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3448 apex_vndk {
3449 name: "myapex_v27",
3450 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003451 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003452 vndk_version: "27",
3453 }
3454 apex_vndk {
3455 name: "myapex_v27_other",
3456 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003457 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003458 vndk_version: "27",
3459 }
3460
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466
3467 cc_library {
3468 name: "libvndk",
3469 srcs: ["mylib.cpp"],
3470 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003471 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003472 vndk: {
3473 enabled: true,
3474 },
3475 system_shared_libs: [],
3476 stl: "none",
3477 }
3478
3479 vndk_prebuilt_shared {
3480 name: "libvndk",
3481 version: "27",
3482 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003483 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003484 vndk: {
3485 enabled: true,
3486 },
3487 srcs: ["libvndk.so"],
3488 }
3489 `, withFiles(map[string][]byte{
3490 "libvndk.so": nil,
3491 }))
3492}
3493
Jooyung Han90eee022019-10-01 20:02:42 +09003494func TestVndkApexNameRule(t *testing.T) {
3495 ctx, _ := testApex(t, `
3496 apex_vndk {
3497 name: "myapex",
3498 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003499 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003500 }
3501 apex_vndk {
3502 name: "myapex_v28",
3503 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003504 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003505 vndk_version: "28",
3506 }
3507 apex_key {
3508 name: "myapex.key",
3509 public_key: "testkey.avbpubkey",
3510 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003511 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003512
3513 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003514 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003515 actual := proptools.String(bundle.properties.Apex_name)
3516 if !reflect.DeepEqual(actual, expected) {
3517 t.Errorf("Got '%v', expected '%v'", actual, expected)
3518 }
3519 }
3520
3521 assertApexName("com.android.vndk.vVER", "myapex")
3522 assertApexName("com.android.vndk.v28", "myapex_v28")
3523}
3524
Jooyung Han344d5432019-08-23 11:17:39 +09003525func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3526 ctx, _ := testApex(t, `
3527 apex_vndk {
3528 name: "myapex",
3529 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003530 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003531 }
3532
3533 apex_key {
3534 name: "myapex.key",
3535 public_key: "testkey.avbpubkey",
3536 private_key: "testkey.pem",
3537 }
3538
3539 cc_library {
3540 name: "libvndk",
3541 srcs: ["mylib.cpp"],
3542 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003543 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003544 native_bridge_supported: true,
3545 host_supported: true,
3546 vndk: {
3547 enabled: true,
3548 },
3549 system_shared_libs: [],
3550 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003551 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003552 }
Jooyung Han35155c42020-02-06 17:33:20 +09003553 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003554
Jooyung Hana57af4a2020-01-23 05:36:59 +00003555 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003556 "lib/libvndk.so",
3557 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003558 "lib/libc++.so",
3559 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003560 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003561 })
Jooyung Han344d5432019-08-23 11:17:39 +09003562}
3563
3564func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3565 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3566 apex_vndk {
3567 name: "myapex",
3568 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003569 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003570 native_bridge_supported: true,
3571 }
3572
3573 apex_key {
3574 name: "myapex.key",
3575 public_key: "testkey.avbpubkey",
3576 private_key: "testkey.pem",
3577 }
3578
3579 cc_library {
3580 name: "libvndk",
3581 srcs: ["mylib.cpp"],
3582 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003583 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003584 native_bridge_supported: true,
3585 host_supported: true,
3586 vndk: {
3587 enabled: true,
3588 },
3589 system_shared_libs: [],
3590 stl: "none",
3591 }
3592 `)
3593}
3594
Jooyung Han31c470b2019-10-18 16:26:59 +09003595func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003596 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003597 apex_vndk {
3598 name: "myapex_v27",
3599 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003600 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003601 vndk_version: "27",
3602 }
3603
3604 apex_key {
3605 name: "myapex.key",
3606 public_key: "testkey.avbpubkey",
3607 private_key: "testkey.pem",
3608 }
3609
3610 vndk_prebuilt_shared {
3611 name: "libvndk27",
3612 version: "27",
3613 target_arch: "arm",
3614 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003615 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 vndk: {
3617 enabled: true,
3618 },
3619 arch: {
3620 arm: {
3621 srcs: ["libvndk27.so"],
3622 }
3623 },
3624 }
3625
3626 vndk_prebuilt_shared {
3627 name: "libvndk27",
3628 version: "27",
3629 target_arch: "arm",
3630 binder32bit: true,
3631 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003632 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003633 vndk: {
3634 enabled: true,
3635 },
3636 arch: {
3637 arm: {
3638 srcs: ["libvndk27binder32.so"],
3639 }
3640 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003641 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003643 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003644 withFiles(map[string][]byte{
3645 "libvndk27.so": nil,
3646 "libvndk27binder32.so": nil,
3647 }),
3648 withBinder32bit,
3649 withTargets(map[android.OsType][]android.Target{
3650 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003651 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3652 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003653 },
3654 }),
3655 )
3656
Jooyung Hana57af4a2020-01-23 05:36:59 +00003657 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003658 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003659 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003660 })
3661}
3662
Jooyung Han45a96772020-06-15 14:59:42 +09003663func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3664 ctx, _ := testApex(t, `
3665 apex_vndk {
3666 name: "myapex",
3667 key: "myapex.key",
3668 file_contexts: ":myapex-file_contexts",
3669 }
3670
3671 apex_key {
3672 name: "myapex.key",
3673 public_key: "testkey.avbpubkey",
3674 private_key: "testkey.pem",
3675 }
3676
3677 cc_library {
3678 name: "libz",
3679 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003680 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003681 vndk: {
3682 enabled: true,
3683 },
3684 stubs: {
3685 symbol_file: "libz.map.txt",
3686 versions: ["30"],
3687 }
3688 }
3689 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3690 "libz.map.txt": nil,
3691 }))
3692
3693 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3694 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3695 ensureListEmpty(t, provideNativeLibs)
3696}
3697
Jooyung Hane1633032019-08-01 17:41:43 +09003698func TestDependenciesInApexManifest(t *testing.T) {
3699 ctx, _ := testApex(t, `
3700 apex {
3701 name: "myapex_nodep",
3702 key: "myapex.key",
3703 native_shared_libs: ["lib_nodep"],
3704 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003705 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003706 }
3707
3708 apex {
3709 name: "myapex_dep",
3710 key: "myapex.key",
3711 native_shared_libs: ["lib_dep"],
3712 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003713 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003714 }
3715
3716 apex {
3717 name: "myapex_provider",
3718 key: "myapex.key",
3719 native_shared_libs: ["libfoo"],
3720 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003721 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003722 }
3723
3724 apex {
3725 name: "myapex_selfcontained",
3726 key: "myapex.key",
3727 native_shared_libs: ["lib_dep", "libfoo"],
3728 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003729 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003730 }
3731
3732 apex_key {
3733 name: "myapex.key",
3734 public_key: "testkey.avbpubkey",
3735 private_key: "testkey.pem",
3736 }
3737
3738 cc_library {
3739 name: "lib_nodep",
3740 srcs: ["mylib.cpp"],
3741 system_shared_libs: [],
3742 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003743 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003744 }
3745
3746 cc_library {
3747 name: "lib_dep",
3748 srcs: ["mylib.cpp"],
3749 shared_libs: ["libfoo"],
3750 system_shared_libs: [],
3751 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003752 apex_available: [
3753 "myapex_dep",
3754 "myapex_provider",
3755 "myapex_selfcontained",
3756 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003757 }
3758
3759 cc_library {
3760 name: "libfoo",
3761 srcs: ["mytest.cpp"],
3762 stubs: {
3763 versions: ["1"],
3764 },
3765 system_shared_libs: [],
3766 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003767 apex_available: [
3768 "myapex_provider",
3769 "myapex_selfcontained",
3770 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003771 }
3772 `)
3773
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003774 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003775 var provideNativeLibs, requireNativeLibs []string
3776
Sundong Ahnabb64432019-10-22 13:58:29 +09003777 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003778 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3779 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003780 ensureListEmpty(t, provideNativeLibs)
3781 ensureListEmpty(t, requireNativeLibs)
3782
Sundong Ahnabb64432019-10-22 13:58:29 +09003783 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003784 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3785 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003786 ensureListEmpty(t, provideNativeLibs)
3787 ensureListContains(t, requireNativeLibs, "libfoo.so")
3788
Sundong Ahnabb64432019-10-22 13:58:29 +09003789 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003790 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3791 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003792 ensureListContains(t, provideNativeLibs, "libfoo.so")
3793 ensureListEmpty(t, requireNativeLibs)
3794
Sundong Ahnabb64432019-10-22 13:58:29 +09003795 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003796 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3797 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003798 ensureListContains(t, provideNativeLibs, "libfoo.so")
3799 ensureListEmpty(t, requireNativeLibs)
3800}
3801
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003802func TestApexName(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07003803 ctx, _ := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003804 apex {
3805 name: "myapex",
3806 key: "myapex.key",
3807 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003808 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003809 }
3810
3811 apex_key {
3812 name: "myapex.key",
3813 public_key: "testkey.avbpubkey",
3814 private_key: "testkey.pem",
3815 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003816
3817 cc_library {
3818 name: "mylib",
3819 srcs: ["mylib.cpp"],
3820 system_shared_libs: [],
3821 stl: "none",
3822 apex_available: [
3823 "//apex_available:platform",
3824 "myapex",
3825 ],
3826 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003827 `)
3828
Sundong Ahnabb64432019-10-22 13:58:29 +09003829 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003830 apexManifestRule := module.Rule("apexManifestRule")
3831 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3832 apexRule := module.Rule("apexRule")
3833 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003834
3835 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003836 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003837 name := apexBundle.BaseModuleName()
3838 prefix := "TARGET_"
3839 var builder strings.Builder
3840 data.Custom(&builder, name, prefix, "", data)
3841 androidMk := builder.String()
3842 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3843 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003844}
3845
Alex Light0851b882019-02-07 13:20:53 -08003846func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003847 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003848 apex {
3849 name: "myapex",
3850 key: "myapex.key",
3851 native_shared_libs: ["mylib_common"],
3852 }
3853
3854 apex_key {
3855 name: "myapex.key",
3856 public_key: "testkey.avbpubkey",
3857 private_key: "testkey.pem",
3858 }
3859
3860 cc_library {
3861 name: "mylib_common",
3862 srcs: ["mylib.cpp"],
3863 system_shared_libs: [],
3864 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003865 apex_available: [
3866 "//apex_available:platform",
3867 "myapex",
3868 ],
Alex Light0851b882019-02-07 13:20:53 -08003869 }
3870 `)
3871
Sundong Ahnabb64432019-10-22 13:58:29 +09003872 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003873 apexRule := module.Rule("apexRule")
3874 copyCmds := apexRule.Args["copy_commands"]
3875
3876 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3877 t.Log("Apex was a test apex!")
3878 t.Fail()
3879 }
3880 // Ensure that main rule creates an output
3881 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3882
3883 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003885
3886 // Ensure that both direct and indirect deps are copied into apex
3887 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3888
Colin Cross7113d202019-11-20 16:39:12 -08003889 // Ensure that the platform variant ends with _shared
3890 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003891
Colin Cross56a83212020-09-15 18:30:11 -07003892 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003893 t.Log("Found mylib_common not in any apex!")
3894 t.Fail()
3895 }
3896}
3897
3898func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003899 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003900 apex_test {
3901 name: "myapex",
3902 key: "myapex.key",
3903 native_shared_libs: ["mylib_common_test"],
3904 }
3905
3906 apex_key {
3907 name: "myapex.key",
3908 public_key: "testkey.avbpubkey",
3909 private_key: "testkey.pem",
3910 }
3911
3912 cc_library {
3913 name: "mylib_common_test",
3914 srcs: ["mylib.cpp"],
3915 system_shared_libs: [],
3916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003917 // TODO: remove //apex_available:platform
3918 apex_available: [
3919 "//apex_available:platform",
3920 "myapex",
3921 ],
Alex Light0851b882019-02-07 13:20:53 -08003922 }
3923 `)
3924
Sundong Ahnabb64432019-10-22 13:58:29 +09003925 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003926 apexRule := module.Rule("apexRule")
3927 copyCmds := apexRule.Args["copy_commands"]
3928
3929 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3930 t.Log("Apex was not a test apex!")
3931 t.Fail()
3932 }
3933 // Ensure that main rule creates an output
3934 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3935
3936 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003937 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003938
3939 // Ensure that both direct and indirect deps are copied into apex
3940 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3941
Colin Cross7113d202019-11-20 16:39:12 -08003942 // Ensure that the platform variant ends with _shared
3943 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003944}
3945
Alex Light9670d332019-01-29 18:07:33 -08003946func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003947 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003948 apex {
3949 name: "myapex",
3950 key: "myapex.key",
3951 multilib: {
3952 first: {
3953 native_shared_libs: ["mylib_common"],
3954 }
3955 },
3956 target: {
3957 android: {
3958 multilib: {
3959 first: {
3960 native_shared_libs: ["mylib"],
3961 }
3962 }
3963 },
3964 host: {
3965 multilib: {
3966 first: {
3967 native_shared_libs: ["mylib2"],
3968 }
3969 }
3970 }
3971 }
3972 }
3973
3974 apex_key {
3975 name: "myapex.key",
3976 public_key: "testkey.avbpubkey",
3977 private_key: "testkey.pem",
3978 }
3979
3980 cc_library {
3981 name: "mylib",
3982 srcs: ["mylib.cpp"],
3983 system_shared_libs: [],
3984 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003985 // TODO: remove //apex_available:platform
3986 apex_available: [
3987 "//apex_available:platform",
3988 "myapex",
3989 ],
Alex Light9670d332019-01-29 18:07:33 -08003990 }
3991
3992 cc_library {
3993 name: "mylib_common",
3994 srcs: ["mylib.cpp"],
3995 system_shared_libs: [],
3996 stl: "none",
3997 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003998 // TODO: remove //apex_available:platform
3999 apex_available: [
4000 "//apex_available:platform",
4001 "myapex",
4002 ],
Alex Light9670d332019-01-29 18:07:33 -08004003 }
4004
4005 cc_library {
4006 name: "mylib2",
4007 srcs: ["mylib.cpp"],
4008 system_shared_libs: [],
4009 stl: "none",
4010 compile_multilib: "first",
4011 }
4012 `)
4013
Sundong Ahnabb64432019-10-22 13:58:29 +09004014 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004015 copyCmds := apexRule.Args["copy_commands"]
4016
4017 // Ensure that main rule creates an output
4018 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4019
4020 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004021 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4022 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4023 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004024
4025 // Ensure that both direct and indirect deps are copied into apex
4026 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4027 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4028 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4029
Colin Cross7113d202019-11-20 16:39:12 -08004030 // Ensure that the platform variant ends with _shared
4031 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4032 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4033 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004034}
Jiyong Park04480cf2019-02-06 00:16:29 +09004035
Jiyong Park59140302020-12-14 18:44:04 +09004036func TestApexWithArch(t *testing.T) {
4037 ctx, _ := testApex(t, `
4038 apex {
4039 name: "myapex",
4040 key: "myapex.key",
4041 arch: {
4042 arm64: {
4043 native_shared_libs: ["mylib.arm64"],
4044 },
4045 x86_64: {
4046 native_shared_libs: ["mylib.x64"],
4047 },
4048 }
4049 }
4050
4051 apex_key {
4052 name: "myapex.key",
4053 public_key: "testkey.avbpubkey",
4054 private_key: "testkey.pem",
4055 }
4056
4057 cc_library {
4058 name: "mylib.arm64",
4059 srcs: ["mylib.cpp"],
4060 system_shared_libs: [],
4061 stl: "none",
4062 // TODO: remove //apex_available:platform
4063 apex_available: [
4064 "//apex_available:platform",
4065 "myapex",
4066 ],
4067 }
4068
4069 cc_library {
4070 name: "mylib.x64",
4071 srcs: ["mylib.cpp"],
4072 system_shared_libs: [],
4073 stl: "none",
4074 // TODO: remove //apex_available:platform
4075 apex_available: [
4076 "//apex_available:platform",
4077 "myapex",
4078 ],
4079 }
4080 `)
4081
4082 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4083 copyCmds := apexRule.Args["copy_commands"]
4084
4085 // Ensure that apex variant is created for the direct dep
4086 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4087 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4088
4089 // Ensure that both direct and indirect deps are copied into apex
4090 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4091 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4092}
4093
Jiyong Park04480cf2019-02-06 00:16:29 +09004094func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004095 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004096 apex {
4097 name: "myapex",
4098 key: "myapex.key",
4099 binaries: ["myscript"],
4100 }
4101
4102 apex_key {
4103 name: "myapex.key",
4104 public_key: "testkey.avbpubkey",
4105 private_key: "testkey.pem",
4106 }
4107
4108 sh_binary {
4109 name: "myscript",
4110 src: "mylib.cpp",
4111 filename: "myscript.sh",
4112 sub_dir: "script",
4113 }
4114 `)
4115
Sundong Ahnabb64432019-10-22 13:58:29 +09004116 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004117 copyCmds := apexRule.Args["copy_commands"]
4118
4119 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4120}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004121
Jooyung Han91df2082019-11-20 01:49:42 +09004122func TestApexInVariousPartition(t *testing.T) {
4123 testcases := []struct {
4124 propName, parition, flattenedPartition string
4125 }{
4126 {"", "system", "system_ext"},
4127 {"product_specific: true", "product", "product"},
4128 {"soc_specific: true", "vendor", "vendor"},
4129 {"proprietary: true", "vendor", "vendor"},
4130 {"vendor: true", "vendor", "vendor"},
4131 {"system_ext_specific: true", "system_ext", "system_ext"},
4132 }
4133 for _, tc := range testcases {
4134 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
4135 ctx, _ := testApex(t, `
4136 apex {
4137 name: "myapex",
4138 key: "myapex.key",
4139 `+tc.propName+`
4140 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004141
Jooyung Han91df2082019-11-20 01:49:42 +09004142 apex_key {
4143 name: "myapex.key",
4144 public_key: "testkey.avbpubkey",
4145 private_key: "testkey.pem",
4146 }
4147 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004148
Jooyung Han91df2082019-11-20 01:49:42 +09004149 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4150 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4151 actual := apex.installDir.String()
4152 if actual != expected {
4153 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4154 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004155
Jooyung Han91df2082019-11-20 01:49:42 +09004156 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4157 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4158 actual = flattened.installDir.String()
4159 if actual != expected {
4160 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4161 }
4162 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004163 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004164}
Jiyong Park67882562019-03-21 01:11:21 +09004165
Jooyung Han580eb4f2020-06-24 19:33:06 +09004166func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004167 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004168 apex {
4169 name: "myapex",
4170 key: "myapex.key",
4171 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004172
Jooyung Han580eb4f2020-06-24 19:33:06 +09004173 apex_key {
4174 name: "myapex.key",
4175 public_key: "testkey.avbpubkey",
4176 private_key: "testkey.pem",
4177 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004178 `)
4179 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004180 rule := module.Output("file_contexts")
4181 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4182}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004183
Jooyung Han580eb4f2020-06-24 19:33:06 +09004184func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004185 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004186 apex {
4187 name: "myapex",
4188 key: "myapex.key",
4189 file_contexts: "my_own_file_contexts",
4190 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004191
Jooyung Han580eb4f2020-06-24 19:33:06 +09004192 apex_key {
4193 name: "myapex.key",
4194 public_key: "testkey.avbpubkey",
4195 private_key: "testkey.pem",
4196 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004197 `, withFiles(map[string][]byte{
4198 "my_own_file_contexts": nil,
4199 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004200}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004201
Jooyung Han580eb4f2020-06-24 19:33:06 +09004202func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004203 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004204 apex {
4205 name: "myapex",
4206 key: "myapex.key",
4207 product_specific: true,
4208 file_contexts: "product_specific_file_contexts",
4209 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004210
Jooyung Han580eb4f2020-06-24 19:33:06 +09004211 apex_key {
4212 name: "myapex.key",
4213 public_key: "testkey.avbpubkey",
4214 private_key: "testkey.pem",
4215 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004216 `)
4217
Jooyung Han580eb4f2020-06-24 19:33:06 +09004218 ctx, _ := testApex(t, `
4219 apex {
4220 name: "myapex",
4221 key: "myapex.key",
4222 product_specific: true,
4223 file_contexts: "product_specific_file_contexts",
4224 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004225
Jooyung Han580eb4f2020-06-24 19:33:06 +09004226 apex_key {
4227 name: "myapex.key",
4228 public_key: "testkey.avbpubkey",
4229 private_key: "testkey.pem",
4230 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004231 `, withFiles(map[string][]byte{
4232 "product_specific_file_contexts": nil,
4233 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004234 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4235 rule := module.Output("file_contexts")
4236 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4237}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004238
Jooyung Han580eb4f2020-06-24 19:33:06 +09004239func TestFileContexts_SetViaFileGroup(t *testing.T) {
4240 ctx, _ := testApex(t, `
4241 apex {
4242 name: "myapex",
4243 key: "myapex.key",
4244 product_specific: true,
4245 file_contexts: ":my-file-contexts",
4246 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004247
Jooyung Han580eb4f2020-06-24 19:33:06 +09004248 apex_key {
4249 name: "myapex.key",
4250 public_key: "testkey.avbpubkey",
4251 private_key: "testkey.pem",
4252 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004253
Jooyung Han580eb4f2020-06-24 19:33:06 +09004254 filegroup {
4255 name: "my-file-contexts",
4256 srcs: ["product_specific_file_contexts"],
4257 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004258 `, withFiles(map[string][]byte{
4259 "product_specific_file_contexts": nil,
4260 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004261 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4262 rule := module.Output("file_contexts")
4263 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004264}
4265
Jiyong Park67882562019-03-21 01:11:21 +09004266func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004267 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004268 apex_key {
4269 name: "myapex.key",
4270 public_key: ":my.avbpubkey",
4271 private_key: ":my.pem",
4272 product_specific: true,
4273 }
4274
4275 filegroup {
4276 name: "my.avbpubkey",
4277 srcs: ["testkey2.avbpubkey"],
4278 }
4279
4280 filegroup {
4281 name: "my.pem",
4282 srcs: ["testkey2.pem"],
4283 }
4284 `)
4285
4286 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4287 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004288 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004289 if actual_pubkey != expected_pubkey {
4290 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4291 }
4292 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004293 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004294 if actual_privkey != expected_privkey {
4295 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4296 }
4297}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004298
4299func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004300 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004301 prebuilt_apex {
4302 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004303 arch: {
4304 arm64: {
4305 src: "myapex-arm64.apex",
4306 },
4307 arm: {
4308 src: "myapex-arm.apex",
4309 },
4310 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004311 }
4312 `)
4313
4314 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4315
Jiyong Parkc95714e2019-03-29 14:23:10 +09004316 expectedInput := "myapex-arm64.apex"
4317 if prebuilt.inputApex.String() != expectedInput {
4318 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4319 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004320}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004321
4322func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004323 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004324 prebuilt_apex {
4325 name: "myapex",
4326 src: "myapex-arm.apex",
4327 filename: "notmyapex.apex",
4328 }
4329 `)
4330
4331 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4332
4333 expected := "notmyapex.apex"
4334 if p.installFilename != expected {
4335 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4336 }
4337}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004338
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004339func TestPrebuiltOverrides(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004340 ctx, _ := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004341 prebuilt_apex {
4342 name: "myapex.prebuilt",
4343 src: "myapex-arm.apex",
4344 overrides: [
4345 "myapex",
4346 ],
4347 }
4348 `)
4349
4350 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4351
4352 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004353 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004354 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004355 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004356 }
4357}
4358
Paul Duffin092153d2021-01-26 11:42:39 +00004359// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4360// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004361func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4362 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004363 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004364 }
4365
Paul Duffin89886cb2021-02-05 16:44:03 +00004366 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004367 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004368 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004369 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004370 stem := android.RemoveOptionalPrebuiltPrefix(name)
4371 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004372 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4373 }
4374 }
4375
Paul Duffin39853512021-02-26 11:09:39 +00004376 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004377 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004378 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004379 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4380 }
4381 }
4382
4383 t.Run("prebuilt only", func(t *testing.T) {
4384 bp := `
4385 prebuilt_apex {
4386 name: "myapex",
4387 arch: {
4388 arm64: {
4389 src: "myapex-arm64.apex",
4390 },
4391 arm: {
4392 src: "myapex-arm.apex",
4393 },
4394 },
Paul Duffin39853512021-02-26 11:09:39 +00004395 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004396 }
4397
4398 java_import {
4399 name: "libfoo",
4400 jars: ["libfoo.jar"],
4401 }
Paul Duffin39853512021-02-26 11:09:39 +00004402
4403 java_sdk_library_import {
4404 name: "libbar",
4405 public: {
4406 jars: ["libbar.jar"],
4407 },
4408 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004409 `
4410
4411 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4412 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4413
Paul Duffin89886cb2021-02-05 16:44:03 +00004414 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004415
4416 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004417 })
4418
4419 t.Run("prebuilt with source preferred", func(t *testing.T) {
4420
4421 bp := `
4422 prebuilt_apex {
4423 name: "myapex",
4424 arch: {
4425 arm64: {
4426 src: "myapex-arm64.apex",
4427 },
4428 arm: {
4429 src: "myapex-arm.apex",
4430 },
4431 },
Paul Duffin39853512021-02-26 11:09:39 +00004432 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004433 }
4434
4435 java_import {
4436 name: "libfoo",
4437 jars: ["libfoo.jar"],
4438 }
4439
4440 java_library {
4441 name: "libfoo",
4442 }
Paul Duffin39853512021-02-26 11:09:39 +00004443
4444 java_sdk_library_import {
4445 name: "libbar",
4446 public: {
4447 jars: ["libbar.jar"],
4448 },
4449 }
4450
4451 java_sdk_library {
4452 name: "libbar",
4453 srcs: ["foo/bar/MyClass.java"],
4454 unsafe_ignore_missing_latest_api: true,
4455 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004456 `
4457
4458 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4459 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4460
Paul Duffin89886cb2021-02-05 16:44:03 +00004461 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004462 ensureNoSourceVariant(t, ctx, "libfoo")
4463
4464 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4465 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004466 })
4467
4468 t.Run("prebuilt preferred with source", func(t *testing.T) {
4469 bp := `
4470 prebuilt_apex {
4471 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004472 arch: {
4473 arm64: {
4474 src: "myapex-arm64.apex",
4475 },
4476 arm: {
4477 src: "myapex-arm.apex",
4478 },
4479 },
Paul Duffin39853512021-02-26 11:09:39 +00004480 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004481 }
4482
4483 java_import {
4484 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004485 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004486 jars: ["libfoo.jar"],
4487 }
4488
4489 java_library {
4490 name: "libfoo",
4491 }
Paul Duffin39853512021-02-26 11:09:39 +00004492
4493 java_sdk_library_import {
4494 name: "libbar",
4495 prefer: true,
4496 public: {
4497 jars: ["libbar.jar"],
4498 },
4499 }
4500
4501 java_sdk_library {
4502 name: "libbar",
4503 srcs: ["foo/bar/MyClass.java"],
4504 unsafe_ignore_missing_latest_api: true,
4505 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004506 `
4507
4508 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4509 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4510
Paul Duffin89886cb2021-02-05 16:44:03 +00004511 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004512 ensureNoSourceVariant(t, ctx, "libfoo")
4513
4514 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4515 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004516 })
4517}
4518
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004519func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4520 transform := func(config *dexpreopt.GlobalConfig) {
4521 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
4522 }
4523
Paul Duffin89886cb2021-02-05 16:44:03 +00004524 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, bootDexJarPath string) {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004525 s := ctx.SingletonForTests("dex_bootjars")
4526 foundLibfooJar := false
4527 for _, output := range s.AllOutputs() {
4528 if strings.HasSuffix(output, "/libfoo.jar") {
4529 foundLibfooJar = true
4530 buildRule := s.Output(output)
4531 actual := android.NormalizePathForTesting(buildRule.Input)
4532 if actual != bootDexJarPath {
4533 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4534 }
4535 }
4536 }
4537 if !foundLibfooJar {
4538 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4539 }
4540 }
4541
Paul Duffin4fd997b2021-02-03 20:06:33 +00004542 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
4543 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4544 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4545 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4546 }
4547
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004548 t.Run("prebuilt only", func(t *testing.T) {
4549 bp := `
4550 prebuilt_apex {
4551 name: "myapex",
4552 arch: {
4553 arm64: {
4554 src: "myapex-arm64.apex",
4555 },
4556 arm: {
4557 src: "myapex-arm.apex",
4558 },
4559 },
4560 exported_java_libs: ["libfoo"],
4561 }
4562
4563 java_import {
4564 name: "libfoo",
4565 jars: ["libfoo.jar"],
4566 apex_available: ["myapex"],
4567 }
4568 `
4569
4570 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin89886cb2021-02-05 16:44:03 +00004571 checkBootDexJarPath(t, ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004572
Paul Duffin9d67ca62021-02-03 20:06:33 +00004573 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4574 checkHiddenAPIIndexInputs(t, ctx, `
4575.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4576`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004577 })
4578
4579 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4580 bp := `
4581 prebuilt_apex {
4582 name: "myapex",
4583 arch: {
4584 arm64: {
4585 src: "myapex-arm64.apex",
4586 },
4587 arm: {
4588 src: "myapex-arm.apex",
4589 },
4590 },
4591 exported_java_libs: ["libfoo"],
4592 }
4593
4594 java_import {
4595 name: "libfoo",
4596 jars: ["libfoo.jar"],
4597 apex_available: ["myapex"],
4598 }
4599
4600 java_library {
4601 name: "libfoo",
4602 srcs: ["foo/bar/MyClass.java"],
4603 apex_available: ["myapex"],
4604 }
4605 `
4606
4607 // In this test the source (java_library) libfoo is active since the
4608 // prebuilt (java_import) defaults to prefer:false. However the
4609 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4610 // find the dex boot jar in it. We either need to disable the source libfoo
4611 // or make the prebuilt libfoo preferred.
4612 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4613 })
4614
4615 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4616 bp := `
4617 prebuilt_apex {
4618 name: "myapex",
4619 arch: {
4620 arm64: {
4621 src: "myapex-arm64.apex",
4622 },
4623 arm: {
4624 src: "myapex-arm.apex",
4625 },
4626 },
4627 exported_java_libs: ["libfoo"],
4628 }
4629
4630 java_import {
4631 name: "libfoo",
4632 prefer: true,
4633 jars: ["libfoo.jar"],
4634 apex_available: ["myapex"],
4635 }
4636
4637 java_library {
4638 name: "libfoo",
4639 srcs: ["foo/bar/MyClass.java"],
4640 apex_available: ["myapex"],
4641 }
4642 `
4643
4644 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin89886cb2021-02-05 16:44:03 +00004645 checkBootDexJarPath(t, ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004646
Paul Duffin9d67ca62021-02-03 20:06:33 +00004647 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4648 checkHiddenAPIIndexInputs(t, ctx, `
4649.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4650`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004651 })
4652
4653 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4654 bp := `
4655 apex {
4656 name: "myapex",
4657 key: "myapex.key",
4658 java_libs: ["libfoo"],
4659 }
4660
4661 apex_key {
4662 name: "myapex.key",
4663 public_key: "testkey.avbpubkey",
4664 private_key: "testkey.pem",
4665 }
4666
4667 prebuilt_apex {
4668 name: "myapex",
4669 arch: {
4670 arm64: {
4671 src: "myapex-arm64.apex",
4672 },
4673 arm: {
4674 src: "myapex-arm.apex",
4675 },
4676 },
4677 exported_java_libs: ["libfoo"],
4678 }
4679
4680 java_import {
4681 name: "libfoo",
4682 jars: ["libfoo.jar"],
4683 apex_available: ["myapex"],
4684 }
4685
4686 java_library {
4687 name: "libfoo",
4688 srcs: ["foo/bar/MyClass.java"],
4689 apex_available: ["myapex"],
4690 }
4691 `
4692
4693 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffinf38931c2021-02-05 16:58:28 +00004694 checkBootDexJarPath(t, ctx, ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004695
4696 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4697 checkHiddenAPIIndexInputs(t, ctx, `
4698.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4699`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004700 })
4701
4702 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4703 bp := `
4704 apex {
4705 name: "myapex",
4706 enabled: false,
4707 key: "myapex.key",
4708 java_libs: ["libfoo"],
4709 }
4710
4711 apex_key {
4712 name: "myapex.key",
4713 public_key: "testkey.avbpubkey",
4714 private_key: "testkey.pem",
4715 }
4716
4717 prebuilt_apex {
4718 name: "myapex",
4719 arch: {
4720 arm64: {
4721 src: "myapex-arm64.apex",
4722 },
4723 arm: {
4724 src: "myapex-arm.apex",
4725 },
4726 },
4727 exported_java_libs: ["libfoo"],
4728 }
4729
4730 java_import {
4731 name: "libfoo",
4732 prefer: true,
4733 jars: ["libfoo.jar"],
4734 apex_available: ["myapex"],
4735 }
4736
4737 java_library {
4738 name: "libfoo",
4739 srcs: ["foo/bar/MyClass.java"],
4740 apex_available: ["myapex"],
4741 }
4742 `
4743
4744 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin89886cb2021-02-05 16:44:03 +00004745 checkBootDexJarPath(t, ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004746
Paul Duffin9d67ca62021-02-03 20:06:33 +00004747 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4748 checkHiddenAPIIndexInputs(t, ctx, `
4749.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4750`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004751 })
4752}
4753
Roland Levillain630846d2019-06-26 12:48:34 +01004754func TestApexWithTests(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004755 ctx, _ := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004756 apex_test {
4757 name: "myapex",
4758 key: "myapex.key",
4759 tests: [
4760 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004761 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004762 ],
4763 }
4764
4765 apex_key {
4766 name: "myapex.key",
4767 public_key: "testkey.avbpubkey",
4768 private_key: "testkey.pem",
4769 }
4770
Liz Kammer1c14a212020-05-12 15:26:55 -07004771 filegroup {
4772 name: "fg",
4773 srcs: [
4774 "baz",
4775 "bar/baz"
4776 ],
4777 }
4778
Roland Levillain630846d2019-06-26 12:48:34 +01004779 cc_test {
4780 name: "mytest",
4781 gtest: false,
4782 srcs: ["mytest.cpp"],
4783 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004784 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004785 system_shared_libs: [],
4786 static_executable: true,
4787 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004788 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004789 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004790
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004791 cc_library {
4792 name: "mylib",
4793 srcs: ["mylib.cpp"],
4794 system_shared_libs: [],
4795 stl: "none",
4796 }
4797
Liz Kammer5bd365f2020-05-27 15:15:11 -07004798 filegroup {
4799 name: "fg2",
4800 srcs: [
4801 "testdata/baz"
4802 ],
4803 }
4804
Roland Levillain9b5fde92019-06-28 15:41:19 +01004805 cc_test {
4806 name: "mytests",
4807 gtest: false,
4808 srcs: [
4809 "mytest1.cpp",
4810 "mytest2.cpp",
4811 "mytest3.cpp",
4812 ],
4813 test_per_src: true,
4814 relative_install_path: "test",
4815 system_shared_libs: [],
4816 static_executable: true,
4817 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004818 data: [
4819 ":fg",
4820 ":fg2",
4821 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004822 }
Roland Levillain630846d2019-06-26 12:48:34 +01004823 `)
4824
Sundong Ahnabb64432019-10-22 13:58:29 +09004825 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004826 copyCmds := apexRule.Args["copy_commands"]
4827
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004828 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004829 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004830 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004831
Liz Kammer1c14a212020-05-12 15:26:55 -07004832 //Ensure that test data are copied into apex.
4833 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4834 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4835
Roland Levillain9b5fde92019-06-28 15:41:19 +01004836 // Ensure that test deps built with `test_per_src` are copied into apex.
4837 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4838 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4839 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004840
4841 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004842 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004843 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004844 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004845 prefix := "TARGET_"
4846 var builder strings.Builder
4847 data.Custom(&builder, name, prefix, "", data)
4848 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004849 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4850 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4851 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4852 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004853 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004854 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004855 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004856
4857 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004858 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004859 data.Custom(&builder, name, prefix, "", data)
4860 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004861 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4862 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004863}
4864
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004865func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004866 ctx, _ := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004867 apex {
4868 name: "myapex",
4869 key: "myapex.key",
4870 }
4871 apex_key {
4872 name: "myapex.key",
4873 public_key: "testkey.avbpubkey",
4874 private_key: "testkey.pem",
4875 }
4876 `, func(fs map[string][]byte, config android.Config) {
4877 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4878 })
4879 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004880 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004881 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004882 var builder strings.Builder
4883 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4884 androidMk := builder.String()
4885 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4886}
4887
Jooyung Hand48f3c32019-08-23 11:18:57 +09004888func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4889 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4890 apex {
4891 name: "myapex",
4892 key: "myapex.key",
4893 native_shared_libs: ["libfoo"],
4894 }
4895
4896 apex_key {
4897 name: "myapex.key",
4898 public_key: "testkey.avbpubkey",
4899 private_key: "testkey.pem",
4900 }
4901
4902 cc_library {
4903 name: "libfoo",
4904 stl: "none",
4905 system_shared_libs: [],
4906 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004907 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004908 }
4909 `)
4910 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4911 apex {
4912 name: "myapex",
4913 key: "myapex.key",
4914 java_libs: ["myjar"],
4915 }
4916
4917 apex_key {
4918 name: "myapex.key",
4919 public_key: "testkey.avbpubkey",
4920 private_key: "testkey.pem",
4921 }
4922
4923 java_library {
4924 name: "myjar",
4925 srcs: ["foo/bar/MyClass.java"],
4926 sdk_version: "none",
4927 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004928 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004929 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004930 }
4931 `)
4932}
4933
Bill Peckhama41a6962021-01-11 10:58:54 -08004934func TestApexWithJavaImport(t *testing.T) {
4935 ctx, _ := testApex(t, `
4936 apex {
4937 name: "myapex",
4938 key: "myapex.key",
4939 java_libs: ["myjavaimport"],
4940 }
4941
4942 apex_key {
4943 name: "myapex.key",
4944 public_key: "testkey.avbpubkey",
4945 private_key: "testkey.pem",
4946 }
4947
4948 java_import {
4949 name: "myjavaimport",
4950 apex_available: ["myapex"],
4951 jars: ["my.jar"],
4952 compile_dex: true,
4953 }
4954 `)
4955
4956 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4957 apexRule := module.Rule("apexRule")
4958 copyCmds := apexRule.Args["copy_commands"]
4959 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
4960}
4961
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004962func TestApexWithApps(t *testing.T) {
4963 ctx, _ := testApex(t, `
4964 apex {
4965 name: "myapex",
4966 key: "myapex.key",
4967 apps: [
4968 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004969 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004970 ],
4971 }
4972
4973 apex_key {
4974 name: "myapex.key",
4975 public_key: "testkey.avbpubkey",
4976 private_key: "testkey.pem",
4977 }
4978
4979 android_app {
4980 name: "AppFoo",
4981 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004982 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004983 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004984 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004986 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004987 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004988
4989 android_app {
4990 name: "AppFooPriv",
4991 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004992 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004993 system_modules: "none",
4994 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004996 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004997 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004998
4999 cc_library_shared {
5000 name: "libjni",
5001 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005002 shared_libs: ["libfoo"],
5003 stl: "none",
5004 system_shared_libs: [],
5005 apex_available: [ "myapex" ],
5006 sdk_version: "current",
5007 }
5008
5009 cc_library_shared {
5010 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005011 stl: "none",
5012 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005013 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005014 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005015 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005016 `)
5017
Sundong Ahnabb64432019-10-22 13:58:29 +09005018 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005019 apexRule := module.Rule("apexRule")
5020 copyCmds := apexRule.Args["copy_commands"]
5021
5022 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005023 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005024
Colin Crossaede88c2020-08-11 12:17:01 -07005025 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005026 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005027 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005028 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005029 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005030 // JNI libraries including transitive deps are
5031 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005032 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005033 // ... embedded inside APK (jnilibs.zip)
5034 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5035 // ... and not directly inside the APEX
5036 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5037 }
Dario Frenicde2a032019-10-27 00:29:22 +01005038}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005039
Dario Frenicde2a032019-10-27 00:29:22 +01005040func TestApexWithAppImports(t *testing.T) {
5041 ctx, _ := testApex(t, `
5042 apex {
5043 name: "myapex",
5044 key: "myapex.key",
5045 apps: [
5046 "AppFooPrebuilt",
5047 "AppFooPrivPrebuilt",
5048 ],
5049 }
5050
5051 apex_key {
5052 name: "myapex.key",
5053 public_key: "testkey.avbpubkey",
5054 private_key: "testkey.pem",
5055 }
5056
5057 android_app_import {
5058 name: "AppFooPrebuilt",
5059 apk: "PrebuiltAppFoo.apk",
5060 presigned: true,
5061 dex_preopt: {
5062 enabled: false,
5063 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005064 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005065 }
5066
5067 android_app_import {
5068 name: "AppFooPrivPrebuilt",
5069 apk: "PrebuiltAppFooPriv.apk",
5070 privileged: true,
5071 presigned: true,
5072 dex_preopt: {
5073 enabled: false,
5074 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005075 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005076 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005077 }
5078 `)
5079
Sundong Ahnabb64432019-10-22 13:58:29 +09005080 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005081 apexRule := module.Rule("apexRule")
5082 copyCmds := apexRule.Args["copy_commands"]
5083
5084 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005085 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5086}
5087
5088func TestApexWithAppImportsPrefer(t *testing.T) {
5089 ctx, _ := testApex(t, `
5090 apex {
5091 name: "myapex",
5092 key: "myapex.key",
5093 apps: [
5094 "AppFoo",
5095 ],
5096 }
5097
5098 apex_key {
5099 name: "myapex.key",
5100 public_key: "testkey.avbpubkey",
5101 private_key: "testkey.pem",
5102 }
5103
5104 android_app {
5105 name: "AppFoo",
5106 srcs: ["foo/bar/MyClass.java"],
5107 sdk_version: "none",
5108 system_modules: "none",
5109 apex_available: [ "myapex" ],
5110 }
5111
5112 android_app_import {
5113 name: "AppFoo",
5114 apk: "AppFooPrebuilt.apk",
5115 filename: "AppFooPrebuilt.apk",
5116 presigned: true,
5117 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005118 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005119 }
5120 `, withFiles(map[string][]byte{
5121 "AppFooPrebuilt.apk": nil,
5122 }))
5123
5124 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5125 "app/AppFoo/AppFooPrebuilt.apk",
5126 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005127}
5128
Dario Freni6f3937c2019-12-20 22:58:03 +00005129func TestApexWithTestHelperApp(t *testing.T) {
5130 ctx, _ := testApex(t, `
5131 apex {
5132 name: "myapex",
5133 key: "myapex.key",
5134 apps: [
5135 "TesterHelpAppFoo",
5136 ],
5137 }
5138
5139 apex_key {
5140 name: "myapex.key",
5141 public_key: "testkey.avbpubkey",
5142 private_key: "testkey.pem",
5143 }
5144
5145 android_test_helper_app {
5146 name: "TesterHelpAppFoo",
5147 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005148 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005149 }
5150
5151 `)
5152
5153 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5154 apexRule := module.Rule("apexRule")
5155 copyCmds := apexRule.Args["copy_commands"]
5156
5157 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5158}
5159
Jooyung Han18020ea2019-11-13 10:50:48 +09005160func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5161 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005162 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005163 apex {
5164 name: "myapex",
5165 key: "myapex.key",
5166 native_shared_libs: ["libfoo"],
5167 }
5168
5169 apex_key {
5170 name: "myapex.key",
5171 public_key: "testkey.avbpubkey",
5172 private_key: "testkey.pem",
5173 }
5174
5175 apex {
5176 name: "otherapex",
5177 key: "myapex.key",
5178 native_shared_libs: ["libfoo"],
5179 }
5180
5181 cc_defaults {
5182 name: "libfoo-defaults",
5183 apex_available: ["otherapex"],
5184 }
5185
5186 cc_library {
5187 name: "libfoo",
5188 defaults: ["libfoo-defaults"],
5189 stl: "none",
5190 system_shared_libs: [],
5191 }`)
5192}
5193
Paul Duffine52e66f2020-03-30 17:54:29 +01005194func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005195 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005196 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005197 apex {
5198 name: "myapex",
5199 key: "myapex.key",
5200 native_shared_libs: ["libfoo"],
5201 }
5202
5203 apex_key {
5204 name: "myapex.key",
5205 public_key: "testkey.avbpubkey",
5206 private_key: "testkey.pem",
5207 }
5208
5209 apex {
5210 name: "otherapex",
5211 key: "otherapex.key",
5212 native_shared_libs: ["libfoo"],
5213 }
5214
5215 apex_key {
5216 name: "otherapex.key",
5217 public_key: "testkey.avbpubkey",
5218 private_key: "testkey.pem",
5219 }
5220
5221 cc_library {
5222 name: "libfoo",
5223 stl: "none",
5224 system_shared_libs: [],
5225 apex_available: ["otherapex"],
5226 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005227}
Jiyong Park127b40b2019-09-30 16:04:35 +09005228
Paul Duffine52e66f2020-03-30 17:54:29 +01005229func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005230 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00005231 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005232.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005233.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005234.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005235.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005236.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005237.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005238 apex {
5239 name: "myapex",
5240 key: "myapex.key",
5241 native_shared_libs: ["libfoo"],
5242 }
5243
5244 apex_key {
5245 name: "myapex.key",
5246 public_key: "testkey.avbpubkey",
5247 private_key: "testkey.pem",
5248 }
5249
Jiyong Park127b40b2019-09-30 16:04:35 +09005250 cc_library {
5251 name: "libfoo",
5252 stl: "none",
5253 shared_libs: ["libbar"],
5254 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005255 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005256 }
5257
5258 cc_library {
5259 name: "libbar",
5260 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005261 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005262 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005263 apex_available: ["myapex"],
5264 }
5265
5266 cc_library {
5267 name: "libbaz",
5268 stl: "none",
5269 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005270 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005271}
Jiyong Park127b40b2019-09-30 16:04:35 +09005272
Paul Duffine52e66f2020-03-30 17:54:29 +01005273func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005274 testApexError(t, "\"otherapex\" is not a valid module name", `
5275 apex {
5276 name: "myapex",
5277 key: "myapex.key",
5278 native_shared_libs: ["libfoo"],
5279 }
5280
5281 apex_key {
5282 name: "myapex.key",
5283 public_key: "testkey.avbpubkey",
5284 private_key: "testkey.pem",
5285 }
5286
5287 cc_library {
5288 name: "libfoo",
5289 stl: "none",
5290 system_shared_libs: [],
5291 apex_available: ["otherapex"],
5292 }`)
5293
Paul Duffine52e66f2020-03-30 17:54:29 +01005294 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005295 apex {
5296 name: "myapex",
5297 key: "myapex.key",
5298 native_shared_libs: ["libfoo", "libbar"],
5299 }
5300
5301 apex_key {
5302 name: "myapex.key",
5303 public_key: "testkey.avbpubkey",
5304 private_key: "testkey.pem",
5305 }
5306
5307 cc_library {
5308 name: "libfoo",
5309 stl: "none",
5310 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005311 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005312 apex_available: ["myapex"],
5313 }
5314
5315 cc_library {
5316 name: "libbar",
5317 stl: "none",
5318 system_shared_libs: [],
5319 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005320 }
5321
5322 cc_library {
5323 name: "libbaz",
5324 stl: "none",
5325 system_shared_libs: [],
5326 stubs: {
5327 versions: ["10", "20", "30"],
5328 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005329 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005330}
Jiyong Park127b40b2019-09-30 16:04:35 +09005331
Jiyong Park89e850a2020-04-07 16:37:39 +09005332func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01005333 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005334 apex {
5335 name: "myapex",
5336 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005337 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005338 }
5339
5340 apex_key {
5341 name: "myapex.key",
5342 public_key: "testkey.avbpubkey",
5343 private_key: "testkey.pem",
5344 }
5345
5346 cc_library {
5347 name: "libfoo",
5348 stl: "none",
5349 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005350 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005351 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005352 }
5353
5354 cc_library {
5355 name: "libfoo2",
5356 stl: "none",
5357 system_shared_libs: [],
5358 shared_libs: ["libbaz"],
5359 apex_available: ["//apex_available:platform"],
5360 }
5361
5362 cc_library {
5363 name: "libbar",
5364 stl: "none",
5365 system_shared_libs: [],
5366 apex_available: ["myapex"],
5367 }
5368
5369 cc_library {
5370 name: "libbaz",
5371 stl: "none",
5372 system_shared_libs: [],
5373 apex_available: ["myapex"],
5374 stubs: {
5375 versions: ["1"],
5376 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005377 }`)
5378
Jiyong Park89e850a2020-04-07 16:37:39 +09005379 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5380 // because it depends on libbar which isn't available to platform
5381 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5382 if libfoo.NotAvailableForPlatform() != true {
5383 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5384 }
5385
5386 // libfoo2 however can be available to platform because it depends on libbaz which provides
5387 // stubs
5388 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5389 if libfoo2.NotAvailableForPlatform() == true {
5390 t.Errorf("%q should be available to platform", libfoo2.String())
5391 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005392}
Jiyong Parka90ca002019-10-07 15:47:24 +09005393
Paul Duffine52e66f2020-03-30 17:54:29 +01005394func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09005395 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005396 apex {
5397 name: "myapex",
5398 key: "myapex.key",
5399 native_shared_libs: ["libfoo"],
5400 }
5401
5402 apex_key {
5403 name: "myapex.key",
5404 public_key: "testkey.avbpubkey",
5405 private_key: "testkey.pem",
5406 }
5407
5408 cc_library {
5409 name: "libfoo",
5410 stl: "none",
5411 system_shared_libs: [],
5412 apex_available: ["myapex"],
5413 static: {
5414 apex_available: ["//apex_available:platform"],
5415 },
5416 }`)
5417
Jiyong Park89e850a2020-04-07 16:37:39 +09005418 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5419 if libfooShared.NotAvailableForPlatform() != true {
5420 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5421 }
5422 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5423 if libfooStatic.NotAvailableForPlatform() != false {
5424 t.Errorf("%q should be available to platform", libfooStatic.String())
5425 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005426}
5427
Jiyong Park5d790c32019-11-15 18:40:32 +09005428func TestOverrideApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005429 ctx, _ := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005430 apex {
5431 name: "myapex",
5432 key: "myapex.key",
5433 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005434 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09005435 }
5436
5437 override_apex {
5438 name: "override_myapex",
5439 base: "myapex",
5440 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005441 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005442 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005443 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005444 }
5445
5446 apex_key {
5447 name: "myapex.key",
5448 public_key: "testkey.avbpubkey",
5449 private_key: "testkey.pem",
5450 }
5451
5452 android_app {
5453 name: "app",
5454 srcs: ["foo/bar/MyClass.java"],
5455 package_name: "foo",
5456 sdk_version: "none",
5457 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005458 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005459 }
5460
5461 override_android_app {
5462 name: "override_app",
5463 base: "app",
5464 package_name: "bar",
5465 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005466 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005467
Jiyong Park317645e2019-12-05 13:20:58 +09005468 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5469 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5470 if originalVariant.GetOverriddenBy() != "" {
5471 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5472 }
5473 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5474 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5475 }
5476
Jiyong Park5d790c32019-11-15 18:40:32 +09005477 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5478 apexRule := module.Rule("apexRule")
5479 copyCmds := apexRule.Args["copy_commands"]
5480
5481 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005482 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005483
5484 apexBundle := module.Module().(*apexBundle)
5485 name := apexBundle.Name()
5486 if name != "override_myapex" {
5487 t.Errorf("name should be \"override_myapex\", but was %q", name)
5488 }
5489
Baligh Uddin004d7172020-02-19 21:29:28 -08005490 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5491 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5492 }
5493
Jiyong Park20bacab2020-03-03 11:45:41 +09005494 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005495 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005496
Colin Crossaa255532020-07-03 13:18:24 -07005497 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005498 var builder strings.Builder
5499 data.Custom(&builder, name, "TARGET_", "", data)
5500 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005501 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005502 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5503 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005504 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005505 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005506 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005507 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5508 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005509}
5510
Jooyung Han214bf372019-11-12 13:03:50 +09005511func TestLegacyAndroid10Support(t *testing.T) {
5512 ctx, _ := testApex(t, `
5513 apex {
5514 name: "myapex",
5515 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005516 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005517 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005518 }
5519
5520 apex_key {
5521 name: "myapex.key",
5522 public_key: "testkey.avbpubkey",
5523 private_key: "testkey.pem",
5524 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005525
5526 cc_library {
5527 name: "mylib",
5528 srcs: ["mylib.cpp"],
5529 stl: "libc++",
5530 system_shared_libs: [],
5531 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005532 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005533 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005534 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005535
5536 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5537 args := module.Rule("apexRule").Args
5538 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005539 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005540
5541 // The copies of the libraries in the apex should have one more dependency than
5542 // the ones outside the apex, namely the unwinder. Ideally we should check
5543 // the dependency names directly here but for some reason the names are blank in
5544 // this test.
5545 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005546 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005547 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5548 if len(apexImplicits) != len(nonApexImplicits)+1 {
5549 t.Errorf("%q missing unwinder dep", lib)
5550 }
5551 }
Jooyung Han214bf372019-11-12 13:03:50 +09005552}
5553
Paul Duffin9b879592020-05-26 13:21:35 +01005554var filesForSdkLibrary = map[string][]byte{
5555 "api/current.txt": nil,
5556 "api/removed.txt": nil,
5557 "api/system-current.txt": nil,
5558 "api/system-removed.txt": nil,
5559 "api/test-current.txt": nil,
5560 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005561
Anton Hanssondff2c782020-12-21 17:10:01 +00005562 "100/public/api/foo.txt": nil,
5563 "100/public/api/foo-removed.txt": nil,
5564 "100/system/api/foo.txt": nil,
5565 "100/system/api/foo-removed.txt": nil,
5566
Paul Duffineedc5d52020-06-12 17:46:39 +01005567 // For java_sdk_library_import
5568 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005569}
5570
Jooyung Han58f26ab2019-12-18 15:34:32 +09005571func TestJavaSDKLibrary(t *testing.T) {
5572 ctx, _ := testApex(t, `
5573 apex {
5574 name: "myapex",
5575 key: "myapex.key",
5576 java_libs: ["foo"],
5577 }
5578
5579 apex_key {
5580 name: "myapex.key",
5581 public_key: "testkey.avbpubkey",
5582 private_key: "testkey.pem",
5583 }
5584
5585 java_sdk_library {
5586 name: "foo",
5587 srcs: ["a.java"],
5588 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005589 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005590 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005591
5592 prebuilt_apis {
5593 name: "sdk",
5594 api_dirs: ["100"],
5595 }
Paul Duffin9b879592020-05-26 13:21:35 +01005596 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005597
5598 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005599 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005600 "javalib/foo.jar",
5601 "etc/permissions/foo.xml",
5602 })
5603 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005604 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5605 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005606}
5607
Paul Duffin9b879592020-05-26 13:21:35 +01005608func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5609 ctx, _ := testApex(t, `
5610 apex {
5611 name: "myapex",
5612 key: "myapex.key",
5613 java_libs: ["foo", "bar"],
5614 }
5615
5616 apex_key {
5617 name: "myapex.key",
5618 public_key: "testkey.avbpubkey",
5619 private_key: "testkey.pem",
5620 }
5621
5622 java_sdk_library {
5623 name: "foo",
5624 srcs: ["a.java"],
5625 api_packages: ["foo"],
5626 apex_available: ["myapex"],
5627 sdk_version: "none",
5628 system_modules: "none",
5629 }
5630
5631 java_library {
5632 name: "bar",
5633 srcs: ["a.java"],
5634 libs: ["foo"],
5635 apex_available: ["myapex"],
5636 sdk_version: "none",
5637 system_modules: "none",
5638 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005639
5640 prebuilt_apis {
5641 name: "sdk",
5642 api_dirs: ["100"],
5643 }
Paul Duffin9b879592020-05-26 13:21:35 +01005644 `, withFiles(filesForSdkLibrary))
5645
5646 // java_sdk_library installs both impl jar and permission XML
5647 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5648 "javalib/bar.jar",
5649 "javalib/foo.jar",
5650 "etc/permissions/foo.xml",
5651 })
5652
5653 // The bar library should depend on the implementation jar.
5654 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5655 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5656 t.Errorf("expected %q, found %#q", expected, actual)
5657 }
5658}
5659
5660func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5661 ctx, _ := testApex(t, `
5662 apex {
5663 name: "myapex",
5664 key: "myapex.key",
5665 java_libs: ["foo"],
5666 }
5667
5668 apex_key {
5669 name: "myapex.key",
5670 public_key: "testkey.avbpubkey",
5671 private_key: "testkey.pem",
5672 }
5673
5674 java_sdk_library {
5675 name: "foo",
5676 srcs: ["a.java"],
5677 api_packages: ["foo"],
5678 apex_available: ["myapex"],
5679 sdk_version: "none",
5680 system_modules: "none",
5681 }
5682
5683 java_library {
5684 name: "bar",
5685 srcs: ["a.java"],
5686 libs: ["foo"],
5687 sdk_version: "none",
5688 system_modules: "none",
5689 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005690
5691 prebuilt_apis {
5692 name: "sdk",
5693 api_dirs: ["100"],
5694 }
Paul Duffin9b879592020-05-26 13:21:35 +01005695 `, withFiles(filesForSdkLibrary))
5696
5697 // java_sdk_library installs both impl jar and permission XML
5698 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5699 "javalib/foo.jar",
5700 "etc/permissions/foo.xml",
5701 })
5702
5703 // The bar library should depend on the stubs jar.
5704 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5705 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5706 t.Errorf("expected %q, found %#q", expected, actual)
5707 }
5708}
5709
Paul Duffineedc5d52020-06-12 17:46:39 +01005710func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005711 ctx, _ := testApex(t, `
5712 prebuilt_apis {
5713 name: "sdk",
5714 api_dirs: ["100"],
5715 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005716 withFiles(map[string][]byte{
5717 "apex/a.java": nil,
5718 "apex/apex_manifest.json": nil,
5719 "apex/Android.bp": []byte(`
5720 package {
5721 default_visibility: ["//visibility:private"],
5722 }
5723
5724 apex {
5725 name: "myapex",
5726 key: "myapex.key",
5727 java_libs: ["foo", "bar"],
5728 }
5729
5730 apex_key {
5731 name: "myapex.key",
5732 public_key: "testkey.avbpubkey",
5733 private_key: "testkey.pem",
5734 }
5735
5736 java_library {
5737 name: "bar",
5738 srcs: ["a.java"],
5739 libs: ["foo"],
5740 apex_available: ["myapex"],
5741 sdk_version: "none",
5742 system_modules: "none",
5743 }
5744`),
5745 "source/a.java": nil,
5746 "source/api/current.txt": nil,
5747 "source/api/removed.txt": nil,
5748 "source/Android.bp": []byte(`
5749 package {
5750 default_visibility: ["//visibility:private"],
5751 }
5752
5753 java_sdk_library {
5754 name: "foo",
5755 visibility: ["//apex"],
5756 srcs: ["a.java"],
5757 api_packages: ["foo"],
5758 apex_available: ["myapex"],
5759 sdk_version: "none",
5760 system_modules: "none",
5761 public: {
5762 enabled: true,
5763 },
5764 }
5765`),
5766 "prebuilt/a.jar": nil,
5767 "prebuilt/Android.bp": []byte(`
5768 package {
5769 default_visibility: ["//visibility:private"],
5770 }
5771
5772 java_sdk_library_import {
5773 name: "foo",
5774 visibility: ["//apex", "//source"],
5775 apex_available: ["myapex"],
5776 prefer: true,
5777 public: {
5778 jars: ["a.jar"],
5779 },
5780 }
5781`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005782 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005783 )
5784
5785 // java_sdk_library installs both impl jar and permission XML
5786 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5787 "javalib/bar.jar",
5788 "javalib/foo.jar",
5789 "etc/permissions/foo.xml",
5790 })
5791
5792 // The bar library should depend on the implementation jar.
5793 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5794 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5795 t.Errorf("expected %q, found %#q", expected, actual)
5796 }
5797}
5798
5799func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5800 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5801 apex {
5802 name: "myapex",
5803 key: "myapex.key",
5804 java_libs: ["foo"],
5805 }
5806
5807 apex_key {
5808 name: "myapex.key",
5809 public_key: "testkey.avbpubkey",
5810 private_key: "testkey.pem",
5811 }
5812
5813 java_sdk_library_import {
5814 name: "foo",
5815 apex_available: ["myapex"],
5816 prefer: true,
5817 public: {
5818 jars: ["a.jar"],
5819 },
5820 }
5821
5822 `, withFiles(filesForSdkLibrary))
5823}
5824
atrost6e126252020-01-27 17:01:16 +00005825func TestCompatConfig(t *testing.T) {
5826 ctx, _ := testApex(t, `
5827 apex {
5828 name: "myapex",
5829 key: "myapex.key",
5830 prebuilts: ["myjar-platform-compat-config"],
5831 java_libs: ["myjar"],
5832 }
5833
5834 apex_key {
5835 name: "myapex.key",
5836 public_key: "testkey.avbpubkey",
5837 private_key: "testkey.pem",
5838 }
5839
5840 platform_compat_config {
5841 name: "myjar-platform-compat-config",
5842 src: ":myjar",
5843 }
5844
5845 java_library {
5846 name: "myjar",
5847 srcs: ["foo/bar/MyClass.java"],
5848 sdk_version: "none",
5849 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005850 apex_available: [ "myapex" ],
5851 }
5852 `)
5853 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5854 "etc/compatconfig/myjar-platform-compat-config.xml",
5855 "javalib/myjar.jar",
5856 })
5857}
5858
Jiyong Park479321d2019-12-16 11:47:12 +09005859func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5860 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5861 apex {
5862 name: "myapex",
5863 key: "myapex.key",
5864 java_libs: ["myjar"],
5865 }
5866
5867 apex_key {
5868 name: "myapex.key",
5869 public_key: "testkey.avbpubkey",
5870 private_key: "testkey.pem",
5871 }
5872
5873 java_library {
5874 name: "myjar",
5875 srcs: ["foo/bar/MyClass.java"],
5876 sdk_version: "none",
5877 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005878 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005879 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005880 }
5881 `)
5882}
5883
Jiyong Park7afd1072019-12-30 16:56:33 +09005884func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005885 ctx, _ := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005886 apex {
5887 name: "myapex",
5888 key: "myapex.key",
5889 native_shared_libs: ["mylib"],
5890 }
5891
5892 apex_key {
5893 name: "myapex.key",
5894 public_key: "testkey.avbpubkey",
5895 private_key: "testkey.pem",
5896 }
5897
5898 cc_library {
5899 name: "mylib",
5900 srcs: ["mylib.cpp"],
5901 system_shared_libs: [],
5902 stl: "none",
5903 required: ["a", "b"],
5904 host_required: ["c", "d"],
5905 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005906 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005907 }
5908 `)
5909
5910 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005911 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09005912 name := apexBundle.BaseModuleName()
5913 prefix := "TARGET_"
5914 var builder strings.Builder
5915 data.Custom(&builder, name, prefix, "", data)
5916 androidMk := builder.String()
5917 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5918 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5919 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5920}
5921
Jiyong Park7cd10e32020-01-14 09:22:18 +09005922func TestSymlinksFromApexToSystem(t *testing.T) {
5923 bp := `
5924 apex {
5925 name: "myapex",
5926 key: "myapex.key",
5927 native_shared_libs: ["mylib"],
5928 java_libs: ["myjar"],
5929 }
5930
Jiyong Park9d677202020-02-19 16:29:35 +09005931 apex {
5932 name: "myapex.updatable",
5933 key: "myapex.key",
5934 native_shared_libs: ["mylib"],
5935 java_libs: ["myjar"],
5936 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005937 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005938 }
5939
Jiyong Park7cd10e32020-01-14 09:22:18 +09005940 apex_key {
5941 name: "myapex.key",
5942 public_key: "testkey.avbpubkey",
5943 private_key: "testkey.pem",
5944 }
5945
5946 cc_library {
5947 name: "mylib",
5948 srcs: ["mylib.cpp"],
5949 shared_libs: ["myotherlib"],
5950 system_shared_libs: [],
5951 stl: "none",
5952 apex_available: [
5953 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005954 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005955 "//apex_available:platform",
5956 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005957 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005958 }
5959
5960 cc_library {
5961 name: "myotherlib",
5962 srcs: ["mylib.cpp"],
5963 system_shared_libs: [],
5964 stl: "none",
5965 apex_available: [
5966 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005967 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005968 "//apex_available:platform",
5969 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005970 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005971 }
5972
5973 java_library {
5974 name: "myjar",
5975 srcs: ["foo/bar/MyClass.java"],
5976 sdk_version: "none",
5977 system_modules: "none",
5978 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005979 apex_available: [
5980 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005981 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005982 "//apex_available:platform",
5983 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005984 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005985 }
5986
5987 java_library {
5988 name: "myotherjar",
5989 srcs: ["foo/bar/MyClass.java"],
5990 sdk_version: "none",
5991 system_modules: "none",
5992 apex_available: [
5993 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005994 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005995 "//apex_available:platform",
5996 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005997 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005998 }
5999 `
6000
6001 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6002 for _, f := range files {
6003 if f.path == file {
6004 if f.isLink {
6005 t.Errorf("%q is not a real file", file)
6006 }
6007 return
6008 }
6009 }
6010 t.Errorf("%q is not found", file)
6011 }
6012
6013 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6014 for _, f := range files {
6015 if f.path == file {
6016 if !f.isLink {
6017 t.Errorf("%q is not a symlink", file)
6018 }
6019 return
6020 }
6021 }
6022 t.Errorf("%q is not found", file)
6023 }
6024
Jiyong Park9d677202020-02-19 16:29:35 +09006025 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6026 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09006027 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006028 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006029 ensureRealfileExists(t, files, "javalib/myjar.jar")
6030 ensureRealfileExists(t, files, "lib64/mylib.so")
6031 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6032
Jiyong Park9d677202020-02-19 16:29:35 +09006033 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6034 ensureRealfileExists(t, files, "javalib/myjar.jar")
6035 ensureRealfileExists(t, files, "lib64/mylib.so")
6036 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6037
6038 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09006039 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006040 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006041 ensureRealfileExists(t, files, "javalib/myjar.jar")
6042 ensureRealfileExists(t, files, "lib64/mylib.so")
6043 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006044
6045 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6046 ensureRealfileExists(t, files, "javalib/myjar.jar")
6047 ensureRealfileExists(t, files, "lib64/mylib.so")
6048 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006049}
6050
Yo Chiange8128052020-07-23 20:09:18 +08006051func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006052 ctx, _ := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006053 apex {
6054 name: "myapex",
6055 key: "myapex.key",
6056 native_shared_libs: ["mylib"],
6057 }
6058
6059 apex_key {
6060 name: "myapex.key",
6061 public_key: "testkey.avbpubkey",
6062 private_key: "testkey.pem",
6063 }
6064
6065 cc_library_shared {
6066 name: "mylib",
6067 srcs: ["mylib.cpp"],
6068 shared_libs: ["myotherlib"],
6069 system_shared_libs: [],
6070 stl: "none",
6071 apex_available: [
6072 "myapex",
6073 "//apex_available:platform",
6074 ],
6075 }
6076
6077 cc_prebuilt_library_shared {
6078 name: "myotherlib",
6079 srcs: ["prebuilt.so"],
6080 system_shared_libs: [],
6081 stl: "none",
6082 apex_available: [
6083 "myapex",
6084 "//apex_available:platform",
6085 ],
6086 }
6087 `)
6088
6089 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006090 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006091 var builder strings.Builder
6092 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6093 androidMk := builder.String()
6094 // `myotherlib` is added to `myapex` as symlink
6095 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6096 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6097 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6098 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006099 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08006100}
6101
Jooyung Han643adc42020-02-27 13:50:06 +09006102func TestApexWithJniLibs(t *testing.T) {
6103 ctx, _ := testApex(t, `
6104 apex {
6105 name: "myapex",
6106 key: "myapex.key",
6107 jni_libs: ["mylib"],
6108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
6116 cc_library {
6117 name: "mylib",
6118 srcs: ["mylib.cpp"],
6119 shared_libs: ["mylib2"],
6120 system_shared_libs: [],
6121 stl: "none",
6122 apex_available: [ "myapex" ],
6123 }
6124
6125 cc_library {
6126 name: "mylib2",
6127 srcs: ["mylib.cpp"],
6128 system_shared_libs: [],
6129 stl: "none",
6130 apex_available: [ "myapex" ],
6131 }
6132 `)
6133
6134 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6135 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6136 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6137 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6138 "lib64/mylib.so",
6139 "lib64/mylib2.so",
6140 })
6141}
6142
Jooyung Han49f67012020-04-17 13:43:10 +09006143func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
6144 ctx, _ := testApex(t, `
6145 apex {
6146 name: "myapex",
6147 key: "myapex.key",
6148 }
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154 `, func(fs map[string][]byte, config android.Config) {
6155 delete(config.Targets, android.Android)
6156 config.AndroidCommonTarget = android.Target{}
6157 })
6158
6159 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6160 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6161 }
6162}
6163
Jiyong Parkbd159612020-02-28 15:22:21 +09006164func TestAppBundle(t *testing.T) {
6165 ctx, _ := testApex(t, `
6166 apex {
6167 name: "myapex",
6168 key: "myapex.key",
6169 apps: ["AppFoo"],
6170 }
6171
6172 apex_key {
6173 name: "myapex.key",
6174 public_key: "testkey.avbpubkey",
6175 private_key: "testkey.pem",
6176 }
6177
6178 android_app {
6179 name: "AppFoo",
6180 srcs: ["foo/bar/MyClass.java"],
6181 sdk_version: "none",
6182 system_modules: "none",
6183 apex_available: [ "myapex" ],
6184 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006185 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006186
Colin Crosscf371cc2020-11-13 11:48:42 -08006187 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006188 content := bundleConfigRule.Args["content"]
6189
6190 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006191 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 +09006192}
6193
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006194func TestAppSetBundle(t *testing.T) {
6195 ctx, _ := testApex(t, `
6196 apex {
6197 name: "myapex",
6198 key: "myapex.key",
6199 apps: ["AppSet"],
6200 }
6201
6202 apex_key {
6203 name: "myapex.key",
6204 public_key: "testkey.avbpubkey",
6205 private_key: "testkey.pem",
6206 }
6207
6208 android_app_set {
6209 name: "AppSet",
6210 set: "AppSet.apks",
6211 }`)
6212 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006213 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006214 content := bundleConfigRule.Args["content"]
6215 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6216 s := mod.Rule("apexRule").Args["copy_commands"]
6217 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6218 if len(copyCmds) != 3 {
6219 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6220 }
6221 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6222 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6223 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6224}
6225
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006226func TestAppSetBundlePrebuilt(t *testing.T) {
6227 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
6228 bp := `
6229 apex_set {
6230 name: "myapex",
6231 filename: "foo_v2.apex",
6232 sanitized: {
6233 none: { set: "myapex.apks", },
6234 hwaddress: { set: "myapex.hwasan.apks", },
6235 },
6236 }`
6237 fs["Android.bp"] = []byte(bp)
6238
6239 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6240 })
6241
6242 m := ctx.ModuleForTests("myapex", "android_common")
6243 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6244
6245 actual := extractedApex.Inputs
6246 if len(actual) != 1 {
6247 t.Errorf("expected a single input")
6248 }
6249
6250 expected := "myapex.hwasan.apks"
6251 if actual[0].String() != expected {
6252 t.Errorf("expected %s, got %s", expected, actual[0].String())
6253 }
6254}
6255
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006256func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006257 t.Helper()
6258
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006259 bp := `
6260 java_library {
6261 name: "some-updatable-apex-lib",
6262 srcs: ["a.java"],
6263 sdk_version: "current",
6264 apex_available: [
6265 "some-updatable-apex",
6266 ],
6267 }
6268
6269 java_library {
6270 name: "some-non-updatable-apex-lib",
6271 srcs: ["a.java"],
6272 apex_available: [
6273 "some-non-updatable-apex",
6274 ],
6275 }
6276
6277 java_library {
6278 name: "some-platform-lib",
6279 srcs: ["a.java"],
6280 sdk_version: "current",
6281 installable: true,
6282 }
6283
6284 java_library {
6285 name: "some-art-lib",
6286 srcs: ["a.java"],
6287 sdk_version: "current",
6288 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006289 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006290 ],
6291 hostdex: true,
6292 }
6293
6294 apex {
6295 name: "some-updatable-apex",
6296 key: "some-updatable-apex.key",
6297 java_libs: ["some-updatable-apex-lib"],
6298 updatable: true,
6299 min_sdk_version: "current",
6300 }
6301
6302 apex {
6303 name: "some-non-updatable-apex",
6304 key: "some-non-updatable-apex.key",
6305 java_libs: ["some-non-updatable-apex-lib"],
6306 }
6307
6308 apex_key {
6309 name: "some-updatable-apex.key",
6310 }
6311
6312 apex_key {
6313 name: "some-non-updatable-apex.key",
6314 }
6315
6316 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006317 name: "com.android.art.debug",
6318 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006319 java_libs: ["some-art-lib"],
6320 updatable: true,
6321 min_sdk_version: "current",
6322 }
6323
6324 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006325 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006326 }
6327
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006328 filegroup {
6329 name: "some-updatable-apex-file_contexts",
6330 srcs: [
6331 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6332 ],
6333 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006334
6335 filegroup {
6336 name: "some-non-updatable-apex-file_contexts",
6337 srcs: [
6338 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6339 ],
6340 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006341 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006342
6343 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6344}
6345
Paul Duffin064b70c2020-11-02 17:32:38 +00006346func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006347 t.Helper()
6348
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006349 bp += cc.GatherRequiredDepsForTest(android.Android)
6350 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006351
6352 fs := map[string][]byte{
6353 "a.java": nil,
6354 "a.jar": nil,
6355 "build/make/target/product/security": nil,
6356 "apex_manifest.json": nil,
6357 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006358 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006359 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6360 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6361 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006362 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006363 }
6364 cc.GatherRequiredFilesForTest(fs)
6365
Paul Duffin39853512021-02-26 11:09:39 +00006366 for k, v := range filesForSdkLibrary {
6367 fs[k] = v
6368 }
Colin Crossae8600b2020-10-29 17:09:13 -07006369 config := android.TestArchConfig(buildDir, nil, bp, fs)
6370
6371 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006372 ctx.RegisterModuleType("apex", BundleFactory)
6373 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006374 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006375 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006376 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01006377 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006378 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006379 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006380 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006381 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6382 ctx.PreDepsMutators(RegisterPreDepsMutators)
6383 ctx.PostDepsMutators(RegisterPostDepsMutators)
6384
Colin Crossae8600b2020-10-29 17:09:13 -07006385 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006386
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006387 pathCtx := android.PathContextForTesting(config)
6388 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6389 transformDexpreoptConfig(dexpreoptConfig)
6390 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6391
Paul Duffinf38931c2021-02-05 16:58:28 +00006392 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006393 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006394 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6395 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6396
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006397 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6398 android.FailIfErrored(t, errs)
6399
6400 _, errs = ctx.PrepareBuildActions(config)
6401 if errmsg == "" {
6402 android.FailIfErrored(t, errs)
6403 } else if len(errs) > 0 {
6404 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006405 } else {
6406 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6407 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006408
6409 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006410}
6411
Jooyung Han548640b2020-04-27 12:10:30 +09006412func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6413 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6414 apex {
6415 name: "myapex",
6416 key: "myapex.key",
6417 updatable: true,
6418 }
6419
6420 apex_key {
6421 name: "myapex.key",
6422 public_key: "testkey.avbpubkey",
6423 private_key: "testkey.pem",
6424 }
6425 `)
6426}
6427
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006428func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006429 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006430 var transform func(*dexpreopt.GlobalConfig)
6431
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006432 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6433 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006434 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006435 }
6436 testNoUpdatableJarsInBootImage(t, "", transform)
6437 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006438
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006439 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006440 err = `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006441 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006442 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006443 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006444 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006445 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006446
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006447 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 -07006448 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 +01006449 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006450 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006451 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006452 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006453 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006454
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006455 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 -07006456 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006457 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006458 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006459 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006460 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006461 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006462
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006463 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 -07006464 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 +01006465 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006466 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006467 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006468 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006469 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006470
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006471 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6472 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006473 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006474 }
6475 testNoUpdatableJarsInBootImage(t, "", transform)
6476 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006477
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006478 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006479 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006480 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006481 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006482 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006483 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006484 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006485
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006486 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006487 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006488 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006489 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006490 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006491 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006492 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006493
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006494 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006495 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006496 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006497 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006498 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006499 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006500 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006501
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006502 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6503 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006504 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006505 }
6506 testNoUpdatableJarsInBootImage(t, "", transform)
6507 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006508
6509}
6510
6511func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6512 transform := func(config *dexpreopt.GlobalConfig) {
6513 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6514 }
6515 t.Run("prebuilt no source", func(t *testing.T) {
6516 testDexpreoptWithApexes(t, `
6517 prebuilt_apex {
6518 name: "myapex" ,
6519 arch: {
6520 arm64: {
6521 src: "myapex-arm64.apex",
6522 },
6523 arm: {
6524 src: "myapex-arm.apex",
6525 },
6526 },
6527 exported_java_libs: ["libfoo"],
6528 }
6529
6530 java_import {
6531 name: "libfoo",
6532 jars: ["libfoo.jar"],
6533 }
6534`, "", transform)
6535 })
6536
6537 t.Run("prebuilt no source", func(t *testing.T) {
6538 testDexpreoptWithApexes(t, `
6539 prebuilt_apex {
6540 name: "myapex" ,
6541 arch: {
6542 arm64: {
6543 src: "myapex-arm64.apex",
6544 },
6545 arm: {
6546 src: "myapex-arm.apex",
6547 },
6548 },
6549 exported_java_libs: ["libfoo"],
6550 }
6551
6552 java_import {
6553 name: "libfoo",
6554 jars: ["libfoo.jar"],
6555 }
6556`, "", transform)
6557 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006558}
6559
Andrei Onea115e7e72020-06-05 21:14:03 +01006560func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6561 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006562 bp += `
6563 apex_key {
6564 name: "myapex.key",
6565 public_key: "testkey.avbpubkey",
6566 private_key: "testkey.pem",
6567 }`
6568 fs := map[string][]byte{
6569 "lib1/src/A.java": nil,
6570 "lib2/src/B.java": nil,
6571 "system/sepolicy/apex/myapex-file_contexts": nil,
6572 }
6573
Colin Crossae8600b2020-10-29 17:09:13 -07006574 config := android.TestArchConfig(buildDir, nil, bp, fs)
6575 android.SetTestNeverallowRules(config, rules)
6576 updatableBootJars := make([]string, 0, len(apexBootJars))
6577 for _, apexBootJar := range apexBootJars {
6578 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6579 }
6580 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6581
6582 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006583 ctx.RegisterModuleType("apex", BundleFactory)
6584 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6585 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6586 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006587 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006588 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6589 ctx.PreDepsMutators(RegisterPreDepsMutators)
6590 ctx.PostDepsMutators(RegisterPostDepsMutators)
6591 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6592
Colin Crossae8600b2020-10-29 17:09:13 -07006593 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006594
6595 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6596 android.FailIfErrored(t, errs)
6597
6598 _, errs = ctx.PrepareBuildActions(config)
6599 if errmsg == "" {
6600 android.FailIfErrored(t, errs)
6601 } else if len(errs) > 0 {
6602 android.FailIfNoMatchingErrors(t, errmsg, errs)
6603 return
6604 } else {
6605 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6606 }
6607}
6608
6609func TestApexPermittedPackagesRules(t *testing.T) {
6610 testcases := []struct {
6611 name string
6612 expectedError string
6613 bp string
6614 bootJars []string
6615 modulesPackages map[string][]string
6616 }{
6617
6618 {
6619 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6620 expectedError: "",
6621 bp: `
6622 java_library {
6623 name: "bcp_lib1",
6624 srcs: ["lib1/src/*.java"],
6625 permitted_packages: ["foo.bar"],
6626 apex_available: ["myapex"],
6627 sdk_version: "none",
6628 system_modules: "none",
6629 }
6630 java_library {
6631 name: "nonbcp_lib2",
6632 srcs: ["lib2/src/*.java"],
6633 apex_available: ["myapex"],
6634 permitted_packages: ["a.b"],
6635 sdk_version: "none",
6636 system_modules: "none",
6637 }
6638 apex {
6639 name: "myapex",
6640 key: "myapex.key",
6641 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6642 }`,
6643 bootJars: []string{"bcp_lib1"},
6644 modulesPackages: map[string][]string{
6645 "myapex": []string{
6646 "foo.bar",
6647 },
6648 },
6649 },
6650 {
6651 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6652 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.`,
6653 bp: `
6654 java_library {
6655 name: "bcp_lib1",
6656 srcs: ["lib1/src/*.java"],
6657 apex_available: ["myapex"],
6658 permitted_packages: ["foo.bar"],
6659 sdk_version: "none",
6660 system_modules: "none",
6661 }
6662 java_library {
6663 name: "bcp_lib2",
6664 srcs: ["lib2/src/*.java"],
6665 apex_available: ["myapex"],
6666 permitted_packages: ["foo.bar", "bar.baz"],
6667 sdk_version: "none",
6668 system_modules: "none",
6669 }
6670 apex {
6671 name: "myapex",
6672 key: "myapex.key",
6673 java_libs: ["bcp_lib1", "bcp_lib2"],
6674 }
6675 `,
6676 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6677 modulesPackages: map[string][]string{
6678 "myapex": []string{
6679 "foo.bar",
6680 },
6681 },
6682 },
6683 }
6684 for _, tc := range testcases {
6685 t.Run(tc.name, func(t *testing.T) {
6686 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6687 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6688 })
6689 }
6690}
6691
Jiyong Park62304bb2020-04-13 16:19:48 +09006692func TestTestFor(t *testing.T) {
6693 ctx, _ := testApex(t, `
6694 apex {
6695 name: "myapex",
6696 key: "myapex.key",
6697 native_shared_libs: ["mylib", "myprivlib"],
6698 }
6699
6700 apex_key {
6701 name: "myapex.key",
6702 public_key: "testkey.avbpubkey",
6703 private_key: "testkey.pem",
6704 }
6705
6706 cc_library {
6707 name: "mylib",
6708 srcs: ["mylib.cpp"],
6709 system_shared_libs: [],
6710 stl: "none",
6711 stubs: {
6712 versions: ["1"],
6713 },
6714 apex_available: ["myapex"],
6715 }
6716
6717 cc_library {
6718 name: "myprivlib",
6719 srcs: ["mylib.cpp"],
6720 system_shared_libs: [],
6721 stl: "none",
6722 apex_available: ["myapex"],
6723 }
6724
6725
6726 cc_test {
6727 name: "mytest",
6728 gtest: false,
6729 srcs: ["mylib.cpp"],
6730 system_shared_libs: [],
6731 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006732 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006733 test_for: ["myapex"]
6734 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006735
6736 cc_library {
6737 name: "mytestlib",
6738 srcs: ["mylib.cpp"],
6739 system_shared_libs: [],
6740 shared_libs: ["mylib", "myprivlib"],
6741 stl: "none",
6742 test_for: ["myapex"],
6743 }
6744
6745 cc_benchmark {
6746 name: "mybench",
6747 srcs: ["mylib.cpp"],
6748 system_shared_libs: [],
6749 shared_libs: ["mylib", "myprivlib"],
6750 stl: "none",
6751 test_for: ["myapex"],
6752 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006753 `)
6754
6755 // the test 'mytest' is a test for the apex, therefore is linked to the
6756 // actual implementation of mylib instead of its stub.
6757 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6758 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6759 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006760
6761 // The same should be true for cc_library
6762 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6763 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6764 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6765
6766 // ... and for cc_benchmark
6767 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6768 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6769 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006770}
6771
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006772// TODO(jungjw): Move this to proptools
6773func intPtr(i int) *int {
6774 return &i
6775}
6776
6777func TestApexSet(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006778 ctx, _ := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006779 apex_set {
6780 name: "myapex",
6781 set: "myapex.apks",
6782 filename: "foo_v2.apex",
6783 overrides: ["foo"],
6784 }
6785 `, func(fs map[string][]byte, config android.Config) {
6786 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006787 config.Targets[android.Android] = []android.Target{
6788 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6789 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6790 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006791 })
6792
6793 m := ctx.ModuleForTests("myapex", "android_common")
6794
6795 // Check extract_apks tool parameters.
6796 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6797 actual := extractedApex.Args["abis"]
6798 expected := "ARMEABI_V7A,ARM64_V8A"
6799 if actual != expected {
6800 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6801 }
6802 actual = extractedApex.Args["sdk-version"]
6803 expected = "30"
6804 if actual != expected {
6805 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6806 }
6807
6808 a := m.Module().(*ApexSet)
6809 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006810 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006811 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6812 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6813 }
6814}
6815
Jiyong Park7d95a512020-05-10 15:16:24 +09006816func TestNoStaticLinkingToStubsLib(t *testing.T) {
6817 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6818 apex {
6819 name: "myapex",
6820 key: "myapex.key",
6821 native_shared_libs: ["mylib"],
6822 }
6823
6824 apex_key {
6825 name: "myapex.key",
6826 public_key: "testkey.avbpubkey",
6827 private_key: "testkey.pem",
6828 }
6829
6830 cc_library {
6831 name: "mylib",
6832 srcs: ["mylib.cpp"],
6833 static_libs: ["otherlib"],
6834 system_shared_libs: [],
6835 stl: "none",
6836 apex_available: [ "myapex" ],
6837 }
6838
6839 cc_library {
6840 name: "otherlib",
6841 srcs: ["mylib.cpp"],
6842 system_shared_libs: [],
6843 stl: "none",
6844 stubs: {
6845 versions: ["1", "2", "3"],
6846 },
6847 apex_available: [ "myapex" ],
6848 }
6849 `)
6850}
6851
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006852func TestApexKeysTxt(t *testing.T) {
6853 ctx, _ := testApex(t, `
6854 apex {
6855 name: "myapex",
6856 key: "myapex.key",
6857 }
6858
6859 apex_key {
6860 name: "myapex.key",
6861 public_key: "testkey.avbpubkey",
6862 private_key: "testkey.pem",
6863 }
6864
6865 prebuilt_apex {
6866 name: "myapex",
6867 prefer: true,
6868 arch: {
6869 arm64: {
6870 src: "myapex-arm64.apex",
6871 },
6872 arm: {
6873 src: "myapex-arm.apex",
6874 },
6875 },
6876 }
6877
6878 apex_set {
6879 name: "myapex_set",
6880 set: "myapex.apks",
6881 filename: "myapex_set.apex",
6882 overrides: ["myapex"],
6883 }
6884 `)
6885
6886 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6887 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6888 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 +09006889 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 +09006890}
6891
Jooyung Han938b5932020-06-20 12:47:47 +09006892func TestAllowedFiles(t *testing.T) {
6893 ctx, _ := testApex(t, `
6894 apex {
6895 name: "myapex",
6896 key: "myapex.key",
6897 apps: ["app"],
6898 allowed_files: "allowed.txt",
6899 }
6900
6901 apex_key {
6902 name: "myapex.key",
6903 public_key: "testkey.avbpubkey",
6904 private_key: "testkey.pem",
6905 }
6906
6907 android_app {
6908 name: "app",
6909 srcs: ["foo/bar/MyClass.java"],
6910 package_name: "foo",
6911 sdk_version: "none",
6912 system_modules: "none",
6913 apex_available: [ "myapex" ],
6914 }
6915 `, withFiles(map[string][]byte{
6916 "sub/Android.bp": []byte(`
6917 override_apex {
6918 name: "override_myapex",
6919 base: "myapex",
6920 apps: ["override_app"],
6921 allowed_files: ":allowed",
6922 }
6923 // Overridable "path" property should be referenced indirectly
6924 filegroup {
6925 name: "allowed",
6926 srcs: ["allowed.txt"],
6927 }
6928 override_android_app {
6929 name: "override_app",
6930 base: "app",
6931 package_name: "bar",
6932 }
6933 `),
6934 }))
6935
6936 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6937 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6938 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6939 }
6940
6941 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6942 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6943 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6944 }
6945}
6946
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006947func TestNonPreferredPrebuiltDependency(t *testing.T) {
6948 _, _ = testApex(t, `
6949 apex {
6950 name: "myapex",
6951 key: "myapex.key",
6952 native_shared_libs: ["mylib"],
6953 }
6954
6955 apex_key {
6956 name: "myapex.key",
6957 public_key: "testkey.avbpubkey",
6958 private_key: "testkey.pem",
6959 }
6960
6961 cc_library {
6962 name: "mylib",
6963 srcs: ["mylib.cpp"],
6964 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006965 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006966 },
6967 apex_available: ["myapex"],
6968 }
6969
6970 cc_prebuilt_library_shared {
6971 name: "mylib",
6972 prefer: false,
6973 srcs: ["prebuilt.so"],
6974 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006975 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006976 },
6977 apex_available: ["myapex"],
6978 }
6979 `)
6980}
6981
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006982func TestCompressedApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006983 ctx, _ := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006984 apex {
6985 name: "myapex",
6986 key: "myapex.key",
6987 compressible: true,
6988 }
6989 apex_key {
6990 name: "myapex.key",
6991 public_key: "testkey.avbpubkey",
6992 private_key: "testkey.pem",
6993 }
6994 `, func(fs map[string][]byte, config android.Config) {
6995 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6996 })
6997
6998 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6999 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7000
7001 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7002 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7003
7004 // Make sure output of bundle is .capex
7005 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7006 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7007
7008 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007009 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007010 var builder strings.Builder
7011 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7012 androidMk := builder.String()
7013 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7014}
7015
Martin Stjernholm2856c662020-12-02 15:03:42 +00007016func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07007017 ctx, _ := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007018 apex {
7019 name: "myapex",
7020 key: "myapex.key",
7021 native_shared_libs: ["mylib"],
7022 }
7023
7024 apex_key {
7025 name: "myapex.key",
7026 public_key: "testkey.avbpubkey",
7027 private_key: "testkey.pem",
7028 }
7029
7030 cc_library {
7031 name: "mylib",
7032 srcs: ["mylib.cpp"],
7033 apex_available: ["myapex"],
7034 shared_libs: ["otherlib"],
7035 system_shared_libs: [],
7036 }
7037
7038 cc_library {
7039 name: "otherlib",
7040 srcs: ["mylib.cpp"],
7041 stubs: {
7042 versions: ["current"],
7043 },
7044 }
7045
7046 cc_prebuilt_library_shared {
7047 name: "otherlib",
7048 prefer: true,
7049 srcs: ["prebuilt.so"],
7050 stubs: {
7051 versions: ["current"],
7052 },
7053 }
7054 `)
7055
7056 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007057 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007058 var builder strings.Builder
7059 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7060 androidMk := builder.String()
7061
7062 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7063 // a thing there.
7064 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7065}
7066
Jiyong Parke3867542020-12-03 17:28:25 +09007067func TestExcludeDependency(t *testing.T) {
7068 ctx, _ := testApex(t, `
7069 apex {
7070 name: "myapex",
7071 key: "myapex.key",
7072 native_shared_libs: ["mylib"],
7073 }
7074
7075 apex_key {
7076 name: "myapex.key",
7077 public_key: "testkey.avbpubkey",
7078 private_key: "testkey.pem",
7079 }
7080
7081 cc_library {
7082 name: "mylib",
7083 srcs: ["mylib.cpp"],
7084 system_shared_libs: [],
7085 stl: "none",
7086 apex_available: ["myapex"],
7087 shared_libs: ["mylib2"],
7088 target: {
7089 apex: {
7090 exclude_shared_libs: ["mylib2"],
7091 },
7092 },
7093 }
7094
7095 cc_library {
7096 name: "mylib2",
7097 srcs: ["mylib.cpp"],
7098 system_shared_libs: [],
7099 stl: "none",
7100 }
7101 `)
7102
7103 // Check if mylib is linked to mylib2 for the non-apex target
7104 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7105 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7106
7107 // Make sure that the link doesn't occur for the apex target
7108 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7109 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7110
7111 // It shouldn't appear in the copy cmd as well.
7112 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7113 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7114}
7115
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007116func TestPrebuiltStubLibDep(t *testing.T) {
7117 bpBase := `
7118 apex {
7119 name: "myapex",
7120 key: "myapex.key",
7121 native_shared_libs: ["mylib"],
7122 }
7123 apex_key {
7124 name: "myapex.key",
7125 public_key: "testkey.avbpubkey",
7126 private_key: "testkey.pem",
7127 }
7128 cc_library {
7129 name: "mylib",
7130 srcs: ["mylib.cpp"],
7131 apex_available: ["myapex"],
7132 shared_libs: ["stublib"],
7133 system_shared_libs: [],
7134 }
7135 apex {
7136 name: "otherapex",
7137 enabled: %s,
7138 key: "myapex.key",
7139 native_shared_libs: ["stublib"],
7140 }
7141 `
7142
7143 stublibSourceBp := `
7144 cc_library {
7145 name: "stublib",
7146 srcs: ["mylib.cpp"],
7147 apex_available: ["otherapex"],
7148 system_shared_libs: [],
7149 stl: "none",
7150 stubs: {
7151 versions: ["1"],
7152 },
7153 }
7154 `
7155
7156 stublibPrebuiltBp := `
7157 cc_prebuilt_library_shared {
7158 name: "stublib",
7159 srcs: ["prebuilt.so"],
7160 apex_available: ["otherapex"],
7161 stubs: {
7162 versions: ["1"],
7163 },
7164 %s
7165 }
7166 `
7167
7168 tests := []struct {
7169 name string
7170 stublibBp string
7171 usePrebuilt bool
7172 modNames []string // Modules to collect AndroidMkEntries for
7173 otherApexEnabled []string
7174 }{
7175 {
7176 name: "only_source",
7177 stublibBp: stublibSourceBp,
7178 usePrebuilt: false,
7179 modNames: []string{"stublib"},
7180 otherApexEnabled: []string{"true", "false"},
7181 },
7182 {
7183 name: "source_preferred",
7184 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7185 usePrebuilt: false,
7186 modNames: []string{"stublib", "prebuilt_stublib"},
7187 otherApexEnabled: []string{"true", "false"},
7188 },
7189 {
7190 name: "prebuilt_preferred",
7191 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7192 usePrebuilt: true,
7193 modNames: []string{"stublib", "prebuilt_stublib"},
7194 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7195 },
7196 {
7197 name: "only_prebuilt",
7198 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7199 usePrebuilt: true,
7200 modNames: []string{"stublib"},
7201 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7202 },
7203 }
7204
7205 for _, test := range tests {
7206 t.Run(test.name, func(t *testing.T) {
7207 for _, otherApexEnabled := range test.otherApexEnabled {
7208 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07007209 ctx, _ := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007210
7211 type modAndMkEntries struct {
7212 mod *cc.Module
7213 mkEntries android.AndroidMkEntries
7214 }
7215 entries := []*modAndMkEntries{}
7216
7217 // Gather shared lib modules that are installable
7218 for _, modName := range test.modNames {
7219 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7220 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7221 continue
7222 }
7223 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007224 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007225 continue
7226 }
Colin Crossaa255532020-07-03 13:18:24 -07007227 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007228 if ent.Disabled {
7229 continue
7230 }
7231 entries = append(entries, &modAndMkEntries{
7232 mod: mod,
7233 mkEntries: ent,
7234 })
7235 }
7236 }
7237 }
7238
7239 var entry *modAndMkEntries = nil
7240 for _, ent := range entries {
7241 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7242 if entry != nil {
7243 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7244 } else {
7245 entry = ent
7246 }
7247 }
7248 }
7249
7250 if entry == nil {
7251 t.Errorf("AndroidMk entry for \"stublib\" missing")
7252 } else {
7253 isPrebuilt := entry.mod.Prebuilt() != nil
7254 if isPrebuilt != test.usePrebuilt {
7255 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7256 }
7257 if !entry.mod.IsStubs() {
7258 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7259 }
7260 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7261 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7262 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007263 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7264 expected := "-D__STUBLIB_API__=1"
7265 if !android.InList(expected, cflags) {
7266 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7267 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007268 }
7269 })
7270 }
7271 })
7272 }
7273}
7274
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007275func TestMain(m *testing.M) {
7276 run := func() int {
7277 setUp()
7278 defer tearDown()
7279
7280 return m.Run()
7281 }
7282
7283 os.Exit(run())
7284}