blob: c27eed62e03476715f4e1f24af83312fd13ebdc6 [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{
Colin Cross2807f002021-03-02 10:15:29 -0800146 "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,
153 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
154 "system/sepolicy/apex/myapex2-file_contexts": nil,
155 "system/sepolicy/apex/otherapex-file_contexts": nil,
156 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
157 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800158 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800159 "mytest.cpp": nil,
160 "mytest1.cpp": nil,
161 "mytest2.cpp": nil,
162 "mytest3.cpp": nil,
163 "myprebuilt": nil,
164 "my_include": nil,
165 "foo/bar/MyClass.java": nil,
166 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100167 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800168 "vendor/foo/devkeys/test.x509.pem": nil,
169 "vendor/foo/devkeys/test.pk8": nil,
170 "testkey.x509.pem": nil,
171 "testkey.pk8": nil,
172 "testkey.override.x509.pem": nil,
173 "testkey.override.pk8": nil,
174 "vendor/foo/devkeys/testkey.avbpubkey": nil,
175 "vendor/foo/devkeys/testkey.pem": nil,
176 "NOTICE": nil,
177 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900178 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800179 "testkey2.avbpubkey": nil,
180 "testkey2.pem": nil,
181 "myapex-arm64.apex": nil,
182 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700183 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800184 "frameworks/base/api/current.txt": nil,
185 "framework/aidl/a.aidl": nil,
186 "build/make/core/proguard.flags": nil,
187 "build/make/core/proguard_basic_keeps.flags": nil,
188 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700189 "baz": nil,
190 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700191 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700192 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900193 "foo.rs": nil,
Paul Duffin064b70c2020-11-02 17:32:38 +0000194 "libfoo.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 {
Colin Cross2807f002021-03-02 10:15:29 -08003241 name: "com.android.vndk.current",
3242 key: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003243 }
3244
3245 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003246 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003247 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",
Colin Cross2807f002021-03-02 10:15:29 -08003261 apex_available: [ "com.android.vndk.current" ],
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",
Colin Cross2807f002021-03-02 10:15:29 -08003275 apex_available: [ "com.android.vndk.current" ],
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
Colin Cross2807f002021-03-02 10:15:29 -08003279 ensureExactContents(t, ctx, "com.android.vndk.current", "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 {
Colin Cross2807f002021-03-02 10:15:29 -08003297 name: "com.android.vndk.current",
3298 key: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003299 }
3300
3301 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003302 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003303 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",
Colin Cross2807f002021-03-02 10:15:29 -08003317 apex_available: [ "com.android.vndk.current" ],
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",
Colin Cross2807f002021-03-02 10:15:29 -08003336 apex_available: [ "com.android.vndk.current" ],
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 }))
Colin Cross2807f002021-03-02 10:15:29 -08003343 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003344 "lib/libvndk.so",
3345 "lib/libvndk.arm.so",
3346 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003347 "lib/libc++.so",
3348 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003349 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003350 })
Jooyung Han344d5432019-08-23 11:17:39 +09003351}
3352
Jooyung Han39edb6c2019-11-06 16:53:07 +09003353func vndkLibrariesTxtFiles(vers ...string) (result string) {
3354 for _, v := range vers {
3355 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003356 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003357 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003358 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003359 name: "` + txt + `.libraries.txt",
3360 }
3361 `
3362 }
3363 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003364 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003365 result += `
3366 prebuilt_etc {
3367 name: "` + txt + `.libraries.` + v + `.txt",
3368 src: "dummy.txt",
3369 }
3370 `
3371 }
3372 }
3373 }
3374 return
3375}
3376
Jooyung Han344d5432019-08-23 11:17:39 +09003377func TestVndkApexVersion(t *testing.T) {
3378 ctx, _ := testApex(t, `
3379 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003380 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003381 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003382 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003383 vndk_version: "27",
3384 }
3385
3386 apex_key {
3387 name: "myapex.key",
3388 public_key: "testkey.avbpubkey",
3389 private_key: "testkey.pem",
3390 }
3391
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 vndk_prebuilt_shared {
3393 name: "libvndk27",
3394 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003395 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003396 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003397 vndk: {
3398 enabled: true,
3399 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003400 target_arch: "arm64",
3401 arch: {
3402 arm: {
3403 srcs: ["libvndk27_arm.so"],
3404 },
3405 arm64: {
3406 srcs: ["libvndk27_arm64.so"],
3407 },
3408 },
Colin Cross2807f002021-03-02 10:15:29 -08003409 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003410 }
3411
3412 vndk_prebuilt_shared {
3413 name: "libvndk27",
3414 version: "27",
3415 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003416 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003417 vndk: {
3418 enabled: true,
3419 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003420 target_arch: "x86_64",
3421 arch: {
3422 x86: {
3423 srcs: ["libvndk27_x86.so"],
3424 },
3425 x86_64: {
3426 srcs: ["libvndk27_x86_64.so"],
3427 },
3428 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003429 }
3430 `+vndkLibrariesTxtFiles("27"),
3431 withFiles(map[string][]byte{
3432 "libvndk27_arm.so": nil,
3433 "libvndk27_arm64.so": nil,
3434 "libvndk27_x86.so": nil,
3435 "libvndk27_x86_64.so": nil,
3436 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003437
Colin Cross2807f002021-03-02 10:15:29 -08003438 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003439 "lib/libvndk27_arm.so",
3440 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003441 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003442 })
Jooyung Han344d5432019-08-23 11:17:39 +09003443}
3444
Jooyung Han90eee022019-10-01 20:02:42 +09003445func TestVndkApexNameRule(t *testing.T) {
3446 ctx, _ := testApex(t, `
3447 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003448 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003449 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003450 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003451 }
3452 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003453 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003454 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003455 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003456 vndk_version: "28",
3457 }
3458 apex_key {
3459 name: "myapex.key",
3460 public_key: "testkey.avbpubkey",
3461 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003462 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003463
3464 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003465 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003466 actual := proptools.String(bundle.properties.Apex_name)
3467 if !reflect.DeepEqual(actual, expected) {
3468 t.Errorf("Got '%v', expected '%v'", actual, expected)
3469 }
3470 }
3471
Colin Cross2807f002021-03-02 10:15:29 -08003472 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3473 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003474}
3475
Jooyung Han344d5432019-08-23 11:17:39 +09003476func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3477 ctx, _ := testApex(t, `
3478 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003479 name: "com.android.vndk.current",
3480 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003481 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003482 }
3483
3484 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003485 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003486 public_key: "testkey.avbpubkey",
3487 private_key: "testkey.pem",
3488 }
3489
3490 cc_library {
3491 name: "libvndk",
3492 srcs: ["mylib.cpp"],
3493 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003494 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003495 native_bridge_supported: true,
3496 host_supported: true,
3497 vndk: {
3498 enabled: true,
3499 },
3500 system_shared_libs: [],
3501 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003502 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003503 }
Colin Cross2807f002021-03-02 10:15:29 -08003504 `+vndkLibrariesTxtFiles("current"),
3505 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003506
Colin Cross2807f002021-03-02 10:15:29 -08003507 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003508 "lib/libvndk.so",
3509 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003510 "lib/libc++.so",
3511 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003512 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003513 })
Jooyung Han344d5432019-08-23 11:17:39 +09003514}
3515
3516func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003517 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003518 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003519 name: "com.android.vndk.current",
3520 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003521 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003522 native_bridge_supported: true,
3523 }
3524
3525 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003526 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003527 public_key: "testkey.avbpubkey",
3528 private_key: "testkey.pem",
3529 }
3530
3531 cc_library {
3532 name: "libvndk",
3533 srcs: ["mylib.cpp"],
3534 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003535 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003536 native_bridge_supported: true,
3537 host_supported: true,
3538 vndk: {
3539 enabled: true,
3540 },
3541 system_shared_libs: [],
3542 stl: "none",
3543 }
3544 `)
3545}
3546
Jooyung Han31c470b2019-10-18 16:26:59 +09003547func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003548 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003549 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003550 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003551 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003552 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003553 vndk_version: "27",
3554 }
3555
3556 apex_key {
3557 name: "myapex.key",
3558 public_key: "testkey.avbpubkey",
3559 private_key: "testkey.pem",
3560 }
3561
3562 vndk_prebuilt_shared {
3563 name: "libvndk27",
3564 version: "27",
3565 target_arch: "arm",
3566 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003567 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003568 vndk: {
3569 enabled: true,
3570 },
3571 arch: {
3572 arm: {
3573 srcs: ["libvndk27.so"],
3574 }
3575 },
3576 }
3577
3578 vndk_prebuilt_shared {
3579 name: "libvndk27",
3580 version: "27",
3581 target_arch: "arm",
3582 binder32bit: true,
3583 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003584 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003585 vndk: {
3586 enabled: true,
3587 },
3588 arch: {
3589 arm: {
3590 srcs: ["libvndk27binder32.so"],
3591 }
3592 },
Colin Cross2807f002021-03-02 10:15:29 -08003593 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003594 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003595 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003596 withFiles(map[string][]byte{
3597 "libvndk27.so": nil,
3598 "libvndk27binder32.so": nil,
3599 }),
3600 withBinder32bit,
3601 withTargets(map[android.OsType][]android.Target{
3602 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003603 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3604 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003605 },
3606 }),
3607 )
3608
Colin Cross2807f002021-03-02 10:15:29 -08003609 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003611 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003612 })
3613}
3614
Jooyung Han45a96772020-06-15 14:59:42 +09003615func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3616 ctx, _ := testApex(t, `
3617 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003618 name: "com.android.vndk.current",
3619 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003620 file_contexts: ":myapex-file_contexts",
3621 }
3622
3623 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003624 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003625 public_key: "testkey.avbpubkey",
3626 private_key: "testkey.pem",
3627 }
3628
3629 cc_library {
3630 name: "libz",
3631 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003632 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003633 vndk: {
3634 enabled: true,
3635 },
3636 stubs: {
3637 symbol_file: "libz.map.txt",
3638 versions: ["30"],
3639 }
3640 }
3641 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3642 "libz.map.txt": nil,
3643 }))
3644
Colin Cross2807f002021-03-02 10:15:29 -08003645 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003646 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3647 ensureListEmpty(t, provideNativeLibs)
3648}
3649
Jooyung Hane1633032019-08-01 17:41:43 +09003650func TestDependenciesInApexManifest(t *testing.T) {
3651 ctx, _ := testApex(t, `
3652 apex {
3653 name: "myapex_nodep",
3654 key: "myapex.key",
3655 native_shared_libs: ["lib_nodep"],
3656 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003657 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003658 }
3659
3660 apex {
3661 name: "myapex_dep",
3662 key: "myapex.key",
3663 native_shared_libs: ["lib_dep"],
3664 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003665 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003666 }
3667
3668 apex {
3669 name: "myapex_provider",
3670 key: "myapex.key",
3671 native_shared_libs: ["libfoo"],
3672 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003673 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003674 }
3675
3676 apex {
3677 name: "myapex_selfcontained",
3678 key: "myapex.key",
3679 native_shared_libs: ["lib_dep", "libfoo"],
3680 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003681 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003682 }
3683
3684 apex_key {
3685 name: "myapex.key",
3686 public_key: "testkey.avbpubkey",
3687 private_key: "testkey.pem",
3688 }
3689
3690 cc_library {
3691 name: "lib_nodep",
3692 srcs: ["mylib.cpp"],
3693 system_shared_libs: [],
3694 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003695 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003696 }
3697
3698 cc_library {
3699 name: "lib_dep",
3700 srcs: ["mylib.cpp"],
3701 shared_libs: ["libfoo"],
3702 system_shared_libs: [],
3703 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003704 apex_available: [
3705 "myapex_dep",
3706 "myapex_provider",
3707 "myapex_selfcontained",
3708 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003709 }
3710
3711 cc_library {
3712 name: "libfoo",
3713 srcs: ["mytest.cpp"],
3714 stubs: {
3715 versions: ["1"],
3716 },
3717 system_shared_libs: [],
3718 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003719 apex_available: [
3720 "myapex_provider",
3721 "myapex_selfcontained",
3722 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003723 }
3724 `)
3725
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003726 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003727 var provideNativeLibs, requireNativeLibs []string
3728
Sundong Ahnabb64432019-10-22 13:58:29 +09003729 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003730 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3731 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003732 ensureListEmpty(t, provideNativeLibs)
3733 ensureListEmpty(t, requireNativeLibs)
3734
Sundong Ahnabb64432019-10-22 13:58:29 +09003735 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003736 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3737 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003738 ensureListEmpty(t, provideNativeLibs)
3739 ensureListContains(t, requireNativeLibs, "libfoo.so")
3740
Sundong Ahnabb64432019-10-22 13:58:29 +09003741 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003742 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3743 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003744 ensureListContains(t, provideNativeLibs, "libfoo.so")
3745 ensureListEmpty(t, requireNativeLibs)
3746
Sundong Ahnabb64432019-10-22 13:58:29 +09003747 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003748 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3749 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003750 ensureListContains(t, provideNativeLibs, "libfoo.so")
3751 ensureListEmpty(t, requireNativeLibs)
3752}
3753
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003754func TestApexName(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07003755 ctx, _ := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003756 apex {
3757 name: "myapex",
3758 key: "myapex.key",
3759 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003760 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003761 }
3762
3763 apex_key {
3764 name: "myapex.key",
3765 public_key: "testkey.avbpubkey",
3766 private_key: "testkey.pem",
3767 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003768
3769 cc_library {
3770 name: "mylib",
3771 srcs: ["mylib.cpp"],
3772 system_shared_libs: [],
3773 stl: "none",
3774 apex_available: [
3775 "//apex_available:platform",
3776 "myapex",
3777 ],
3778 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003779 `)
3780
Sundong Ahnabb64432019-10-22 13:58:29 +09003781 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003782 apexManifestRule := module.Rule("apexManifestRule")
3783 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3784 apexRule := module.Rule("apexRule")
3785 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003786
3787 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003788 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003789 name := apexBundle.BaseModuleName()
3790 prefix := "TARGET_"
3791 var builder strings.Builder
3792 data.Custom(&builder, name, prefix, "", data)
3793 androidMk := builder.String()
3794 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3795 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003796}
3797
Alex Light0851b882019-02-07 13:20:53 -08003798func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003799 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003800 apex {
3801 name: "myapex",
3802 key: "myapex.key",
3803 native_shared_libs: ["mylib_common"],
3804 }
3805
3806 apex_key {
3807 name: "myapex.key",
3808 public_key: "testkey.avbpubkey",
3809 private_key: "testkey.pem",
3810 }
3811
3812 cc_library {
3813 name: "mylib_common",
3814 srcs: ["mylib.cpp"],
3815 system_shared_libs: [],
3816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003817 apex_available: [
3818 "//apex_available:platform",
3819 "myapex",
3820 ],
Alex Light0851b882019-02-07 13:20:53 -08003821 }
3822 `)
3823
Sundong Ahnabb64432019-10-22 13:58:29 +09003824 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003825 apexRule := module.Rule("apexRule")
3826 copyCmds := apexRule.Args["copy_commands"]
3827
3828 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3829 t.Log("Apex was a test apex!")
3830 t.Fail()
3831 }
3832 // Ensure that main rule creates an output
3833 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3834
3835 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003836 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003837
3838 // Ensure that both direct and indirect deps are copied into apex
3839 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3840
Colin Cross7113d202019-11-20 16:39:12 -08003841 // Ensure that the platform variant ends with _shared
3842 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003843
Colin Cross56a83212020-09-15 18:30:11 -07003844 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003845 t.Log("Found mylib_common not in any apex!")
3846 t.Fail()
3847 }
3848}
3849
3850func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003851 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003852 apex_test {
3853 name: "myapex",
3854 key: "myapex.key",
3855 native_shared_libs: ["mylib_common_test"],
3856 }
3857
3858 apex_key {
3859 name: "myapex.key",
3860 public_key: "testkey.avbpubkey",
3861 private_key: "testkey.pem",
3862 }
3863
3864 cc_library {
3865 name: "mylib_common_test",
3866 srcs: ["mylib.cpp"],
3867 system_shared_libs: [],
3868 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003869 // TODO: remove //apex_available:platform
3870 apex_available: [
3871 "//apex_available:platform",
3872 "myapex",
3873 ],
Alex Light0851b882019-02-07 13:20:53 -08003874 }
3875 `)
3876
Sundong Ahnabb64432019-10-22 13:58:29 +09003877 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003878 apexRule := module.Rule("apexRule")
3879 copyCmds := apexRule.Args["copy_commands"]
3880
3881 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3882 t.Log("Apex was not a test apex!")
3883 t.Fail()
3884 }
3885 // Ensure that main rule creates an output
3886 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3887
3888 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003889 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003890
3891 // Ensure that both direct and indirect deps are copied into apex
3892 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3893
Colin Cross7113d202019-11-20 16:39:12 -08003894 // Ensure that the platform variant ends with _shared
3895 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003896}
3897
Alex Light9670d332019-01-29 18:07:33 -08003898func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003899 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003900 apex {
3901 name: "myapex",
3902 key: "myapex.key",
3903 multilib: {
3904 first: {
3905 native_shared_libs: ["mylib_common"],
3906 }
3907 },
3908 target: {
3909 android: {
3910 multilib: {
3911 first: {
3912 native_shared_libs: ["mylib"],
3913 }
3914 }
3915 },
3916 host: {
3917 multilib: {
3918 first: {
3919 native_shared_libs: ["mylib2"],
3920 }
3921 }
3922 }
3923 }
3924 }
3925
3926 apex_key {
3927 name: "myapex.key",
3928 public_key: "testkey.avbpubkey",
3929 private_key: "testkey.pem",
3930 }
3931
3932 cc_library {
3933 name: "mylib",
3934 srcs: ["mylib.cpp"],
3935 system_shared_libs: [],
3936 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003937 // TODO: remove //apex_available:platform
3938 apex_available: [
3939 "//apex_available:platform",
3940 "myapex",
3941 ],
Alex Light9670d332019-01-29 18:07:33 -08003942 }
3943
3944 cc_library {
3945 name: "mylib_common",
3946 srcs: ["mylib.cpp"],
3947 system_shared_libs: [],
3948 stl: "none",
3949 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003950 // TODO: remove //apex_available:platform
3951 apex_available: [
3952 "//apex_available:platform",
3953 "myapex",
3954 ],
Alex Light9670d332019-01-29 18:07:33 -08003955 }
3956
3957 cc_library {
3958 name: "mylib2",
3959 srcs: ["mylib.cpp"],
3960 system_shared_libs: [],
3961 stl: "none",
3962 compile_multilib: "first",
3963 }
3964 `)
3965
Sundong Ahnabb64432019-10-22 13:58:29 +09003966 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003967 copyCmds := apexRule.Args["copy_commands"]
3968
3969 // Ensure that main rule creates an output
3970 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3971
3972 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003973 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3974 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3975 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003976
3977 // Ensure that both direct and indirect deps are copied into apex
3978 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3979 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3980 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3981
Colin Cross7113d202019-11-20 16:39:12 -08003982 // Ensure that the platform variant ends with _shared
3983 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3984 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3985 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003986}
Jiyong Park04480cf2019-02-06 00:16:29 +09003987
Jiyong Park59140302020-12-14 18:44:04 +09003988func TestApexWithArch(t *testing.T) {
3989 ctx, _ := testApex(t, `
3990 apex {
3991 name: "myapex",
3992 key: "myapex.key",
3993 arch: {
3994 arm64: {
3995 native_shared_libs: ["mylib.arm64"],
3996 },
3997 x86_64: {
3998 native_shared_libs: ["mylib.x64"],
3999 },
4000 }
4001 }
4002
4003 apex_key {
4004 name: "myapex.key",
4005 public_key: "testkey.avbpubkey",
4006 private_key: "testkey.pem",
4007 }
4008
4009 cc_library {
4010 name: "mylib.arm64",
4011 srcs: ["mylib.cpp"],
4012 system_shared_libs: [],
4013 stl: "none",
4014 // TODO: remove //apex_available:platform
4015 apex_available: [
4016 "//apex_available:platform",
4017 "myapex",
4018 ],
4019 }
4020
4021 cc_library {
4022 name: "mylib.x64",
4023 srcs: ["mylib.cpp"],
4024 system_shared_libs: [],
4025 stl: "none",
4026 // TODO: remove //apex_available:platform
4027 apex_available: [
4028 "//apex_available:platform",
4029 "myapex",
4030 ],
4031 }
4032 `)
4033
4034 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4035 copyCmds := apexRule.Args["copy_commands"]
4036
4037 // Ensure that apex variant is created for the direct dep
4038 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4039 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4040
4041 // Ensure that both direct and indirect deps are copied into apex
4042 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4043 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4044}
4045
Jiyong Park04480cf2019-02-06 00:16:29 +09004046func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004047 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004048 apex {
4049 name: "myapex",
4050 key: "myapex.key",
4051 binaries: ["myscript"],
4052 }
4053
4054 apex_key {
4055 name: "myapex.key",
4056 public_key: "testkey.avbpubkey",
4057 private_key: "testkey.pem",
4058 }
4059
4060 sh_binary {
4061 name: "myscript",
4062 src: "mylib.cpp",
4063 filename: "myscript.sh",
4064 sub_dir: "script",
4065 }
4066 `)
4067
Sundong Ahnabb64432019-10-22 13:58:29 +09004068 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004069 copyCmds := apexRule.Args["copy_commands"]
4070
4071 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4072}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004073
Jooyung Han91df2082019-11-20 01:49:42 +09004074func TestApexInVariousPartition(t *testing.T) {
4075 testcases := []struct {
4076 propName, parition, flattenedPartition string
4077 }{
4078 {"", "system", "system_ext"},
4079 {"product_specific: true", "product", "product"},
4080 {"soc_specific: true", "vendor", "vendor"},
4081 {"proprietary: true", "vendor", "vendor"},
4082 {"vendor: true", "vendor", "vendor"},
4083 {"system_ext_specific: true", "system_ext", "system_ext"},
4084 }
4085 for _, tc := range testcases {
4086 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
4087 ctx, _ := testApex(t, `
4088 apex {
4089 name: "myapex",
4090 key: "myapex.key",
4091 `+tc.propName+`
4092 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004093
Jooyung Han91df2082019-11-20 01:49:42 +09004094 apex_key {
4095 name: "myapex.key",
4096 public_key: "testkey.avbpubkey",
4097 private_key: "testkey.pem",
4098 }
4099 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004100
Jooyung Han91df2082019-11-20 01:49:42 +09004101 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4102 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4103 actual := apex.installDir.String()
4104 if actual != expected {
4105 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4106 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004107
Jooyung Han91df2082019-11-20 01:49:42 +09004108 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4109 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4110 actual = flattened.installDir.String()
4111 if actual != expected {
4112 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4113 }
4114 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004115 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004116}
Jiyong Park67882562019-03-21 01:11:21 +09004117
Jooyung Han580eb4f2020-06-24 19:33:06 +09004118func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004119 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004120 apex {
4121 name: "myapex",
4122 key: "myapex.key",
4123 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004124
Jooyung Han580eb4f2020-06-24 19:33:06 +09004125 apex_key {
4126 name: "myapex.key",
4127 public_key: "testkey.avbpubkey",
4128 private_key: "testkey.pem",
4129 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004130 `)
4131 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004132 rule := module.Output("file_contexts")
4133 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4134}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004135
Jooyung Han580eb4f2020-06-24 19:33:06 +09004136func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004137 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004138 apex {
4139 name: "myapex",
4140 key: "myapex.key",
4141 file_contexts: "my_own_file_contexts",
4142 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004143
Jooyung Han580eb4f2020-06-24 19:33:06 +09004144 apex_key {
4145 name: "myapex.key",
4146 public_key: "testkey.avbpubkey",
4147 private_key: "testkey.pem",
4148 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004149 `, withFiles(map[string][]byte{
4150 "my_own_file_contexts": nil,
4151 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004152}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004153
Jooyung Han580eb4f2020-06-24 19:33:06 +09004154func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004155 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004156 apex {
4157 name: "myapex",
4158 key: "myapex.key",
4159 product_specific: true,
4160 file_contexts: "product_specific_file_contexts",
4161 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004162
Jooyung Han580eb4f2020-06-24 19:33:06 +09004163 apex_key {
4164 name: "myapex.key",
4165 public_key: "testkey.avbpubkey",
4166 private_key: "testkey.pem",
4167 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004168 `)
4169
Jooyung Han580eb4f2020-06-24 19:33:06 +09004170 ctx, _ := testApex(t, `
4171 apex {
4172 name: "myapex",
4173 key: "myapex.key",
4174 product_specific: true,
4175 file_contexts: "product_specific_file_contexts",
4176 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004177
Jooyung Han580eb4f2020-06-24 19:33:06 +09004178 apex_key {
4179 name: "myapex.key",
4180 public_key: "testkey.avbpubkey",
4181 private_key: "testkey.pem",
4182 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004183 `, withFiles(map[string][]byte{
4184 "product_specific_file_contexts": nil,
4185 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004186 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4187 rule := module.Output("file_contexts")
4188 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4189}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004190
Jooyung Han580eb4f2020-06-24 19:33:06 +09004191func TestFileContexts_SetViaFileGroup(t *testing.T) {
4192 ctx, _ := testApex(t, `
4193 apex {
4194 name: "myapex",
4195 key: "myapex.key",
4196 product_specific: true,
4197 file_contexts: ":my-file-contexts",
4198 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004199
Jooyung Han580eb4f2020-06-24 19:33:06 +09004200 apex_key {
4201 name: "myapex.key",
4202 public_key: "testkey.avbpubkey",
4203 private_key: "testkey.pem",
4204 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004205
Jooyung Han580eb4f2020-06-24 19:33:06 +09004206 filegroup {
4207 name: "my-file-contexts",
4208 srcs: ["product_specific_file_contexts"],
4209 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004210 `, withFiles(map[string][]byte{
4211 "product_specific_file_contexts": nil,
4212 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004213 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4214 rule := module.Output("file_contexts")
4215 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004216}
4217
Jiyong Park67882562019-03-21 01:11:21 +09004218func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004219 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004220 apex_key {
4221 name: "myapex.key",
4222 public_key: ":my.avbpubkey",
4223 private_key: ":my.pem",
4224 product_specific: true,
4225 }
4226
4227 filegroup {
4228 name: "my.avbpubkey",
4229 srcs: ["testkey2.avbpubkey"],
4230 }
4231
4232 filegroup {
4233 name: "my.pem",
4234 srcs: ["testkey2.pem"],
4235 }
4236 `)
4237
4238 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4239 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004240 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004241 if actual_pubkey != expected_pubkey {
4242 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4243 }
4244 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004245 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004246 if actual_privkey != expected_privkey {
4247 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4248 }
4249}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004250
4251func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004252 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004253 prebuilt_apex {
4254 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004255 arch: {
4256 arm64: {
4257 src: "myapex-arm64.apex",
4258 },
4259 arm: {
4260 src: "myapex-arm.apex",
4261 },
4262 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004263 }
4264 `)
4265
4266 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4267
Jiyong Parkc95714e2019-03-29 14:23:10 +09004268 expectedInput := "myapex-arm64.apex"
4269 if prebuilt.inputApex.String() != expectedInput {
4270 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4271 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004272}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004273
4274func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004275 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004276 prebuilt_apex {
4277 name: "myapex",
4278 src: "myapex-arm.apex",
4279 filename: "notmyapex.apex",
4280 }
4281 `)
4282
4283 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4284
4285 expected := "notmyapex.apex"
4286 if p.installFilename != expected {
4287 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4288 }
4289}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004290
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004291func TestPrebuiltOverrides(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004292 ctx, _ := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004293 prebuilt_apex {
4294 name: "myapex.prebuilt",
4295 src: "myapex-arm.apex",
4296 overrides: [
4297 "myapex",
4298 ],
4299 }
4300 `)
4301
4302 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4303
4304 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004305 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004306 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004307 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004308 }
4309}
4310
Paul Duffin092153d2021-01-26 11:42:39 +00004311// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4312// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004313func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4314 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004315 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004316 }
4317
Paul Duffin89886cb2021-02-05 16:44:03 +00004318 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004319 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004320 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004321 dexJarBuildPath := p.DexJarBuildPath()
4322 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
4323 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4324 }
4325 }
4326
Paul Duffin89886cb2021-02-05 16:44:03 +00004327 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004328 // Make sure that an apex variant is not created for the source module.
4329 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests("libfoo"); !reflect.DeepEqual(expected, actual) {
4330 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4331 }
4332 }
4333
4334 t.Run("prebuilt only", func(t *testing.T) {
4335 bp := `
4336 prebuilt_apex {
4337 name: "myapex",
4338 arch: {
4339 arm64: {
4340 src: "myapex-arm64.apex",
4341 },
4342 arm: {
4343 src: "myapex-arm.apex",
4344 },
4345 },
4346 exported_java_libs: ["libfoo"],
4347 }
4348
4349 java_import {
4350 name: "libfoo",
4351 jars: ["libfoo.jar"],
4352 }
4353 `
4354
4355 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4356 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4357
Paul Duffin89886cb2021-02-05 16:44:03 +00004358 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00004359 })
4360
4361 t.Run("prebuilt with source preferred", func(t *testing.T) {
4362
4363 bp := `
4364 prebuilt_apex {
4365 name: "myapex",
4366 arch: {
4367 arm64: {
4368 src: "myapex-arm64.apex",
4369 },
4370 arm: {
4371 src: "myapex-arm.apex",
4372 },
4373 },
4374 exported_java_libs: ["libfoo"],
4375 }
4376
4377 java_import {
4378 name: "libfoo",
4379 jars: ["libfoo.jar"],
4380 }
4381
4382 java_library {
4383 name: "libfoo",
4384 }
4385 `
4386
4387 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4388 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4389
Paul Duffin89886cb2021-02-05 16:44:03 +00004390 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
4391 ensureNoSourceVariant(t, ctx)
Paul Duffin064b70c2020-11-02 17:32:38 +00004392 })
4393
4394 t.Run("prebuilt preferred with source", func(t *testing.T) {
4395 bp := `
4396 prebuilt_apex {
4397 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004398 arch: {
4399 arm64: {
4400 src: "myapex-arm64.apex",
4401 },
4402 arm: {
4403 src: "myapex-arm.apex",
4404 },
4405 },
4406 exported_java_libs: ["libfoo"],
4407 }
4408
4409 java_import {
4410 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004411 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004412 jars: ["libfoo.jar"],
4413 }
4414
4415 java_library {
4416 name: "libfoo",
4417 }
4418 `
4419
4420 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4421 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4422
Paul Duffin89886cb2021-02-05 16:44:03 +00004423 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
4424 ensureNoSourceVariant(t, ctx)
Paul Duffin064b70c2020-11-02 17:32:38 +00004425 })
4426}
4427
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004428func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4429 transform := func(config *dexpreopt.GlobalConfig) {
4430 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
4431 }
4432
Paul Duffin89886cb2021-02-05 16:44:03 +00004433 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, bootDexJarPath string) {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004434 s := ctx.SingletonForTests("dex_bootjars")
4435 foundLibfooJar := false
4436 for _, output := range s.AllOutputs() {
4437 if strings.HasSuffix(output, "/libfoo.jar") {
4438 foundLibfooJar = true
4439 buildRule := s.Output(output)
4440 actual := android.NormalizePathForTesting(buildRule.Input)
4441 if actual != bootDexJarPath {
4442 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4443 }
4444 }
4445 }
4446 if !foundLibfooJar {
4447 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4448 }
4449 }
4450
Paul Duffin4fd997b2021-02-03 20:06:33 +00004451 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
4452 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4453 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4454 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4455 }
4456
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004457 t.Run("prebuilt only", func(t *testing.T) {
4458 bp := `
4459 prebuilt_apex {
4460 name: "myapex",
4461 arch: {
4462 arm64: {
4463 src: "myapex-arm64.apex",
4464 },
4465 arm: {
4466 src: "myapex-arm.apex",
4467 },
4468 },
4469 exported_java_libs: ["libfoo"],
4470 }
4471
4472 java_import {
4473 name: "libfoo",
4474 jars: ["libfoo.jar"],
4475 apex_available: ["myapex"],
4476 }
4477 `
4478
4479 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin89886cb2021-02-05 16:44:03 +00004480 checkBootDexJarPath(t, ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004481
Paul Duffin9d67ca62021-02-03 20:06:33 +00004482 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4483 checkHiddenAPIIndexInputs(t, ctx, `
4484.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4485`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004486 })
4487
4488 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4489 bp := `
4490 prebuilt_apex {
4491 name: "myapex",
4492 arch: {
4493 arm64: {
4494 src: "myapex-arm64.apex",
4495 },
4496 arm: {
4497 src: "myapex-arm.apex",
4498 },
4499 },
4500 exported_java_libs: ["libfoo"],
4501 }
4502
4503 java_import {
4504 name: "libfoo",
4505 jars: ["libfoo.jar"],
4506 apex_available: ["myapex"],
4507 }
4508
4509 java_library {
4510 name: "libfoo",
4511 srcs: ["foo/bar/MyClass.java"],
4512 apex_available: ["myapex"],
4513 }
4514 `
4515
4516 // In this test the source (java_library) libfoo is active since the
4517 // prebuilt (java_import) defaults to prefer:false. However the
4518 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4519 // find the dex boot jar in it. We either need to disable the source libfoo
4520 // or make the prebuilt libfoo preferred.
4521 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4522 })
4523
4524 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4525 bp := `
4526 prebuilt_apex {
4527 name: "myapex",
4528 arch: {
4529 arm64: {
4530 src: "myapex-arm64.apex",
4531 },
4532 arm: {
4533 src: "myapex-arm.apex",
4534 },
4535 },
4536 exported_java_libs: ["libfoo"],
4537 }
4538
4539 java_import {
4540 name: "libfoo",
4541 prefer: true,
4542 jars: ["libfoo.jar"],
4543 apex_available: ["myapex"],
4544 }
4545
4546 java_library {
4547 name: "libfoo",
4548 srcs: ["foo/bar/MyClass.java"],
4549 apex_available: ["myapex"],
4550 }
4551 `
4552
4553 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin89886cb2021-02-05 16:44:03 +00004554 checkBootDexJarPath(t, ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004555
Paul Duffin9d67ca62021-02-03 20:06:33 +00004556 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4557 checkHiddenAPIIndexInputs(t, ctx, `
4558.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4559`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004560 })
4561
4562 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4563 bp := `
4564 apex {
4565 name: "myapex",
4566 key: "myapex.key",
4567 java_libs: ["libfoo"],
4568 }
4569
4570 apex_key {
4571 name: "myapex.key",
4572 public_key: "testkey.avbpubkey",
4573 private_key: "testkey.pem",
4574 }
4575
4576 prebuilt_apex {
4577 name: "myapex",
4578 arch: {
4579 arm64: {
4580 src: "myapex-arm64.apex",
4581 },
4582 arm: {
4583 src: "myapex-arm.apex",
4584 },
4585 },
4586 exported_java_libs: ["libfoo"],
4587 }
4588
4589 java_import {
4590 name: "libfoo",
4591 jars: ["libfoo.jar"],
4592 apex_available: ["myapex"],
4593 }
4594
4595 java_library {
4596 name: "libfoo",
4597 srcs: ["foo/bar/MyClass.java"],
4598 apex_available: ["myapex"],
4599 }
4600 `
4601
4602 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffinf38931c2021-02-05 16:58:28 +00004603 checkBootDexJarPath(t, ctx, ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004604
4605 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4606 checkHiddenAPIIndexInputs(t, ctx, `
4607.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4608`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004609 })
4610
4611 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4612 bp := `
4613 apex {
4614 name: "myapex",
4615 enabled: false,
4616 key: "myapex.key",
4617 java_libs: ["libfoo"],
4618 }
4619
4620 apex_key {
4621 name: "myapex.key",
4622 public_key: "testkey.avbpubkey",
4623 private_key: "testkey.pem",
4624 }
4625
4626 prebuilt_apex {
4627 name: "myapex",
4628 arch: {
4629 arm64: {
4630 src: "myapex-arm64.apex",
4631 },
4632 arm: {
4633 src: "myapex-arm.apex",
4634 },
4635 },
4636 exported_java_libs: ["libfoo"],
4637 }
4638
4639 java_import {
4640 name: "libfoo",
4641 prefer: true,
4642 jars: ["libfoo.jar"],
4643 apex_available: ["myapex"],
4644 }
4645
4646 java_library {
4647 name: "libfoo",
4648 srcs: ["foo/bar/MyClass.java"],
4649 apex_available: ["myapex"],
4650 }
4651 `
4652
4653 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin89886cb2021-02-05 16:44:03 +00004654 checkBootDexJarPath(t, ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004655
Paul Duffin9d67ca62021-02-03 20:06:33 +00004656 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4657 checkHiddenAPIIndexInputs(t, ctx, `
4658.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4659`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004660 })
4661}
4662
Roland Levillain630846d2019-06-26 12:48:34 +01004663func TestApexWithTests(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004664 ctx, _ := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004665 apex_test {
4666 name: "myapex",
4667 key: "myapex.key",
4668 tests: [
4669 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004670 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004671 ],
4672 }
4673
4674 apex_key {
4675 name: "myapex.key",
4676 public_key: "testkey.avbpubkey",
4677 private_key: "testkey.pem",
4678 }
4679
Liz Kammer1c14a212020-05-12 15:26:55 -07004680 filegroup {
4681 name: "fg",
4682 srcs: [
4683 "baz",
4684 "bar/baz"
4685 ],
4686 }
4687
Roland Levillain630846d2019-06-26 12:48:34 +01004688 cc_test {
4689 name: "mytest",
4690 gtest: false,
4691 srcs: ["mytest.cpp"],
4692 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004693 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004694 system_shared_libs: [],
4695 static_executable: true,
4696 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004697 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004698 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004699
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004700 cc_library {
4701 name: "mylib",
4702 srcs: ["mylib.cpp"],
4703 system_shared_libs: [],
4704 stl: "none",
4705 }
4706
Liz Kammer5bd365f2020-05-27 15:15:11 -07004707 filegroup {
4708 name: "fg2",
4709 srcs: [
4710 "testdata/baz"
4711 ],
4712 }
4713
Roland Levillain9b5fde92019-06-28 15:41:19 +01004714 cc_test {
4715 name: "mytests",
4716 gtest: false,
4717 srcs: [
4718 "mytest1.cpp",
4719 "mytest2.cpp",
4720 "mytest3.cpp",
4721 ],
4722 test_per_src: true,
4723 relative_install_path: "test",
4724 system_shared_libs: [],
4725 static_executable: true,
4726 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004727 data: [
4728 ":fg",
4729 ":fg2",
4730 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004731 }
Roland Levillain630846d2019-06-26 12:48:34 +01004732 `)
4733
Sundong Ahnabb64432019-10-22 13:58:29 +09004734 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004735 copyCmds := apexRule.Args["copy_commands"]
4736
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004737 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004738 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004739 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004740
Liz Kammer1c14a212020-05-12 15:26:55 -07004741 //Ensure that test data are copied into apex.
4742 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4743 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4744
Roland Levillain9b5fde92019-06-28 15:41:19 +01004745 // Ensure that test deps built with `test_per_src` are copied into apex.
4746 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4747 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4748 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004749
4750 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004751 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004752 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004753 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004754 prefix := "TARGET_"
4755 var builder strings.Builder
4756 data.Custom(&builder, name, prefix, "", data)
4757 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004758 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4759 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4760 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4761 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004762 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004763 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004764 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004765
4766 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004767 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004768 data.Custom(&builder, name, prefix, "", data)
4769 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004770 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4771 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004772}
4773
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004774func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004775 ctx, _ := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004776 apex {
4777 name: "myapex",
4778 key: "myapex.key",
4779 }
4780 apex_key {
4781 name: "myapex.key",
4782 public_key: "testkey.avbpubkey",
4783 private_key: "testkey.pem",
4784 }
4785 `, func(fs map[string][]byte, config android.Config) {
4786 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4787 })
4788 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004789 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004790 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004791 var builder strings.Builder
4792 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4793 androidMk := builder.String()
4794 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4795}
4796
Jooyung Hand48f3c32019-08-23 11:18:57 +09004797func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4798 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4799 apex {
4800 name: "myapex",
4801 key: "myapex.key",
4802 native_shared_libs: ["libfoo"],
4803 }
4804
4805 apex_key {
4806 name: "myapex.key",
4807 public_key: "testkey.avbpubkey",
4808 private_key: "testkey.pem",
4809 }
4810
4811 cc_library {
4812 name: "libfoo",
4813 stl: "none",
4814 system_shared_libs: [],
4815 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004816 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004817 }
4818 `)
4819 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4820 apex {
4821 name: "myapex",
4822 key: "myapex.key",
4823 java_libs: ["myjar"],
4824 }
4825
4826 apex_key {
4827 name: "myapex.key",
4828 public_key: "testkey.avbpubkey",
4829 private_key: "testkey.pem",
4830 }
4831
4832 java_library {
4833 name: "myjar",
4834 srcs: ["foo/bar/MyClass.java"],
4835 sdk_version: "none",
4836 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004837 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004838 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004839 }
4840 `)
4841}
4842
Bill Peckhama41a6962021-01-11 10:58:54 -08004843func TestApexWithJavaImport(t *testing.T) {
4844 ctx, _ := testApex(t, `
4845 apex {
4846 name: "myapex",
4847 key: "myapex.key",
4848 java_libs: ["myjavaimport"],
4849 }
4850
4851 apex_key {
4852 name: "myapex.key",
4853 public_key: "testkey.avbpubkey",
4854 private_key: "testkey.pem",
4855 }
4856
4857 java_import {
4858 name: "myjavaimport",
4859 apex_available: ["myapex"],
4860 jars: ["my.jar"],
4861 compile_dex: true,
4862 }
4863 `)
4864
4865 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4866 apexRule := module.Rule("apexRule")
4867 copyCmds := apexRule.Args["copy_commands"]
4868 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
4869}
4870
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004871func TestApexWithApps(t *testing.T) {
4872 ctx, _ := testApex(t, `
4873 apex {
4874 name: "myapex",
4875 key: "myapex.key",
4876 apps: [
4877 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004878 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004879 ],
4880 }
4881
4882 apex_key {
4883 name: "myapex.key",
4884 public_key: "testkey.avbpubkey",
4885 private_key: "testkey.pem",
4886 }
4887
4888 android_app {
4889 name: "AppFoo",
4890 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004891 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004892 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004893 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004894 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004895 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004896 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004897
4898 android_app {
4899 name: "AppFooPriv",
4900 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004901 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004902 system_modules: "none",
4903 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004904 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004905 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004906 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004907
4908 cc_library_shared {
4909 name: "libjni",
4910 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004911 shared_libs: ["libfoo"],
4912 stl: "none",
4913 system_shared_libs: [],
4914 apex_available: [ "myapex" ],
4915 sdk_version: "current",
4916 }
4917
4918 cc_library_shared {
4919 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004920 stl: "none",
4921 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004922 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004923 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004924 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004925 `)
4926
Sundong Ahnabb64432019-10-22 13:58:29 +09004927 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004928 apexRule := module.Rule("apexRule")
4929 copyCmds := apexRule.Args["copy_commands"]
4930
4931 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004932 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004933
Colin Crossaede88c2020-08-11 12:17:01 -07004934 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004935 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004936 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004937 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004938 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004939 // JNI libraries including transitive deps are
4940 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004941 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004942 // ... embedded inside APK (jnilibs.zip)
4943 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4944 // ... and not directly inside the APEX
4945 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4946 }
Dario Frenicde2a032019-10-27 00:29:22 +01004947}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004948
Dario Frenicde2a032019-10-27 00:29:22 +01004949func TestApexWithAppImports(t *testing.T) {
4950 ctx, _ := testApex(t, `
4951 apex {
4952 name: "myapex",
4953 key: "myapex.key",
4954 apps: [
4955 "AppFooPrebuilt",
4956 "AppFooPrivPrebuilt",
4957 ],
4958 }
4959
4960 apex_key {
4961 name: "myapex.key",
4962 public_key: "testkey.avbpubkey",
4963 private_key: "testkey.pem",
4964 }
4965
4966 android_app_import {
4967 name: "AppFooPrebuilt",
4968 apk: "PrebuiltAppFoo.apk",
4969 presigned: true,
4970 dex_preopt: {
4971 enabled: false,
4972 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004973 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004974 }
4975
4976 android_app_import {
4977 name: "AppFooPrivPrebuilt",
4978 apk: "PrebuiltAppFooPriv.apk",
4979 privileged: true,
4980 presigned: true,
4981 dex_preopt: {
4982 enabled: false,
4983 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004984 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004985 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004986 }
4987 `)
4988
Sundong Ahnabb64432019-10-22 13:58:29 +09004989 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004990 apexRule := module.Rule("apexRule")
4991 copyCmds := apexRule.Args["copy_commands"]
4992
4993 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004994 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4995}
4996
4997func TestApexWithAppImportsPrefer(t *testing.T) {
4998 ctx, _ := testApex(t, `
4999 apex {
5000 name: "myapex",
5001 key: "myapex.key",
5002 apps: [
5003 "AppFoo",
5004 ],
5005 }
5006
5007 apex_key {
5008 name: "myapex.key",
5009 public_key: "testkey.avbpubkey",
5010 private_key: "testkey.pem",
5011 }
5012
5013 android_app {
5014 name: "AppFoo",
5015 srcs: ["foo/bar/MyClass.java"],
5016 sdk_version: "none",
5017 system_modules: "none",
5018 apex_available: [ "myapex" ],
5019 }
5020
5021 android_app_import {
5022 name: "AppFoo",
5023 apk: "AppFooPrebuilt.apk",
5024 filename: "AppFooPrebuilt.apk",
5025 presigned: true,
5026 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005027 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005028 }
5029 `, withFiles(map[string][]byte{
5030 "AppFooPrebuilt.apk": nil,
5031 }))
5032
5033 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5034 "app/AppFoo/AppFooPrebuilt.apk",
5035 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005036}
5037
Dario Freni6f3937c2019-12-20 22:58:03 +00005038func TestApexWithTestHelperApp(t *testing.T) {
5039 ctx, _ := testApex(t, `
5040 apex {
5041 name: "myapex",
5042 key: "myapex.key",
5043 apps: [
5044 "TesterHelpAppFoo",
5045 ],
5046 }
5047
5048 apex_key {
5049 name: "myapex.key",
5050 public_key: "testkey.avbpubkey",
5051 private_key: "testkey.pem",
5052 }
5053
5054 android_test_helper_app {
5055 name: "TesterHelpAppFoo",
5056 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005057 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005058 }
5059
5060 `)
5061
5062 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5063 apexRule := module.Rule("apexRule")
5064 copyCmds := apexRule.Args["copy_commands"]
5065
5066 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5067}
5068
Jooyung Han18020ea2019-11-13 10:50:48 +09005069func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5070 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005071 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005072 apex {
5073 name: "myapex",
5074 key: "myapex.key",
5075 native_shared_libs: ["libfoo"],
5076 }
5077
5078 apex_key {
5079 name: "myapex.key",
5080 public_key: "testkey.avbpubkey",
5081 private_key: "testkey.pem",
5082 }
5083
5084 apex {
5085 name: "otherapex",
5086 key: "myapex.key",
5087 native_shared_libs: ["libfoo"],
5088 }
5089
5090 cc_defaults {
5091 name: "libfoo-defaults",
5092 apex_available: ["otherapex"],
5093 }
5094
5095 cc_library {
5096 name: "libfoo",
5097 defaults: ["libfoo-defaults"],
5098 stl: "none",
5099 system_shared_libs: [],
5100 }`)
5101}
5102
Paul Duffine52e66f2020-03-30 17:54:29 +01005103func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005104 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005105 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005106 apex {
5107 name: "myapex",
5108 key: "myapex.key",
5109 native_shared_libs: ["libfoo"],
5110 }
5111
5112 apex_key {
5113 name: "myapex.key",
5114 public_key: "testkey.avbpubkey",
5115 private_key: "testkey.pem",
5116 }
5117
5118 apex {
5119 name: "otherapex",
5120 key: "otherapex.key",
5121 native_shared_libs: ["libfoo"],
5122 }
5123
5124 apex_key {
5125 name: "otherapex.key",
5126 public_key: "testkey.avbpubkey",
5127 private_key: "testkey.pem",
5128 }
5129
5130 cc_library {
5131 name: "libfoo",
5132 stl: "none",
5133 system_shared_libs: [],
5134 apex_available: ["otherapex"],
5135 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005136}
Jiyong Park127b40b2019-09-30 16:04:35 +09005137
Paul Duffine52e66f2020-03-30 17:54:29 +01005138func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005139 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00005140 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005141.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005142.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005143.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005144.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005145.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005146.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005147 apex {
5148 name: "myapex",
5149 key: "myapex.key",
5150 native_shared_libs: ["libfoo"],
5151 }
5152
5153 apex_key {
5154 name: "myapex.key",
5155 public_key: "testkey.avbpubkey",
5156 private_key: "testkey.pem",
5157 }
5158
Jiyong Park127b40b2019-09-30 16:04:35 +09005159 cc_library {
5160 name: "libfoo",
5161 stl: "none",
5162 shared_libs: ["libbar"],
5163 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005164 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005165 }
5166
5167 cc_library {
5168 name: "libbar",
5169 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005170 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005171 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005172 apex_available: ["myapex"],
5173 }
5174
5175 cc_library {
5176 name: "libbaz",
5177 stl: "none",
5178 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005179 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005180}
Jiyong Park127b40b2019-09-30 16:04:35 +09005181
Paul Duffine52e66f2020-03-30 17:54:29 +01005182func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005183 testApexError(t, "\"otherapex\" is not a valid module name", `
5184 apex {
5185 name: "myapex",
5186 key: "myapex.key",
5187 native_shared_libs: ["libfoo"],
5188 }
5189
5190 apex_key {
5191 name: "myapex.key",
5192 public_key: "testkey.avbpubkey",
5193 private_key: "testkey.pem",
5194 }
5195
5196 cc_library {
5197 name: "libfoo",
5198 stl: "none",
5199 system_shared_libs: [],
5200 apex_available: ["otherapex"],
5201 }`)
5202
Paul Duffine52e66f2020-03-30 17:54:29 +01005203 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005204 apex {
5205 name: "myapex",
5206 key: "myapex.key",
5207 native_shared_libs: ["libfoo", "libbar"],
5208 }
5209
5210 apex_key {
5211 name: "myapex.key",
5212 public_key: "testkey.avbpubkey",
5213 private_key: "testkey.pem",
5214 }
5215
5216 cc_library {
5217 name: "libfoo",
5218 stl: "none",
5219 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005220 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005221 apex_available: ["myapex"],
5222 }
5223
5224 cc_library {
5225 name: "libbar",
5226 stl: "none",
5227 system_shared_libs: [],
5228 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005229 }
5230
5231 cc_library {
5232 name: "libbaz",
5233 stl: "none",
5234 system_shared_libs: [],
5235 stubs: {
5236 versions: ["10", "20", "30"],
5237 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005238 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005239}
Jiyong Park127b40b2019-09-30 16:04:35 +09005240
Jiyong Park89e850a2020-04-07 16:37:39 +09005241func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01005242 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005243 apex {
5244 name: "myapex",
5245 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005246 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005247 }
5248
5249 apex_key {
5250 name: "myapex.key",
5251 public_key: "testkey.avbpubkey",
5252 private_key: "testkey.pem",
5253 }
5254
5255 cc_library {
5256 name: "libfoo",
5257 stl: "none",
5258 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005259 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005260 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005261 }
5262
5263 cc_library {
5264 name: "libfoo2",
5265 stl: "none",
5266 system_shared_libs: [],
5267 shared_libs: ["libbaz"],
5268 apex_available: ["//apex_available:platform"],
5269 }
5270
5271 cc_library {
5272 name: "libbar",
5273 stl: "none",
5274 system_shared_libs: [],
5275 apex_available: ["myapex"],
5276 }
5277
5278 cc_library {
5279 name: "libbaz",
5280 stl: "none",
5281 system_shared_libs: [],
5282 apex_available: ["myapex"],
5283 stubs: {
5284 versions: ["1"],
5285 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005286 }`)
5287
Jiyong Park89e850a2020-04-07 16:37:39 +09005288 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5289 // because it depends on libbar which isn't available to platform
5290 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5291 if libfoo.NotAvailableForPlatform() != true {
5292 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5293 }
5294
5295 // libfoo2 however can be available to platform because it depends on libbaz which provides
5296 // stubs
5297 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5298 if libfoo2.NotAvailableForPlatform() == true {
5299 t.Errorf("%q should be available to platform", libfoo2.String())
5300 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005301}
Jiyong Parka90ca002019-10-07 15:47:24 +09005302
Paul Duffine52e66f2020-03-30 17:54:29 +01005303func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09005304 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005305 apex {
5306 name: "myapex",
5307 key: "myapex.key",
5308 native_shared_libs: ["libfoo"],
5309 }
5310
5311 apex_key {
5312 name: "myapex.key",
5313 public_key: "testkey.avbpubkey",
5314 private_key: "testkey.pem",
5315 }
5316
5317 cc_library {
5318 name: "libfoo",
5319 stl: "none",
5320 system_shared_libs: [],
5321 apex_available: ["myapex"],
5322 static: {
5323 apex_available: ["//apex_available:platform"],
5324 },
5325 }`)
5326
Jiyong Park89e850a2020-04-07 16:37:39 +09005327 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5328 if libfooShared.NotAvailableForPlatform() != true {
5329 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5330 }
5331 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5332 if libfooStatic.NotAvailableForPlatform() != false {
5333 t.Errorf("%q should be available to platform", libfooStatic.String())
5334 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005335}
5336
Jiyong Park5d790c32019-11-15 18:40:32 +09005337func TestOverrideApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005338 ctx, _ := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005339 apex {
5340 name: "myapex",
5341 key: "myapex.key",
5342 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005343 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09005344 }
5345
5346 override_apex {
5347 name: "override_myapex",
5348 base: "myapex",
5349 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005350 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005351 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005352 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005353 }
5354
5355 apex_key {
5356 name: "myapex.key",
5357 public_key: "testkey.avbpubkey",
5358 private_key: "testkey.pem",
5359 }
5360
5361 android_app {
5362 name: "app",
5363 srcs: ["foo/bar/MyClass.java"],
5364 package_name: "foo",
5365 sdk_version: "none",
5366 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005367 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005368 }
5369
5370 override_android_app {
5371 name: "override_app",
5372 base: "app",
5373 package_name: "bar",
5374 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005375 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005376
Jiyong Park317645e2019-12-05 13:20:58 +09005377 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5378 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5379 if originalVariant.GetOverriddenBy() != "" {
5380 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5381 }
5382 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5383 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5384 }
5385
Jiyong Park5d790c32019-11-15 18:40:32 +09005386 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5387 apexRule := module.Rule("apexRule")
5388 copyCmds := apexRule.Args["copy_commands"]
5389
5390 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005391 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005392
5393 apexBundle := module.Module().(*apexBundle)
5394 name := apexBundle.Name()
5395 if name != "override_myapex" {
5396 t.Errorf("name should be \"override_myapex\", but was %q", name)
5397 }
5398
Baligh Uddin004d7172020-02-19 21:29:28 -08005399 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5400 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5401 }
5402
Jiyong Park20bacab2020-03-03 11:45:41 +09005403 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005404 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005405
Colin Crossaa255532020-07-03 13:18:24 -07005406 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005407 var builder strings.Builder
5408 data.Custom(&builder, name, "TARGET_", "", data)
5409 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005410 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005411 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5412 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005413 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005414 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005415 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005416 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5417 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005418}
5419
Jooyung Han214bf372019-11-12 13:03:50 +09005420func TestLegacyAndroid10Support(t *testing.T) {
5421 ctx, _ := testApex(t, `
5422 apex {
5423 name: "myapex",
5424 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005425 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005426 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005427 }
5428
5429 apex_key {
5430 name: "myapex.key",
5431 public_key: "testkey.avbpubkey",
5432 private_key: "testkey.pem",
5433 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005434
5435 cc_library {
5436 name: "mylib",
5437 srcs: ["mylib.cpp"],
5438 stl: "libc++",
5439 system_shared_libs: [],
5440 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005441 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005442 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005443 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005444
5445 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5446 args := module.Rule("apexRule").Args
5447 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005448 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005449
5450 // The copies of the libraries in the apex should have one more dependency than
5451 // the ones outside the apex, namely the unwinder. Ideally we should check
5452 // the dependency names directly here but for some reason the names are blank in
5453 // this test.
5454 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005455 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005456 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5457 if len(apexImplicits) != len(nonApexImplicits)+1 {
5458 t.Errorf("%q missing unwinder dep", lib)
5459 }
5460 }
Jooyung Han214bf372019-11-12 13:03:50 +09005461}
5462
Paul Duffin9b879592020-05-26 13:21:35 +01005463var filesForSdkLibrary = map[string][]byte{
5464 "api/current.txt": nil,
5465 "api/removed.txt": nil,
5466 "api/system-current.txt": nil,
5467 "api/system-removed.txt": nil,
5468 "api/test-current.txt": nil,
5469 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005470
Anton Hanssondff2c782020-12-21 17:10:01 +00005471 "100/public/api/foo.txt": nil,
5472 "100/public/api/foo-removed.txt": nil,
5473 "100/system/api/foo.txt": nil,
5474 "100/system/api/foo-removed.txt": nil,
5475
Paul Duffineedc5d52020-06-12 17:46:39 +01005476 // For java_sdk_library_import
5477 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005478}
5479
Jooyung Han58f26ab2019-12-18 15:34:32 +09005480func TestJavaSDKLibrary(t *testing.T) {
5481 ctx, _ := testApex(t, `
5482 apex {
5483 name: "myapex",
5484 key: "myapex.key",
5485 java_libs: ["foo"],
5486 }
5487
5488 apex_key {
5489 name: "myapex.key",
5490 public_key: "testkey.avbpubkey",
5491 private_key: "testkey.pem",
5492 }
5493
5494 java_sdk_library {
5495 name: "foo",
5496 srcs: ["a.java"],
5497 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005498 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005499 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005500
5501 prebuilt_apis {
5502 name: "sdk",
5503 api_dirs: ["100"],
5504 }
Paul Duffin9b879592020-05-26 13:21:35 +01005505 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005506
5507 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005508 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005509 "javalib/foo.jar",
5510 "etc/permissions/foo.xml",
5511 })
5512 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005513 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5514 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005515}
5516
Paul Duffin9b879592020-05-26 13:21:35 +01005517func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5518 ctx, _ := testApex(t, `
5519 apex {
5520 name: "myapex",
5521 key: "myapex.key",
5522 java_libs: ["foo", "bar"],
5523 }
5524
5525 apex_key {
5526 name: "myapex.key",
5527 public_key: "testkey.avbpubkey",
5528 private_key: "testkey.pem",
5529 }
5530
5531 java_sdk_library {
5532 name: "foo",
5533 srcs: ["a.java"],
5534 api_packages: ["foo"],
5535 apex_available: ["myapex"],
5536 sdk_version: "none",
5537 system_modules: "none",
5538 }
5539
5540 java_library {
5541 name: "bar",
5542 srcs: ["a.java"],
5543 libs: ["foo"],
5544 apex_available: ["myapex"],
5545 sdk_version: "none",
5546 system_modules: "none",
5547 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005548
5549 prebuilt_apis {
5550 name: "sdk",
5551 api_dirs: ["100"],
5552 }
Paul Duffin9b879592020-05-26 13:21:35 +01005553 `, withFiles(filesForSdkLibrary))
5554
5555 // java_sdk_library installs both impl jar and permission XML
5556 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5557 "javalib/bar.jar",
5558 "javalib/foo.jar",
5559 "etc/permissions/foo.xml",
5560 })
5561
5562 // The bar library should depend on the implementation jar.
5563 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5564 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5565 t.Errorf("expected %q, found %#q", expected, actual)
5566 }
5567}
5568
5569func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5570 ctx, _ := testApex(t, `
5571 apex {
5572 name: "myapex",
5573 key: "myapex.key",
5574 java_libs: ["foo"],
5575 }
5576
5577 apex_key {
5578 name: "myapex.key",
5579 public_key: "testkey.avbpubkey",
5580 private_key: "testkey.pem",
5581 }
5582
5583 java_sdk_library {
5584 name: "foo",
5585 srcs: ["a.java"],
5586 api_packages: ["foo"],
5587 apex_available: ["myapex"],
5588 sdk_version: "none",
5589 system_modules: "none",
5590 }
5591
5592 java_library {
5593 name: "bar",
5594 srcs: ["a.java"],
5595 libs: ["foo"],
5596 sdk_version: "none",
5597 system_modules: "none",
5598 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005599
5600 prebuilt_apis {
5601 name: "sdk",
5602 api_dirs: ["100"],
5603 }
Paul Duffin9b879592020-05-26 13:21:35 +01005604 `, withFiles(filesForSdkLibrary))
5605
5606 // java_sdk_library installs both impl jar and permission XML
5607 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5608 "javalib/foo.jar",
5609 "etc/permissions/foo.xml",
5610 })
5611
5612 // The bar library should depend on the stubs jar.
5613 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5614 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5615 t.Errorf("expected %q, found %#q", expected, actual)
5616 }
5617}
5618
Paul Duffineedc5d52020-06-12 17:46:39 +01005619func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005620 ctx, _ := testApex(t, `
5621 prebuilt_apis {
5622 name: "sdk",
5623 api_dirs: ["100"],
5624 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005625 withFiles(map[string][]byte{
5626 "apex/a.java": nil,
5627 "apex/apex_manifest.json": nil,
5628 "apex/Android.bp": []byte(`
5629 package {
5630 default_visibility: ["//visibility:private"],
5631 }
5632
5633 apex {
5634 name: "myapex",
5635 key: "myapex.key",
5636 java_libs: ["foo", "bar"],
5637 }
5638
5639 apex_key {
5640 name: "myapex.key",
5641 public_key: "testkey.avbpubkey",
5642 private_key: "testkey.pem",
5643 }
5644
5645 java_library {
5646 name: "bar",
5647 srcs: ["a.java"],
5648 libs: ["foo"],
5649 apex_available: ["myapex"],
5650 sdk_version: "none",
5651 system_modules: "none",
5652 }
5653`),
5654 "source/a.java": nil,
5655 "source/api/current.txt": nil,
5656 "source/api/removed.txt": nil,
5657 "source/Android.bp": []byte(`
5658 package {
5659 default_visibility: ["//visibility:private"],
5660 }
5661
5662 java_sdk_library {
5663 name: "foo",
5664 visibility: ["//apex"],
5665 srcs: ["a.java"],
5666 api_packages: ["foo"],
5667 apex_available: ["myapex"],
5668 sdk_version: "none",
5669 system_modules: "none",
5670 public: {
5671 enabled: true,
5672 },
5673 }
5674`),
5675 "prebuilt/a.jar": nil,
5676 "prebuilt/Android.bp": []byte(`
5677 package {
5678 default_visibility: ["//visibility:private"],
5679 }
5680
5681 java_sdk_library_import {
5682 name: "foo",
5683 visibility: ["//apex", "//source"],
5684 apex_available: ["myapex"],
5685 prefer: true,
5686 public: {
5687 jars: ["a.jar"],
5688 },
5689 }
5690`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005691 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005692 )
5693
5694 // java_sdk_library installs both impl jar and permission XML
5695 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5696 "javalib/bar.jar",
5697 "javalib/foo.jar",
5698 "etc/permissions/foo.xml",
5699 })
5700
5701 // The bar library should depend on the implementation jar.
5702 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5703 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5704 t.Errorf("expected %q, found %#q", expected, actual)
5705 }
5706}
5707
5708func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5709 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5710 apex {
5711 name: "myapex",
5712 key: "myapex.key",
5713 java_libs: ["foo"],
5714 }
5715
5716 apex_key {
5717 name: "myapex.key",
5718 public_key: "testkey.avbpubkey",
5719 private_key: "testkey.pem",
5720 }
5721
5722 java_sdk_library_import {
5723 name: "foo",
5724 apex_available: ["myapex"],
5725 prefer: true,
5726 public: {
5727 jars: ["a.jar"],
5728 },
5729 }
5730
5731 `, withFiles(filesForSdkLibrary))
5732}
5733
atrost6e126252020-01-27 17:01:16 +00005734func TestCompatConfig(t *testing.T) {
5735 ctx, _ := testApex(t, `
5736 apex {
5737 name: "myapex",
5738 key: "myapex.key",
5739 prebuilts: ["myjar-platform-compat-config"],
5740 java_libs: ["myjar"],
5741 }
5742
5743 apex_key {
5744 name: "myapex.key",
5745 public_key: "testkey.avbpubkey",
5746 private_key: "testkey.pem",
5747 }
5748
5749 platform_compat_config {
5750 name: "myjar-platform-compat-config",
5751 src: ":myjar",
5752 }
5753
5754 java_library {
5755 name: "myjar",
5756 srcs: ["foo/bar/MyClass.java"],
5757 sdk_version: "none",
5758 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005759 apex_available: [ "myapex" ],
5760 }
5761 `)
5762 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5763 "etc/compatconfig/myjar-platform-compat-config.xml",
5764 "javalib/myjar.jar",
5765 })
5766}
5767
Jiyong Park479321d2019-12-16 11:47:12 +09005768func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5769 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5770 apex {
5771 name: "myapex",
5772 key: "myapex.key",
5773 java_libs: ["myjar"],
5774 }
5775
5776 apex_key {
5777 name: "myapex.key",
5778 public_key: "testkey.avbpubkey",
5779 private_key: "testkey.pem",
5780 }
5781
5782 java_library {
5783 name: "myjar",
5784 srcs: ["foo/bar/MyClass.java"],
5785 sdk_version: "none",
5786 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005787 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005788 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005789 }
5790 `)
5791}
5792
Jiyong Park7afd1072019-12-30 16:56:33 +09005793func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005794 ctx, _ := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005795 apex {
5796 name: "myapex",
5797 key: "myapex.key",
5798 native_shared_libs: ["mylib"],
5799 }
5800
5801 apex_key {
5802 name: "myapex.key",
5803 public_key: "testkey.avbpubkey",
5804 private_key: "testkey.pem",
5805 }
5806
5807 cc_library {
5808 name: "mylib",
5809 srcs: ["mylib.cpp"],
5810 system_shared_libs: [],
5811 stl: "none",
5812 required: ["a", "b"],
5813 host_required: ["c", "d"],
5814 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005815 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005816 }
5817 `)
5818
5819 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005820 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09005821 name := apexBundle.BaseModuleName()
5822 prefix := "TARGET_"
5823 var builder strings.Builder
5824 data.Custom(&builder, name, prefix, "", data)
5825 androidMk := builder.String()
5826 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5827 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5828 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5829}
5830
Jiyong Park7cd10e32020-01-14 09:22:18 +09005831func TestSymlinksFromApexToSystem(t *testing.T) {
5832 bp := `
5833 apex {
5834 name: "myapex",
5835 key: "myapex.key",
5836 native_shared_libs: ["mylib"],
5837 java_libs: ["myjar"],
5838 }
5839
Jiyong Park9d677202020-02-19 16:29:35 +09005840 apex {
5841 name: "myapex.updatable",
5842 key: "myapex.key",
5843 native_shared_libs: ["mylib"],
5844 java_libs: ["myjar"],
5845 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005846 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005847 }
5848
Jiyong Park7cd10e32020-01-14 09:22:18 +09005849 apex_key {
5850 name: "myapex.key",
5851 public_key: "testkey.avbpubkey",
5852 private_key: "testkey.pem",
5853 }
5854
5855 cc_library {
5856 name: "mylib",
5857 srcs: ["mylib.cpp"],
5858 shared_libs: ["myotherlib"],
5859 system_shared_libs: [],
5860 stl: "none",
5861 apex_available: [
5862 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005863 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005864 "//apex_available:platform",
5865 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005866 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005867 }
5868
5869 cc_library {
5870 name: "myotherlib",
5871 srcs: ["mylib.cpp"],
5872 system_shared_libs: [],
5873 stl: "none",
5874 apex_available: [
5875 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005876 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005877 "//apex_available:platform",
5878 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005879 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005880 }
5881
5882 java_library {
5883 name: "myjar",
5884 srcs: ["foo/bar/MyClass.java"],
5885 sdk_version: "none",
5886 system_modules: "none",
5887 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005888 apex_available: [
5889 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005890 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005891 "//apex_available:platform",
5892 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005893 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005894 }
5895
5896 java_library {
5897 name: "myotherjar",
5898 srcs: ["foo/bar/MyClass.java"],
5899 sdk_version: "none",
5900 system_modules: "none",
5901 apex_available: [
5902 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005903 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005904 "//apex_available:platform",
5905 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005906 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005907 }
5908 `
5909
5910 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5911 for _, f := range files {
5912 if f.path == file {
5913 if f.isLink {
5914 t.Errorf("%q is not a real file", file)
5915 }
5916 return
5917 }
5918 }
5919 t.Errorf("%q is not found", file)
5920 }
5921
5922 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5923 for _, f := range files {
5924 if f.path == file {
5925 if !f.isLink {
5926 t.Errorf("%q is not a symlink", file)
5927 }
5928 return
5929 }
5930 }
5931 t.Errorf("%q is not found", file)
5932 }
5933
Jiyong Park9d677202020-02-19 16:29:35 +09005934 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5935 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005936 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005937 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005938 ensureRealfileExists(t, files, "javalib/myjar.jar")
5939 ensureRealfileExists(t, files, "lib64/mylib.so")
5940 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5941
Jiyong Park9d677202020-02-19 16:29:35 +09005942 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5943 ensureRealfileExists(t, files, "javalib/myjar.jar")
5944 ensureRealfileExists(t, files, "lib64/mylib.so")
5945 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5946
5947 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005948 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005949 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005950 ensureRealfileExists(t, files, "javalib/myjar.jar")
5951 ensureRealfileExists(t, files, "lib64/mylib.so")
5952 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005953
5954 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5955 ensureRealfileExists(t, files, "javalib/myjar.jar")
5956 ensureRealfileExists(t, files, "lib64/mylib.so")
5957 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005958}
5959
Yo Chiange8128052020-07-23 20:09:18 +08005960func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005961 ctx, _ := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08005962 apex {
5963 name: "myapex",
5964 key: "myapex.key",
5965 native_shared_libs: ["mylib"],
5966 }
5967
5968 apex_key {
5969 name: "myapex.key",
5970 public_key: "testkey.avbpubkey",
5971 private_key: "testkey.pem",
5972 }
5973
5974 cc_library_shared {
5975 name: "mylib",
5976 srcs: ["mylib.cpp"],
5977 shared_libs: ["myotherlib"],
5978 system_shared_libs: [],
5979 stl: "none",
5980 apex_available: [
5981 "myapex",
5982 "//apex_available:platform",
5983 ],
5984 }
5985
5986 cc_prebuilt_library_shared {
5987 name: "myotherlib",
5988 srcs: ["prebuilt.so"],
5989 system_shared_libs: [],
5990 stl: "none",
5991 apex_available: [
5992 "myapex",
5993 "//apex_available:platform",
5994 ],
5995 }
5996 `)
5997
5998 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005999 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006000 var builder strings.Builder
6001 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6002 androidMk := builder.String()
6003 // `myotherlib` is added to `myapex` as symlink
6004 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6005 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6006 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6007 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006008 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 +08006009}
6010
Jooyung Han643adc42020-02-27 13:50:06 +09006011func TestApexWithJniLibs(t *testing.T) {
6012 ctx, _ := testApex(t, `
6013 apex {
6014 name: "myapex",
6015 key: "myapex.key",
6016 jni_libs: ["mylib"],
6017 }
6018
6019 apex_key {
6020 name: "myapex.key",
6021 public_key: "testkey.avbpubkey",
6022 private_key: "testkey.pem",
6023 }
6024
6025 cc_library {
6026 name: "mylib",
6027 srcs: ["mylib.cpp"],
6028 shared_libs: ["mylib2"],
6029 system_shared_libs: [],
6030 stl: "none",
6031 apex_available: [ "myapex" ],
6032 }
6033
6034 cc_library {
6035 name: "mylib2",
6036 srcs: ["mylib.cpp"],
6037 system_shared_libs: [],
6038 stl: "none",
6039 apex_available: [ "myapex" ],
6040 }
6041 `)
6042
6043 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6044 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6045 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6046 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6047 "lib64/mylib.so",
6048 "lib64/mylib2.so",
6049 })
6050}
6051
Jooyung Han49f67012020-04-17 13:43:10 +09006052func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
6053 ctx, _ := testApex(t, `
6054 apex {
6055 name: "myapex",
6056 key: "myapex.key",
6057 }
6058 apex_key {
6059 name: "myapex.key",
6060 public_key: "testkey.avbpubkey",
6061 private_key: "testkey.pem",
6062 }
6063 `, func(fs map[string][]byte, config android.Config) {
6064 delete(config.Targets, android.Android)
6065 config.AndroidCommonTarget = android.Target{}
6066 })
6067
6068 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6069 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6070 }
6071}
6072
Jiyong Parkbd159612020-02-28 15:22:21 +09006073func TestAppBundle(t *testing.T) {
6074 ctx, _ := testApex(t, `
6075 apex {
6076 name: "myapex",
6077 key: "myapex.key",
6078 apps: ["AppFoo"],
6079 }
6080
6081 apex_key {
6082 name: "myapex.key",
6083 public_key: "testkey.avbpubkey",
6084 private_key: "testkey.pem",
6085 }
6086
6087 android_app {
6088 name: "AppFoo",
6089 srcs: ["foo/bar/MyClass.java"],
6090 sdk_version: "none",
6091 system_modules: "none",
6092 apex_available: [ "myapex" ],
6093 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006094 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006095
Colin Crosscf371cc2020-11-13 11:48:42 -08006096 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006097 content := bundleConfigRule.Args["content"]
6098
6099 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006100 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 +09006101}
6102
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006103func TestAppSetBundle(t *testing.T) {
6104 ctx, _ := testApex(t, `
6105 apex {
6106 name: "myapex",
6107 key: "myapex.key",
6108 apps: ["AppSet"],
6109 }
6110
6111 apex_key {
6112 name: "myapex.key",
6113 public_key: "testkey.avbpubkey",
6114 private_key: "testkey.pem",
6115 }
6116
6117 android_app_set {
6118 name: "AppSet",
6119 set: "AppSet.apks",
6120 }`)
6121 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006122 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006123 content := bundleConfigRule.Args["content"]
6124 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6125 s := mod.Rule("apexRule").Args["copy_commands"]
6126 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6127 if len(copyCmds) != 3 {
6128 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6129 }
6130 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6131 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6132 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6133}
6134
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006135func TestAppSetBundlePrebuilt(t *testing.T) {
6136 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
6137 bp := `
6138 apex_set {
6139 name: "myapex",
6140 filename: "foo_v2.apex",
6141 sanitized: {
6142 none: { set: "myapex.apks", },
6143 hwaddress: { set: "myapex.hwasan.apks", },
6144 },
6145 }`
6146 fs["Android.bp"] = []byte(bp)
6147
6148 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6149 })
6150
6151 m := ctx.ModuleForTests("myapex", "android_common")
6152 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6153
6154 actual := extractedApex.Inputs
6155 if len(actual) != 1 {
6156 t.Errorf("expected a single input")
6157 }
6158
6159 expected := "myapex.hwasan.apks"
6160 if actual[0].String() != expected {
6161 t.Errorf("expected %s, got %s", expected, actual[0].String())
6162 }
6163}
6164
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006165func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006166 t.Helper()
6167
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006168 bp := `
6169 java_library {
6170 name: "some-updatable-apex-lib",
6171 srcs: ["a.java"],
6172 sdk_version: "current",
6173 apex_available: [
6174 "some-updatable-apex",
6175 ],
6176 }
6177
6178 java_library {
6179 name: "some-non-updatable-apex-lib",
6180 srcs: ["a.java"],
6181 apex_available: [
6182 "some-non-updatable-apex",
6183 ],
6184 }
6185
6186 java_library {
6187 name: "some-platform-lib",
6188 srcs: ["a.java"],
6189 sdk_version: "current",
6190 installable: true,
6191 }
6192
6193 java_library {
6194 name: "some-art-lib",
6195 srcs: ["a.java"],
6196 sdk_version: "current",
6197 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006198 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006199 ],
6200 hostdex: true,
6201 }
6202
6203 apex {
6204 name: "some-updatable-apex",
6205 key: "some-updatable-apex.key",
6206 java_libs: ["some-updatable-apex-lib"],
6207 updatable: true,
6208 min_sdk_version: "current",
6209 }
6210
6211 apex {
6212 name: "some-non-updatable-apex",
6213 key: "some-non-updatable-apex.key",
6214 java_libs: ["some-non-updatable-apex-lib"],
6215 }
6216
6217 apex_key {
6218 name: "some-updatable-apex.key",
6219 }
6220
6221 apex_key {
6222 name: "some-non-updatable-apex.key",
6223 }
6224
6225 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006226 name: "com.android.art.debug",
6227 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006228 java_libs: ["some-art-lib"],
6229 updatable: true,
6230 min_sdk_version: "current",
6231 }
6232
6233 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006234 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006235 }
6236
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006237 filegroup {
6238 name: "some-updatable-apex-file_contexts",
6239 srcs: [
6240 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6241 ],
6242 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006243
6244 filegroup {
6245 name: "some-non-updatable-apex-file_contexts",
6246 srcs: [
6247 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6248 ],
6249 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006250 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006251
6252 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6253}
6254
Paul Duffin064b70c2020-11-02 17:32:38 +00006255func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006256 t.Helper()
6257
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006258 bp += cc.GatherRequiredDepsForTest(android.Android)
6259 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006260
6261 fs := map[string][]byte{
6262 "a.java": nil,
6263 "a.jar": nil,
6264 "build/make/target/product/security": nil,
6265 "apex_manifest.json": nil,
6266 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006267 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006268 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6269 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6270 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006271 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006272 }
6273 cc.GatherRequiredFilesForTest(fs)
6274
Colin Crossae8600b2020-10-29 17:09:13 -07006275 config := android.TestArchConfig(buildDir, nil, bp, fs)
6276
6277 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006278 ctx.RegisterModuleType("apex", BundleFactory)
6279 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006280 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006281 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006282 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01006283 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006284 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006285 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006286 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006287 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6288 ctx.PreDepsMutators(RegisterPreDepsMutators)
6289 ctx.PostDepsMutators(RegisterPostDepsMutators)
6290
Colin Crossae8600b2020-10-29 17:09:13 -07006291 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006292
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006293 pathCtx := android.PathContextForTesting(config)
6294 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6295 transformDexpreoptConfig(dexpreoptConfig)
6296 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6297
Paul Duffinf38931c2021-02-05 16:58:28 +00006298 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006299 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006300 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6301 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6302
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006303 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6304 android.FailIfErrored(t, errs)
6305
6306 _, errs = ctx.PrepareBuildActions(config)
6307 if errmsg == "" {
6308 android.FailIfErrored(t, errs)
6309 } else if len(errs) > 0 {
6310 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006311 } else {
6312 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6313 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006314
6315 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006316}
6317
Jooyung Han548640b2020-04-27 12:10:30 +09006318func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6319 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6320 apex {
6321 name: "myapex",
6322 key: "myapex.key",
6323 updatable: true,
6324 }
6325
6326 apex_key {
6327 name: "myapex.key",
6328 public_key: "testkey.avbpubkey",
6329 private_key: "testkey.pem",
6330 }
6331 `)
6332}
6333
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006334func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006335 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006336 var transform func(*dexpreopt.GlobalConfig)
6337
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006338 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6339 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006340 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006341 }
6342 testNoUpdatableJarsInBootImage(t, "", transform)
6343 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006344
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006345 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006346 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 +01006347 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006348 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006349 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006350 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006351 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006352
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006353 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 -07006354 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 +01006355 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006356 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006357 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006358 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006359 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006360
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006361 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 -07006362 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006363 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006364 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006365 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006366 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006367 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006368
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006369 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 -07006370 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 +01006371 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006372 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006373 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006374 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006375 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006376
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006377 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6378 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006379 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006380 }
6381 testNoUpdatableJarsInBootImage(t, "", transform)
6382 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006383
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006384 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006385 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006386 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006387 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006388 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006389 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006390 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006391
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006392 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006393 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006394 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006395 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006396 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006397 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006398 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006399
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006400 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006401 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006402 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006403 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006404 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006405 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006406 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006407
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006408 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6409 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006410 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006411 }
6412 testNoUpdatableJarsInBootImage(t, "", transform)
6413 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006414
6415}
6416
6417func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6418 transform := func(config *dexpreopt.GlobalConfig) {
6419 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6420 }
6421 t.Run("prebuilt no source", func(t *testing.T) {
6422 testDexpreoptWithApexes(t, `
6423 prebuilt_apex {
6424 name: "myapex" ,
6425 arch: {
6426 arm64: {
6427 src: "myapex-arm64.apex",
6428 },
6429 arm: {
6430 src: "myapex-arm.apex",
6431 },
6432 },
6433 exported_java_libs: ["libfoo"],
6434 }
6435
6436 java_import {
6437 name: "libfoo",
6438 jars: ["libfoo.jar"],
6439 }
6440`, "", transform)
6441 })
6442
6443 t.Run("prebuilt no source", func(t *testing.T) {
6444 testDexpreoptWithApexes(t, `
6445 prebuilt_apex {
6446 name: "myapex" ,
6447 arch: {
6448 arm64: {
6449 src: "myapex-arm64.apex",
6450 },
6451 arm: {
6452 src: "myapex-arm.apex",
6453 },
6454 },
6455 exported_java_libs: ["libfoo"],
6456 }
6457
6458 java_import {
6459 name: "libfoo",
6460 jars: ["libfoo.jar"],
6461 }
6462`, "", transform)
6463 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006464}
6465
Andrei Onea115e7e72020-06-05 21:14:03 +01006466func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6467 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006468 bp += `
6469 apex_key {
6470 name: "myapex.key",
6471 public_key: "testkey.avbpubkey",
6472 private_key: "testkey.pem",
6473 }`
6474 fs := map[string][]byte{
6475 "lib1/src/A.java": nil,
6476 "lib2/src/B.java": nil,
6477 "system/sepolicy/apex/myapex-file_contexts": nil,
6478 }
6479
Colin Crossae8600b2020-10-29 17:09:13 -07006480 config := android.TestArchConfig(buildDir, nil, bp, fs)
6481 android.SetTestNeverallowRules(config, rules)
6482 updatableBootJars := make([]string, 0, len(apexBootJars))
6483 for _, apexBootJar := range apexBootJars {
6484 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6485 }
6486 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6487
6488 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006489 ctx.RegisterModuleType("apex", BundleFactory)
6490 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6491 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6492 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006493 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006494 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6495 ctx.PreDepsMutators(RegisterPreDepsMutators)
6496 ctx.PostDepsMutators(RegisterPostDepsMutators)
6497 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6498
Colin Crossae8600b2020-10-29 17:09:13 -07006499 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006500
6501 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6502 android.FailIfErrored(t, errs)
6503
6504 _, errs = ctx.PrepareBuildActions(config)
6505 if errmsg == "" {
6506 android.FailIfErrored(t, errs)
6507 } else if len(errs) > 0 {
6508 android.FailIfNoMatchingErrors(t, errmsg, errs)
6509 return
6510 } else {
6511 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6512 }
6513}
6514
6515func TestApexPermittedPackagesRules(t *testing.T) {
6516 testcases := []struct {
6517 name string
6518 expectedError string
6519 bp string
6520 bootJars []string
6521 modulesPackages map[string][]string
6522 }{
6523
6524 {
6525 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6526 expectedError: "",
6527 bp: `
6528 java_library {
6529 name: "bcp_lib1",
6530 srcs: ["lib1/src/*.java"],
6531 permitted_packages: ["foo.bar"],
6532 apex_available: ["myapex"],
6533 sdk_version: "none",
6534 system_modules: "none",
6535 }
6536 java_library {
6537 name: "nonbcp_lib2",
6538 srcs: ["lib2/src/*.java"],
6539 apex_available: ["myapex"],
6540 permitted_packages: ["a.b"],
6541 sdk_version: "none",
6542 system_modules: "none",
6543 }
6544 apex {
6545 name: "myapex",
6546 key: "myapex.key",
6547 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6548 }`,
6549 bootJars: []string{"bcp_lib1"},
6550 modulesPackages: map[string][]string{
6551 "myapex": []string{
6552 "foo.bar",
6553 },
6554 },
6555 },
6556 {
6557 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6558 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.`,
6559 bp: `
6560 java_library {
6561 name: "bcp_lib1",
6562 srcs: ["lib1/src/*.java"],
6563 apex_available: ["myapex"],
6564 permitted_packages: ["foo.bar"],
6565 sdk_version: "none",
6566 system_modules: "none",
6567 }
6568 java_library {
6569 name: "bcp_lib2",
6570 srcs: ["lib2/src/*.java"],
6571 apex_available: ["myapex"],
6572 permitted_packages: ["foo.bar", "bar.baz"],
6573 sdk_version: "none",
6574 system_modules: "none",
6575 }
6576 apex {
6577 name: "myapex",
6578 key: "myapex.key",
6579 java_libs: ["bcp_lib1", "bcp_lib2"],
6580 }
6581 `,
6582 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6583 modulesPackages: map[string][]string{
6584 "myapex": []string{
6585 "foo.bar",
6586 },
6587 },
6588 },
6589 }
6590 for _, tc := range testcases {
6591 t.Run(tc.name, func(t *testing.T) {
6592 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6593 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6594 })
6595 }
6596}
6597
Jiyong Park62304bb2020-04-13 16:19:48 +09006598func TestTestFor(t *testing.T) {
6599 ctx, _ := testApex(t, `
6600 apex {
6601 name: "myapex",
6602 key: "myapex.key",
6603 native_shared_libs: ["mylib", "myprivlib"],
6604 }
6605
6606 apex_key {
6607 name: "myapex.key",
6608 public_key: "testkey.avbpubkey",
6609 private_key: "testkey.pem",
6610 }
6611
6612 cc_library {
6613 name: "mylib",
6614 srcs: ["mylib.cpp"],
6615 system_shared_libs: [],
6616 stl: "none",
6617 stubs: {
6618 versions: ["1"],
6619 },
6620 apex_available: ["myapex"],
6621 }
6622
6623 cc_library {
6624 name: "myprivlib",
6625 srcs: ["mylib.cpp"],
6626 system_shared_libs: [],
6627 stl: "none",
6628 apex_available: ["myapex"],
6629 }
6630
6631
6632 cc_test {
6633 name: "mytest",
6634 gtest: false,
6635 srcs: ["mylib.cpp"],
6636 system_shared_libs: [],
6637 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006638 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006639 test_for: ["myapex"]
6640 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006641
6642 cc_library {
6643 name: "mytestlib",
6644 srcs: ["mylib.cpp"],
6645 system_shared_libs: [],
6646 shared_libs: ["mylib", "myprivlib"],
6647 stl: "none",
6648 test_for: ["myapex"],
6649 }
6650
6651 cc_benchmark {
6652 name: "mybench",
6653 srcs: ["mylib.cpp"],
6654 system_shared_libs: [],
6655 shared_libs: ["mylib", "myprivlib"],
6656 stl: "none",
6657 test_for: ["myapex"],
6658 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006659 `)
6660
6661 // the test 'mytest' is a test for the apex, therefore is linked to the
6662 // actual implementation of mylib instead of its stub.
6663 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6664 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6665 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006666
6667 // The same should be true for cc_library
6668 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6669 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6670 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6671
6672 // ... and for cc_benchmark
6673 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6674 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6675 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006676}
6677
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006678// TODO(jungjw): Move this to proptools
6679func intPtr(i int) *int {
6680 return &i
6681}
6682
6683func TestApexSet(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006684 ctx, _ := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006685 apex_set {
6686 name: "myapex",
6687 set: "myapex.apks",
6688 filename: "foo_v2.apex",
6689 overrides: ["foo"],
6690 }
6691 `, func(fs map[string][]byte, config android.Config) {
6692 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006693 config.Targets[android.Android] = []android.Target{
6694 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6695 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6696 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006697 })
6698
6699 m := ctx.ModuleForTests("myapex", "android_common")
6700
6701 // Check extract_apks tool parameters.
6702 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6703 actual := extractedApex.Args["abis"]
6704 expected := "ARMEABI_V7A,ARM64_V8A"
6705 if actual != expected {
6706 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6707 }
6708 actual = extractedApex.Args["sdk-version"]
6709 expected = "30"
6710 if actual != expected {
6711 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6712 }
6713
6714 a := m.Module().(*ApexSet)
6715 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006716 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006717 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6718 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6719 }
6720}
6721
Jiyong Park7d95a512020-05-10 15:16:24 +09006722func TestNoStaticLinkingToStubsLib(t *testing.T) {
6723 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6724 apex {
6725 name: "myapex",
6726 key: "myapex.key",
6727 native_shared_libs: ["mylib"],
6728 }
6729
6730 apex_key {
6731 name: "myapex.key",
6732 public_key: "testkey.avbpubkey",
6733 private_key: "testkey.pem",
6734 }
6735
6736 cc_library {
6737 name: "mylib",
6738 srcs: ["mylib.cpp"],
6739 static_libs: ["otherlib"],
6740 system_shared_libs: [],
6741 stl: "none",
6742 apex_available: [ "myapex" ],
6743 }
6744
6745 cc_library {
6746 name: "otherlib",
6747 srcs: ["mylib.cpp"],
6748 system_shared_libs: [],
6749 stl: "none",
6750 stubs: {
6751 versions: ["1", "2", "3"],
6752 },
6753 apex_available: [ "myapex" ],
6754 }
6755 `)
6756}
6757
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006758func TestApexKeysTxt(t *testing.T) {
6759 ctx, _ := testApex(t, `
6760 apex {
6761 name: "myapex",
6762 key: "myapex.key",
6763 }
6764
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770
6771 prebuilt_apex {
6772 name: "myapex",
6773 prefer: true,
6774 arch: {
6775 arm64: {
6776 src: "myapex-arm64.apex",
6777 },
6778 arm: {
6779 src: "myapex-arm.apex",
6780 },
6781 },
6782 }
6783
6784 apex_set {
6785 name: "myapex_set",
6786 set: "myapex.apks",
6787 filename: "myapex_set.apex",
6788 overrides: ["myapex"],
6789 }
6790 `)
6791
6792 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6793 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6794 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 +09006795 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 +09006796}
6797
Jooyung Han938b5932020-06-20 12:47:47 +09006798func TestAllowedFiles(t *testing.T) {
6799 ctx, _ := testApex(t, `
6800 apex {
6801 name: "myapex",
6802 key: "myapex.key",
6803 apps: ["app"],
6804 allowed_files: "allowed.txt",
6805 }
6806
6807 apex_key {
6808 name: "myapex.key",
6809 public_key: "testkey.avbpubkey",
6810 private_key: "testkey.pem",
6811 }
6812
6813 android_app {
6814 name: "app",
6815 srcs: ["foo/bar/MyClass.java"],
6816 package_name: "foo",
6817 sdk_version: "none",
6818 system_modules: "none",
6819 apex_available: [ "myapex" ],
6820 }
6821 `, withFiles(map[string][]byte{
6822 "sub/Android.bp": []byte(`
6823 override_apex {
6824 name: "override_myapex",
6825 base: "myapex",
6826 apps: ["override_app"],
6827 allowed_files: ":allowed",
6828 }
6829 // Overridable "path" property should be referenced indirectly
6830 filegroup {
6831 name: "allowed",
6832 srcs: ["allowed.txt"],
6833 }
6834 override_android_app {
6835 name: "override_app",
6836 base: "app",
6837 package_name: "bar",
6838 }
6839 `),
6840 }))
6841
6842 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6843 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6844 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6845 }
6846
6847 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6848 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6849 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6850 }
6851}
6852
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006853func TestNonPreferredPrebuiltDependency(t *testing.T) {
6854 _, _ = testApex(t, `
6855 apex {
6856 name: "myapex",
6857 key: "myapex.key",
6858 native_shared_libs: ["mylib"],
6859 }
6860
6861 apex_key {
6862 name: "myapex.key",
6863 public_key: "testkey.avbpubkey",
6864 private_key: "testkey.pem",
6865 }
6866
6867 cc_library {
6868 name: "mylib",
6869 srcs: ["mylib.cpp"],
6870 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006871 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006872 },
6873 apex_available: ["myapex"],
6874 }
6875
6876 cc_prebuilt_library_shared {
6877 name: "mylib",
6878 prefer: false,
6879 srcs: ["prebuilt.so"],
6880 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006881 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006882 },
6883 apex_available: ["myapex"],
6884 }
6885 `)
6886}
6887
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006888func TestCompressedApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006889 ctx, _ := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006890 apex {
6891 name: "myapex",
6892 key: "myapex.key",
6893 compressible: true,
6894 }
6895 apex_key {
6896 name: "myapex.key",
6897 public_key: "testkey.avbpubkey",
6898 private_key: "testkey.pem",
6899 }
6900 `, func(fs map[string][]byte, config android.Config) {
6901 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6902 })
6903
6904 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6905 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6906
6907 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6908 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6909
6910 // Make sure output of bundle is .capex
6911 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6912 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6913
6914 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07006915 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006916 var builder strings.Builder
6917 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6918 androidMk := builder.String()
6919 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6920}
6921
Martin Stjernholm2856c662020-12-02 15:03:42 +00006922func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006923 ctx, _ := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00006924 apex {
6925 name: "myapex",
6926 key: "myapex.key",
6927 native_shared_libs: ["mylib"],
6928 }
6929
6930 apex_key {
6931 name: "myapex.key",
6932 public_key: "testkey.avbpubkey",
6933 private_key: "testkey.pem",
6934 }
6935
6936 cc_library {
6937 name: "mylib",
6938 srcs: ["mylib.cpp"],
6939 apex_available: ["myapex"],
6940 shared_libs: ["otherlib"],
6941 system_shared_libs: [],
6942 }
6943
6944 cc_library {
6945 name: "otherlib",
6946 srcs: ["mylib.cpp"],
6947 stubs: {
6948 versions: ["current"],
6949 },
6950 }
6951
6952 cc_prebuilt_library_shared {
6953 name: "otherlib",
6954 prefer: true,
6955 srcs: ["prebuilt.so"],
6956 stubs: {
6957 versions: ["current"],
6958 },
6959 }
6960 `)
6961
6962 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006963 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00006964 var builder strings.Builder
6965 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6966 androidMk := builder.String()
6967
6968 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6969 // a thing there.
6970 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6971}
6972
Jiyong Parke3867542020-12-03 17:28:25 +09006973func TestExcludeDependency(t *testing.T) {
6974 ctx, _ := testApex(t, `
6975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
6978 native_shared_libs: ["mylib"],
6979 }
6980
6981 apex_key {
6982 name: "myapex.key",
6983 public_key: "testkey.avbpubkey",
6984 private_key: "testkey.pem",
6985 }
6986
6987 cc_library {
6988 name: "mylib",
6989 srcs: ["mylib.cpp"],
6990 system_shared_libs: [],
6991 stl: "none",
6992 apex_available: ["myapex"],
6993 shared_libs: ["mylib2"],
6994 target: {
6995 apex: {
6996 exclude_shared_libs: ["mylib2"],
6997 },
6998 },
6999 }
7000
7001 cc_library {
7002 name: "mylib2",
7003 srcs: ["mylib.cpp"],
7004 system_shared_libs: [],
7005 stl: "none",
7006 }
7007 `)
7008
7009 // Check if mylib is linked to mylib2 for the non-apex target
7010 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7011 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7012
7013 // Make sure that the link doesn't occur for the apex target
7014 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7015 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7016
7017 // It shouldn't appear in the copy cmd as well.
7018 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7019 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7020}
7021
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007022func TestPrebuiltStubLibDep(t *testing.T) {
7023 bpBase := `
7024 apex {
7025 name: "myapex",
7026 key: "myapex.key",
7027 native_shared_libs: ["mylib"],
7028 }
7029 apex_key {
7030 name: "myapex.key",
7031 public_key: "testkey.avbpubkey",
7032 private_key: "testkey.pem",
7033 }
7034 cc_library {
7035 name: "mylib",
7036 srcs: ["mylib.cpp"],
7037 apex_available: ["myapex"],
7038 shared_libs: ["stublib"],
7039 system_shared_libs: [],
7040 }
7041 apex {
7042 name: "otherapex",
7043 enabled: %s,
7044 key: "myapex.key",
7045 native_shared_libs: ["stublib"],
7046 }
7047 `
7048
7049 stublibSourceBp := `
7050 cc_library {
7051 name: "stublib",
7052 srcs: ["mylib.cpp"],
7053 apex_available: ["otherapex"],
7054 system_shared_libs: [],
7055 stl: "none",
7056 stubs: {
7057 versions: ["1"],
7058 },
7059 }
7060 `
7061
7062 stublibPrebuiltBp := `
7063 cc_prebuilt_library_shared {
7064 name: "stublib",
7065 srcs: ["prebuilt.so"],
7066 apex_available: ["otherapex"],
7067 stubs: {
7068 versions: ["1"],
7069 },
7070 %s
7071 }
7072 `
7073
7074 tests := []struct {
7075 name string
7076 stublibBp string
7077 usePrebuilt bool
7078 modNames []string // Modules to collect AndroidMkEntries for
7079 otherApexEnabled []string
7080 }{
7081 {
7082 name: "only_source",
7083 stublibBp: stublibSourceBp,
7084 usePrebuilt: false,
7085 modNames: []string{"stublib"},
7086 otherApexEnabled: []string{"true", "false"},
7087 },
7088 {
7089 name: "source_preferred",
7090 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7091 usePrebuilt: false,
7092 modNames: []string{"stublib", "prebuilt_stublib"},
7093 otherApexEnabled: []string{"true", "false"},
7094 },
7095 {
7096 name: "prebuilt_preferred",
7097 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7098 usePrebuilt: true,
7099 modNames: []string{"stublib", "prebuilt_stublib"},
7100 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7101 },
7102 {
7103 name: "only_prebuilt",
7104 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7105 usePrebuilt: true,
7106 modNames: []string{"stublib"},
7107 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7108 },
7109 }
7110
7111 for _, test := range tests {
7112 t.Run(test.name, func(t *testing.T) {
7113 for _, otherApexEnabled := range test.otherApexEnabled {
7114 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07007115 ctx, _ := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007116
7117 type modAndMkEntries struct {
7118 mod *cc.Module
7119 mkEntries android.AndroidMkEntries
7120 }
7121 entries := []*modAndMkEntries{}
7122
7123 // Gather shared lib modules that are installable
7124 for _, modName := range test.modNames {
7125 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7126 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7127 continue
7128 }
7129 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007130 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007131 continue
7132 }
Colin Crossaa255532020-07-03 13:18:24 -07007133 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007134 if ent.Disabled {
7135 continue
7136 }
7137 entries = append(entries, &modAndMkEntries{
7138 mod: mod,
7139 mkEntries: ent,
7140 })
7141 }
7142 }
7143 }
7144
7145 var entry *modAndMkEntries = nil
7146 for _, ent := range entries {
7147 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7148 if entry != nil {
7149 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7150 } else {
7151 entry = ent
7152 }
7153 }
7154 }
7155
7156 if entry == nil {
7157 t.Errorf("AndroidMk entry for \"stublib\" missing")
7158 } else {
7159 isPrebuilt := entry.mod.Prebuilt() != nil
7160 if isPrebuilt != test.usePrebuilt {
7161 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7162 }
7163 if !entry.mod.IsStubs() {
7164 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7165 }
7166 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7167 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7168 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007169 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7170 expected := "-D__STUBLIB_API__=1"
7171 if !android.InList(expected, cflags) {
7172 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7173 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007174 }
7175 })
7176 }
7177 })
7178 }
7179}
7180
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007181func TestMain(m *testing.M) {
7182 run := func() int {
7183 setUp()
7184 defer tearDown()
7185
7186 return m.Run()
7187 }
7188
7189 os.Exit(run())
7190}