blob: 3e5ba7fc74a9090e87b638c5a00cb66e38f36c39 [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"
Paul Duffin37856732021-02-26 14:24:15 +000022 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070023 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010024 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090025 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070041var buildDir string
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Jooyung Han344d5432019-08-23 11:17:39 +090053func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
54 t.Helper()
55 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090056 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
57 if len(errs) > 0 {
58 android.FailIfNoMatchingErrors(t, pattern, errs)
59 return
60 }
61 _, errs = ctx.PrepareBuildActions(config)
62 if len(errs) > 0 {
63 android.FailIfNoMatchingErrors(t, pattern, errs)
64 return
65 }
66
67 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
68}
69
Colin Cross1c460562021-02-16 17:55:47 -080070func testApex(t *testing.T, bp string, handlers ...testCustomizer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090071 t.Helper()
72 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010073 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090074 android.FailIfErrored(t, errs)
75 _, errs = ctx.PrepareBuildActions(config)
76 android.FailIfErrored(t, errs)
Colin Cross1c460562021-02-16 17:55:47 -080077 return ctx
Jooyung Han5c998b92019-06-27 11:30:33 +090078}
79
Jooyung Han344d5432019-08-23 11:17:39 +090080type testCustomizer func(fs map[string][]byte, config android.Config)
81
82func withFiles(files map[string][]byte) testCustomizer {
83 return func(fs map[string][]byte, config android.Config) {
84 for k, v := range files {
85 fs[k] = v
86 }
87 }
88}
89
90func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
91 return func(fs map[string][]byte, config android.Config) {
92 for k, v := range targets {
93 config.Targets[k] = v
94 }
95 }
96}
97
Jooyung Han35155c42020-02-06 17:33:20 +090098// withNativeBridgeTargets sets configuration with targets including:
99// - X86_64 (primary)
100// - X86 (secondary)
101// - Arm64 on X86_64 (native bridge)
102// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700103func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900104 config.Targets[android.Android] = []android.Target{
105 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
109 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
110 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
111 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
112 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
113 }
114}
115
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900116func withManifestPackageNameOverrides(specs []string) testCustomizer {
117 return func(fs map[string][]byte, config android.Config) {
118 config.TestProductVariables.ManifestPackageNameOverrides = specs
119 }
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900123 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900127 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
128}
129
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700130func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900131 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900132 filegroup {
133 name: "myapex-file_contexts",
134 srcs: [
135 "system/sepolicy/apex/myapex-file_contexts",
136 ],
137 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900138 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800139
Colin Crossf9aabd72020-02-15 11:29:50 -0800140 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
141
Jiyong Park99644e92020-11-17 22:21:02 +0900142 bp = bp + rust.GatherRequiredDepsForTest()
143
Dario Frenicde2a032019-10-27 00:29:22 +0100144 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900145
Jooyung Han344d5432019-08-23 11:17:39 +0900146 fs := map[string][]byte{
Colin Cross2807f002021-03-02 10:15:29 -0800147 "a.java": nil,
148 "PrebuiltAppFoo.apk": nil,
149 "PrebuiltAppFooPriv.apk": nil,
150 "build/make/target/product/security": nil,
151 "apex_manifest.json": nil,
152 "AndroidManifest.xml": nil,
153 "system/sepolicy/apex/myapex-file_contexts": nil,
154 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
155 "system/sepolicy/apex/myapex2-file_contexts": nil,
156 "system/sepolicy/apex/otherapex-file_contexts": nil,
157 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
158 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800159 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800160 "mytest.cpp": nil,
161 "mytest1.cpp": nil,
162 "mytest2.cpp": nil,
163 "mytest3.cpp": nil,
164 "myprebuilt": nil,
165 "my_include": nil,
166 "foo/bar/MyClass.java": nil,
167 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100168 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800169 "vendor/foo/devkeys/test.x509.pem": nil,
170 "vendor/foo/devkeys/test.pk8": nil,
171 "testkey.x509.pem": nil,
172 "testkey.pk8": nil,
173 "testkey.override.x509.pem": nil,
174 "testkey.override.pk8": nil,
175 "vendor/foo/devkeys/testkey.avbpubkey": nil,
176 "vendor/foo/devkeys/testkey.pem": nil,
177 "NOTICE": nil,
178 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900179 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800180 "testkey2.avbpubkey": nil,
181 "testkey2.pem": nil,
182 "myapex-arm64.apex": nil,
183 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700184 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800185 "frameworks/base/api/current.txt": nil,
186 "framework/aidl/a.aidl": nil,
187 "build/make/core/proguard.flags": nil,
188 "build/make/core/proguard_basic_keeps.flags": nil,
189 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700190 "baz": nil,
191 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700192 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700193 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900194 "foo.rs": nil,
Paul Duffin064b70c2020-11-02 17:32:38 +0000195 "libfoo.jar": nil,
Paul Duffin39853512021-02-26 11:09:39 +0000196 "libbar.jar": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900197 }
198
Colin Crossf9aabd72020-02-15 11:29:50 -0800199 cc.GatherRequiredFilesForTest(fs)
200
Jooyung Han344d5432019-08-23 11:17:39 +0900201 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800202 // The fs now needs to be populated before creating the config, call handlers twice
203 // for now, once to get any fs changes, and later after the config was created to
204 // set product variables or targets.
205 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
206 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900207 }
208
Colin Cross98be1bb2019-12-13 20:41:13 -0800209 config := android.TestArchConfig(buildDir, nil, bp, fs)
210 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
211 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
212 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
213 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
214 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700215 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800216 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
217
218 for _, handler := range handlers {
219 // The fs now needs to be populated before creating the config, call handlers twice
220 // for now, earlier to get any fs changes, and now after the config was created to
221 // set product variables or targets.
222 tempFS := map[string][]byte{}
223 handler(tempFS, config)
224 }
225
Colin Crossae8600b2020-10-29 17:09:13 -0700226 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100227
228 // from android package
229 android.RegisterPackageBuildComponents(ctx)
230 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
231
Colin Cross98be1bb2019-12-13 20:41:13 -0800232 ctx.RegisterModuleType("apex", BundleFactory)
233 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
234 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
235 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
236 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
237 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
238 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700239 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800240
Jooyung Hana57af4a2020-01-23 05:36:59 +0000241 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100242 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000243
Paul Duffin021f4e52020-07-30 16:04:17 +0100244 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100245
Paul Duffin021f4e52020-07-30 16:04:17 +0100246 // Register these after the prebuilt mutators have been registered to match what
247 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100248 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
249 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
250
Paul Duffin6d119b82021-03-05 13:57:33 +0000251 // These must come after prebuilts and visibility rules to match runtime.
252 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
253
254 // These must come after override rules to match the runtime.
Paul Duffin021f4e52020-07-30 16:04:17 +0100255 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900256 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +0000257 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100258
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800261 cc.RegisterVndkLibraryTxtTypes(ctx)
Jooyung Han0703fd82020-08-26 22:11:53 +0900262 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000263 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700264 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900266 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800267 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800268
Colin Cross98be1bb2019-12-13 20:41:13 -0800269 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800270 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800271
Colin Crossae8600b2020-10-29 17:09:13 -0700272 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273
Jooyung Han5c998b92019-06-27 11:30:33 +0900274 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275}
276
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277func setUp() {
278 var err error
279 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700281 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283}
284
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700285func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700286 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287}
288
Jooyung Han643adc42020-02-27 13:50:06 +0900289// ensure that 'result' equals 'expected'
290func ensureEquals(t *testing.T, result string, expected string) {
291 t.Helper()
292 if result != expected {
293 t.Errorf("%q != %q", expected, result)
294 }
295}
296
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297// ensure that 'result' contains 'expected'
298func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900299 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900300 if !strings.Contains(result, expected) {
301 t.Errorf("%q is not found in %q", expected, result)
302 }
303}
304
Liz Kammer5bd365f2020-05-27 15:15:11 -0700305// ensure that 'result' contains 'expected' exactly one time
306func ensureContainsOnce(t *testing.T, result string, expected string) {
307 t.Helper()
308 count := strings.Count(result, expected)
309 if count != 1 {
310 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
311 }
312}
313
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314// ensures that 'result' does not contain 'notExpected'
315func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900316 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 if strings.Contains(result, notExpected) {
318 t.Errorf("%q is found in %q", notExpected, result)
319 }
320}
321
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700322func ensureMatches(t *testing.T, result string, expectedRex string) {
323 ok, err := regexp.MatchString(expectedRex, result)
324 if err != nil {
325 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
326 return
327 }
328 if !ok {
329 t.Errorf("%s does not match regular expession %s", result, expectedRex)
330 }
331}
332
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900334 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900335 if !android.InList(expected, result) {
336 t.Errorf("%q is not found in %v", expected, result)
337 }
338}
339
340func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900341 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900342 if android.InList(notExpected, result) {
343 t.Errorf("%q is found in %v", notExpected, result)
344 }
345}
346
Jooyung Hane1633032019-08-01 17:41:43 +0900347func ensureListEmpty(t *testing.T, result []string) {
348 t.Helper()
349 if len(result) > 0 {
350 t.Errorf("%q is expected to be empty", result)
351 }
352}
353
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000354func ensureListNotEmpty(t *testing.T, result []string) {
355 t.Helper()
356 if len(result) == 0 {
357 t.Errorf("%q is expected to be not empty", result)
358 }
359}
360
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361// Minimal test
362func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800363 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900364 apex_defaults {
365 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900366 manifest: ":myapex.manifest",
367 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900369 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900370 native_shared_libs: [
371 "mylib",
372 "libfoo.ffi",
373 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900374 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800375 multilib: {
376 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900377 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800378 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900379 },
Jiyong Park77acec62020-06-01 21:39:15 +0900380 java_libs: [
381 "myjar",
382 "myjar_dex",
383 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000384 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900385 }
386
Jiyong Park30ca9372019-02-07 16:27:23 +0900387 apex {
388 name: "myapex",
389 defaults: ["myapex-defaults"],
390 }
391
Jiyong Park25fc6a92018-11-18 18:02:45 +0900392 apex_key {
393 name: "myapex.key",
394 public_key: "testkey.avbpubkey",
395 private_key: "testkey.pem",
396 }
397
Jiyong Park809bb722019-02-13 21:33:49 +0900398 filegroup {
399 name: "myapex.manifest",
400 srcs: ["apex_manifest.json"],
401 }
402
403 filegroup {
404 name: "myapex.androidmanifest",
405 srcs: ["AndroidManifest.xml"],
406 }
407
Jiyong Park25fc6a92018-11-18 18:02:45 +0900408 cc_library {
409 name: "mylib",
410 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900411 shared_libs: [
412 "mylib2",
413 "libbar.ffi",
414 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900415 system_shared_libs: [],
416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000417 // TODO: remove //apex_available:platform
418 apex_available: [
419 "//apex_available:platform",
420 "myapex",
421 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900422 }
423
Alex Light3d673592019-01-18 14:37:31 -0800424 cc_binary {
425 name: "foo",
426 srcs: ["mylib.cpp"],
427 compile_multilib: "both",
428 multilib: {
429 lib32: {
430 suffix: "32",
431 },
432 lib64: {
433 suffix: "64",
434 },
435 },
436 symlinks: ["foo_link_"],
437 symlink_preferred_arch: true,
438 system_shared_libs: [],
439 static_executable: true,
440 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700441 apex_available: [ "myapex", "com.android.gki.*" ],
442 }
443
Jiyong Park99644e92020-11-17 22:21:02 +0900444 rust_binary {
445 name: "foo.rust",
446 srcs: ["foo.rs"],
447 rlibs: ["libfoo.rlib.rust"],
448 dylibs: ["libfoo.dylib.rust"],
449 apex_available: ["myapex"],
450 }
451
452 rust_library_rlib {
453 name: "libfoo.rlib.rust",
454 srcs: ["foo.rs"],
455 crate_name: "foo",
456 apex_available: ["myapex"],
457 }
458
459 rust_library_dylib {
460 name: "libfoo.dylib.rust",
461 srcs: ["foo.rs"],
462 crate_name: "foo",
463 apex_available: ["myapex"],
464 }
465
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900466 rust_ffi_shared {
467 name: "libfoo.ffi",
468 srcs: ["foo.rs"],
469 crate_name: "foo",
470 apex_available: ["myapex"],
471 }
472
473 rust_ffi_shared {
474 name: "libbar.ffi",
475 srcs: ["foo.rs"],
476 crate_name: "bar",
477 apex_available: ["myapex"],
478 }
479
Yifan Hongd22a84a2020-07-28 17:37:46 -0700480 apex {
481 name: "com.android.gki.fake",
482 binaries: ["foo"],
483 key: "myapex.key",
484 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000485 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800486 }
487
Paul Duffindddd5462020-04-07 15:25:44 +0100488 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900489 name: "mylib2",
490 srcs: ["mylib.cpp"],
491 system_shared_libs: [],
492 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900493 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900494 static_libs: ["libstatic"],
495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
500 }
501
Paul Duffindddd5462020-04-07 15:25:44 +0100502 cc_prebuilt_library_shared {
503 name: "mylib2",
504 srcs: ["prebuilt.so"],
505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
510 }
511
Jiyong Park9918e1a2020-03-17 19:16:40 +0900512 cc_library_static {
513 name: "libstatic",
514 srcs: ["mylib.cpp"],
515 system_shared_libs: [],
516 stl: "none",
517 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000518 // TODO: remove //apex_available:platform
519 apex_available: [
520 "//apex_available:platform",
521 "myapex",
522 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900523 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900524
525 java_library {
526 name: "myjar",
527 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900528 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900529 sdk_version: "none",
530 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900531 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900532 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000533 // TODO: remove //apex_available:platform
534 apex_available: [
535 "//apex_available:platform",
536 "myapex",
537 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900538 }
539
Jiyong Park77acec62020-06-01 21:39:15 +0900540 dex_import {
541 name: "myjar_dex",
542 jars: ["prebuilt.jar"],
543 apex_available: [
544 "//apex_available:platform",
545 "myapex",
546 ],
547 }
548
Jiyong Park7f7766d2019-07-25 22:02:35 +0900549 java_library {
550 name: "myotherjar",
551 srcs: ["foo/bar/MyClass.java"],
552 sdk_version: "none",
553 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900554 // TODO: remove //apex_available:platform
555 apex_available: [
556 "//apex_available:platform",
557 "myapex",
558 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900559 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900560
561 java_library {
562 name: "mysharedjar",
563 srcs: ["foo/bar/MyClass.java"],
564 sdk_version: "none",
565 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900566 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900567 `)
568
Sundong Ahnabb64432019-10-22 13:58:29 +0900569 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900570
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900571 // Make sure that Android.mk is created
572 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700573 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900574 var builder strings.Builder
575 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
576
577 androidMk := builder.String()
578 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
579 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
580
Jiyong Park42cca6c2019-04-01 11:15:50 +0900581 optFlags := apexRule.Args["opt_flags"]
582 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700583 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900584 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900585
Jiyong Park25fc6a92018-11-18 18:02:45 +0900586 copyCmds := apexRule.Args["copy_commands"]
587
588 // Ensure that main rule creates an output
589 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
590
591 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700592 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
593 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
594 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900595 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900596 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900597
598 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700599 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
600 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900601 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
602 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900603 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900604
605 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800606 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
607 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900608 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900609 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900610 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900611 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
612 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900613 // .. but not for java libs
614 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900615 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800616
Colin Cross7113d202019-11-20 16:39:12 -0800617 // Ensure that the platform variant ends with _shared or _common
618 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
619 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900620 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
621 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900622 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
623
624 // Ensure that dynamic dependency to java libs are not included
625 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800626
627 // Ensure that all symlinks are present.
628 found_foo_link_64 := false
629 found_foo := false
630 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900631 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800632 if strings.HasSuffix(cmd, "bin/foo") {
633 found_foo = true
634 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
635 found_foo_link_64 = true
636 }
637 }
638 }
639 good := found_foo && found_foo_link_64
640 if !good {
641 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
642 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900643
Sundong Ahnabb64432019-10-22 13:58:29 +0900644 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700645 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900646 if len(noticeInputs) != 3 {
647 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900648 }
649 ensureListContains(t, noticeInputs, "NOTICE")
650 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900651 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900652
Artur Satayeva8bd1132020-04-27 18:07:06 +0100653 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100654 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
655 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
656 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
657 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
658 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100659
660 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100661 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
662 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
663 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
664 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
665 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800666}
667
Jooyung Hanf21c7972019-12-16 22:32:06 +0900668func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800669 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900670 apex_defaults {
671 name: "myapex-defaults",
672 key: "myapex.key",
673 prebuilts: ["myetc"],
674 native_shared_libs: ["mylib"],
675 java_libs: ["myjar"],
676 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900677 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800678 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000679 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 }
681
682 prebuilt_etc {
683 name: "myetc",
684 src: "myprebuilt",
685 }
686
687 apex {
688 name: "myapex",
689 defaults: ["myapex-defaults"],
690 }
691
692 apex_key {
693 name: "myapex.key",
694 public_key: "testkey.avbpubkey",
695 private_key: "testkey.pem",
696 }
697
698 cc_library {
699 name: "mylib",
700 system_shared_libs: [],
701 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000702 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900703 }
704
705 java_library {
706 name: "myjar",
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 }
712
713 android_app {
714 name: "AppFoo",
715 srcs: ["foo/bar/MyClass.java"],
716 sdk_version: "none",
717 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000718 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900719 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900720
721 runtime_resource_overlay {
722 name: "rro",
723 theme: "blue",
724 }
725
markchien2f59ec92020-09-02 16:23:38 +0800726 bpf {
727 name: "bpf",
728 srcs: ["bpf.c", "bpf2.c"],
729 }
730
Jooyung Hanf21c7972019-12-16 22:32:06 +0900731 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000732 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900733 "etc/myetc",
734 "javalib/myjar.jar",
735 "lib64/mylib.so",
736 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900737 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800738 "etc/bpf/bpf.o",
739 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900740 })
741}
742
Jooyung Han01a3ee22019-11-02 02:52:25 +0900743func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800744 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900745 apex {
746 name: "myapex",
747 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000748 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900749 }
750
751 apex_key {
752 name: "myapex.key",
753 public_key: "testkey.avbpubkey",
754 private_key: "testkey.pem",
755 }
756 `)
757
758 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900759 args := module.Rule("apexRule").Args
760 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
761 t.Error("manifest should be apex_manifest.pb, but " + manifest)
762 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900763}
764
Alex Light5098a612018-11-29 17:12:15 -0800765func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800766 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800767 apex {
768 name: "myapex",
769 key: "myapex.key",
770 payload_type: "zip",
771 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000772 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800773 }
774
775 apex_key {
776 name: "myapex.key",
777 public_key: "testkey.avbpubkey",
778 private_key: "testkey.pem",
779 }
780
781 cc_library {
782 name: "mylib",
783 srcs: ["mylib.cpp"],
784 shared_libs: ["mylib2"],
785 system_shared_libs: [],
786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000787 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800788 }
789
790 cc_library {
791 name: "mylib2",
792 srcs: ["mylib.cpp"],
793 system_shared_libs: [],
794 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000795 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800796 }
797 `)
798
Sundong Ahnabb64432019-10-22 13:58:29 +0900799 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800800 copyCmds := zipApexRule.Args["copy_commands"]
801
802 // Ensure that main rule creates an output
803 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
804
805 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700806 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800807
808 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700809 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800810
811 // Ensure that both direct and indirect deps are copied into apex
812 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
813 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900814}
815
816func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800817 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900818 apex {
819 name: "myapex",
820 key: "myapex.key",
821 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000822 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900823 }
824
825 apex_key {
826 name: "myapex.key",
827 public_key: "testkey.avbpubkey",
828 private_key: "testkey.pem",
829 }
830
831 cc_library {
832 name: "mylib",
833 srcs: ["mylib.cpp"],
834 shared_libs: ["mylib2", "mylib3"],
835 system_shared_libs: [],
836 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000837 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838 }
839
840 cc_library {
841 name: "mylib2",
842 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900843 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900844 system_shared_libs: [],
845 stl: "none",
846 stubs: {
847 versions: ["1", "2", "3"],
848 },
849 }
850
851 cc_library {
852 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900853 srcs: ["mylib.cpp"],
854 shared_libs: ["mylib4"],
855 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900856 stl: "none",
857 stubs: {
858 versions: ["10", "11", "12"],
859 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900862
863 cc_library {
864 name: "mylib4",
865 srcs: ["mylib.cpp"],
866 system_shared_libs: [],
867 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000868 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900869 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 `)
871
Sundong Ahnabb64432019-10-22 13:58:29 +0900872 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 copyCmds := apexRule.Args["copy_commands"]
874
875 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800876 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877
878 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800879 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880
881 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800882 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883
Colin Crossaede88c2020-08-11 12:17:01 -0700884 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885
886 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900887 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900888 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900889 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890
891 // 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 -0700892 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900893 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700894 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900895
896 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900897 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900898 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900899
900 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700901 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900902
Jooyung Hana57af4a2020-01-23 05:36:59 +0000903 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900904 "lib64/mylib.so",
905 "lib64/mylib3.so",
906 "lib64/mylib4.so",
907 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908}
909
Colin Cross7812fd32020-09-25 12:35:10 -0700910func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
911 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800912 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700913 apex {
914 name: "myapex",
915 key: "myapex.key",
916 native_shared_libs: ["mylib", "mylib3"],
917 min_sdk_version: "29",
918 }
919
920 apex_key {
921 name: "myapex.key",
922 public_key: "testkey.avbpubkey",
923 private_key: "testkey.pem",
924 }
925
926 cc_library {
927 name: "mylib",
928 srcs: ["mylib.cpp"],
929 shared_libs: ["mylib2", "mylib3"],
930 system_shared_libs: [],
931 stl: "none",
932 apex_available: [ "myapex" ],
933 min_sdk_version: "28",
934 }
935
936 cc_library {
937 name: "mylib2",
938 srcs: ["mylib.cpp"],
939 cflags: ["-include mylib.h"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["28", "29", "30", "current"],
944 },
945 min_sdk_version: "28",
946 }
947
948 cc_library {
949 name: "mylib3",
950 srcs: ["mylib.cpp"],
951 shared_libs: ["mylib4"],
952 system_shared_libs: [],
953 stl: "none",
954 stubs: {
955 versions: ["28", "29", "30", "current"],
956 },
957 apex_available: [ "myapex" ],
958 min_sdk_version: "28",
959 }
960
961 cc_library {
962 name: "mylib4",
963 srcs: ["mylib.cpp"],
964 system_shared_libs: [],
965 stl: "none",
966 apex_available: [ "myapex" ],
967 min_sdk_version: "28",
968 }
969 `)
970
971 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
972 copyCmds := apexRule.Args["copy_commands"]
973
974 // Ensure that direct non-stubs dep is always included
975 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
976
977 // Ensure that indirect stubs dep is not included
978 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
979
980 // Ensure that direct stubs dep is included
981 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
982
983 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
984
Jiyong Park55549df2021-02-26 23:57:23 +0900985 // Ensure that mylib is linking with the latest version of stub for mylib2
986 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -0700987 // ... and not linking to the non-stub (impl) variant of mylib2
988 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
989
990 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
991 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
992 // .. and not linking to the stubs variant of mylib3
993 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
994
995 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700996 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700997 ensureNotContains(t, mylib2Cflags, "-include ")
998
999 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001000 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001001
1002 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1003 "lib64/mylib.so",
1004 "lib64/mylib3.so",
1005 "lib64/mylib4.so",
1006 })
1007}
1008
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001009func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1010 t.Parallel()
1011 // myapex (Z)
1012 // mylib -----------------.
1013 // |
1014 // otherapex (29) |
1015 // libstub's versions: 29 Z current
1016 // |
1017 // <platform> |
1018 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001019 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001020 apex {
1021 name: "myapex",
1022 key: "myapex.key",
1023 native_shared_libs: ["mylib"],
1024 min_sdk_version: "Z", // non-final
1025 }
1026
1027 cc_library {
1028 name: "mylib",
1029 srcs: ["mylib.cpp"],
1030 shared_libs: ["libstub"],
1031 apex_available: ["myapex"],
1032 min_sdk_version: "Z",
1033 }
1034
1035 apex_key {
1036 name: "myapex.key",
1037 public_key: "testkey.avbpubkey",
1038 private_key: "testkey.pem",
1039 }
1040
1041 apex {
1042 name: "otherapex",
1043 key: "myapex.key",
1044 native_shared_libs: ["libstub"],
1045 min_sdk_version: "29",
1046 }
1047
1048 cc_library {
1049 name: "libstub",
1050 srcs: ["mylib.cpp"],
1051 stubs: {
1052 versions: ["29", "Z", "current"],
1053 },
1054 apex_available: ["otherapex"],
1055 min_sdk_version: "29",
1056 }
1057
1058 // platform module depending on libstub from otherapex should use the latest stub("current")
1059 cc_library {
1060 name: "libplatform",
1061 srcs: ["mylib.cpp"],
1062 shared_libs: ["libstub"],
1063 }
1064 `, func(fs map[string][]byte, config android.Config) {
1065 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1066 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1067 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1068 })
1069
Jiyong Park55549df2021-02-26 23:57:23 +09001070 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001071 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001072 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001073 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001074 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001075
1076 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1077 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1078 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1079 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1080 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1081}
1082
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001083func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001084 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001085 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001086 name: "myapex2",
1087 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001088 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001089 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001090 }
1091
1092 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001093 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001094 public_key: "testkey.avbpubkey",
1095 private_key: "testkey.pem",
1096 }
1097
1098 cc_library {
1099 name: "mylib",
1100 srcs: ["mylib.cpp"],
1101 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001102 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001103 system_shared_libs: [],
1104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001105 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001106 }
1107
1108 cc_library {
1109 name: "libfoo",
1110 srcs: ["mylib.cpp"],
1111 shared_libs: ["libbar"],
1112 system_shared_libs: [],
1113 stl: "none",
1114 stubs: {
1115 versions: ["10", "20", "30"],
1116 },
1117 }
1118
1119 cc_library {
1120 name: "libbar",
1121 srcs: ["mylib.cpp"],
1122 system_shared_libs: [],
1123 stl: "none",
1124 }
1125
Jiyong Park678c8812020-02-07 17:25:49 +09001126 cc_library_static {
1127 name: "libbaz",
1128 srcs: ["mylib.cpp"],
1129 system_shared_libs: [],
1130 stl: "none",
1131 apex_available: [ "myapex2" ],
1132 }
1133
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001134 `)
1135
Jiyong Park83dc74b2020-01-14 18:38:44 +09001136 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001137 copyCmds := apexRule.Args["copy_commands"]
1138
1139 // Ensure that direct non-stubs dep is always included
1140 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1141
1142 // Ensure that indirect stubs dep is not included
1143 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1144
1145 // Ensure that dependency of stubs is not included
1146 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1147
Colin Crossaede88c2020-08-11 12:17:01 -07001148 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001149
1150 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001151 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001152 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001153 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001154
Jiyong Park3ff16992019-12-27 14:11:47 +09001155 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001156
1157 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1158 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001159
Artur Satayeva8bd1132020-04-27 18:07:06 +01001160 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001161 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1162 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1163 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001164
Artur Satayeva8bd1132020-04-27 18:07:06 +01001165 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001166 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1167 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1168 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001169}
1170
Jooyung Hand3639552019-08-09 12:57:43 +09001171func TestApexWithRuntimeLibsDependency(t *testing.T) {
1172 /*
1173 myapex
1174 |
1175 v (runtime_libs)
1176 mylib ------+------> libfoo [provides stub]
1177 |
1178 `------> libbar
1179 */
Colin Cross1c460562021-02-16 17:55:47 -08001180 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001181 apex {
1182 name: "myapex",
1183 key: "myapex.key",
1184 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001185 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001186 }
1187
1188 apex_key {
1189 name: "myapex.key",
1190 public_key: "testkey.avbpubkey",
1191 private_key: "testkey.pem",
1192 }
1193
1194 cc_library {
1195 name: "mylib",
1196 srcs: ["mylib.cpp"],
1197 runtime_libs: ["libfoo", "libbar"],
1198 system_shared_libs: [],
1199 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001200 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001201 }
1202
1203 cc_library {
1204 name: "libfoo",
1205 srcs: ["mylib.cpp"],
1206 system_shared_libs: [],
1207 stl: "none",
1208 stubs: {
1209 versions: ["10", "20", "30"],
1210 },
1211 }
1212
1213 cc_library {
1214 name: "libbar",
1215 srcs: ["mylib.cpp"],
1216 system_shared_libs: [],
1217 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001218 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001219 }
1220
1221 `)
1222
Sundong Ahnabb64432019-10-22 13:58:29 +09001223 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001224 copyCmds := apexRule.Args["copy_commands"]
1225
1226 // Ensure that direct non-stubs dep is always included
1227 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1228
1229 // Ensure that indirect stubs dep is not included
1230 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1231
1232 // Ensure that runtime_libs dep in included
1233 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1234
Sundong Ahnabb64432019-10-22 13:58:29 +09001235 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001236 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1237 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001238
1239}
1240
Jooyung Han8ce8db92020-05-15 19:05:05 +09001241func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001242 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001243 bp := `
1244 apex {
1245 name: "com.android.runtime",
1246 key: "com.android.runtime.key",
1247 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001248 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001249 }
1250
1251 apex_key {
1252 name: "com.android.runtime.key",
1253 public_key: "testkey.avbpubkey",
1254 private_key: "testkey.pem",
1255 }
1256
1257 cc_library {
1258 name: "libc",
1259 no_libcrt: true,
1260 nocrt: true,
1261 stl: "none",
1262 system_shared_libs: [],
1263 stubs: { versions: ["1"] },
1264 apex_available: ["com.android.runtime"],
1265
1266 sanitize: {
1267 hwaddress: true,
1268 }
1269 }
1270
1271 cc_prebuilt_library_shared {
1272 name: "libclang_rt.hwasan-aarch64-android",
1273 no_libcrt: true,
1274 nocrt: true,
1275 stl: "none",
1276 system_shared_libs: [],
1277 srcs: [""],
1278 stubs: { versions: ["1"] },
1279
1280 sanitize: {
1281 never: true,
1282 },
1283 }
1284 `
1285 // override bp to use hard-coded names: com.android.runtime and libc
1286 fs["Android.bp"] = []byte(bp)
1287 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1288 })
1289
1290 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1291 "lib64/bionic/libc.so",
1292 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1293 })
1294
1295 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1296
1297 installed := hwasan.Description("install libclang_rt.hwasan")
1298 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1299
1300 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1301 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1302 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1303}
1304
1305func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001306 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001307 bp := `
1308 apex {
1309 name: "com.android.runtime",
1310 key: "com.android.runtime.key",
1311 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001312 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001313 }
1314
1315 apex_key {
1316 name: "com.android.runtime.key",
1317 public_key: "testkey.avbpubkey",
1318 private_key: "testkey.pem",
1319 }
1320
1321 cc_library {
1322 name: "libc",
1323 no_libcrt: true,
1324 nocrt: true,
1325 stl: "none",
1326 system_shared_libs: [],
1327 stubs: { versions: ["1"] },
1328 apex_available: ["com.android.runtime"],
1329 }
1330
1331 cc_prebuilt_library_shared {
1332 name: "libclang_rt.hwasan-aarch64-android",
1333 no_libcrt: true,
1334 nocrt: true,
1335 stl: "none",
1336 system_shared_libs: [],
1337 srcs: [""],
1338 stubs: { versions: ["1"] },
1339
1340 sanitize: {
1341 never: true,
1342 },
1343 }
1344 `
1345 // override bp to use hard-coded names: com.android.runtime and libc
1346 fs["Android.bp"] = []byte(bp)
1347 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1348
1349 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1350 })
1351
1352 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1353 "lib64/bionic/libc.so",
1354 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1355 })
1356
1357 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1358
1359 installed := hwasan.Description("install libclang_rt.hwasan")
1360 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1361
1362 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1363 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1364 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1365}
1366
Jooyung Han61b66e92020-03-21 14:21:46 +00001367func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1368 testcases := []struct {
1369 name string
1370 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001371 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001372 shouldLink string
1373 shouldNotLink []string
1374 }{
1375 {
Jiyong Park55549df2021-02-26 23:57:23 +09001376 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001377 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001378 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001379 shouldLink: "30",
1380 shouldNotLink: []string{"29"},
1381 },
1382 {
Jiyong Park55549df2021-02-26 23:57:23 +09001383 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001384 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001385 apexVariant: "apex29",
Jiyong Park55549df2021-02-26 23:57:23 +09001386 shouldLink: "30",
1387 shouldNotLink: []string{"29"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001388 },
1389 }
1390 for _, tc := range testcases {
1391 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001392 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001393 apex {
1394 name: "myapex",
1395 key: "myapex.key",
1396 use_vendor: true,
1397 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001398 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001399 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001400 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001401
Jooyung Han61b66e92020-03-21 14:21:46 +00001402 apex_key {
1403 name: "myapex.key",
1404 public_key: "testkey.avbpubkey",
1405 private_key: "testkey.pem",
1406 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001407
Jooyung Han61b66e92020-03-21 14:21:46 +00001408 cc_library {
1409 name: "mylib",
1410 srcs: ["mylib.cpp"],
1411 vendor_available: true,
1412 shared_libs: ["libbar"],
1413 system_shared_libs: [],
1414 stl: "none",
1415 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001416 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001417 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001418
Jooyung Han61b66e92020-03-21 14:21:46 +00001419 cc_library {
1420 name: "libbar",
1421 srcs: ["mylib.cpp"],
1422 system_shared_libs: [],
1423 stl: "none",
1424 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001425 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001426 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001427
Jooyung Han61b66e92020-03-21 14:21:46 +00001428 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001429 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001430 symbol_file: "",
1431 }
1432 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001433 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001434 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001435
Jooyung Han61b66e92020-03-21 14:21:46 +00001436 // Ensure that LLNDK dep is not included
1437 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1438 "lib64/mylib.so",
1439 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001440
Jooyung Han61b66e92020-03-21 14:21:46 +00001441 // Ensure that LLNDK dep is required
1442 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1443 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1444 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001445
Colin Crossaede88c2020-08-11 12:17:01 -07001446 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001447 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001448 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001449 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001450 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001451
Colin Crossaede88c2020-08-11 12:17:01 -07001452 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001453 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1454 })
1455 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001456}
1457
Jiyong Park25fc6a92018-11-18 18:02:45 +09001458func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001459 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001460 apex {
1461 name: "myapex",
1462 key: "myapex.key",
1463 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001464 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001465 }
1466
1467 apex_key {
1468 name: "myapex.key",
1469 public_key: "testkey.avbpubkey",
1470 private_key: "testkey.pem",
1471 }
1472
1473 cc_library {
1474 name: "mylib",
1475 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001476 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001477 shared_libs: ["libdl#27"],
1478 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001479 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001480 }
1481
1482 cc_library_shared {
1483 name: "mylib_shared",
1484 srcs: ["mylib.cpp"],
1485 shared_libs: ["libdl#27"],
1486 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001487 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001488 }
1489
1490 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001491 name: "libBootstrap",
1492 srcs: ["mylib.cpp"],
1493 stl: "none",
1494 bootstrap: true,
1495 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001496 `)
1497
Sundong Ahnabb64432019-10-22 13:58:29 +09001498 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001499 copyCmds := apexRule.Args["copy_commands"]
1500
1501 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001502 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001503 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1504 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001505
1506 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001507 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001508
Colin Crossaede88c2020-08-11 12:17:01 -07001509 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1510 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1511 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001512
1513 // For dependency to libc
1514 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001515 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001516 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001517 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001518 // ... Cflags from stub is correctly exported to mylib
1519 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1520 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1521
1522 // For dependency to libm
1523 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001524 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001525 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001526 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001527 // ... and is not compiling with the stub
1528 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1529 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1530
1531 // For dependency to libdl
1532 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001533 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001534 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001535 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1536 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001537 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001538 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001539 // ... Cflags from stub is correctly exported to mylib
1540 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1541 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001542
1543 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001544 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1545 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1546 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1547 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001548}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001549
Jooyung Han749dc692020-04-15 11:03:39 +09001550func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001551 // there are three links between liba --> libz.
1552 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001553 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001554 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001555 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001556 apex {
1557 name: "myapex",
1558 key: "myapex.key",
1559 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001560 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001561 }
1562
1563 apex {
1564 name: "otherapex",
1565 key: "myapex.key",
1566 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001567 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001568 }
1569
1570 apex_key {
1571 name: "myapex.key",
1572 public_key: "testkey.avbpubkey",
1573 private_key: "testkey.pem",
1574 }
1575
1576 cc_library {
1577 name: "libx",
1578 shared_libs: ["liba"],
1579 system_shared_libs: [],
1580 stl: "none",
1581 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001582 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001583 }
1584
1585 cc_library {
1586 name: "liby",
1587 shared_libs: ["liba"],
1588 system_shared_libs: [],
1589 stl: "none",
1590 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001591 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001592 }
1593
1594 cc_library {
1595 name: "liba",
1596 shared_libs: ["libz"],
1597 system_shared_libs: [],
1598 stl: "none",
1599 apex_available: [
1600 "//apex_available:anyapex",
1601 "//apex_available:platform",
1602 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001603 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001604 }
1605
1606 cc_library {
1607 name: "libz",
1608 system_shared_libs: [],
1609 stl: "none",
1610 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001611 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001612 },
1613 }
Jooyung Han749dc692020-04-15 11:03:39 +09001614 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001615
1616 expectLink := func(from, from_variant, to, to_variant string) {
1617 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1618 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1619 }
1620 expectNoLink := func(from, from_variant, to, to_variant string) {
1621 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1622 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1623 }
1624 // platform liba is linked to non-stub version
1625 expectLink("liba", "shared", "libz", "shared")
Jiyong Park55549df2021-02-26 23:57:23 +09001626 // liba in myapex is linked to #30
1627 expectLink("liba", "shared_apex29", "libz", "shared_30")
1628 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001629 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001630 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001631 expectLink("liba", "shared_apex30", "libz", "shared_30")
1632 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1633 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001634}
1635
Jooyung Hanaed150d2020-04-02 01:41:41 +09001636func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001637 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001638 apex {
1639 name: "myapex",
1640 key: "myapex.key",
1641 native_shared_libs: ["libx"],
1642 min_sdk_version: "R",
1643 }
1644
1645 apex_key {
1646 name: "myapex.key",
1647 public_key: "testkey.avbpubkey",
1648 private_key: "testkey.pem",
1649 }
1650
1651 cc_library {
1652 name: "libx",
1653 shared_libs: ["libz"],
1654 system_shared_libs: [],
1655 stl: "none",
1656 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001657 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001658 }
1659
1660 cc_library {
1661 name: "libz",
1662 system_shared_libs: [],
1663 stl: "none",
1664 stubs: {
1665 versions: ["29", "R"],
1666 },
1667 }
1668 `, func(fs map[string][]byte, config android.Config) {
1669 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1670 })
1671
1672 expectLink := func(from, from_variant, to, to_variant string) {
1673 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1674 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1675 }
1676 expectNoLink := func(from, from_variant, to, to_variant string) {
1677 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1678 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1679 }
Dan Albertc8060532020-07-22 22:32:17 -07001680 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001681 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1682 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001683}
1684
Jooyung Han749dc692020-04-15 11:03:39 +09001685func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001686 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001687 apex {
1688 name: "myapex",
1689 key: "myapex.key",
1690 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001691 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001692 }
1693
1694 apex_key {
1695 name: "myapex.key",
1696 public_key: "testkey.avbpubkey",
1697 private_key: "testkey.pem",
1698 }
1699
1700 cc_library {
1701 name: "libx",
1702 shared_libs: ["libz"],
1703 system_shared_libs: [],
1704 stl: "none",
1705 apex_available: [ "myapex" ],
1706 }
1707
1708 cc_library {
1709 name: "libz",
1710 system_shared_libs: [],
1711 stl: "none",
1712 stubs: {
1713 versions: ["1", "2"],
1714 },
1715 }
1716 `)
1717
1718 expectLink := func(from, from_variant, to, to_variant string) {
1719 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1720 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1721 }
1722 expectNoLink := func(from, from_variant, to, to_variant string) {
1723 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1724 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1725 }
Colin Crossaede88c2020-08-11 12:17:01 -07001726 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1727 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1728 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001729}
1730
1731func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001732 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001733 apex {
1734 name: "myapex",
1735 key: "myapex.key",
1736 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001737 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001738 }
1739
1740 apex_key {
1741 name: "myapex.key",
1742 public_key: "testkey.avbpubkey",
1743 private_key: "testkey.pem",
1744 }
1745
1746 cc_library {
1747 name: "libx",
1748 system_shared_libs: [],
1749 stl: "none",
1750 apex_available: [ "myapex" ],
1751 stubs: {
1752 versions: ["1", "2"],
1753 },
1754 }
1755
1756 cc_library {
1757 name: "libz",
1758 shared_libs: ["libx"],
1759 system_shared_libs: [],
1760 stl: "none",
1761 }
1762 `)
1763
1764 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001765 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001766 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1767 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1768 }
1769 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001770 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001771 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1772 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1773 }
1774 expectLink("libz", "shared", "libx", "shared_2")
1775 expectNoLink("libz", "shared", "libz", "shared_1")
1776 expectNoLink("libz", "shared", "libz", "shared")
1777}
1778
Jooyung Han75568392020-03-20 04:29:24 +09001779func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001780 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001781 apex {
1782 name: "myapex",
1783 key: "myapex.key",
1784 native_shared_libs: ["libx"],
1785 min_sdk_version: "29",
1786 }
1787
1788 apex_key {
1789 name: "myapex.key",
1790 public_key: "testkey.avbpubkey",
1791 private_key: "testkey.pem",
1792 }
1793
1794 cc_library {
1795 name: "libx",
1796 shared_libs: ["libbar"],
1797 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001798 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001799 }
1800
1801 cc_library {
1802 name: "libbar",
1803 stubs: {
1804 versions: ["29", "30"],
1805 },
1806 }
Jooyung Han75568392020-03-20 04:29:24 +09001807 `, func(fs map[string][]byte, config android.Config) {
1808 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1809 })
Jooyung Han03b51852020-02-26 22:45:42 +09001810 expectLink := func(from, from_variant, to, to_variant string) {
1811 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1812 libFlags := ld.Args["libFlags"]
1813 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1814 }
Colin Crossaede88c2020-08-11 12:17:01 -07001815 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001816}
1817
Jooyung Han75568392020-03-20 04:29:24 +09001818func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001819 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 native_shared_libs: ["libx"],
1824 min_sdk_version: "29",
1825 }
1826
1827 apex_key {
1828 name: "myapex.key",
1829 public_key: "testkey.avbpubkey",
1830 private_key: "testkey.pem",
1831 }
1832
1833 cc_library {
1834 name: "libx",
1835 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001836 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001837 }
Jooyung Han75568392020-03-20 04:29:24 +09001838 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001839
1840 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001841 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001842 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001843 // note that platform variant is not.
1844 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001845 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001846}
1847
Jooyung Han749dc692020-04-15 11:03:39 +09001848func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1849 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001853 native_shared_libs: ["mylib"],
1854 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
Jooyung Han749dc692020-04-15 11:03:39 +09001862
1863 cc_library {
1864 name: "mylib",
1865 srcs: ["mylib.cpp"],
1866 system_shared_libs: [],
1867 stl: "none",
1868 apex_available: [
1869 "myapex",
1870 ],
1871 min_sdk_version: "30",
1872 }
1873 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001874
1875 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1876 apex {
1877 name: "myapex",
1878 key: "myapex.key",
1879 native_shared_libs: ["libfoo.ffi"],
1880 min_sdk_version: "29",
1881 }
1882
1883 apex_key {
1884 name: "myapex.key",
1885 public_key: "testkey.avbpubkey",
1886 private_key: "testkey.pem",
1887 }
1888
1889 rust_ffi_shared {
1890 name: "libfoo.ffi",
1891 srcs: ["foo.rs"],
1892 crate_name: "foo",
1893 apex_available: [
1894 "myapex",
1895 ],
1896 min_sdk_version: "30",
1897 }
1898 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001899}
1900
1901func TestApexMinSdkVersion_Okay(t *testing.T) {
1902 testApex(t, `
1903 apex {
1904 name: "myapex",
1905 key: "myapex.key",
1906 native_shared_libs: ["libfoo"],
1907 java_libs: ["libbar"],
1908 min_sdk_version: "29",
1909 }
1910
1911 apex_key {
1912 name: "myapex.key",
1913 public_key: "testkey.avbpubkey",
1914 private_key: "testkey.pem",
1915 }
1916
1917 cc_library {
1918 name: "libfoo",
1919 srcs: ["mylib.cpp"],
1920 shared_libs: ["libfoo_dep"],
1921 apex_available: ["myapex"],
1922 min_sdk_version: "29",
1923 }
1924
1925 cc_library {
1926 name: "libfoo_dep",
1927 srcs: ["mylib.cpp"],
1928 apex_available: ["myapex"],
1929 min_sdk_version: "29",
1930 }
1931
1932 java_library {
1933 name: "libbar",
1934 sdk_version: "current",
1935 srcs: ["a.java"],
1936 static_libs: ["libbar_dep"],
1937 apex_available: ["myapex"],
1938 min_sdk_version: "29",
1939 }
1940
1941 java_library {
1942 name: "libbar_dep",
1943 sdk_version: "current",
1944 srcs: ["a.java"],
1945 apex_available: ["myapex"],
1946 min_sdk_version: "29",
1947 }
Jooyung Han03b51852020-02-26 22:45:42 +09001948 `)
1949}
1950
Artur Satayev8cf899a2020-04-15 17:29:42 +01001951func TestJavaStableSdkVersion(t *testing.T) {
1952 testCases := []struct {
1953 name string
1954 expectedError string
1955 bp string
1956 }{
1957 {
1958 name: "Non-updatable apex with non-stable dep",
1959 bp: `
1960 apex {
1961 name: "myapex",
1962 java_libs: ["myjar"],
1963 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001964 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01001965 }
1966 apex_key {
1967 name: "myapex.key",
1968 public_key: "testkey.avbpubkey",
1969 private_key: "testkey.pem",
1970 }
1971 java_library {
1972 name: "myjar",
1973 srcs: ["foo/bar/MyClass.java"],
1974 sdk_version: "core_platform",
1975 apex_available: ["myapex"],
1976 }
1977 `,
1978 },
1979 {
1980 name: "Updatable apex with stable dep",
1981 bp: `
1982 apex {
1983 name: "myapex",
1984 java_libs: ["myjar"],
1985 key: "myapex.key",
1986 updatable: true,
1987 min_sdk_version: "29",
1988 }
1989 apex_key {
1990 name: "myapex.key",
1991 public_key: "testkey.avbpubkey",
1992 private_key: "testkey.pem",
1993 }
1994 java_library {
1995 name: "myjar",
1996 srcs: ["foo/bar/MyClass.java"],
1997 sdk_version: "current",
1998 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001999 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002000 }
2001 `,
2002 },
2003 {
2004 name: "Updatable apex with non-stable dep",
2005 expectedError: "cannot depend on \"myjar\"",
2006 bp: `
2007 apex {
2008 name: "myapex",
2009 java_libs: ["myjar"],
2010 key: "myapex.key",
2011 updatable: true,
2012 }
2013 apex_key {
2014 name: "myapex.key",
2015 public_key: "testkey.avbpubkey",
2016 private_key: "testkey.pem",
2017 }
2018 java_library {
2019 name: "myjar",
2020 srcs: ["foo/bar/MyClass.java"],
2021 sdk_version: "core_platform",
2022 apex_available: ["myapex"],
2023 }
2024 `,
2025 },
2026 {
2027 name: "Updatable apex with non-stable transitive dep",
Jiyong Park670e0f62021-02-18 13:10:18 +09002028 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002029 bp: `
2030 apex {
2031 name: "myapex",
2032 java_libs: ["myjar"],
2033 key: "myapex.key",
2034 updatable: true,
2035 }
2036 apex_key {
2037 name: "myapex.key",
2038 public_key: "testkey.avbpubkey",
2039 private_key: "testkey.pem",
2040 }
2041 java_library {
2042 name: "myjar",
2043 srcs: ["foo/bar/MyClass.java"],
2044 sdk_version: "current",
2045 apex_available: ["myapex"],
2046 static_libs: ["transitive-jar"],
2047 }
2048 java_library {
2049 name: "transitive-jar",
2050 srcs: ["foo/bar/MyClass.java"],
2051 sdk_version: "core_platform",
2052 apex_available: ["myapex"],
2053 }
2054 `,
2055 },
2056 }
2057
2058 for _, test := range testCases {
2059 t.Run(test.name, func(t *testing.T) {
2060 if test.expectedError == "" {
2061 testApex(t, test.bp)
2062 } else {
2063 testApexError(t, test.expectedError, test.bp)
2064 }
2065 })
2066 }
2067}
2068
Jooyung Han749dc692020-04-15 11:03:39 +09002069func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2070 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2071 apex {
2072 name: "myapex",
2073 key: "myapex.key",
2074 native_shared_libs: ["mylib"],
2075 min_sdk_version: "29",
2076 }
2077
2078 apex_key {
2079 name: "myapex.key",
2080 public_key: "testkey.avbpubkey",
2081 private_key: "testkey.pem",
2082 }
2083
2084 cc_library {
2085 name: "mylib",
2086 srcs: ["mylib.cpp"],
2087 shared_libs: ["mylib2"],
2088 system_shared_libs: [],
2089 stl: "none",
2090 apex_available: [
2091 "myapex",
2092 ],
2093 min_sdk_version: "29",
2094 }
2095
2096 // indirect part of the apex
2097 cc_library {
2098 name: "mylib2",
2099 srcs: ["mylib.cpp"],
2100 system_shared_libs: [],
2101 stl: "none",
2102 apex_available: [
2103 "myapex",
2104 ],
2105 min_sdk_version: "30",
2106 }
2107 `)
2108}
2109
2110func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2111 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2112 apex {
2113 name: "myapex",
2114 key: "myapex.key",
2115 apps: ["AppFoo"],
2116 min_sdk_version: "29",
2117 }
2118
2119 apex_key {
2120 name: "myapex.key",
2121 public_key: "testkey.avbpubkey",
2122 private_key: "testkey.pem",
2123 }
2124
2125 android_app {
2126 name: "AppFoo",
2127 srcs: ["foo/bar/MyClass.java"],
2128 sdk_version: "current",
2129 min_sdk_version: "29",
2130 system_modules: "none",
2131 stl: "none",
2132 static_libs: ["bar"],
2133 apex_available: [ "myapex" ],
2134 }
2135
2136 java_library {
2137 name: "bar",
2138 sdk_version: "current",
2139 srcs: ["a.java"],
2140 apex_available: [ "myapex" ],
2141 }
2142 `)
2143}
2144
2145func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002146 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002147 apex {
2148 name: "myapex",
2149 key: "myapex.key",
2150 native_shared_libs: ["mylib"],
2151 min_sdk_version: "29",
2152 }
2153
2154 apex_key {
2155 name: "myapex.key",
2156 public_key: "testkey.avbpubkey",
2157 private_key: "testkey.pem",
2158 }
2159
Jiyong Park55549df2021-02-26 23:57:23 +09002160 // mylib in myapex will link to mylib2#30
Jooyung Han749dc692020-04-15 11:03:39 +09002161 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2162 cc_library {
2163 name: "mylib",
2164 srcs: ["mylib.cpp"],
2165 shared_libs: ["mylib2"],
2166 system_shared_libs: [],
2167 stl: "none",
2168 apex_available: ["myapex", "otherapex"],
2169 min_sdk_version: "29",
2170 }
2171
2172 cc_library {
2173 name: "mylib2",
2174 srcs: ["mylib.cpp"],
2175 system_shared_libs: [],
2176 stl: "none",
2177 apex_available: ["otherapex"],
2178 stubs: { versions: ["29", "30"] },
2179 min_sdk_version: "30",
2180 }
2181
2182 apex {
2183 name: "otherapex",
2184 key: "myapex.key",
2185 native_shared_libs: ["mylib", "mylib2"],
2186 min_sdk_version: "30",
2187 }
2188 `)
2189 expectLink := func(from, from_variant, to, to_variant string) {
2190 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2191 libFlags := ld.Args["libFlags"]
2192 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2193 }
Jiyong Park55549df2021-02-26 23:57:23 +09002194 expectLink("mylib", "shared_apex29", "mylib2", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002195 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002196}
2197
Jooyung Haned124c32021-01-26 11:43:46 +09002198func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2199 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2200 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2201 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2202 }
2203 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2204 apex {
2205 name: "myapex",
2206 key: "myapex.key",
2207 native_shared_libs: ["libfoo"],
2208 min_sdk_version: "S",
2209 }
2210 apex_key {
2211 name: "myapex.key",
2212 public_key: "testkey.avbpubkey",
2213 private_key: "testkey.pem",
2214 }
2215 cc_library {
2216 name: "libfoo",
2217 shared_libs: ["libbar"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "29",
2220 }
2221 cc_library {
2222 name: "libbar",
2223 apex_available: ["myapex"],
2224 }
2225 `, withSAsActiveCodeNames)
2226}
2227
2228func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2229 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2230 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2231 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2232 }
Colin Cross1c460562021-02-16 17:55:47 -08002233 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002234 apex {
2235 name: "myapex",
2236 key: "myapex.key",
2237 native_shared_libs: ["libfoo"],
2238 min_sdk_version: "S",
2239 }
2240 apex_key {
2241 name: "myapex.key",
2242 public_key: "testkey.avbpubkey",
2243 private_key: "testkey.pem",
2244 }
2245 cc_library {
2246 name: "libfoo",
2247 shared_libs: ["libbar"],
2248 apex_available: ["myapex"],
2249 min_sdk_version: "S",
2250 }
2251 cc_library {
2252 name: "libbar",
2253 stubs: {
2254 symbol_file: "libbar.map.txt",
2255 versions: ["30", "S", "T"],
2256 },
2257 }
2258 `, withSAsActiveCodeNames)
2259
2260 // ensure libfoo is linked with "S" version of libbar stub
2261 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2262 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09002263 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_T/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002264}
2265
Jiyong Park7c2ee712018-12-07 00:42:25 +09002266func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002267 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002268 apex {
2269 name: "myapex",
2270 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002271 native_shared_libs: ["mylib"],
2272 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002273 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002274 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002275 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002276 }
2277
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283
2284 prebuilt_etc {
2285 name: "myetc",
2286 src: "myprebuilt",
2287 sub_dir: "foo/bar",
2288 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002289
2290 cc_library {
2291 name: "mylib",
2292 srcs: ["mylib.cpp"],
2293 relative_install_path: "foo/bar",
2294 system_shared_libs: [],
2295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002296 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002297 }
2298
2299 cc_binary {
2300 name: "mybin",
2301 srcs: ["mylib.cpp"],
2302 relative_install_path: "foo/bar",
2303 system_shared_libs: [],
2304 static_executable: true,
2305 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002306 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002307 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002308 `)
2309
Sundong Ahnabb64432019-10-22 13:58:29 +09002310 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002311 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2312
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002313 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002314 ensureListContains(t, dirs, "etc")
2315 ensureListContains(t, dirs, "etc/foo")
2316 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002317 ensureListContains(t, dirs, "lib64")
2318 ensureListContains(t, dirs, "lib64/foo")
2319 ensureListContains(t, dirs, "lib64/foo/bar")
2320 ensureListContains(t, dirs, "lib")
2321 ensureListContains(t, dirs, "lib/foo")
2322 ensureListContains(t, dirs, "lib/foo/bar")
2323
Jiyong Parkbd13e442019-03-15 18:10:35 +09002324 ensureListContains(t, dirs, "bin")
2325 ensureListContains(t, dirs, "bin/foo")
2326 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002327}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002328
Jooyung Han35155c42020-02-06 17:33:20 +09002329func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002330 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002331 apex {
2332 name: "myapex",
2333 key: "myapex.key",
2334 multilib: {
2335 both: {
2336 native_shared_libs: ["mylib"],
2337 binaries: ["mybin"],
2338 },
2339 },
2340 compile_multilib: "both",
2341 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002342 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002343 }
2344
2345 apex_key {
2346 name: "myapex.key",
2347 public_key: "testkey.avbpubkey",
2348 private_key: "testkey.pem",
2349 }
2350
2351 cc_library {
2352 name: "mylib",
2353 relative_install_path: "foo/bar",
2354 system_shared_libs: [],
2355 stl: "none",
2356 apex_available: [ "myapex" ],
2357 native_bridge_supported: true,
2358 }
2359
2360 cc_binary {
2361 name: "mybin",
2362 relative_install_path: "foo/bar",
2363 system_shared_libs: [],
2364 static_executable: true,
2365 stl: "none",
2366 apex_available: [ "myapex" ],
2367 native_bridge_supported: true,
2368 compile_multilib: "both", // default is "first" for binary
2369 multilib: {
2370 lib64: {
2371 suffix: "64",
2372 },
2373 },
2374 }
2375 `, withNativeBridgeEnabled)
2376 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2377 "bin/foo/bar/mybin",
2378 "bin/foo/bar/mybin64",
2379 "bin/arm/foo/bar/mybin",
2380 "bin/arm64/foo/bar/mybin64",
2381 "lib/foo/bar/mylib.so",
2382 "lib/arm/foo/bar/mylib.so",
2383 "lib64/foo/bar/mylib.so",
2384 "lib64/arm64/foo/bar/mylib.so",
2385 })
2386}
2387
Jiyong Parkda6eb592018-12-19 17:12:36 +09002388func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002389 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002390 apex {
2391 name: "myapex",
2392 key: "myapex.key",
2393 native_shared_libs: ["mylib"],
2394 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002395 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002396 }
2397
2398 apex_key {
2399 name: "myapex.key",
2400 public_key: "testkey.avbpubkey",
2401 private_key: "testkey.pem",
2402 }
2403
2404 cc_library {
2405 name: "mylib",
2406 srcs: ["mylib.cpp"],
2407 shared_libs: ["mylib2"],
2408 system_shared_libs: [],
2409 vendor_available: true,
2410 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002411 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002412 }
2413
2414 cc_library {
2415 name: "mylib2",
2416 srcs: ["mylib.cpp"],
2417 system_shared_libs: [],
2418 vendor_available: true,
2419 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002420 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002421 }
Jooyung Handc782442019-11-01 03:14:38 +09002422 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002423 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002424 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002425
2426 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002427 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002428 for _, implicit := range i.Implicits {
2429 inputsList = append(inputsList, implicit.String())
2430 }
2431 }
2432 inputsString := strings.Join(inputsList, " ")
2433
2434 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002435 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2436 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002437
2438 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002439 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2440 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002441}
Jiyong Park16e91a02018-12-20 18:18:08 +09002442
Jooyung Han85d61762020-06-24 23:50:26 +09002443func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002444 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2445 apex {
2446 name: "myapex",
2447 key: "myapex.key",
2448 use_vendor: true,
2449 }
2450 apex_key {
2451 name: "myapex.key",
2452 public_key: "testkey.avbpubkey",
2453 private_key: "testkey.pem",
2454 }
2455 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002456 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002457 })
Colin Cross440e0d02020-06-11 11:32:11 -07002458 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002459 testApex(t, `
2460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002464 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002465 }
2466 apex_key {
2467 name: "myapex.key",
2468 public_key: "testkey.avbpubkey",
2469 private_key: "testkey.pem",
2470 }
2471 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002472 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002473 })
2474}
2475
Jooyung Han5c998b92019-06-27 11:30:33 +09002476func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2477 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2478 apex {
2479 name: "myapex",
2480 key: "myapex.key",
2481 native_shared_libs: ["mylib"],
2482 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002483 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002484 }
2485
2486 apex_key {
2487 name: "myapex.key",
2488 public_key: "testkey.avbpubkey",
2489 private_key: "testkey.pem",
2490 }
2491
2492 cc_library {
2493 name: "mylib",
2494 srcs: ["mylib.cpp"],
2495 system_shared_libs: [],
2496 stl: "none",
2497 }
2498 `)
2499}
2500
Jooyung Han85d61762020-06-24 23:50:26 +09002501func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002502 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002503 apex {
2504 name: "myapex",
2505 key: "myapex.key",
2506 binaries: ["mybin"],
2507 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002508 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002509 }
2510 apex_key {
2511 name: "myapex.key",
2512 public_key: "testkey.avbpubkey",
2513 private_key: "testkey.pem",
2514 }
2515 cc_binary {
2516 name: "mybin",
2517 vendor: true,
2518 shared_libs: ["libfoo"],
2519 }
2520 cc_library {
2521 name: "libfoo",
2522 proprietary: true,
2523 }
2524 `)
2525
2526 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2527 "bin/mybin",
2528 "lib64/libfoo.so",
2529 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2530 "lib64/libc++.so",
2531 })
2532
2533 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002534 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002535 name := apexBundle.BaseModuleName()
2536 prefix := "TARGET_"
2537 var builder strings.Builder
2538 data.Custom(&builder, name, prefix, "", data)
2539 androidMk := builder.String()
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002540 installPath := path.Join(buildDir, "../target/product/test_device/vendor/apex")
2541 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002542
2543 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2544 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2545 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002546}
2547
Jooyung Handf78e212020-07-22 15:54:47 +09002548func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002549 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 binaries: ["mybin"],
2554 vendor: true,
2555 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002556 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002557 }
2558 apex_key {
2559 name: "myapex.key",
2560 public_key: "testkey.avbpubkey",
2561 private_key: "testkey.pem",
2562 }
2563 cc_binary {
2564 name: "mybin",
2565 vendor: true,
2566 shared_libs: ["libvndk", "libvendor"],
2567 }
2568 cc_library {
2569 name: "libvndk",
2570 vndk: {
2571 enabled: true,
2572 },
2573 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002574 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002575 }
2576 cc_library {
2577 name: "libvendor",
2578 vendor: true,
2579 }
2580 `)
2581
2582 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2583
Colin Crossaede88c2020-08-11 12:17:01 -07002584 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002585 libs := names(ldRule.Args["libFlags"])
2586 // VNDK libs(libvndk/libc++) as they are
2587 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2588 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2589 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002590 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002591
2592 // VNDK libs are not included when use_vndk_as_stable: true
2593 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2594 "bin/mybin",
2595 "lib64/libvendor.so",
2596 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002597
2598 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2599 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2600 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002601}
2602
Jooyung Han8e5685d2020-09-21 11:02:57 +09002603func TestApex_withPrebuiltFirmware(t *testing.T) {
2604 testCases := []struct {
2605 name string
2606 additionalProp string
2607 }{
2608 {"system apex with prebuilt_firmware", ""},
2609 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2610 }
2611 for _, tc := range testCases {
2612 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002613 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002614 apex {
2615 name: "myapex",
2616 key: "myapex.key",
2617 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002618 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002619 `+tc.additionalProp+`
2620 }
2621 apex_key {
2622 name: "myapex.key",
2623 public_key: "testkey.avbpubkey",
2624 private_key: "testkey.pem",
2625 }
2626 prebuilt_firmware {
2627 name: "myfirmware",
2628 src: "myfirmware.bin",
2629 filename_from_src: true,
2630 `+tc.additionalProp+`
2631 }
2632 `)
2633 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2634 "etc/firmware/myfirmware.bin",
2635 })
2636 })
2637 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002638}
2639
Jooyung Hanefb184e2020-06-25 17:14:25 +09002640func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002641 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002642 apex {
2643 name: "myapex",
2644 key: "myapex.key",
2645 use_vendor: true,
2646 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002647 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002648 }
2649
2650 apex_key {
2651 name: "myapex.key",
2652 public_key: "testkey.avbpubkey",
2653 private_key: "testkey.pem",
2654 }
2655
2656 cc_library {
2657 name: "mylib",
2658 vendor_available: true,
2659 apex_available: ["myapex"],
2660 }
2661 `, func(fs map[string][]byte, config android.Config) {
2662 setUseVendorAllowListForTest(config, []string{"myapex"})
2663 })
2664
2665 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002666 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002667 name := apexBundle.BaseModuleName()
2668 prefix := "TARGET_"
2669 var builder strings.Builder
2670 data.Custom(&builder, name, prefix, "", data)
2671 androidMk := builder.String()
2672 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2673}
2674
2675func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002676 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002677 apex {
2678 name: "myapex",
2679 key: "myapex.key",
2680 vendor: true,
2681 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002682 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002683 }
2684
2685 apex_key {
2686 name: "myapex.key",
2687 public_key: "testkey.avbpubkey",
2688 private_key: "testkey.pem",
2689 }
2690
2691 cc_library {
2692 name: "mylib",
2693 vendor_available: true,
2694 }
2695 `)
2696
2697 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002698 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002699 name := apexBundle.BaseModuleName()
2700 prefix := "TARGET_"
2701 var builder strings.Builder
2702 data.Custom(&builder, name, prefix, "", data)
2703 androidMk := builder.String()
2704 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2705}
2706
Jooyung Han2ed99d02020-06-24 23:26:26 +09002707func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002708 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002709 apex {
2710 name: "myapex",
2711 key: "myapex.key",
2712 vintf_fragments: ["fragment.xml"],
2713 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002714 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 cc_binary {
2722 name: "mybin",
2723 }
2724 `)
2725
2726 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002727 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002728 name := apexBundle.BaseModuleName()
2729 prefix := "TARGET_"
2730 var builder strings.Builder
2731 data.Custom(&builder, name, prefix, "", data)
2732 androidMk := builder.String()
2733 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2734 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2735}
2736
Jiyong Park16e91a02018-12-20 18:18:08 +09002737func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002738 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002739 apex {
2740 name: "myapex",
2741 key: "myapex.key",
2742 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002743 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002744 }
2745
2746 apex_key {
2747 name: "myapex.key",
2748 public_key: "testkey.avbpubkey",
2749 private_key: "testkey.pem",
2750 }
2751
2752 cc_library {
2753 name: "mylib",
2754 srcs: ["mylib.cpp"],
2755 system_shared_libs: [],
2756 stl: "none",
2757 stubs: {
2758 versions: ["1", "2", "3"],
2759 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002760 apex_available: [
2761 "//apex_available:platform",
2762 "myapex",
2763 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002764 }
2765
2766 cc_binary {
2767 name: "not_in_apex",
2768 srcs: ["mylib.cpp"],
2769 static_libs: ["mylib"],
2770 static_executable: true,
2771 system_shared_libs: [],
2772 stl: "none",
2773 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002774 `)
2775
Colin Cross7113d202019-11-20 16:39:12 -08002776 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002777
2778 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002779 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002780}
Jiyong Park9335a262018-12-24 11:31:58 +09002781
2782func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002783 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002784 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002785 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002786 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002787 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002788 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002789 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002790 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002791 }
2792
2793 cc_library {
2794 name: "mylib",
2795 srcs: ["mylib.cpp"],
2796 system_shared_libs: [],
2797 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002798 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002799 }
2800
2801 apex_key {
2802 name: "myapex.key",
2803 public_key: "testkey.avbpubkey",
2804 private_key: "testkey.pem",
2805 }
2806
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002807 android_app_certificate {
2808 name: "myapex.certificate",
2809 certificate: "testkey",
2810 }
2811
2812 android_app_certificate {
2813 name: "myapex.certificate.override",
2814 certificate: "testkey.override",
2815 }
2816
Jiyong Park9335a262018-12-24 11:31:58 +09002817 `)
2818
2819 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002820 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002821
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002822 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2823 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002824 "vendor/foo/devkeys/testkey.avbpubkey")
2825 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002826 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2827 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002828 "vendor/foo/devkeys/testkey.pem")
2829 }
2830
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002831 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002832 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002833 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002834 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002835 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002836 }
2837}
Jiyong Park58e364a2019-01-19 19:24:06 +09002838
Jooyung Hanf121a652019-12-17 14:30:11 +09002839func TestCertificate(t *testing.T) {
2840 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002841 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002842 apex {
2843 name: "myapex",
2844 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002845 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002846 }
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) {
Colin Cross1c460562021-02-16 17:55:47 -08002859 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002860 apex {
2861 name: "myapex_keytest",
2862 key: "myapex.key",
2863 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002864 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002865 }
2866 apex_key {
2867 name: "myapex.key",
2868 public_key: "testkey.avbpubkey",
2869 private_key: "testkey.pem",
2870 }
2871 android_app_certificate {
2872 name: "myapex.certificate.override",
2873 certificate: "testkey.override",
2874 }`)
2875 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2876 expected := "testkey.override.x509.pem testkey.override.pk8"
2877 if actual := rule.Args["certificates"]; actual != expected {
2878 t.Errorf("certificates should be %q, not %q", expected, actual)
2879 }
2880 })
2881 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002882 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002883 apex {
2884 name: "myapex",
2885 key: "myapex.key",
2886 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002887 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002888 }
2889 apex_key {
2890 name: "myapex.key",
2891 public_key: "testkey.avbpubkey",
2892 private_key: "testkey.pem",
2893 }
2894 android_app_certificate {
2895 name: "myapex.certificate",
2896 certificate: "testkey",
2897 }`)
2898 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2899 expected := "testkey.x509.pem testkey.pk8"
2900 if actual := rule.Args["certificates"]; actual != expected {
2901 t.Errorf("certificates should be %q, not %q", expected, actual)
2902 }
2903 })
2904 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002905 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002906 apex {
2907 name: "myapex_keytest",
2908 key: "myapex.key",
2909 file_contexts: ":myapex-file_contexts",
2910 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002911 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002912 }
2913 apex_key {
2914 name: "myapex.key",
2915 public_key: "testkey.avbpubkey",
2916 private_key: "testkey.pem",
2917 }
2918 android_app_certificate {
2919 name: "myapex.certificate.override",
2920 certificate: "testkey.override",
2921 }`)
2922 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2923 expected := "testkey.override.x509.pem testkey.override.pk8"
2924 if actual := rule.Args["certificates"]; actual != expected {
2925 t.Errorf("certificates should be %q, not %q", expected, actual)
2926 }
2927 })
2928 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002929 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002930 apex {
2931 name: "myapex",
2932 key: "myapex.key",
2933 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002934 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002935 }
2936 apex_key {
2937 name: "myapex.key",
2938 public_key: "testkey.avbpubkey",
2939 private_key: "testkey.pem",
2940 }`)
2941 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2942 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2943 if actual := rule.Args["certificates"]; actual != expected {
2944 t.Errorf("certificates should be %q, not %q", expected, actual)
2945 }
2946 })
2947 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002948 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002949 apex {
2950 name: "myapex_keytest",
2951 key: "myapex.key",
2952 file_contexts: ":myapex-file_contexts",
2953 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002954 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002955 }
2956 apex_key {
2957 name: "myapex.key",
2958 public_key: "testkey.avbpubkey",
2959 private_key: "testkey.pem",
2960 }
2961 android_app_certificate {
2962 name: "myapex.certificate.override",
2963 certificate: "testkey.override",
2964 }`)
2965 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2966 expected := "testkey.override.x509.pem testkey.override.pk8"
2967 if actual := rule.Args["certificates"]; actual != expected {
2968 t.Errorf("certificates should be %q, not %q", expected, actual)
2969 }
2970 })
2971}
2972
Jiyong Park58e364a2019-01-19 19:24:06 +09002973func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002974 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002975 apex {
2976 name: "myapex",
2977 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002978 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002979 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09002980 }
2981
2982 apex {
2983 name: "otherapex",
2984 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002985 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002986 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002987 }
2988
2989 apex_key {
2990 name: "myapex.key",
2991 public_key: "testkey.avbpubkey",
2992 private_key: "testkey.pem",
2993 }
2994
2995 cc_library {
2996 name: "mylib",
2997 srcs: ["mylib.cpp"],
2998 system_shared_libs: [],
2999 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003000 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003001 "myapex",
3002 "otherapex",
3003 ],
Jooyung Han24282772020-03-21 23:20:55 +09003004 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003005 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003006 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003007 cc_library {
3008 name: "mylib2",
3009 srcs: ["mylib.cpp"],
3010 system_shared_libs: [],
3011 stl: "none",
3012 apex_available: [
3013 "myapex",
3014 "otherapex",
3015 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003016 static_libs: ["mylib3"],
3017 recovery_available: true,
3018 min_sdk_version: "29",
3019 }
3020 cc_library {
3021 name: "mylib3",
3022 srcs: ["mylib.cpp"],
3023 system_shared_libs: [],
3024 stl: "none",
3025 apex_available: [
3026 "myapex",
3027 "otherapex",
3028 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003029 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003030 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003031 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003032 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003033 `)
3034
Jooyung Hanc87a0592020-03-02 17:44:33 +09003035 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003036 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003037 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003038 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
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_apex10000").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__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003044 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003045
Jooyung Hanccce2f22020-03-07 03:45:53 +09003046 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003047 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003048 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003049 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003050 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003051
Colin Crossaede88c2020-08-11 12:17:01 -07003052 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3053 // each variant defines additional macros to distinguish which apex variant it is built for
3054
3055 // non-APEX variant does not have __ANDROID_APEX__ defined
3056 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3057 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3058
3059 // APEX variant has __ANDROID_APEX__ defined
3060 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3061 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3062 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3063 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3064
3065 // APEX variant has __ANDROID_APEX__ defined
3066 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3067 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3068 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3069 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3070
Dan Albertb19953d2020-11-17 15:29:36 -08003071 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003072 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3073 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003074 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003075
3076 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3077 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003078
3079 // non-APEX variant does not have __ANDROID_APEX__ defined
3080 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3081 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3082
3083 // APEX variant has __ANDROID_APEX__ defined
3084 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003085 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003086 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003087 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003088
Jooyung Hanc87a0592020-03-02 17:44:33 +09003089 // APEX variant has __ANDROID_APEX__ defined
3090 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003091 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003092 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003093 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003094
Dan Albertb19953d2020-11-17 15:29:36 -08003095 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003096 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003097 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003098 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003099}
Jiyong Park7e636d02019-01-28 16:16:54 +09003100
3101func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003102 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003103 apex {
3104 name: "myapex",
3105 key: "myapex.key",
3106 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003107 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003108 }
3109
3110 apex_key {
3111 name: "myapex.key",
3112 public_key: "testkey.avbpubkey",
3113 private_key: "testkey.pem",
3114 }
3115
3116 cc_library_headers {
3117 name: "mylib_headers",
3118 export_include_dirs: ["my_include"],
3119 system_shared_libs: [],
3120 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003121 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003122 }
3123
3124 cc_library {
3125 name: "mylib",
3126 srcs: ["mylib.cpp"],
3127 system_shared_libs: [],
3128 stl: "none",
3129 header_libs: ["mylib_headers"],
3130 export_header_lib_headers: ["mylib_headers"],
3131 stubs: {
3132 versions: ["1", "2", "3"],
3133 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003134 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003135 }
3136
3137 cc_library {
3138 name: "otherlib",
3139 srcs: ["mylib.cpp"],
3140 system_shared_libs: [],
3141 stl: "none",
3142 shared_libs: ["mylib"],
3143 }
3144 `)
3145
Colin Cross7113d202019-11-20 16:39:12 -08003146 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003147
3148 // Ensure that the include path of the header lib is exported to 'otherlib'
3149 ensureContains(t, cFlags, "-Imy_include")
3150}
Alex Light9670d332019-01-29 18:07:33 -08003151
Jiyong Park7cd10e32020-01-14 09:22:18 +09003152type fileInApex struct {
3153 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003154 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003155 isLink bool
3156}
3157
Jooyung Hana57af4a2020-01-23 05:36:59 +00003158func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003159 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003160 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003161 copyCmds := apexRule.Args["copy_commands"]
3162 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003163 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003164 for _, cmd := range strings.Split(copyCmds, "&&") {
3165 cmd = strings.TrimSpace(cmd)
3166 if cmd == "" {
3167 continue
3168 }
3169 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003170 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003171 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003172 switch terms[0] {
3173 case "mkdir":
3174 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003175 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003176 t.Fatal("copyCmds contains invalid cp command", cmd)
3177 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003178 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003179 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003180 isLink = false
3181 case "ln":
3182 if len(terms) != 3 && len(terms) != 4 {
3183 // ln LINK TARGET or ln -s LINK TARGET
3184 t.Fatal("copyCmds contains invalid ln command", cmd)
3185 }
3186 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003187 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003188 isLink = true
3189 default:
3190 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3191 }
3192 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003193 index := strings.Index(dst, imageApexDir)
3194 if index == -1 {
3195 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3196 }
3197 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003198 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003199 }
3200 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003201 return ret
3202}
3203
Jooyung Hana57af4a2020-01-23 05:36:59 +00003204func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3205 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003206 var failed bool
3207 var surplus []string
3208 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003209 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003210 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003211 for _, expected := range files {
3212 if matched, _ := path.Match(expected, file.path); matched {
3213 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003214 mactchFound = true
3215 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003216 }
3217 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003218 if !mactchFound {
3219 surplus = append(surplus, file.path)
3220 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003221 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003222
Jooyung Han31c470b2019-10-18 16:26:59 +09003223 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003224 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003225 t.Log("surplus files", surplus)
3226 failed = true
3227 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003228
3229 if len(files) > len(filesMatched) {
3230 var missing []string
3231 for _, expected := range files {
3232 if !filesMatched[expected] {
3233 missing = append(missing, expected)
3234 }
3235 }
3236 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003237 t.Log("missing files", missing)
3238 failed = true
3239 }
3240 if failed {
3241 t.Fail()
3242 }
3243}
3244
Jooyung Han344d5432019-08-23 11:17:39 +09003245func TestVndkApexCurrent(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003246 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003247 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003248 name: "com.android.vndk.current",
3249 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003250 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003251 }
3252
3253 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003254 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
3258
3259 cc_library {
3260 name: "libvndk",
3261 srcs: ["mylib.cpp"],
3262 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003263 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003264 vndk: {
3265 enabled: true,
3266 },
3267 system_shared_libs: [],
3268 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003269 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003270 }
3271
3272 cc_library {
3273 name: "libvndksp",
3274 srcs: ["mylib.cpp"],
3275 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003276 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003277 vndk: {
3278 enabled: true,
3279 support_system_process: true,
3280 },
3281 system_shared_libs: [],
3282 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003283 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003284 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003285 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003286
Colin Cross2807f002021-03-02 10:15:29 -08003287 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003288 "lib/libvndk.so",
3289 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003290 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003291 "lib64/libvndk.so",
3292 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003293 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003294 "etc/llndk.libraries.VER.txt",
3295 "etc/vndkcore.libraries.VER.txt",
3296 "etc/vndksp.libraries.VER.txt",
3297 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003298 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003299 })
Jooyung Han344d5432019-08-23 11:17:39 +09003300}
3301
3302func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003303 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003304 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003305 name: "com.android.vndk.current",
3306 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003307 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003308 }
3309
3310 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003311 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003312 public_key: "testkey.avbpubkey",
3313 private_key: "testkey.pem",
3314 }
3315
3316 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003317 name: "libvndk",
3318 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003319 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003320 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003321 vndk: {
3322 enabled: true,
3323 },
3324 system_shared_libs: [],
3325 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003326 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003327 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003328
3329 cc_prebuilt_library_shared {
3330 name: "libvndk.arm",
3331 srcs: ["libvndk.arm.so"],
3332 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003333 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003334 vndk: {
3335 enabled: true,
3336 },
3337 enabled: false,
3338 arch: {
3339 arm: {
3340 enabled: true,
3341 },
3342 },
3343 system_shared_libs: [],
3344 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003345 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003346 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003347 `+vndkLibrariesTxtFiles("current"),
3348 withFiles(map[string][]byte{
3349 "libvndk.so": nil,
3350 "libvndk.arm.so": nil,
3351 }))
Colin Cross2807f002021-03-02 10:15:29 -08003352 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003353 "lib/libvndk.so",
3354 "lib/libvndk.arm.so",
3355 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003356 "lib/libc++.so",
3357 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003358 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003359 })
Jooyung Han344d5432019-08-23 11:17:39 +09003360}
3361
Jooyung Han39edb6c2019-11-06 16:53:07 +09003362func vndkLibrariesTxtFiles(vers ...string) (result string) {
3363 for _, v := range vers {
3364 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003365 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003366 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003367 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003368 name: "` + txt + `.libraries.txt",
3369 }
3370 `
3371 }
3372 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003373 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003374 result += `
3375 prebuilt_etc {
3376 name: "` + txt + `.libraries.` + v + `.txt",
3377 src: "dummy.txt",
3378 }
3379 `
3380 }
3381 }
3382 }
3383 return
3384}
3385
Jooyung Han344d5432019-08-23 11:17:39 +09003386func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003387 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003388 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003389 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003390 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003391 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003392 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003393 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003394 }
3395
3396 apex_key {
3397 name: "myapex.key",
3398 public_key: "testkey.avbpubkey",
3399 private_key: "testkey.pem",
3400 }
3401
Jooyung Han31c470b2019-10-18 16:26:59 +09003402 vndk_prebuilt_shared {
3403 name: "libvndk27",
3404 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003405 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003406 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003407 vndk: {
3408 enabled: true,
3409 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003410 target_arch: "arm64",
3411 arch: {
3412 arm: {
3413 srcs: ["libvndk27_arm.so"],
3414 },
3415 arm64: {
3416 srcs: ["libvndk27_arm64.so"],
3417 },
3418 },
Colin Cross2807f002021-03-02 10:15:29 -08003419 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003420 }
3421
3422 vndk_prebuilt_shared {
3423 name: "libvndk27",
3424 version: "27",
3425 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003426 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003427 vndk: {
3428 enabled: true,
3429 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003430 target_arch: "x86_64",
3431 arch: {
3432 x86: {
3433 srcs: ["libvndk27_x86.so"],
3434 },
3435 x86_64: {
3436 srcs: ["libvndk27_x86_64.so"],
3437 },
3438 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003439 }
3440 `+vndkLibrariesTxtFiles("27"),
3441 withFiles(map[string][]byte{
3442 "libvndk27_arm.so": nil,
3443 "libvndk27_arm64.so": nil,
3444 "libvndk27_x86.so": nil,
3445 "libvndk27_x86_64.so": nil,
3446 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003447
Colin Cross2807f002021-03-02 10:15:29 -08003448 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003449 "lib/libvndk27_arm.so",
3450 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003451 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003452 })
Jooyung Han344d5432019-08-23 11:17:39 +09003453}
3454
Jooyung Han90eee022019-10-01 20:02:42 +09003455func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003456 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003457 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003458 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003459 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003460 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003461 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003462 }
3463 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003464 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003465 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003466 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003467 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003468 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003469 }
3470 apex_key {
3471 name: "myapex.key",
3472 public_key: "testkey.avbpubkey",
3473 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003474 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003475
3476 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003477 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003478 actual := proptools.String(bundle.properties.Apex_name)
3479 if !reflect.DeepEqual(actual, expected) {
3480 t.Errorf("Got '%v', expected '%v'", actual, expected)
3481 }
3482 }
3483
Colin Cross2807f002021-03-02 10:15:29 -08003484 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3485 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003486}
3487
Jooyung Han344d5432019-08-23 11:17:39 +09003488func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003489 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003490 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003491 name: "com.android.vndk.current",
3492 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003493 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003494 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003495 }
3496
3497 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003498 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003499 public_key: "testkey.avbpubkey",
3500 private_key: "testkey.pem",
3501 }
3502
3503 cc_library {
3504 name: "libvndk",
3505 srcs: ["mylib.cpp"],
3506 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003507 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003508 native_bridge_supported: true,
3509 host_supported: true,
3510 vndk: {
3511 enabled: true,
3512 },
3513 system_shared_libs: [],
3514 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003515 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003516 }
Colin Cross2807f002021-03-02 10:15:29 -08003517 `+vndkLibrariesTxtFiles("current"),
3518 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003519
Colin Cross2807f002021-03-02 10:15:29 -08003520 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003521 "lib/libvndk.so",
3522 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003523 "lib/libc++.so",
3524 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003525 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003526 })
Jooyung Han344d5432019-08-23 11:17:39 +09003527}
3528
3529func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003530 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003531 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003532 name: "com.android.vndk.current",
3533 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003534 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003535 native_bridge_supported: true,
3536 }
3537
3538 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003539 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003540 public_key: "testkey.avbpubkey",
3541 private_key: "testkey.pem",
3542 }
3543
3544 cc_library {
3545 name: "libvndk",
3546 srcs: ["mylib.cpp"],
3547 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003548 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003549 native_bridge_supported: true,
3550 host_supported: true,
3551 vndk: {
3552 enabled: true,
3553 },
3554 system_shared_libs: [],
3555 stl: "none",
3556 }
3557 `)
3558}
3559
Jooyung Han31c470b2019-10-18 16:26:59 +09003560func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003561 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003562 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003563 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003564 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003565 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003566 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003567 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003568 }
3569
3570 apex_key {
3571 name: "myapex.key",
3572 public_key: "testkey.avbpubkey",
3573 private_key: "testkey.pem",
3574 }
3575
3576 vndk_prebuilt_shared {
3577 name: "libvndk27",
3578 version: "27",
3579 target_arch: "arm",
3580 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003581 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003582 vndk: {
3583 enabled: true,
3584 },
3585 arch: {
3586 arm: {
3587 srcs: ["libvndk27.so"],
3588 }
3589 },
3590 }
3591
3592 vndk_prebuilt_shared {
3593 name: "libvndk27",
3594 version: "27",
3595 target_arch: "arm",
3596 binder32bit: true,
3597 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003598 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003599 vndk: {
3600 enabled: true,
3601 },
3602 arch: {
3603 arm: {
3604 srcs: ["libvndk27binder32.so"],
3605 }
3606 },
Colin Cross2807f002021-03-02 10:15:29 -08003607 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003609 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 withFiles(map[string][]byte{
3611 "libvndk27.so": nil,
3612 "libvndk27binder32.so": nil,
3613 }),
3614 withBinder32bit,
3615 withTargets(map[android.OsType][]android.Target{
3616 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003617 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3618 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003619 },
3620 }),
3621 )
3622
Colin Cross2807f002021-03-02 10:15:29 -08003623 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003624 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003625 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 })
3627}
3628
Jooyung Han45a96772020-06-15 14:59:42 +09003629func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003630 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003631 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003632 name: "com.android.vndk.current",
3633 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003634 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003635 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003636 }
3637
3638 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003639 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003640 public_key: "testkey.avbpubkey",
3641 private_key: "testkey.pem",
3642 }
3643
3644 cc_library {
3645 name: "libz",
3646 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003647 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003648 vndk: {
3649 enabled: true,
3650 },
3651 stubs: {
3652 symbol_file: "libz.map.txt",
3653 versions: ["30"],
3654 }
3655 }
3656 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3657 "libz.map.txt": nil,
3658 }))
3659
Colin Cross2807f002021-03-02 10:15:29 -08003660 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003661 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3662 ensureListEmpty(t, provideNativeLibs)
3663}
3664
Jooyung Hane1633032019-08-01 17:41:43 +09003665func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003666 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003667 apex {
3668 name: "myapex_nodep",
3669 key: "myapex.key",
3670 native_shared_libs: ["lib_nodep"],
3671 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003672 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003673 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003674 }
3675
3676 apex {
3677 name: "myapex_dep",
3678 key: "myapex.key",
3679 native_shared_libs: ["lib_dep"],
3680 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003681 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003682 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003683 }
3684
3685 apex {
3686 name: "myapex_provider",
3687 key: "myapex.key",
3688 native_shared_libs: ["libfoo"],
3689 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003690 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003691 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003692 }
3693
3694 apex {
3695 name: "myapex_selfcontained",
3696 key: "myapex.key",
3697 native_shared_libs: ["lib_dep", "libfoo"],
3698 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003699 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003700 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003701 }
3702
3703 apex_key {
3704 name: "myapex.key",
3705 public_key: "testkey.avbpubkey",
3706 private_key: "testkey.pem",
3707 }
3708
3709 cc_library {
3710 name: "lib_nodep",
3711 srcs: ["mylib.cpp"],
3712 system_shared_libs: [],
3713 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003714 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003715 }
3716
3717 cc_library {
3718 name: "lib_dep",
3719 srcs: ["mylib.cpp"],
3720 shared_libs: ["libfoo"],
3721 system_shared_libs: [],
3722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003723 apex_available: [
3724 "myapex_dep",
3725 "myapex_provider",
3726 "myapex_selfcontained",
3727 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003728 }
3729
3730 cc_library {
3731 name: "libfoo",
3732 srcs: ["mytest.cpp"],
3733 stubs: {
3734 versions: ["1"],
3735 },
3736 system_shared_libs: [],
3737 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003738 apex_available: [
3739 "myapex_provider",
3740 "myapex_selfcontained",
3741 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003742 }
3743 `)
3744
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003745 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003746 var provideNativeLibs, requireNativeLibs []string
3747
Sundong Ahnabb64432019-10-22 13:58:29 +09003748 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003749 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3750 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003751 ensureListEmpty(t, provideNativeLibs)
3752 ensureListEmpty(t, requireNativeLibs)
3753
Sundong Ahnabb64432019-10-22 13:58:29 +09003754 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003755 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3756 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003757 ensureListEmpty(t, provideNativeLibs)
3758 ensureListContains(t, requireNativeLibs, "libfoo.so")
3759
Sundong Ahnabb64432019-10-22 13:58:29 +09003760 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003761 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3762 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003763 ensureListContains(t, provideNativeLibs, "libfoo.so")
3764 ensureListEmpty(t, requireNativeLibs)
3765
Sundong Ahnabb64432019-10-22 13:58:29 +09003766 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003767 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3768 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003769 ensureListContains(t, provideNativeLibs, "libfoo.so")
3770 ensureListEmpty(t, requireNativeLibs)
3771}
3772
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003773func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003774 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003775 apex {
3776 name: "myapex",
3777 key: "myapex.key",
3778 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003779 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003780 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003781 }
3782
3783 apex_key {
3784 name: "myapex.key",
3785 public_key: "testkey.avbpubkey",
3786 private_key: "testkey.pem",
3787 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003788
3789 cc_library {
3790 name: "mylib",
3791 srcs: ["mylib.cpp"],
3792 system_shared_libs: [],
3793 stl: "none",
3794 apex_available: [
3795 "//apex_available:platform",
3796 "myapex",
3797 ],
3798 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003799 `)
3800
Sundong Ahnabb64432019-10-22 13:58:29 +09003801 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003802 apexManifestRule := module.Rule("apexManifestRule")
3803 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3804 apexRule := module.Rule("apexRule")
3805 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003806
3807 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003808 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003809 name := apexBundle.BaseModuleName()
3810 prefix := "TARGET_"
3811 var builder strings.Builder
3812 data.Custom(&builder, name, prefix, "", data)
3813 androidMk := builder.String()
3814 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3815 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003816}
3817
Alex Light0851b882019-02-07 13:20:53 -08003818func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003819 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003820 apex {
3821 name: "myapex",
3822 key: "myapex.key",
3823 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003824 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003825 }
3826
3827 apex_key {
3828 name: "myapex.key",
3829 public_key: "testkey.avbpubkey",
3830 private_key: "testkey.pem",
3831 }
3832
3833 cc_library {
3834 name: "mylib_common",
3835 srcs: ["mylib.cpp"],
3836 system_shared_libs: [],
3837 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003838 apex_available: [
3839 "//apex_available:platform",
3840 "myapex",
3841 ],
Alex Light0851b882019-02-07 13:20:53 -08003842 }
3843 `)
3844
Sundong Ahnabb64432019-10-22 13:58:29 +09003845 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003846 apexRule := module.Rule("apexRule")
3847 copyCmds := apexRule.Args["copy_commands"]
3848
3849 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3850 t.Log("Apex was a test apex!")
3851 t.Fail()
3852 }
3853 // Ensure that main rule creates an output
3854 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3855
3856 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003857 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003858
3859 // Ensure that both direct and indirect deps are copied into apex
3860 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3861
Colin Cross7113d202019-11-20 16:39:12 -08003862 // Ensure that the platform variant ends with _shared
3863 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003864
Colin Cross56a83212020-09-15 18:30:11 -07003865 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003866 t.Log("Found mylib_common not in any apex!")
3867 t.Fail()
3868 }
3869}
3870
3871func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003872 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003873 apex_test {
3874 name: "myapex",
3875 key: "myapex.key",
3876 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003877 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003878 }
3879
3880 apex_key {
3881 name: "myapex.key",
3882 public_key: "testkey.avbpubkey",
3883 private_key: "testkey.pem",
3884 }
3885
3886 cc_library {
3887 name: "mylib_common_test",
3888 srcs: ["mylib.cpp"],
3889 system_shared_libs: [],
3890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003891 // TODO: remove //apex_available:platform
3892 apex_available: [
3893 "//apex_available:platform",
3894 "myapex",
3895 ],
Alex Light0851b882019-02-07 13:20:53 -08003896 }
3897 `)
3898
Sundong Ahnabb64432019-10-22 13:58:29 +09003899 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003900 apexRule := module.Rule("apexRule")
3901 copyCmds := apexRule.Args["copy_commands"]
3902
3903 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3904 t.Log("Apex was not a test apex!")
3905 t.Fail()
3906 }
3907 // Ensure that main rule creates an output
3908 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3909
3910 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003911 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003912
3913 // Ensure that both direct and indirect deps are copied into apex
3914 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3915
Colin Cross7113d202019-11-20 16:39:12 -08003916 // Ensure that the platform variant ends with _shared
3917 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003918}
3919
Alex Light9670d332019-01-29 18:07:33 -08003920func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003921 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003922 apex {
3923 name: "myapex",
3924 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003925 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003926 multilib: {
3927 first: {
3928 native_shared_libs: ["mylib_common"],
3929 }
3930 },
3931 target: {
3932 android: {
3933 multilib: {
3934 first: {
3935 native_shared_libs: ["mylib"],
3936 }
3937 }
3938 },
3939 host: {
3940 multilib: {
3941 first: {
3942 native_shared_libs: ["mylib2"],
3943 }
3944 }
3945 }
3946 }
3947 }
3948
3949 apex_key {
3950 name: "myapex.key",
3951 public_key: "testkey.avbpubkey",
3952 private_key: "testkey.pem",
3953 }
3954
3955 cc_library {
3956 name: "mylib",
3957 srcs: ["mylib.cpp"],
3958 system_shared_libs: [],
3959 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003960 // TODO: remove //apex_available:platform
3961 apex_available: [
3962 "//apex_available:platform",
3963 "myapex",
3964 ],
Alex Light9670d332019-01-29 18:07:33 -08003965 }
3966
3967 cc_library {
3968 name: "mylib_common",
3969 srcs: ["mylib.cpp"],
3970 system_shared_libs: [],
3971 stl: "none",
3972 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003973 // TODO: remove //apex_available:platform
3974 apex_available: [
3975 "//apex_available:platform",
3976 "myapex",
3977 ],
Alex Light9670d332019-01-29 18:07:33 -08003978 }
3979
3980 cc_library {
3981 name: "mylib2",
3982 srcs: ["mylib.cpp"],
3983 system_shared_libs: [],
3984 stl: "none",
3985 compile_multilib: "first",
3986 }
3987 `)
3988
Sundong Ahnabb64432019-10-22 13:58:29 +09003989 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003990 copyCmds := apexRule.Args["copy_commands"]
3991
3992 // Ensure that main rule creates an output
3993 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3994
3995 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003996 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3997 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3998 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003999
4000 // Ensure that both direct and indirect deps are copied into apex
4001 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4002 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4003 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4004
Colin Cross7113d202019-11-20 16:39:12 -08004005 // Ensure that the platform variant ends with _shared
4006 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4007 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4008 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004009}
Jiyong Park04480cf2019-02-06 00:16:29 +09004010
Jiyong Park59140302020-12-14 18:44:04 +09004011func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004012 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004013 apex {
4014 name: "myapex",
4015 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004016 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004017 arch: {
4018 arm64: {
4019 native_shared_libs: ["mylib.arm64"],
4020 },
4021 x86_64: {
4022 native_shared_libs: ["mylib.x64"],
4023 },
4024 }
4025 }
4026
4027 apex_key {
4028 name: "myapex.key",
4029 public_key: "testkey.avbpubkey",
4030 private_key: "testkey.pem",
4031 }
4032
4033 cc_library {
4034 name: "mylib.arm64",
4035 srcs: ["mylib.cpp"],
4036 system_shared_libs: [],
4037 stl: "none",
4038 // TODO: remove //apex_available:platform
4039 apex_available: [
4040 "//apex_available:platform",
4041 "myapex",
4042 ],
4043 }
4044
4045 cc_library {
4046 name: "mylib.x64",
4047 srcs: ["mylib.cpp"],
4048 system_shared_libs: [],
4049 stl: "none",
4050 // TODO: remove //apex_available:platform
4051 apex_available: [
4052 "//apex_available:platform",
4053 "myapex",
4054 ],
4055 }
4056 `)
4057
4058 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4059 copyCmds := apexRule.Args["copy_commands"]
4060
4061 // Ensure that apex variant is created for the direct dep
4062 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4063 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4064
4065 // Ensure that both direct and indirect deps are copied into apex
4066 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4067 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4068}
4069
Jiyong Park04480cf2019-02-06 00:16:29 +09004070func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004071 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004072 apex {
4073 name: "myapex",
4074 key: "myapex.key",
4075 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004076 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004077 }
4078
4079 apex_key {
4080 name: "myapex.key",
4081 public_key: "testkey.avbpubkey",
4082 private_key: "testkey.pem",
4083 }
4084
4085 sh_binary {
4086 name: "myscript",
4087 src: "mylib.cpp",
4088 filename: "myscript.sh",
4089 sub_dir: "script",
4090 }
4091 `)
4092
Sundong Ahnabb64432019-10-22 13:58:29 +09004093 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004094 copyCmds := apexRule.Args["copy_commands"]
4095
4096 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4097}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004098
Jooyung Han91df2082019-11-20 01:49:42 +09004099func TestApexInVariousPartition(t *testing.T) {
4100 testcases := []struct {
4101 propName, parition, flattenedPartition string
4102 }{
4103 {"", "system", "system_ext"},
4104 {"product_specific: true", "product", "product"},
4105 {"soc_specific: true", "vendor", "vendor"},
4106 {"proprietary: true", "vendor", "vendor"},
4107 {"vendor: true", "vendor", "vendor"},
4108 {"system_ext_specific: true", "system_ext", "system_ext"},
4109 }
4110 for _, tc := range testcases {
4111 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004112 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004113 apex {
4114 name: "myapex",
4115 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004116 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004117 `+tc.propName+`
4118 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004119
Jooyung Han91df2082019-11-20 01:49:42 +09004120 apex_key {
4121 name: "myapex.key",
4122 public_key: "testkey.avbpubkey",
4123 private_key: "testkey.pem",
4124 }
4125 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004126
Jooyung Han91df2082019-11-20 01:49:42 +09004127 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4128 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4129 actual := apex.installDir.String()
4130 if actual != expected {
4131 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4132 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004133
Jooyung Han91df2082019-11-20 01:49:42 +09004134 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4135 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4136 actual = flattened.installDir.String()
4137 if actual != expected {
4138 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4139 }
4140 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004141 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004142}
Jiyong Park67882562019-03-21 01:11:21 +09004143
Jooyung Han580eb4f2020-06-24 19:33:06 +09004144func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004145 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004146 apex {
4147 name: "myapex",
4148 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004149 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004150 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004151
Jooyung Han580eb4f2020-06-24 19:33:06 +09004152 apex_key {
4153 name: "myapex.key",
4154 public_key: "testkey.avbpubkey",
4155 private_key: "testkey.pem",
4156 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004157 `)
4158 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004159 rule := module.Output("file_contexts")
4160 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4161}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004162
Jooyung Han580eb4f2020-06-24 19:33:06 +09004163func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004164 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004165 apex {
4166 name: "myapex",
4167 key: "myapex.key",
4168 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004170 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004171
Jooyung Han580eb4f2020-06-24 19:33:06 +09004172 apex_key {
4173 name: "myapex.key",
4174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004177 `, withFiles(map[string][]byte{
4178 "my_own_file_contexts": nil,
4179 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004180}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004181
Jooyung Han580eb4f2020-06-24 19:33:06 +09004182func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004183 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004184 apex {
4185 name: "myapex",
4186 key: "myapex.key",
4187 product_specific: true,
4188 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004189 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004190 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004191
Jooyung Han580eb4f2020-06-24 19:33:06 +09004192 apex_key {
4193 name: "myapex.key",
4194 public_key: "testkey.avbpubkey",
4195 private_key: "testkey.pem",
4196 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004197 `)
4198
Colin Cross1c460562021-02-16 17:55:47 -08004199 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004200 apex {
4201 name: "myapex",
4202 key: "myapex.key",
4203 product_specific: true,
4204 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004205 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004206 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004207
Jooyung Han580eb4f2020-06-24 19:33:06 +09004208 apex_key {
4209 name: "myapex.key",
4210 public_key: "testkey.avbpubkey",
4211 private_key: "testkey.pem",
4212 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004213 `, withFiles(map[string][]byte{
4214 "product_specific_file_contexts": nil,
4215 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004216 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4217 rule := module.Output("file_contexts")
4218 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4219}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004220
Jooyung Han580eb4f2020-06-24 19:33:06 +09004221func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004222 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004223 apex {
4224 name: "myapex",
4225 key: "myapex.key",
4226 product_specific: true,
4227 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004228 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004229 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004230
Jooyung Han580eb4f2020-06-24 19:33:06 +09004231 apex_key {
4232 name: "myapex.key",
4233 public_key: "testkey.avbpubkey",
4234 private_key: "testkey.pem",
4235 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004236
Jooyung Han580eb4f2020-06-24 19:33:06 +09004237 filegroup {
4238 name: "my-file-contexts",
4239 srcs: ["product_specific_file_contexts"],
4240 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004241 `, withFiles(map[string][]byte{
4242 "product_specific_file_contexts": nil,
4243 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004244 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4245 rule := module.Output("file_contexts")
4246 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004247}
4248
Jiyong Park67882562019-03-21 01:11:21 +09004249func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004250 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004251 apex_key {
4252 name: "myapex.key",
4253 public_key: ":my.avbpubkey",
4254 private_key: ":my.pem",
4255 product_specific: true,
4256 }
4257
4258 filegroup {
4259 name: "my.avbpubkey",
4260 srcs: ["testkey2.avbpubkey"],
4261 }
4262
4263 filegroup {
4264 name: "my.pem",
4265 srcs: ["testkey2.pem"],
4266 }
4267 `)
4268
4269 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4270 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004271 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004272 if actual_pubkey != expected_pubkey {
4273 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4274 }
4275 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004276 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004277 if actual_privkey != expected_privkey {
4278 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4279 }
4280}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004281
4282func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004283 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004284 prebuilt_apex {
4285 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004286 arch: {
4287 arm64: {
4288 src: "myapex-arm64.apex",
4289 },
4290 arm: {
4291 src: "myapex-arm.apex",
4292 },
4293 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004294 }
4295 `)
4296
4297 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4298
Jiyong Parkc95714e2019-03-29 14:23:10 +09004299 expectedInput := "myapex-arm64.apex"
4300 if prebuilt.inputApex.String() != expectedInput {
4301 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4302 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004303}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004304
4305func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004306 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004307 prebuilt_apex {
4308 name: "myapex",
4309 src: "myapex-arm.apex",
4310 filename: "notmyapex.apex",
4311 }
4312 `)
4313
4314 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4315
4316 expected := "notmyapex.apex"
4317 if p.installFilename != expected {
4318 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4319 }
4320}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004321
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004322func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004323 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004324 prebuilt_apex {
4325 name: "myapex.prebuilt",
4326 src: "myapex-arm.apex",
4327 overrides: [
4328 "myapex",
4329 ],
4330 }
4331 `)
4332
4333 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4334
4335 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004336 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004337 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004338 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004339 }
4340}
4341
Paul Duffin092153d2021-01-26 11:42:39 +00004342// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4343// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004344func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4345 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004346 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004347 }
4348
Paul Duffin89886cb2021-02-05 16:44:03 +00004349 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004350 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004351 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004352 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004353 stem := android.RemoveOptionalPrebuiltPrefix(name)
4354 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004355 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4356 }
4357 }
4358
Paul Duffin39853512021-02-26 11:09:39 +00004359 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004360 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004361 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004362 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4363 }
4364 }
4365
4366 t.Run("prebuilt only", func(t *testing.T) {
4367 bp := `
4368 prebuilt_apex {
4369 name: "myapex",
4370 arch: {
4371 arm64: {
4372 src: "myapex-arm64.apex",
4373 },
4374 arm: {
4375 src: "myapex-arm.apex",
4376 },
4377 },
Paul Duffin39853512021-02-26 11:09:39 +00004378 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004379 }
4380
4381 java_import {
4382 name: "libfoo",
4383 jars: ["libfoo.jar"],
4384 }
Paul Duffin39853512021-02-26 11:09:39 +00004385
4386 java_sdk_library_import {
4387 name: "libbar",
4388 public: {
4389 jars: ["libbar.jar"],
4390 },
4391 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004392 `
4393
4394 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4395 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4396
Paul Duffinf6932af2021-02-26 18:21:56 +00004397 // Make sure that the deapexer has the correct input APEX.
4398 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4399 rule := deapexer.Rule("deapexer")
4400 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4401 t.Errorf("expected: %q, found: %q", expected, actual)
4402 }
4403
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004404 // Make sure that the prebuilt_apex has the correct input APEX.
4405 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4406 rule = prebuiltApex.Rule("android/soong/android.Cp")
4407 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4408 t.Errorf("expected: %q, found: %q", expected, actual)
4409 }
4410
Paul Duffin89886cb2021-02-05 16:44:03 +00004411 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004412
4413 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004414 })
4415
4416 t.Run("prebuilt with source preferred", func(t *testing.T) {
4417
4418 bp := `
4419 prebuilt_apex {
4420 name: "myapex",
4421 arch: {
4422 arm64: {
4423 src: "myapex-arm64.apex",
4424 },
4425 arm: {
4426 src: "myapex-arm.apex",
4427 },
4428 },
Paul Duffin39853512021-02-26 11:09:39 +00004429 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004430 }
4431
4432 java_import {
4433 name: "libfoo",
4434 jars: ["libfoo.jar"],
4435 }
4436
4437 java_library {
4438 name: "libfoo",
4439 }
Paul Duffin39853512021-02-26 11:09:39 +00004440
4441 java_sdk_library_import {
4442 name: "libbar",
4443 public: {
4444 jars: ["libbar.jar"],
4445 },
4446 }
4447
4448 java_sdk_library {
4449 name: "libbar",
4450 srcs: ["foo/bar/MyClass.java"],
4451 unsafe_ignore_missing_latest_api: true,
4452 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004453 `
4454
4455 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4456 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4457
Paul Duffin89886cb2021-02-05 16:44:03 +00004458 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004459 ensureNoSourceVariant(t, ctx, "libfoo")
4460
4461 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4462 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004463 })
4464
4465 t.Run("prebuilt preferred with source", func(t *testing.T) {
4466 bp := `
4467 prebuilt_apex {
4468 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004469 arch: {
4470 arm64: {
4471 src: "myapex-arm64.apex",
4472 },
4473 arm: {
4474 src: "myapex-arm.apex",
4475 },
4476 },
Paul Duffin39853512021-02-26 11:09:39 +00004477 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004478 }
4479
4480 java_import {
4481 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004482 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004483 jars: ["libfoo.jar"],
4484 }
4485
4486 java_library {
4487 name: "libfoo",
4488 }
Paul Duffin39853512021-02-26 11:09:39 +00004489
4490 java_sdk_library_import {
4491 name: "libbar",
4492 prefer: true,
4493 public: {
4494 jars: ["libbar.jar"],
4495 },
4496 }
4497
4498 java_sdk_library {
4499 name: "libbar",
4500 srcs: ["foo/bar/MyClass.java"],
4501 unsafe_ignore_missing_latest_api: true,
4502 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004503 `
4504
4505 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4506 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4507
Paul Duffin89886cb2021-02-05 16:44:03 +00004508 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004509 ensureNoSourceVariant(t, ctx, "libfoo")
4510
4511 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4512 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004513 })
4514}
4515
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004516func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4517 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004518 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004519 }
4520
Paul Duffin37856732021-02-26 14:24:15 +00004521 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4522 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004523 s := ctx.SingletonForTests("dex_bootjars")
4524 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004525 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004526 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004527 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004528 foundLibfooJar = true
4529 buildRule := s.Output(output)
4530 actual := android.NormalizePathForTesting(buildRule.Input)
4531 if actual != bootDexJarPath {
4532 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4533 }
4534 }
4535 }
4536 if !foundLibfooJar {
4537 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4538 }
4539 }
4540
Paul Duffin4fd997b2021-02-03 20:06:33 +00004541 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004542 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004543 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4544 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4545 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4546 }
4547
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004548 t.Run("prebuilt only", func(t *testing.T) {
4549 bp := `
4550 prebuilt_apex {
4551 name: "myapex",
4552 arch: {
4553 arm64: {
4554 src: "myapex-arm64.apex",
4555 },
4556 arm: {
4557 src: "myapex-arm.apex",
4558 },
4559 },
Paul Duffin37856732021-02-26 14:24:15 +00004560 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004561 }
4562
4563 java_import {
4564 name: "libfoo",
4565 jars: ["libfoo.jar"],
4566 apex_available: ["myapex"],
4567 }
Paul Duffin37856732021-02-26 14:24:15 +00004568
4569 java_sdk_library_import {
4570 name: "libbar",
4571 public: {
4572 jars: ["libbar.jar"],
4573 },
4574 apex_available: ["myapex"],
4575 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004576 `
4577
4578 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004579 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4580 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004581
Paul Duffin9d67ca62021-02-03 20:06:33 +00004582 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4583 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004584.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004585.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4586`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004587 })
4588
4589 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4590 bp := `
4591 prebuilt_apex {
4592 name: "myapex",
4593 arch: {
4594 arm64: {
4595 src: "myapex-arm64.apex",
4596 },
4597 arm: {
4598 src: "myapex-arm.apex",
4599 },
4600 },
Paul Duffin37856732021-02-26 14:24:15 +00004601 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004602 }
4603
4604 java_import {
4605 name: "libfoo",
4606 jars: ["libfoo.jar"],
4607 apex_available: ["myapex"],
4608 }
4609
4610 java_library {
4611 name: "libfoo",
4612 srcs: ["foo/bar/MyClass.java"],
4613 apex_available: ["myapex"],
4614 }
Paul Duffin37856732021-02-26 14:24:15 +00004615
4616 java_sdk_library_import {
4617 name: "libbar",
4618 public: {
4619 jars: ["libbar.jar"],
4620 },
4621 apex_available: ["myapex"],
4622 }
4623
4624 java_sdk_library {
4625 name: "libbar",
4626 srcs: ["foo/bar/MyClass.java"],
4627 unsafe_ignore_missing_latest_api: true,
4628 apex_available: ["myapex"],
4629 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004630 `
4631
4632 // In this test the source (java_library) libfoo is active since the
4633 // prebuilt (java_import) defaults to prefer:false. However the
4634 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4635 // find the dex boot jar in it. We either need to disable the source libfoo
4636 // or make the prebuilt libfoo preferred.
4637 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4638 })
4639
4640 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4641 bp := `
4642 prebuilt_apex {
4643 name: "myapex",
4644 arch: {
4645 arm64: {
4646 src: "myapex-arm64.apex",
4647 },
4648 arm: {
4649 src: "myapex-arm.apex",
4650 },
4651 },
Paul Duffin37856732021-02-26 14:24:15 +00004652 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004653 }
4654
4655 java_import {
4656 name: "libfoo",
4657 prefer: true,
4658 jars: ["libfoo.jar"],
4659 apex_available: ["myapex"],
4660 }
4661
4662 java_library {
4663 name: "libfoo",
4664 srcs: ["foo/bar/MyClass.java"],
4665 apex_available: ["myapex"],
4666 }
Paul Duffin37856732021-02-26 14:24:15 +00004667
4668 java_sdk_library_import {
4669 name: "libbar",
4670 prefer: true,
4671 public: {
4672 jars: ["libbar.jar"],
4673 },
4674 apex_available: ["myapex"],
4675 }
4676
4677 java_sdk_library {
4678 name: "libbar",
4679 srcs: ["foo/bar/MyClass.java"],
4680 unsafe_ignore_missing_latest_api: true,
4681 apex_available: ["myapex"],
4682 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004683 `
4684
4685 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004686 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4687 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004688
Paul Duffin9d67ca62021-02-03 20:06:33 +00004689 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4690 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004691.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004692.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4693`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004694 })
4695
4696 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4697 bp := `
4698 apex {
4699 name: "myapex",
4700 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004701 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004702 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004703 }
4704
4705 apex_key {
4706 name: "myapex.key",
4707 public_key: "testkey.avbpubkey",
4708 private_key: "testkey.pem",
4709 }
4710
4711 prebuilt_apex {
4712 name: "myapex",
4713 arch: {
4714 arm64: {
4715 src: "myapex-arm64.apex",
4716 },
4717 arm: {
4718 src: "myapex-arm.apex",
4719 },
4720 },
Paul Duffin37856732021-02-26 14:24:15 +00004721 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004722 }
4723
4724 java_import {
4725 name: "libfoo",
4726 jars: ["libfoo.jar"],
4727 apex_available: ["myapex"],
4728 }
4729
4730 java_library {
4731 name: "libfoo",
4732 srcs: ["foo/bar/MyClass.java"],
4733 apex_available: ["myapex"],
4734 }
Paul Duffin37856732021-02-26 14:24:15 +00004735
4736 java_sdk_library_import {
4737 name: "libbar",
4738 public: {
4739 jars: ["libbar.jar"],
4740 },
4741 apex_available: ["myapex"],
4742 }
4743
4744 java_sdk_library {
4745 name: "libbar",
4746 srcs: ["foo/bar/MyClass.java"],
4747 unsafe_ignore_missing_latest_api: true,
4748 apex_available: ["myapex"],
4749 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004750 `
4751
4752 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004753 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4754 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004755
4756 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4757 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004758.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004759.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4760`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004761 })
4762
4763 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4764 bp := `
4765 apex {
4766 name: "myapex",
4767 enabled: false,
4768 key: "myapex.key",
4769 java_libs: ["libfoo"],
4770 }
4771
4772 apex_key {
4773 name: "myapex.key",
4774 public_key: "testkey.avbpubkey",
4775 private_key: "testkey.pem",
4776 }
4777
4778 prebuilt_apex {
4779 name: "myapex",
4780 arch: {
4781 arm64: {
4782 src: "myapex-arm64.apex",
4783 },
4784 arm: {
4785 src: "myapex-arm.apex",
4786 },
4787 },
Paul Duffin37856732021-02-26 14:24:15 +00004788 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004789 }
4790
4791 java_import {
4792 name: "libfoo",
4793 prefer: true,
4794 jars: ["libfoo.jar"],
4795 apex_available: ["myapex"],
4796 }
4797
4798 java_library {
4799 name: "libfoo",
4800 srcs: ["foo/bar/MyClass.java"],
4801 apex_available: ["myapex"],
4802 }
Paul Duffin37856732021-02-26 14:24:15 +00004803
4804 java_sdk_library_import {
4805 name: "libbar",
4806 prefer: true,
4807 public: {
4808 jars: ["libbar.jar"],
4809 },
4810 apex_available: ["myapex"],
4811 }
4812
4813 java_sdk_library {
4814 name: "libbar",
4815 srcs: ["foo/bar/MyClass.java"],
4816 unsafe_ignore_missing_latest_api: true,
4817 apex_available: ["myapex"],
4818 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004819 `
4820
4821 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004822 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4823 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004824
Paul Duffin9d67ca62021-02-03 20:06:33 +00004825 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4826 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004827.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004828.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4829`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004830 })
4831}
4832
Roland Levillain630846d2019-06-26 12:48:34 +01004833func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004834 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004835 apex_test {
4836 name: "myapex",
4837 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004838 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004839 tests: [
4840 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004841 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004842 ],
4843 }
4844
4845 apex_key {
4846 name: "myapex.key",
4847 public_key: "testkey.avbpubkey",
4848 private_key: "testkey.pem",
4849 }
4850
Liz Kammer1c14a212020-05-12 15:26:55 -07004851 filegroup {
4852 name: "fg",
4853 srcs: [
4854 "baz",
4855 "bar/baz"
4856 ],
4857 }
4858
Roland Levillain630846d2019-06-26 12:48:34 +01004859 cc_test {
4860 name: "mytest",
4861 gtest: false,
4862 srcs: ["mytest.cpp"],
4863 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004864 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004865 system_shared_libs: [],
4866 static_executable: true,
4867 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004868 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004869 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004870
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004871 cc_library {
4872 name: "mylib",
4873 srcs: ["mylib.cpp"],
4874 system_shared_libs: [],
4875 stl: "none",
4876 }
4877
Liz Kammer5bd365f2020-05-27 15:15:11 -07004878 filegroup {
4879 name: "fg2",
4880 srcs: [
4881 "testdata/baz"
4882 ],
4883 }
4884
Roland Levillain9b5fde92019-06-28 15:41:19 +01004885 cc_test {
4886 name: "mytests",
4887 gtest: false,
4888 srcs: [
4889 "mytest1.cpp",
4890 "mytest2.cpp",
4891 "mytest3.cpp",
4892 ],
4893 test_per_src: true,
4894 relative_install_path: "test",
4895 system_shared_libs: [],
4896 static_executable: true,
4897 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004898 data: [
4899 ":fg",
4900 ":fg2",
4901 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004902 }
Roland Levillain630846d2019-06-26 12:48:34 +01004903 `)
4904
Sundong Ahnabb64432019-10-22 13:58:29 +09004905 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004906 copyCmds := apexRule.Args["copy_commands"]
4907
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004908 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004909 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004910 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004911
Liz Kammer1c14a212020-05-12 15:26:55 -07004912 //Ensure that test data are copied into apex.
4913 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4914 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4915
Roland Levillain9b5fde92019-06-28 15:41:19 +01004916 // Ensure that test deps built with `test_per_src` are copied into apex.
4917 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4918 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4919 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004920
4921 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004922 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004923 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004924 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004925 prefix := "TARGET_"
4926 var builder strings.Builder
4927 data.Custom(&builder, name, prefix, "", data)
4928 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004929 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4930 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4931 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4932 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004933 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004934 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004935 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004936
4937 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004938 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004939 data.Custom(&builder, name, prefix, "", data)
4940 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004941 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4942 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004943}
4944
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004945func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004946 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004947 apex {
4948 name: "myapex",
4949 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004950 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004951 }
4952 apex_key {
4953 name: "myapex.key",
4954 public_key: "testkey.avbpubkey",
4955 private_key: "testkey.pem",
4956 }
4957 `, func(fs map[string][]byte, config android.Config) {
4958 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4959 })
4960 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004961 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004962 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004963 var builder strings.Builder
4964 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4965 androidMk := builder.String()
4966 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4967}
4968
Jooyung Hand48f3c32019-08-23 11:18:57 +09004969func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4970 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4971 apex {
4972 name: "myapex",
4973 key: "myapex.key",
4974 native_shared_libs: ["libfoo"],
4975 }
4976
4977 apex_key {
4978 name: "myapex.key",
4979 public_key: "testkey.avbpubkey",
4980 private_key: "testkey.pem",
4981 }
4982
4983 cc_library {
4984 name: "libfoo",
4985 stl: "none",
4986 system_shared_libs: [],
4987 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004988 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004989 }
4990 `)
4991 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4992 apex {
4993 name: "myapex",
4994 key: "myapex.key",
4995 java_libs: ["myjar"],
4996 }
4997
4998 apex_key {
4999 name: "myapex.key",
5000 public_key: "testkey.avbpubkey",
5001 private_key: "testkey.pem",
5002 }
5003
5004 java_library {
5005 name: "myjar",
5006 srcs: ["foo/bar/MyClass.java"],
5007 sdk_version: "none",
5008 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005009 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005010 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005011 }
5012 `)
5013}
5014
Bill Peckhama41a6962021-01-11 10:58:54 -08005015func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005016 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005017 apex {
5018 name: "myapex",
5019 key: "myapex.key",
5020 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005021 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005022 }
5023
5024 apex_key {
5025 name: "myapex.key",
5026 public_key: "testkey.avbpubkey",
5027 private_key: "testkey.pem",
5028 }
5029
5030 java_import {
5031 name: "myjavaimport",
5032 apex_available: ["myapex"],
5033 jars: ["my.jar"],
5034 compile_dex: true,
5035 }
5036 `)
5037
5038 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5039 apexRule := module.Rule("apexRule")
5040 copyCmds := apexRule.Args["copy_commands"]
5041 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5042}
5043
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005044func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005045 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005046 apex {
5047 name: "myapex",
5048 key: "myapex.key",
5049 apps: [
5050 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005051 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005052 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005053 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005054 }
5055
5056 apex_key {
5057 name: "myapex.key",
5058 public_key: "testkey.avbpubkey",
5059 private_key: "testkey.pem",
5060 }
5061
5062 android_app {
5063 name: "AppFoo",
5064 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005065 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005066 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005067 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005068 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005069 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005070 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005071
5072 android_app {
5073 name: "AppFooPriv",
5074 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005075 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005076 system_modules: "none",
5077 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005078 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005079 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005080 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005081
5082 cc_library_shared {
5083 name: "libjni",
5084 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005085 shared_libs: ["libfoo"],
5086 stl: "none",
5087 system_shared_libs: [],
5088 apex_available: [ "myapex" ],
5089 sdk_version: "current",
5090 }
5091
5092 cc_library_shared {
5093 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005094 stl: "none",
5095 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005096 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005097 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005098 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005099 `)
5100
Sundong Ahnabb64432019-10-22 13:58:29 +09005101 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005102 apexRule := module.Rule("apexRule")
5103 copyCmds := apexRule.Args["copy_commands"]
5104
5105 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005106 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005107
Colin Crossaede88c2020-08-11 12:17:01 -07005108 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005109 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005110 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005111 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005112 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005113 // JNI libraries including transitive deps are
5114 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005115 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005116 // ... embedded inside APK (jnilibs.zip)
5117 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5118 // ... and not directly inside the APEX
5119 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5120 }
Dario Frenicde2a032019-10-27 00:29:22 +01005121}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005122
Dario Frenicde2a032019-10-27 00:29:22 +01005123func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005124 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005125 apex {
5126 name: "myapex",
5127 key: "myapex.key",
5128 apps: [
5129 "AppFooPrebuilt",
5130 "AppFooPrivPrebuilt",
5131 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005132 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005133 }
5134
5135 apex_key {
5136 name: "myapex.key",
5137 public_key: "testkey.avbpubkey",
5138 private_key: "testkey.pem",
5139 }
5140
5141 android_app_import {
5142 name: "AppFooPrebuilt",
5143 apk: "PrebuiltAppFoo.apk",
5144 presigned: true,
5145 dex_preopt: {
5146 enabled: false,
5147 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005148 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005149 }
5150
5151 android_app_import {
5152 name: "AppFooPrivPrebuilt",
5153 apk: "PrebuiltAppFooPriv.apk",
5154 privileged: true,
5155 presigned: true,
5156 dex_preopt: {
5157 enabled: false,
5158 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005159 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005160 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005161 }
5162 `)
5163
Sundong Ahnabb64432019-10-22 13:58:29 +09005164 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005165 apexRule := module.Rule("apexRule")
5166 copyCmds := apexRule.Args["copy_commands"]
5167
5168 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005169 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5170}
5171
5172func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005173 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005174 apex {
5175 name: "myapex",
5176 key: "myapex.key",
5177 apps: [
5178 "AppFoo",
5179 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005180 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005181 }
5182
5183 apex_key {
5184 name: "myapex.key",
5185 public_key: "testkey.avbpubkey",
5186 private_key: "testkey.pem",
5187 }
5188
5189 android_app {
5190 name: "AppFoo",
5191 srcs: ["foo/bar/MyClass.java"],
5192 sdk_version: "none",
5193 system_modules: "none",
5194 apex_available: [ "myapex" ],
5195 }
5196
5197 android_app_import {
5198 name: "AppFoo",
5199 apk: "AppFooPrebuilt.apk",
5200 filename: "AppFooPrebuilt.apk",
5201 presigned: true,
5202 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005203 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005204 }
5205 `, withFiles(map[string][]byte{
5206 "AppFooPrebuilt.apk": nil,
5207 }))
5208
5209 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005210 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005211 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005212}
5213
Dario Freni6f3937c2019-12-20 22:58:03 +00005214func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005215 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005216 apex {
5217 name: "myapex",
5218 key: "myapex.key",
5219 apps: [
5220 "TesterHelpAppFoo",
5221 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005222 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005223 }
5224
5225 apex_key {
5226 name: "myapex.key",
5227 public_key: "testkey.avbpubkey",
5228 private_key: "testkey.pem",
5229 }
5230
5231 android_test_helper_app {
5232 name: "TesterHelpAppFoo",
5233 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005234 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005235 }
5236
5237 `)
5238
5239 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5240 apexRule := module.Rule("apexRule")
5241 copyCmds := apexRule.Args["copy_commands"]
5242
5243 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5244}
5245
Jooyung Han18020ea2019-11-13 10:50:48 +09005246func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5247 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005248 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005249 apex {
5250 name: "myapex",
5251 key: "myapex.key",
5252 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005253 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005254 }
5255
5256 apex_key {
5257 name: "myapex.key",
5258 public_key: "testkey.avbpubkey",
5259 private_key: "testkey.pem",
5260 }
5261
5262 apex {
5263 name: "otherapex",
5264 key: "myapex.key",
5265 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005266 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005267 }
5268
5269 cc_defaults {
5270 name: "libfoo-defaults",
5271 apex_available: ["otherapex"],
5272 }
5273
5274 cc_library {
5275 name: "libfoo",
5276 defaults: ["libfoo-defaults"],
5277 stl: "none",
5278 system_shared_libs: [],
5279 }`)
5280}
5281
Paul Duffine52e66f2020-03-30 17:54:29 +01005282func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005283 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005284 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005285 apex {
5286 name: "myapex",
5287 key: "myapex.key",
5288 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005289 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005290 }
5291
5292 apex_key {
5293 name: "myapex.key",
5294 public_key: "testkey.avbpubkey",
5295 private_key: "testkey.pem",
5296 }
5297
5298 apex {
5299 name: "otherapex",
5300 key: "otherapex.key",
5301 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005302 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005303 }
5304
5305 apex_key {
5306 name: "otherapex.key",
5307 public_key: "testkey.avbpubkey",
5308 private_key: "testkey.pem",
5309 }
5310
5311 cc_library {
5312 name: "libfoo",
5313 stl: "none",
5314 system_shared_libs: [],
5315 apex_available: ["otherapex"],
5316 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005317}
Jiyong Park127b40b2019-09-30 16:04:35 +09005318
Paul Duffine52e66f2020-03-30 17:54:29 +01005319func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005320 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005321 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005322.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005323.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005324.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005325.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005326.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005327.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005328 apex {
5329 name: "myapex",
5330 key: "myapex.key",
5331 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005332 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005333 }
5334
5335 apex_key {
5336 name: "myapex.key",
5337 public_key: "testkey.avbpubkey",
5338 private_key: "testkey.pem",
5339 }
5340
Jiyong Park127b40b2019-09-30 16:04:35 +09005341 cc_library {
5342 name: "libfoo",
5343 stl: "none",
5344 shared_libs: ["libbar"],
5345 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005346 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005347 }
5348
5349 cc_library {
5350 name: "libbar",
5351 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005352 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005353 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005354 apex_available: ["myapex"],
5355 }
5356
5357 cc_library {
5358 name: "libbaz",
5359 stl: "none",
5360 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005361 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005362}
Jiyong Park127b40b2019-09-30 16:04:35 +09005363
Paul Duffine52e66f2020-03-30 17:54:29 +01005364func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005365 testApexError(t, "\"otherapex\" is not a valid module name", `
5366 apex {
5367 name: "myapex",
5368 key: "myapex.key",
5369 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005370 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005371 }
5372
5373 apex_key {
5374 name: "myapex.key",
5375 public_key: "testkey.avbpubkey",
5376 private_key: "testkey.pem",
5377 }
5378
5379 cc_library {
5380 name: "libfoo",
5381 stl: "none",
5382 system_shared_libs: [],
5383 apex_available: ["otherapex"],
5384 }`)
5385
Paul Duffine52e66f2020-03-30 17:54:29 +01005386 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005387 apex {
5388 name: "myapex",
5389 key: "myapex.key",
5390 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005391 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005392 }
5393
5394 apex_key {
5395 name: "myapex.key",
5396 public_key: "testkey.avbpubkey",
5397 private_key: "testkey.pem",
5398 }
5399
5400 cc_library {
5401 name: "libfoo",
5402 stl: "none",
5403 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005404 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005405 apex_available: ["myapex"],
5406 }
5407
5408 cc_library {
5409 name: "libbar",
5410 stl: "none",
5411 system_shared_libs: [],
5412 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005413 }
5414
5415 cc_library {
5416 name: "libbaz",
5417 stl: "none",
5418 system_shared_libs: [],
5419 stubs: {
5420 versions: ["10", "20", "30"],
5421 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005422 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005423}
Jiyong Park127b40b2019-09-30 16:04:35 +09005424
Jiyong Park89e850a2020-04-07 16:37:39 +09005425func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005426 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005427 apex {
5428 name: "myapex",
5429 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005430 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005431 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005432 }
5433
5434 apex_key {
5435 name: "myapex.key",
5436 public_key: "testkey.avbpubkey",
5437 private_key: "testkey.pem",
5438 }
5439
5440 cc_library {
5441 name: "libfoo",
5442 stl: "none",
5443 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005444 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005445 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005446 }
5447
5448 cc_library {
5449 name: "libfoo2",
5450 stl: "none",
5451 system_shared_libs: [],
5452 shared_libs: ["libbaz"],
5453 apex_available: ["//apex_available:platform"],
5454 }
5455
5456 cc_library {
5457 name: "libbar",
5458 stl: "none",
5459 system_shared_libs: [],
5460 apex_available: ["myapex"],
5461 }
5462
5463 cc_library {
5464 name: "libbaz",
5465 stl: "none",
5466 system_shared_libs: [],
5467 apex_available: ["myapex"],
5468 stubs: {
5469 versions: ["1"],
5470 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005471 }`)
5472
Jiyong Park89e850a2020-04-07 16:37:39 +09005473 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5474 // because it depends on libbar which isn't available to platform
5475 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5476 if libfoo.NotAvailableForPlatform() != true {
5477 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5478 }
5479
5480 // libfoo2 however can be available to platform because it depends on libbaz which provides
5481 // stubs
5482 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5483 if libfoo2.NotAvailableForPlatform() == true {
5484 t.Errorf("%q should be available to platform", libfoo2.String())
5485 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005486}
Jiyong Parka90ca002019-10-07 15:47:24 +09005487
Paul Duffine52e66f2020-03-30 17:54:29 +01005488func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005489 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005490 apex {
5491 name: "myapex",
5492 key: "myapex.key",
5493 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005494 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005495 }
5496
5497 apex_key {
5498 name: "myapex.key",
5499 public_key: "testkey.avbpubkey",
5500 private_key: "testkey.pem",
5501 }
5502
5503 cc_library {
5504 name: "libfoo",
5505 stl: "none",
5506 system_shared_libs: [],
5507 apex_available: ["myapex"],
5508 static: {
5509 apex_available: ["//apex_available:platform"],
5510 },
5511 }`)
5512
Jiyong Park89e850a2020-04-07 16:37:39 +09005513 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5514 if libfooShared.NotAvailableForPlatform() != true {
5515 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5516 }
5517 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5518 if libfooStatic.NotAvailableForPlatform() != false {
5519 t.Errorf("%q should be available to platform", libfooStatic.String())
5520 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005521}
5522
Jiyong Park5d790c32019-11-15 18:40:32 +09005523func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005524 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005525 apex {
5526 name: "myapex",
5527 key: "myapex.key",
5528 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005529 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005530 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005531 }
5532
5533 override_apex {
5534 name: "override_myapex",
5535 base: "myapex",
5536 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005537 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005538 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005539 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005540 }
5541
5542 apex_key {
5543 name: "myapex.key",
5544 public_key: "testkey.avbpubkey",
5545 private_key: "testkey.pem",
5546 }
5547
5548 android_app {
5549 name: "app",
5550 srcs: ["foo/bar/MyClass.java"],
5551 package_name: "foo",
5552 sdk_version: "none",
5553 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005554 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005555 }
5556
5557 override_android_app {
5558 name: "override_app",
5559 base: "app",
5560 package_name: "bar",
5561 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005562 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005563
Jiyong Park317645e2019-12-05 13:20:58 +09005564 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5565 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5566 if originalVariant.GetOverriddenBy() != "" {
5567 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5568 }
5569 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5570 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5571 }
5572
Jiyong Park5d790c32019-11-15 18:40:32 +09005573 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5574 apexRule := module.Rule("apexRule")
5575 copyCmds := apexRule.Args["copy_commands"]
5576
5577 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005578 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005579
5580 apexBundle := module.Module().(*apexBundle)
5581 name := apexBundle.Name()
5582 if name != "override_myapex" {
5583 t.Errorf("name should be \"override_myapex\", but was %q", name)
5584 }
5585
Baligh Uddin004d7172020-02-19 21:29:28 -08005586 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5587 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5588 }
5589
Jiyong Park20bacab2020-03-03 11:45:41 +09005590 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005591 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005592
Colin Crossaa255532020-07-03 13:18:24 -07005593 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005594 var builder strings.Builder
5595 data.Custom(&builder, name, "TARGET_", "", data)
5596 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005597 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005598 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5599 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005600 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005601 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005602 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005603 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5604 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005605}
5606
Jooyung Han214bf372019-11-12 13:03:50 +09005607func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005608 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005609 apex {
5610 name: "myapex",
5611 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005612 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005613 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005614 }
5615
5616 apex_key {
5617 name: "myapex.key",
5618 public_key: "testkey.avbpubkey",
5619 private_key: "testkey.pem",
5620 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005621
5622 cc_library {
5623 name: "mylib",
5624 srcs: ["mylib.cpp"],
5625 stl: "libc++",
5626 system_shared_libs: [],
5627 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005628 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005629 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005630 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005631
5632 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5633 args := module.Rule("apexRule").Args
5634 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005635 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005636
5637 // The copies of the libraries in the apex should have one more dependency than
5638 // the ones outside the apex, namely the unwinder. Ideally we should check
5639 // the dependency names directly here but for some reason the names are blank in
5640 // this test.
5641 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005642 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005643 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5644 if len(apexImplicits) != len(nonApexImplicits)+1 {
5645 t.Errorf("%q missing unwinder dep", lib)
5646 }
5647 }
Jooyung Han214bf372019-11-12 13:03:50 +09005648}
5649
Paul Duffin9b879592020-05-26 13:21:35 +01005650var filesForSdkLibrary = map[string][]byte{
5651 "api/current.txt": nil,
5652 "api/removed.txt": nil,
5653 "api/system-current.txt": nil,
5654 "api/system-removed.txt": nil,
5655 "api/test-current.txt": nil,
5656 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005657
Anton Hanssondff2c782020-12-21 17:10:01 +00005658 "100/public/api/foo.txt": nil,
5659 "100/public/api/foo-removed.txt": nil,
5660 "100/system/api/foo.txt": nil,
5661 "100/system/api/foo-removed.txt": nil,
5662
Paul Duffineedc5d52020-06-12 17:46:39 +01005663 // For java_sdk_library_import
5664 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005665}
5666
Jooyung Han58f26ab2019-12-18 15:34:32 +09005667func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005668 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005669 apex {
5670 name: "myapex",
5671 key: "myapex.key",
5672 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005673 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005674 }
5675
5676 apex_key {
5677 name: "myapex.key",
5678 public_key: "testkey.avbpubkey",
5679 private_key: "testkey.pem",
5680 }
5681
5682 java_sdk_library {
5683 name: "foo",
5684 srcs: ["a.java"],
5685 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005686 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005687 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005688
5689 prebuilt_apis {
5690 name: "sdk",
5691 api_dirs: ["100"],
5692 }
Paul Duffin9b879592020-05-26 13:21:35 +01005693 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005694
5695 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005696 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005697 "javalib/foo.jar",
5698 "etc/permissions/foo.xml",
5699 })
5700 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005701 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5702 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005703}
5704
Paul Duffin9b879592020-05-26 13:21:35 +01005705func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005706 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005707 apex {
5708 name: "myapex",
5709 key: "myapex.key",
5710 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005711 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005712 }
5713
5714 apex_key {
5715 name: "myapex.key",
5716 public_key: "testkey.avbpubkey",
5717 private_key: "testkey.pem",
5718 }
5719
5720 java_sdk_library {
5721 name: "foo",
5722 srcs: ["a.java"],
5723 api_packages: ["foo"],
5724 apex_available: ["myapex"],
5725 sdk_version: "none",
5726 system_modules: "none",
5727 }
5728
5729 java_library {
5730 name: "bar",
5731 srcs: ["a.java"],
5732 libs: ["foo"],
5733 apex_available: ["myapex"],
5734 sdk_version: "none",
5735 system_modules: "none",
5736 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005737
5738 prebuilt_apis {
5739 name: "sdk",
5740 api_dirs: ["100"],
5741 }
Paul Duffin9b879592020-05-26 13:21:35 +01005742 `, withFiles(filesForSdkLibrary))
5743
5744 // java_sdk_library installs both impl jar and permission XML
5745 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5746 "javalib/bar.jar",
5747 "javalib/foo.jar",
5748 "etc/permissions/foo.xml",
5749 })
5750
5751 // The bar library should depend on the implementation jar.
5752 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5753 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5754 t.Errorf("expected %q, found %#q", expected, actual)
5755 }
5756}
5757
5758func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005759 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005760 apex {
5761 name: "myapex",
5762 key: "myapex.key",
5763 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005764 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005765 }
5766
5767 apex_key {
5768 name: "myapex.key",
5769 public_key: "testkey.avbpubkey",
5770 private_key: "testkey.pem",
5771 }
5772
5773 java_sdk_library {
5774 name: "foo",
5775 srcs: ["a.java"],
5776 api_packages: ["foo"],
5777 apex_available: ["myapex"],
5778 sdk_version: "none",
5779 system_modules: "none",
5780 }
5781
5782 java_library {
5783 name: "bar",
5784 srcs: ["a.java"],
5785 libs: ["foo"],
5786 sdk_version: "none",
5787 system_modules: "none",
5788 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005789
5790 prebuilt_apis {
5791 name: "sdk",
5792 api_dirs: ["100"],
5793 }
Paul Duffin9b879592020-05-26 13:21:35 +01005794 `, withFiles(filesForSdkLibrary))
5795
5796 // java_sdk_library installs both impl jar and permission XML
5797 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5798 "javalib/foo.jar",
5799 "etc/permissions/foo.xml",
5800 })
5801
5802 // The bar library should depend on the stubs jar.
5803 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5804 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5805 t.Errorf("expected %q, found %#q", expected, actual)
5806 }
5807}
5808
Paul Duffineedc5d52020-06-12 17:46:39 +01005809func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005810 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005811 prebuilt_apis {
5812 name: "sdk",
5813 api_dirs: ["100"],
5814 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005815 withFiles(map[string][]byte{
5816 "apex/a.java": nil,
5817 "apex/apex_manifest.json": nil,
5818 "apex/Android.bp": []byte(`
5819 package {
5820 default_visibility: ["//visibility:private"],
5821 }
5822
5823 apex {
5824 name: "myapex",
5825 key: "myapex.key",
5826 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005827 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005828 }
5829
5830 apex_key {
5831 name: "myapex.key",
5832 public_key: "testkey.avbpubkey",
5833 private_key: "testkey.pem",
5834 }
5835
5836 java_library {
5837 name: "bar",
5838 srcs: ["a.java"],
5839 libs: ["foo"],
5840 apex_available: ["myapex"],
5841 sdk_version: "none",
5842 system_modules: "none",
5843 }
5844`),
5845 "source/a.java": nil,
5846 "source/api/current.txt": nil,
5847 "source/api/removed.txt": nil,
5848 "source/Android.bp": []byte(`
5849 package {
5850 default_visibility: ["//visibility:private"],
5851 }
5852
5853 java_sdk_library {
5854 name: "foo",
5855 visibility: ["//apex"],
5856 srcs: ["a.java"],
5857 api_packages: ["foo"],
5858 apex_available: ["myapex"],
5859 sdk_version: "none",
5860 system_modules: "none",
5861 public: {
5862 enabled: true,
5863 },
5864 }
5865`),
5866 "prebuilt/a.jar": nil,
5867 "prebuilt/Android.bp": []byte(`
5868 package {
5869 default_visibility: ["//visibility:private"],
5870 }
5871
5872 java_sdk_library_import {
5873 name: "foo",
5874 visibility: ["//apex", "//source"],
5875 apex_available: ["myapex"],
5876 prefer: true,
5877 public: {
5878 jars: ["a.jar"],
5879 },
5880 }
5881`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005882 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005883 )
5884
5885 // java_sdk_library installs both impl jar and permission XML
5886 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5887 "javalib/bar.jar",
5888 "javalib/foo.jar",
5889 "etc/permissions/foo.xml",
5890 })
5891
5892 // The bar library should depend on the implementation jar.
5893 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5894 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5895 t.Errorf("expected %q, found %#q", expected, actual)
5896 }
5897}
5898
5899func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5900 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5901 apex {
5902 name: "myapex",
5903 key: "myapex.key",
5904 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005905 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005906 }
5907
5908 apex_key {
5909 name: "myapex.key",
5910 public_key: "testkey.avbpubkey",
5911 private_key: "testkey.pem",
5912 }
5913
5914 java_sdk_library_import {
5915 name: "foo",
5916 apex_available: ["myapex"],
5917 prefer: true,
5918 public: {
5919 jars: ["a.jar"],
5920 },
5921 }
5922
5923 `, withFiles(filesForSdkLibrary))
5924}
5925
atrost6e126252020-01-27 17:01:16 +00005926func TestCompatConfig(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005927 ctx := testApex(t, `
atrost6e126252020-01-27 17:01:16 +00005928 apex {
5929 name: "myapex",
5930 key: "myapex.key",
5931 prebuilts: ["myjar-platform-compat-config"],
5932 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005933 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005934 }
5935
5936 apex_key {
5937 name: "myapex.key",
5938 public_key: "testkey.avbpubkey",
5939 private_key: "testkey.pem",
5940 }
5941
5942 platform_compat_config {
5943 name: "myjar-platform-compat-config",
5944 src: ":myjar",
5945 }
5946
5947 java_library {
5948 name: "myjar",
5949 srcs: ["foo/bar/MyClass.java"],
5950 sdk_version: "none",
5951 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005952 apex_available: [ "myapex" ],
5953 }
5954 `)
5955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5956 "etc/compatconfig/myjar-platform-compat-config.xml",
5957 "javalib/myjar.jar",
5958 })
5959}
5960
Jiyong Park479321d2019-12-16 11:47:12 +09005961func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5962 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5963 apex {
5964 name: "myapex",
5965 key: "myapex.key",
5966 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005967 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09005968 }
5969
5970 apex_key {
5971 name: "myapex.key",
5972 public_key: "testkey.avbpubkey",
5973 private_key: "testkey.pem",
5974 }
5975
5976 java_library {
5977 name: "myjar",
5978 srcs: ["foo/bar/MyClass.java"],
5979 sdk_version: "none",
5980 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005981 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005982 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005983 }
5984 `)
5985}
5986
Jiyong Park7afd1072019-12-30 16:56:33 +09005987func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005988 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005989 apex {
5990 name: "myapex",
5991 key: "myapex.key",
5992 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005993 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09005994 }
5995
5996 apex_key {
5997 name: "myapex.key",
5998 public_key: "testkey.avbpubkey",
5999 private_key: "testkey.pem",
6000 }
6001
6002 cc_library {
6003 name: "mylib",
6004 srcs: ["mylib.cpp"],
6005 system_shared_libs: [],
6006 stl: "none",
6007 required: ["a", "b"],
6008 host_required: ["c", "d"],
6009 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006010 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006011 }
6012 `)
6013
6014 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006015 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006016 name := apexBundle.BaseModuleName()
6017 prefix := "TARGET_"
6018 var builder strings.Builder
6019 data.Custom(&builder, name, prefix, "", data)
6020 androidMk := builder.String()
6021 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6022 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6023 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6024}
6025
Jiyong Park7cd10e32020-01-14 09:22:18 +09006026func TestSymlinksFromApexToSystem(t *testing.T) {
6027 bp := `
6028 apex {
6029 name: "myapex",
6030 key: "myapex.key",
6031 native_shared_libs: ["mylib"],
6032 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006033 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006034 }
6035
Jiyong Park9d677202020-02-19 16:29:35 +09006036 apex {
6037 name: "myapex.updatable",
6038 key: "myapex.key",
6039 native_shared_libs: ["mylib"],
6040 java_libs: ["myjar"],
6041 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006042 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006043 }
6044
Jiyong Park7cd10e32020-01-14 09:22:18 +09006045 apex_key {
6046 name: "myapex.key",
6047 public_key: "testkey.avbpubkey",
6048 private_key: "testkey.pem",
6049 }
6050
6051 cc_library {
6052 name: "mylib",
6053 srcs: ["mylib.cpp"],
6054 shared_libs: ["myotherlib"],
6055 system_shared_libs: [],
6056 stl: "none",
6057 apex_available: [
6058 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006059 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006060 "//apex_available:platform",
6061 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006062 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006063 }
6064
6065 cc_library {
6066 name: "myotherlib",
6067 srcs: ["mylib.cpp"],
6068 system_shared_libs: [],
6069 stl: "none",
6070 apex_available: [
6071 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006072 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006073 "//apex_available:platform",
6074 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006075 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006076 }
6077
6078 java_library {
6079 name: "myjar",
6080 srcs: ["foo/bar/MyClass.java"],
6081 sdk_version: "none",
6082 system_modules: "none",
6083 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006084 apex_available: [
6085 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006086 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006087 "//apex_available:platform",
6088 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006089 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006090 }
6091
6092 java_library {
6093 name: "myotherjar",
6094 srcs: ["foo/bar/MyClass.java"],
6095 sdk_version: "none",
6096 system_modules: "none",
6097 apex_available: [
6098 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006099 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006100 "//apex_available:platform",
6101 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006102 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006103 }
6104 `
6105
6106 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6107 for _, f := range files {
6108 if f.path == file {
6109 if f.isLink {
6110 t.Errorf("%q is not a real file", file)
6111 }
6112 return
6113 }
6114 }
6115 t.Errorf("%q is not found", file)
6116 }
6117
6118 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6119 for _, f := range files {
6120 if f.path == file {
6121 if !f.isLink {
6122 t.Errorf("%q is not a symlink", file)
6123 }
6124 return
6125 }
6126 }
6127 t.Errorf("%q is not found", file)
6128 }
6129
Jiyong Park9d677202020-02-19 16:29:35 +09006130 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6131 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006132 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006133 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006134 ensureRealfileExists(t, files, "javalib/myjar.jar")
6135 ensureRealfileExists(t, files, "lib64/mylib.so")
6136 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6137
Jiyong Park9d677202020-02-19 16:29:35 +09006138 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6139 ensureRealfileExists(t, files, "javalib/myjar.jar")
6140 ensureRealfileExists(t, files, "lib64/mylib.so")
6141 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6142
6143 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006144 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006145 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006146 ensureRealfileExists(t, files, "javalib/myjar.jar")
6147 ensureRealfileExists(t, files, "lib64/mylib.so")
6148 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006149
6150 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6151 ensureRealfileExists(t, files, "javalib/myjar.jar")
6152 ensureRealfileExists(t, files, "lib64/mylib.so")
6153 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006154}
6155
Yo Chiange8128052020-07-23 20:09:18 +08006156func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006157 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006158 apex {
6159 name: "myapex",
6160 key: "myapex.key",
6161 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006162 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006163 }
6164
6165 apex_key {
6166 name: "myapex.key",
6167 public_key: "testkey.avbpubkey",
6168 private_key: "testkey.pem",
6169 }
6170
6171 cc_library_shared {
6172 name: "mylib",
6173 srcs: ["mylib.cpp"],
6174 shared_libs: ["myotherlib"],
6175 system_shared_libs: [],
6176 stl: "none",
6177 apex_available: [
6178 "myapex",
6179 "//apex_available:platform",
6180 ],
6181 }
6182
6183 cc_prebuilt_library_shared {
6184 name: "myotherlib",
6185 srcs: ["prebuilt.so"],
6186 system_shared_libs: [],
6187 stl: "none",
6188 apex_available: [
6189 "myapex",
6190 "//apex_available:platform",
6191 ],
6192 }
6193 `)
6194
6195 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006196 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006197 var builder strings.Builder
6198 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6199 androidMk := builder.String()
6200 // `myotherlib` is added to `myapex` as symlink
6201 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6202 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6203 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6204 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006205 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 +08006206}
6207
Jooyung Han643adc42020-02-27 13:50:06 +09006208func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006209 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006210 apex {
6211 name: "myapex",
6212 key: "myapex.key",
6213 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006214 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006215 }
6216
6217 apex_key {
6218 name: "myapex.key",
6219 public_key: "testkey.avbpubkey",
6220 private_key: "testkey.pem",
6221 }
6222
6223 cc_library {
6224 name: "mylib",
6225 srcs: ["mylib.cpp"],
6226 shared_libs: ["mylib2"],
6227 system_shared_libs: [],
6228 stl: "none",
6229 apex_available: [ "myapex" ],
6230 }
6231
6232 cc_library {
6233 name: "mylib2",
6234 srcs: ["mylib.cpp"],
6235 system_shared_libs: [],
6236 stl: "none",
6237 apex_available: [ "myapex" ],
6238 }
6239 `)
6240
6241 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6242 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6243 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6244 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6245 "lib64/mylib.so",
6246 "lib64/mylib2.so",
6247 })
6248}
6249
Jooyung Han49f67012020-04-17 13:43:10 +09006250func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006251 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006252 apex {
6253 name: "myapex",
6254 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006255 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006256 }
6257 apex_key {
6258 name: "myapex.key",
6259 public_key: "testkey.avbpubkey",
6260 private_key: "testkey.pem",
6261 }
6262 `, func(fs map[string][]byte, config android.Config) {
6263 delete(config.Targets, android.Android)
6264 config.AndroidCommonTarget = android.Target{}
6265 })
6266
6267 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6268 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6269 }
6270}
6271
Jiyong Parkbd159612020-02-28 15:22:21 +09006272func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006273 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006274 apex {
6275 name: "myapex",
6276 key: "myapex.key",
6277 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006278 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006279 }
6280
6281 apex_key {
6282 name: "myapex.key",
6283 public_key: "testkey.avbpubkey",
6284 private_key: "testkey.pem",
6285 }
6286
6287 android_app {
6288 name: "AppFoo",
6289 srcs: ["foo/bar/MyClass.java"],
6290 sdk_version: "none",
6291 system_modules: "none",
6292 apex_available: [ "myapex" ],
6293 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006294 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006295
Colin Crosscf371cc2020-11-13 11:48:42 -08006296 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006297 content := bundleConfigRule.Args["content"]
6298
6299 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006300 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 +09006301}
6302
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006303func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006304 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006305 apex {
6306 name: "myapex",
6307 key: "myapex.key",
6308 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006309 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006310 }
6311
6312 apex_key {
6313 name: "myapex.key",
6314 public_key: "testkey.avbpubkey",
6315 private_key: "testkey.pem",
6316 }
6317
6318 android_app_set {
6319 name: "AppSet",
6320 set: "AppSet.apks",
6321 }`)
6322 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006323 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006324 content := bundleConfigRule.Args["content"]
6325 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6326 s := mod.Rule("apexRule").Args["copy_commands"]
6327 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6328 if len(copyCmds) != 3 {
6329 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6330 }
6331 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6332 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6333 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6334}
6335
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006336func TestAppSetBundlePrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006337 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006338 bp := `
6339 apex_set {
6340 name: "myapex",
6341 filename: "foo_v2.apex",
6342 sanitized: {
6343 none: { set: "myapex.apks", },
6344 hwaddress: { set: "myapex.hwasan.apks", },
6345 },
6346 }`
6347 fs["Android.bp"] = []byte(bp)
6348
6349 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6350 })
6351
6352 m := ctx.ModuleForTests("myapex", "android_common")
6353 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6354
6355 actual := extractedApex.Inputs
6356 if len(actual) != 1 {
6357 t.Errorf("expected a single input")
6358 }
6359
6360 expected := "myapex.hwasan.apks"
6361 if actual[0].String() != expected {
6362 t.Errorf("expected %s, got %s", expected, actual[0].String())
6363 }
6364}
6365
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006366func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006367 t.Helper()
6368
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006369 bp := `
6370 java_library {
6371 name: "some-updatable-apex-lib",
6372 srcs: ["a.java"],
6373 sdk_version: "current",
6374 apex_available: [
6375 "some-updatable-apex",
6376 ],
6377 }
6378
6379 java_library {
6380 name: "some-non-updatable-apex-lib",
6381 srcs: ["a.java"],
6382 apex_available: [
6383 "some-non-updatable-apex",
6384 ],
6385 }
6386
6387 java_library {
6388 name: "some-platform-lib",
6389 srcs: ["a.java"],
6390 sdk_version: "current",
6391 installable: true,
6392 }
6393
6394 java_library {
6395 name: "some-art-lib",
6396 srcs: ["a.java"],
6397 sdk_version: "current",
6398 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006399 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006400 ],
6401 hostdex: true,
6402 }
6403
6404 apex {
6405 name: "some-updatable-apex",
6406 key: "some-updatable-apex.key",
6407 java_libs: ["some-updatable-apex-lib"],
6408 updatable: true,
6409 min_sdk_version: "current",
6410 }
6411
6412 apex {
6413 name: "some-non-updatable-apex",
6414 key: "some-non-updatable-apex.key",
6415 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006416 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006417 }
6418
6419 apex_key {
6420 name: "some-updatable-apex.key",
6421 }
6422
6423 apex_key {
6424 name: "some-non-updatable-apex.key",
6425 }
6426
6427 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006428 name: "com.android.art.debug",
6429 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006430 java_libs: ["some-art-lib"],
6431 updatable: true,
6432 min_sdk_version: "current",
6433 }
6434
6435 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006436 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006437 }
6438
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006439 filegroup {
6440 name: "some-updatable-apex-file_contexts",
6441 srcs: [
6442 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6443 ],
6444 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006445
6446 filegroup {
6447 name: "some-non-updatable-apex-file_contexts",
6448 srcs: [
6449 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6450 ],
6451 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006452 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006453
6454 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6455}
6456
Paul Duffin064b70c2020-11-02 17:32:38 +00006457func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006458 t.Helper()
6459
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006460 bp += cc.GatherRequiredDepsForTest(android.Android)
6461 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006462
6463 fs := map[string][]byte{
6464 "a.java": nil,
6465 "a.jar": nil,
6466 "build/make/target/product/security": nil,
6467 "apex_manifest.json": nil,
6468 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006469 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006470 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6471 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6472 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006473 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006474 }
6475 cc.GatherRequiredFilesForTest(fs)
6476
Paul Duffin39853512021-02-26 11:09:39 +00006477 for k, v := range filesForSdkLibrary {
6478 fs[k] = v
6479 }
Colin Crossae8600b2020-10-29 17:09:13 -07006480 config := android.TestArchConfig(buildDir, nil, bp, fs)
6481
6482 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006483 ctx.RegisterModuleType("apex", BundleFactory)
6484 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006485 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006486 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006487 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006488 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006489 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006490 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006491 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006492 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006493 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6494 ctx.PreDepsMutators(RegisterPreDepsMutators)
6495 ctx.PostDepsMutators(RegisterPostDepsMutators)
6496
Colin Crossae8600b2020-10-29 17:09:13 -07006497 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006498
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006499 pathCtx := android.PathContextForTesting(config)
6500 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6501 transformDexpreoptConfig(dexpreoptConfig)
6502 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6503
Paul Duffinf38931c2021-02-05 16:58:28 +00006504 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006505 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006506 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6507 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6508
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006509 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6510 android.FailIfErrored(t, errs)
6511
6512 _, errs = ctx.PrepareBuildActions(config)
6513 if errmsg == "" {
6514 android.FailIfErrored(t, errs)
6515 } else if len(errs) > 0 {
6516 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006517 } else {
6518 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6519 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006520
6521 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006522}
6523
Jooyung Han548640b2020-04-27 12:10:30 +09006524func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6525 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6526 apex {
6527 name: "myapex",
6528 key: "myapex.key",
6529 updatable: true,
6530 }
6531
6532 apex_key {
6533 name: "myapex.key",
6534 public_key: "testkey.avbpubkey",
6535 private_key: "testkey.pem",
6536 }
6537 `)
6538}
6539
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006540func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6541 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6542 apex {
6543 name: "myapex",
6544 key: "myapex.key",
6545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552 `)
6553}
6554
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006555func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006556 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006557 var transform func(*dexpreopt.GlobalConfig)
6558
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006559 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6560 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006561 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006562 }
6563 testNoUpdatableJarsInBootImage(t, "", transform)
6564 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006565
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006566 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006567 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 +01006568 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006569 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006570 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006571 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006572 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006573
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006574 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 -07006575 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 +01006576 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006577 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006578 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006579 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006580 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006581
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006582 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 -07006583 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006584 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006585 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006586 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006587 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006588 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006589
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006590 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 -07006591 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 +01006592 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006593 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006594 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006595 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006596 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006597
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006598 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6599 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006600 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006601 }
6602 testNoUpdatableJarsInBootImage(t, "", transform)
6603 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006604
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006605 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006606 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006607 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006608 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006609 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006610 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006611 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006612
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006613 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006614 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006615 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006616 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006617 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006618 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006619 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006620
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006621 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006622 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006623 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006624 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006625 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006626 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006627 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006628
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006629 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6630 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006631 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006632 }
6633 testNoUpdatableJarsInBootImage(t, "", transform)
6634 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006635
6636}
6637
6638func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6639 transform := func(config *dexpreopt.GlobalConfig) {
6640 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6641 }
6642 t.Run("prebuilt no source", func(t *testing.T) {
6643 testDexpreoptWithApexes(t, `
6644 prebuilt_apex {
6645 name: "myapex" ,
6646 arch: {
6647 arm64: {
6648 src: "myapex-arm64.apex",
6649 },
6650 arm: {
6651 src: "myapex-arm.apex",
6652 },
6653 },
6654 exported_java_libs: ["libfoo"],
6655 }
6656
6657 java_import {
6658 name: "libfoo",
6659 jars: ["libfoo.jar"],
6660 }
6661`, "", transform)
6662 })
6663
6664 t.Run("prebuilt no source", func(t *testing.T) {
6665 testDexpreoptWithApexes(t, `
6666 prebuilt_apex {
6667 name: "myapex" ,
6668 arch: {
6669 arm64: {
6670 src: "myapex-arm64.apex",
6671 },
6672 arm: {
6673 src: "myapex-arm.apex",
6674 },
6675 },
6676 exported_java_libs: ["libfoo"],
6677 }
6678
6679 java_import {
6680 name: "libfoo",
6681 jars: ["libfoo.jar"],
6682 }
6683`, "", transform)
6684 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006685}
6686
Andrei Onea115e7e72020-06-05 21:14:03 +01006687func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6688 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006689 bp += `
6690 apex_key {
6691 name: "myapex.key",
6692 public_key: "testkey.avbpubkey",
6693 private_key: "testkey.pem",
6694 }`
6695 fs := map[string][]byte{
6696 "lib1/src/A.java": nil,
6697 "lib2/src/B.java": nil,
6698 "system/sepolicy/apex/myapex-file_contexts": nil,
6699 }
6700
Colin Crossae8600b2020-10-29 17:09:13 -07006701 config := android.TestArchConfig(buildDir, nil, bp, fs)
6702 android.SetTestNeverallowRules(config, rules)
6703 updatableBootJars := make([]string, 0, len(apexBootJars))
6704 for _, apexBootJar := range apexBootJars {
6705 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6706 }
6707 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6708
6709 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006710 ctx.RegisterModuleType("apex", BundleFactory)
6711 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6712 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6713 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006714 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006715 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6716 ctx.PreDepsMutators(RegisterPreDepsMutators)
6717 ctx.PostDepsMutators(RegisterPostDepsMutators)
6718 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6719
Colin Crossae8600b2020-10-29 17:09:13 -07006720 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006721
6722 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6723 android.FailIfErrored(t, errs)
6724
6725 _, errs = ctx.PrepareBuildActions(config)
6726 if errmsg == "" {
6727 android.FailIfErrored(t, errs)
6728 } else if len(errs) > 0 {
6729 android.FailIfNoMatchingErrors(t, errmsg, errs)
6730 return
6731 } else {
6732 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6733 }
6734}
6735
6736func TestApexPermittedPackagesRules(t *testing.T) {
6737 testcases := []struct {
6738 name string
6739 expectedError string
6740 bp string
6741 bootJars []string
6742 modulesPackages map[string][]string
6743 }{
6744
6745 {
6746 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6747 expectedError: "",
6748 bp: `
6749 java_library {
6750 name: "bcp_lib1",
6751 srcs: ["lib1/src/*.java"],
6752 permitted_packages: ["foo.bar"],
6753 apex_available: ["myapex"],
6754 sdk_version: "none",
6755 system_modules: "none",
6756 }
6757 java_library {
6758 name: "nonbcp_lib2",
6759 srcs: ["lib2/src/*.java"],
6760 apex_available: ["myapex"],
6761 permitted_packages: ["a.b"],
6762 sdk_version: "none",
6763 system_modules: "none",
6764 }
6765 apex {
6766 name: "myapex",
6767 key: "myapex.key",
6768 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006769 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006770 }`,
6771 bootJars: []string{"bcp_lib1"},
6772 modulesPackages: map[string][]string{
6773 "myapex": []string{
6774 "foo.bar",
6775 },
6776 },
6777 },
6778 {
6779 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6780 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.`,
6781 bp: `
6782 java_library {
6783 name: "bcp_lib1",
6784 srcs: ["lib1/src/*.java"],
6785 apex_available: ["myapex"],
6786 permitted_packages: ["foo.bar"],
6787 sdk_version: "none",
6788 system_modules: "none",
6789 }
6790 java_library {
6791 name: "bcp_lib2",
6792 srcs: ["lib2/src/*.java"],
6793 apex_available: ["myapex"],
6794 permitted_packages: ["foo.bar", "bar.baz"],
6795 sdk_version: "none",
6796 system_modules: "none",
6797 }
6798 apex {
6799 name: "myapex",
6800 key: "myapex.key",
6801 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006802 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006803 }
6804 `,
6805 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6806 modulesPackages: map[string][]string{
6807 "myapex": []string{
6808 "foo.bar",
6809 },
6810 },
6811 },
6812 }
6813 for _, tc := range testcases {
6814 t.Run(tc.name, func(t *testing.T) {
6815 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6816 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6817 })
6818 }
6819}
6820
Jiyong Park62304bb2020-04-13 16:19:48 +09006821func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006822 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006823 apex {
6824 name: "myapex",
6825 key: "myapex.key",
6826 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006827 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006828 }
6829
6830 apex_key {
6831 name: "myapex.key",
6832 public_key: "testkey.avbpubkey",
6833 private_key: "testkey.pem",
6834 }
6835
6836 cc_library {
6837 name: "mylib",
6838 srcs: ["mylib.cpp"],
6839 system_shared_libs: [],
6840 stl: "none",
6841 stubs: {
6842 versions: ["1"],
6843 },
6844 apex_available: ["myapex"],
6845 }
6846
6847 cc_library {
6848 name: "myprivlib",
6849 srcs: ["mylib.cpp"],
6850 system_shared_libs: [],
6851 stl: "none",
6852 apex_available: ["myapex"],
6853 }
6854
6855
6856 cc_test {
6857 name: "mytest",
6858 gtest: false,
6859 srcs: ["mylib.cpp"],
6860 system_shared_libs: [],
6861 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006862 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006863 test_for: ["myapex"]
6864 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006865
6866 cc_library {
6867 name: "mytestlib",
6868 srcs: ["mylib.cpp"],
6869 system_shared_libs: [],
6870 shared_libs: ["mylib", "myprivlib"],
6871 stl: "none",
6872 test_for: ["myapex"],
6873 }
6874
6875 cc_benchmark {
6876 name: "mybench",
6877 srcs: ["mylib.cpp"],
6878 system_shared_libs: [],
6879 shared_libs: ["mylib", "myprivlib"],
6880 stl: "none",
6881 test_for: ["myapex"],
6882 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006883 `)
6884
6885 // the test 'mytest' is a test for the apex, therefore is linked to the
6886 // actual implementation of mylib instead of its stub.
6887 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6888 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6889 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006890
6891 // The same should be true for cc_library
6892 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6893 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6894 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6895
6896 // ... and for cc_benchmark
6897 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6898 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6899 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006900}
6901
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006902// TODO(jungjw): Move this to proptools
6903func intPtr(i int) *int {
6904 return &i
6905}
6906
6907func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006908 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006909 apex_set {
6910 name: "myapex",
6911 set: "myapex.apks",
6912 filename: "foo_v2.apex",
6913 overrides: ["foo"],
6914 }
6915 `, func(fs map[string][]byte, config android.Config) {
6916 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006917 config.Targets[android.Android] = []android.Target{
6918 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6919 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6920 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006921 })
6922
6923 m := ctx.ModuleForTests("myapex", "android_common")
6924
6925 // Check extract_apks tool parameters.
6926 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6927 actual := extractedApex.Args["abis"]
6928 expected := "ARMEABI_V7A,ARM64_V8A"
6929 if actual != expected {
6930 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6931 }
6932 actual = extractedApex.Args["sdk-version"]
6933 expected = "30"
6934 if actual != expected {
6935 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6936 }
6937
6938 a := m.Module().(*ApexSet)
6939 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006940 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006941 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6942 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6943 }
6944}
6945
Jiyong Park7d95a512020-05-10 15:16:24 +09006946func TestNoStaticLinkingToStubsLib(t *testing.T) {
6947 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6948 apex {
6949 name: "myapex",
6950 key: "myapex.key",
6951 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006952 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09006953 }
6954
6955 apex_key {
6956 name: "myapex.key",
6957 public_key: "testkey.avbpubkey",
6958 private_key: "testkey.pem",
6959 }
6960
6961 cc_library {
6962 name: "mylib",
6963 srcs: ["mylib.cpp"],
6964 static_libs: ["otherlib"],
6965 system_shared_libs: [],
6966 stl: "none",
6967 apex_available: [ "myapex" ],
6968 }
6969
6970 cc_library {
6971 name: "otherlib",
6972 srcs: ["mylib.cpp"],
6973 system_shared_libs: [],
6974 stl: "none",
6975 stubs: {
6976 versions: ["1", "2", "3"],
6977 },
6978 apex_available: [ "myapex" ],
6979 }
6980 `)
6981}
6982
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006983func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006984 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006985 apex {
6986 name: "myapex",
6987 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006988 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006989 }
6990
6991 apex_key {
6992 name: "myapex.key",
6993 public_key: "testkey.avbpubkey",
6994 private_key: "testkey.pem",
6995 }
6996
6997 prebuilt_apex {
6998 name: "myapex",
6999 prefer: true,
7000 arch: {
7001 arm64: {
7002 src: "myapex-arm64.apex",
7003 },
7004 arm: {
7005 src: "myapex-arm.apex",
7006 },
7007 },
7008 }
7009
7010 apex_set {
7011 name: "myapex_set",
7012 set: "myapex.apks",
7013 filename: "myapex_set.apex",
7014 overrides: ["myapex"],
7015 }
7016 `)
7017
7018 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7019 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7020 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 +09007021 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 +09007022}
7023
Jooyung Han938b5932020-06-20 12:47:47 +09007024func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007025 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007026 apex {
7027 name: "myapex",
7028 key: "myapex.key",
7029 apps: ["app"],
7030 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007031 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007032 }
7033
7034 apex_key {
7035 name: "myapex.key",
7036 public_key: "testkey.avbpubkey",
7037 private_key: "testkey.pem",
7038 }
7039
7040 android_app {
7041 name: "app",
7042 srcs: ["foo/bar/MyClass.java"],
7043 package_name: "foo",
7044 sdk_version: "none",
7045 system_modules: "none",
7046 apex_available: [ "myapex" ],
7047 }
7048 `, withFiles(map[string][]byte{
7049 "sub/Android.bp": []byte(`
7050 override_apex {
7051 name: "override_myapex",
7052 base: "myapex",
7053 apps: ["override_app"],
7054 allowed_files: ":allowed",
7055 }
7056 // Overridable "path" property should be referenced indirectly
7057 filegroup {
7058 name: "allowed",
7059 srcs: ["allowed.txt"],
7060 }
7061 override_android_app {
7062 name: "override_app",
7063 base: "app",
7064 package_name: "bar",
7065 }
7066 `),
7067 }))
7068
7069 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7070 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7071 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7072 }
7073
7074 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7075 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7076 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7077 }
7078}
7079
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007080func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007081 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007082 apex {
7083 name: "myapex",
7084 key: "myapex.key",
7085 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007086 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007087 }
7088
7089 apex_key {
7090 name: "myapex.key",
7091 public_key: "testkey.avbpubkey",
7092 private_key: "testkey.pem",
7093 }
7094
7095 cc_library {
7096 name: "mylib",
7097 srcs: ["mylib.cpp"],
7098 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007099 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007100 },
7101 apex_available: ["myapex"],
7102 }
7103
7104 cc_prebuilt_library_shared {
7105 name: "mylib",
7106 prefer: false,
7107 srcs: ["prebuilt.so"],
7108 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007109 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007110 },
7111 apex_available: ["myapex"],
7112 }
7113 `)
7114}
7115
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007116func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007117 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007118 apex {
7119 name: "myapex",
7120 key: "myapex.key",
7121 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007122 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007123 }
7124 apex_key {
7125 name: "myapex.key",
7126 public_key: "testkey.avbpubkey",
7127 private_key: "testkey.pem",
7128 }
7129 `, func(fs map[string][]byte, config android.Config) {
7130 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7131 })
7132
7133 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7134 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7135
7136 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7137 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7138
7139 // Make sure output of bundle is .capex
7140 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7141 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7142
7143 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007144 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007145 var builder strings.Builder
7146 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7147 androidMk := builder.String()
7148 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7149}
7150
Martin Stjernholm2856c662020-12-02 15:03:42 +00007151func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007152 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007153 apex {
7154 name: "myapex",
7155 key: "myapex.key",
7156 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007157 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007158 }
7159
7160 apex_key {
7161 name: "myapex.key",
7162 public_key: "testkey.avbpubkey",
7163 private_key: "testkey.pem",
7164 }
7165
7166 cc_library {
7167 name: "mylib",
7168 srcs: ["mylib.cpp"],
7169 apex_available: ["myapex"],
7170 shared_libs: ["otherlib"],
7171 system_shared_libs: [],
7172 }
7173
7174 cc_library {
7175 name: "otherlib",
7176 srcs: ["mylib.cpp"],
7177 stubs: {
7178 versions: ["current"],
7179 },
7180 }
7181
7182 cc_prebuilt_library_shared {
7183 name: "otherlib",
7184 prefer: true,
7185 srcs: ["prebuilt.so"],
7186 stubs: {
7187 versions: ["current"],
7188 },
7189 }
7190 `)
7191
7192 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007193 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007194 var builder strings.Builder
7195 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7196 androidMk := builder.String()
7197
7198 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7199 // a thing there.
7200 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7201}
7202
Jiyong Parke3867542020-12-03 17:28:25 +09007203func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007204 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007205 apex {
7206 name: "myapex",
7207 key: "myapex.key",
7208 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007209 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007210 }
7211
7212 apex_key {
7213 name: "myapex.key",
7214 public_key: "testkey.avbpubkey",
7215 private_key: "testkey.pem",
7216 }
7217
7218 cc_library {
7219 name: "mylib",
7220 srcs: ["mylib.cpp"],
7221 system_shared_libs: [],
7222 stl: "none",
7223 apex_available: ["myapex"],
7224 shared_libs: ["mylib2"],
7225 target: {
7226 apex: {
7227 exclude_shared_libs: ["mylib2"],
7228 },
7229 },
7230 }
7231
7232 cc_library {
7233 name: "mylib2",
7234 srcs: ["mylib.cpp"],
7235 system_shared_libs: [],
7236 stl: "none",
7237 }
7238 `)
7239
7240 // Check if mylib is linked to mylib2 for the non-apex target
7241 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7242 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7243
7244 // Make sure that the link doesn't occur for the apex target
7245 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7246 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7247
7248 // It shouldn't appear in the copy cmd as well.
7249 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7250 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7251}
7252
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007253func TestPrebuiltStubLibDep(t *testing.T) {
7254 bpBase := `
7255 apex {
7256 name: "myapex",
7257 key: "myapex.key",
7258 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007259 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007260 }
7261 apex_key {
7262 name: "myapex.key",
7263 public_key: "testkey.avbpubkey",
7264 private_key: "testkey.pem",
7265 }
7266 cc_library {
7267 name: "mylib",
7268 srcs: ["mylib.cpp"],
7269 apex_available: ["myapex"],
7270 shared_libs: ["stublib"],
7271 system_shared_libs: [],
7272 }
7273 apex {
7274 name: "otherapex",
7275 enabled: %s,
7276 key: "myapex.key",
7277 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007278 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007279 }
7280 `
7281
7282 stublibSourceBp := `
7283 cc_library {
7284 name: "stublib",
7285 srcs: ["mylib.cpp"],
7286 apex_available: ["otherapex"],
7287 system_shared_libs: [],
7288 stl: "none",
7289 stubs: {
7290 versions: ["1"],
7291 },
7292 }
7293 `
7294
7295 stublibPrebuiltBp := `
7296 cc_prebuilt_library_shared {
7297 name: "stublib",
7298 srcs: ["prebuilt.so"],
7299 apex_available: ["otherapex"],
7300 stubs: {
7301 versions: ["1"],
7302 },
7303 %s
7304 }
7305 `
7306
7307 tests := []struct {
7308 name string
7309 stublibBp string
7310 usePrebuilt bool
7311 modNames []string // Modules to collect AndroidMkEntries for
7312 otherApexEnabled []string
7313 }{
7314 {
7315 name: "only_source",
7316 stublibBp: stublibSourceBp,
7317 usePrebuilt: false,
7318 modNames: []string{"stublib"},
7319 otherApexEnabled: []string{"true", "false"},
7320 },
7321 {
7322 name: "source_preferred",
7323 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7324 usePrebuilt: false,
7325 modNames: []string{"stublib", "prebuilt_stublib"},
7326 otherApexEnabled: []string{"true", "false"},
7327 },
7328 {
7329 name: "prebuilt_preferred",
7330 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7331 usePrebuilt: true,
7332 modNames: []string{"stublib", "prebuilt_stublib"},
7333 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7334 },
7335 {
7336 name: "only_prebuilt",
7337 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7338 usePrebuilt: true,
7339 modNames: []string{"stublib"},
7340 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7341 },
7342 }
7343
7344 for _, test := range tests {
7345 t.Run(test.name, func(t *testing.T) {
7346 for _, otherApexEnabled := range test.otherApexEnabled {
7347 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007348 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007349
7350 type modAndMkEntries struct {
7351 mod *cc.Module
7352 mkEntries android.AndroidMkEntries
7353 }
7354 entries := []*modAndMkEntries{}
7355
7356 // Gather shared lib modules that are installable
7357 for _, modName := range test.modNames {
7358 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7359 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7360 continue
7361 }
7362 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007363 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007364 continue
7365 }
Colin Crossaa255532020-07-03 13:18:24 -07007366 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007367 if ent.Disabled {
7368 continue
7369 }
7370 entries = append(entries, &modAndMkEntries{
7371 mod: mod,
7372 mkEntries: ent,
7373 })
7374 }
7375 }
7376 }
7377
7378 var entry *modAndMkEntries = nil
7379 for _, ent := range entries {
7380 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7381 if entry != nil {
7382 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7383 } else {
7384 entry = ent
7385 }
7386 }
7387 }
7388
7389 if entry == nil {
7390 t.Errorf("AndroidMk entry for \"stublib\" missing")
7391 } else {
7392 isPrebuilt := entry.mod.Prebuilt() != nil
7393 if isPrebuilt != test.usePrebuilt {
7394 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7395 }
7396 if !entry.mod.IsStubs() {
7397 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7398 }
7399 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7400 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7401 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007402 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7403 expected := "-D__STUBLIB_API__=1"
7404 if !android.InList(expected, cflags) {
7405 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7406 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007407 }
7408 })
7409 }
7410 })
7411 }
7412}
7413
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007414func TestMain(m *testing.M) {
7415 run := func() int {
7416 setUp()
7417 defer tearDown()
7418
7419 return m.Run()
7420 }
7421
7422 os.Exit(run())
7423}