blob: 991f5c9e90ea4aefae5fcd48a7b76468483be6ea [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{
Paul Duffin6d119b82021-03-05 13:57:33 +00005210 // TODO(b/181974714) - this is wrong it should be "app/AppFoo/AppFooPrebuilt.apk"
5211 "app/AppFoo/AppFoo.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005212 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005213}
5214
Dario Freni6f3937c2019-12-20 22:58:03 +00005215func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005216 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005217 apex {
5218 name: "myapex",
5219 key: "myapex.key",
5220 apps: [
5221 "TesterHelpAppFoo",
5222 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005223 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005224 }
5225
5226 apex_key {
5227 name: "myapex.key",
5228 public_key: "testkey.avbpubkey",
5229 private_key: "testkey.pem",
5230 }
5231
5232 android_test_helper_app {
5233 name: "TesterHelpAppFoo",
5234 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005235 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005236 }
5237
5238 `)
5239
5240 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5241 apexRule := module.Rule("apexRule")
5242 copyCmds := apexRule.Args["copy_commands"]
5243
5244 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5245}
5246
Jooyung Han18020ea2019-11-13 10:50:48 +09005247func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5248 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005249 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005250 apex {
5251 name: "myapex",
5252 key: "myapex.key",
5253 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005254 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005255 }
5256
5257 apex_key {
5258 name: "myapex.key",
5259 public_key: "testkey.avbpubkey",
5260 private_key: "testkey.pem",
5261 }
5262
5263 apex {
5264 name: "otherapex",
5265 key: "myapex.key",
5266 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005267 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005268 }
5269
5270 cc_defaults {
5271 name: "libfoo-defaults",
5272 apex_available: ["otherapex"],
5273 }
5274
5275 cc_library {
5276 name: "libfoo",
5277 defaults: ["libfoo-defaults"],
5278 stl: "none",
5279 system_shared_libs: [],
5280 }`)
5281}
5282
Paul Duffine52e66f2020-03-30 17:54:29 +01005283func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005284 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005285 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005286 apex {
5287 name: "myapex",
5288 key: "myapex.key",
5289 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005290 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005291 }
5292
5293 apex_key {
5294 name: "myapex.key",
5295 public_key: "testkey.avbpubkey",
5296 private_key: "testkey.pem",
5297 }
5298
5299 apex {
5300 name: "otherapex",
5301 key: "otherapex.key",
5302 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005303 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005304 }
5305
5306 apex_key {
5307 name: "otherapex.key",
5308 public_key: "testkey.avbpubkey",
5309 private_key: "testkey.pem",
5310 }
5311
5312 cc_library {
5313 name: "libfoo",
5314 stl: "none",
5315 system_shared_libs: [],
5316 apex_available: ["otherapex"],
5317 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005318}
Jiyong Park127b40b2019-09-30 16:04:35 +09005319
Paul Duffine52e66f2020-03-30 17:54:29 +01005320func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005321 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005322 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005323.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005324.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005325.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005326.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005327.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005328.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005329 apex {
5330 name: "myapex",
5331 key: "myapex.key",
5332 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005333 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005334 }
5335
5336 apex_key {
5337 name: "myapex.key",
5338 public_key: "testkey.avbpubkey",
5339 private_key: "testkey.pem",
5340 }
5341
Jiyong Park127b40b2019-09-30 16:04:35 +09005342 cc_library {
5343 name: "libfoo",
5344 stl: "none",
5345 shared_libs: ["libbar"],
5346 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005347 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005348 }
5349
5350 cc_library {
5351 name: "libbar",
5352 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005353 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005354 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005355 apex_available: ["myapex"],
5356 }
5357
5358 cc_library {
5359 name: "libbaz",
5360 stl: "none",
5361 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005362 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005363}
Jiyong Park127b40b2019-09-30 16:04:35 +09005364
Paul Duffine52e66f2020-03-30 17:54:29 +01005365func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005366 testApexError(t, "\"otherapex\" is not a valid module name", `
5367 apex {
5368 name: "myapex",
5369 key: "myapex.key",
5370 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005371 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005372 }
5373
5374 apex_key {
5375 name: "myapex.key",
5376 public_key: "testkey.avbpubkey",
5377 private_key: "testkey.pem",
5378 }
5379
5380 cc_library {
5381 name: "libfoo",
5382 stl: "none",
5383 system_shared_libs: [],
5384 apex_available: ["otherapex"],
5385 }`)
5386
Paul Duffine52e66f2020-03-30 17:54:29 +01005387 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005388 apex {
5389 name: "myapex",
5390 key: "myapex.key",
5391 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005392 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005393 }
5394
5395 apex_key {
5396 name: "myapex.key",
5397 public_key: "testkey.avbpubkey",
5398 private_key: "testkey.pem",
5399 }
5400
5401 cc_library {
5402 name: "libfoo",
5403 stl: "none",
5404 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005405 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005406 apex_available: ["myapex"],
5407 }
5408
5409 cc_library {
5410 name: "libbar",
5411 stl: "none",
5412 system_shared_libs: [],
5413 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005414 }
5415
5416 cc_library {
5417 name: "libbaz",
5418 stl: "none",
5419 system_shared_libs: [],
5420 stubs: {
5421 versions: ["10", "20", "30"],
5422 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005423 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005424}
Jiyong Park127b40b2019-09-30 16:04:35 +09005425
Jiyong Park89e850a2020-04-07 16:37:39 +09005426func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005427 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005428 apex {
5429 name: "myapex",
5430 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005431 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005432 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005433 }
5434
5435 apex_key {
5436 name: "myapex.key",
5437 public_key: "testkey.avbpubkey",
5438 private_key: "testkey.pem",
5439 }
5440
5441 cc_library {
5442 name: "libfoo",
5443 stl: "none",
5444 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005445 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005446 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005447 }
5448
5449 cc_library {
5450 name: "libfoo2",
5451 stl: "none",
5452 system_shared_libs: [],
5453 shared_libs: ["libbaz"],
5454 apex_available: ["//apex_available:platform"],
5455 }
5456
5457 cc_library {
5458 name: "libbar",
5459 stl: "none",
5460 system_shared_libs: [],
5461 apex_available: ["myapex"],
5462 }
5463
5464 cc_library {
5465 name: "libbaz",
5466 stl: "none",
5467 system_shared_libs: [],
5468 apex_available: ["myapex"],
5469 stubs: {
5470 versions: ["1"],
5471 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005472 }`)
5473
Jiyong Park89e850a2020-04-07 16:37:39 +09005474 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5475 // because it depends on libbar which isn't available to platform
5476 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5477 if libfoo.NotAvailableForPlatform() != true {
5478 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5479 }
5480
5481 // libfoo2 however can be available to platform because it depends on libbaz which provides
5482 // stubs
5483 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5484 if libfoo2.NotAvailableForPlatform() == true {
5485 t.Errorf("%q should be available to platform", libfoo2.String())
5486 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005487}
Jiyong Parka90ca002019-10-07 15:47:24 +09005488
Paul Duffine52e66f2020-03-30 17:54:29 +01005489func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005490 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005491 apex {
5492 name: "myapex",
5493 key: "myapex.key",
5494 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005495 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005496 }
5497
5498 apex_key {
5499 name: "myapex.key",
5500 public_key: "testkey.avbpubkey",
5501 private_key: "testkey.pem",
5502 }
5503
5504 cc_library {
5505 name: "libfoo",
5506 stl: "none",
5507 system_shared_libs: [],
5508 apex_available: ["myapex"],
5509 static: {
5510 apex_available: ["//apex_available:platform"],
5511 },
5512 }`)
5513
Jiyong Park89e850a2020-04-07 16:37:39 +09005514 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5515 if libfooShared.NotAvailableForPlatform() != true {
5516 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5517 }
5518 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5519 if libfooStatic.NotAvailableForPlatform() != false {
5520 t.Errorf("%q should be available to platform", libfooStatic.String())
5521 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005522}
5523
Jiyong Park5d790c32019-11-15 18:40:32 +09005524func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005525 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005526 apex {
5527 name: "myapex",
5528 key: "myapex.key",
5529 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005530 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005531 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005532 }
5533
5534 override_apex {
5535 name: "override_myapex",
5536 base: "myapex",
5537 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005538 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005539 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005540 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005541 }
5542
5543 apex_key {
5544 name: "myapex.key",
5545 public_key: "testkey.avbpubkey",
5546 private_key: "testkey.pem",
5547 }
5548
5549 android_app {
5550 name: "app",
5551 srcs: ["foo/bar/MyClass.java"],
5552 package_name: "foo",
5553 sdk_version: "none",
5554 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005555 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005556 }
5557
5558 override_android_app {
5559 name: "override_app",
5560 base: "app",
5561 package_name: "bar",
5562 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005563 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005564
Jiyong Park317645e2019-12-05 13:20:58 +09005565 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5566 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5567 if originalVariant.GetOverriddenBy() != "" {
5568 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5569 }
5570 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5571 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5572 }
5573
Jiyong Park5d790c32019-11-15 18:40:32 +09005574 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5575 apexRule := module.Rule("apexRule")
5576 copyCmds := apexRule.Args["copy_commands"]
5577
5578 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005579 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005580
5581 apexBundle := module.Module().(*apexBundle)
5582 name := apexBundle.Name()
5583 if name != "override_myapex" {
5584 t.Errorf("name should be \"override_myapex\", but was %q", name)
5585 }
5586
Baligh Uddin004d7172020-02-19 21:29:28 -08005587 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5588 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5589 }
5590
Jiyong Park20bacab2020-03-03 11:45:41 +09005591 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005592 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005593
Colin Crossaa255532020-07-03 13:18:24 -07005594 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005595 var builder strings.Builder
5596 data.Custom(&builder, name, "TARGET_", "", data)
5597 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005598 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005599 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5600 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005601 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005602 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005603 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005604 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5605 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005606}
5607
Jooyung Han214bf372019-11-12 13:03:50 +09005608func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005609 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005610 apex {
5611 name: "myapex",
5612 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005613 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005614 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005615 }
5616
5617 apex_key {
5618 name: "myapex.key",
5619 public_key: "testkey.avbpubkey",
5620 private_key: "testkey.pem",
5621 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005622
5623 cc_library {
5624 name: "mylib",
5625 srcs: ["mylib.cpp"],
5626 stl: "libc++",
5627 system_shared_libs: [],
5628 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005629 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005630 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005631 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005632
5633 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5634 args := module.Rule("apexRule").Args
5635 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005636 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005637
5638 // The copies of the libraries in the apex should have one more dependency than
5639 // the ones outside the apex, namely the unwinder. Ideally we should check
5640 // the dependency names directly here but for some reason the names are blank in
5641 // this test.
5642 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005643 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005644 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5645 if len(apexImplicits) != len(nonApexImplicits)+1 {
5646 t.Errorf("%q missing unwinder dep", lib)
5647 }
5648 }
Jooyung Han214bf372019-11-12 13:03:50 +09005649}
5650
Paul Duffin9b879592020-05-26 13:21:35 +01005651var filesForSdkLibrary = map[string][]byte{
5652 "api/current.txt": nil,
5653 "api/removed.txt": nil,
5654 "api/system-current.txt": nil,
5655 "api/system-removed.txt": nil,
5656 "api/test-current.txt": nil,
5657 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005658
Anton Hanssondff2c782020-12-21 17:10:01 +00005659 "100/public/api/foo.txt": nil,
5660 "100/public/api/foo-removed.txt": nil,
5661 "100/system/api/foo.txt": nil,
5662 "100/system/api/foo-removed.txt": nil,
5663
Paul Duffineedc5d52020-06-12 17:46:39 +01005664 // For java_sdk_library_import
5665 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005666}
5667
Jooyung Han58f26ab2019-12-18 15:34:32 +09005668func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005669 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005670 apex {
5671 name: "myapex",
5672 key: "myapex.key",
5673 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005674 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005675 }
5676
5677 apex_key {
5678 name: "myapex.key",
5679 public_key: "testkey.avbpubkey",
5680 private_key: "testkey.pem",
5681 }
5682
5683 java_sdk_library {
5684 name: "foo",
5685 srcs: ["a.java"],
5686 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005687 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005688 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005689
5690 prebuilt_apis {
5691 name: "sdk",
5692 api_dirs: ["100"],
5693 }
Paul Duffin9b879592020-05-26 13:21:35 +01005694 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005695
5696 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005697 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005698 "javalib/foo.jar",
5699 "etc/permissions/foo.xml",
5700 })
5701 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005702 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5703 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005704}
5705
Paul Duffin9b879592020-05-26 13:21:35 +01005706func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005707 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005708 apex {
5709 name: "myapex",
5710 key: "myapex.key",
5711 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005712 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005713 }
5714
5715 apex_key {
5716 name: "myapex.key",
5717 public_key: "testkey.avbpubkey",
5718 private_key: "testkey.pem",
5719 }
5720
5721 java_sdk_library {
5722 name: "foo",
5723 srcs: ["a.java"],
5724 api_packages: ["foo"],
5725 apex_available: ["myapex"],
5726 sdk_version: "none",
5727 system_modules: "none",
5728 }
5729
5730 java_library {
5731 name: "bar",
5732 srcs: ["a.java"],
5733 libs: ["foo"],
5734 apex_available: ["myapex"],
5735 sdk_version: "none",
5736 system_modules: "none",
5737 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005738
5739 prebuilt_apis {
5740 name: "sdk",
5741 api_dirs: ["100"],
5742 }
Paul Duffin9b879592020-05-26 13:21:35 +01005743 `, withFiles(filesForSdkLibrary))
5744
5745 // java_sdk_library installs both impl jar and permission XML
5746 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5747 "javalib/bar.jar",
5748 "javalib/foo.jar",
5749 "etc/permissions/foo.xml",
5750 })
5751
5752 // The bar library should depend on the implementation jar.
5753 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5754 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5755 t.Errorf("expected %q, found %#q", expected, actual)
5756 }
5757}
5758
5759func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005760 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005761 apex {
5762 name: "myapex",
5763 key: "myapex.key",
5764 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005765 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005766 }
5767
5768 apex_key {
5769 name: "myapex.key",
5770 public_key: "testkey.avbpubkey",
5771 private_key: "testkey.pem",
5772 }
5773
5774 java_sdk_library {
5775 name: "foo",
5776 srcs: ["a.java"],
5777 api_packages: ["foo"],
5778 apex_available: ["myapex"],
5779 sdk_version: "none",
5780 system_modules: "none",
5781 }
5782
5783 java_library {
5784 name: "bar",
5785 srcs: ["a.java"],
5786 libs: ["foo"],
5787 sdk_version: "none",
5788 system_modules: "none",
5789 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005790
5791 prebuilt_apis {
5792 name: "sdk",
5793 api_dirs: ["100"],
5794 }
Paul Duffin9b879592020-05-26 13:21:35 +01005795 `, withFiles(filesForSdkLibrary))
5796
5797 // java_sdk_library installs both impl jar and permission XML
5798 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5799 "javalib/foo.jar",
5800 "etc/permissions/foo.xml",
5801 })
5802
5803 // The bar library should depend on the stubs jar.
5804 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5805 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5806 t.Errorf("expected %q, found %#q", expected, actual)
5807 }
5808}
5809
Paul Duffineedc5d52020-06-12 17:46:39 +01005810func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005811 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005812 prebuilt_apis {
5813 name: "sdk",
5814 api_dirs: ["100"],
5815 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005816 withFiles(map[string][]byte{
5817 "apex/a.java": nil,
5818 "apex/apex_manifest.json": nil,
5819 "apex/Android.bp": []byte(`
5820 package {
5821 default_visibility: ["//visibility:private"],
5822 }
5823
5824 apex {
5825 name: "myapex",
5826 key: "myapex.key",
5827 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005828 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005829 }
5830
5831 apex_key {
5832 name: "myapex.key",
5833 public_key: "testkey.avbpubkey",
5834 private_key: "testkey.pem",
5835 }
5836
5837 java_library {
5838 name: "bar",
5839 srcs: ["a.java"],
5840 libs: ["foo"],
5841 apex_available: ["myapex"],
5842 sdk_version: "none",
5843 system_modules: "none",
5844 }
5845`),
5846 "source/a.java": nil,
5847 "source/api/current.txt": nil,
5848 "source/api/removed.txt": nil,
5849 "source/Android.bp": []byte(`
5850 package {
5851 default_visibility: ["//visibility:private"],
5852 }
5853
5854 java_sdk_library {
5855 name: "foo",
5856 visibility: ["//apex"],
5857 srcs: ["a.java"],
5858 api_packages: ["foo"],
5859 apex_available: ["myapex"],
5860 sdk_version: "none",
5861 system_modules: "none",
5862 public: {
5863 enabled: true,
5864 },
5865 }
5866`),
5867 "prebuilt/a.jar": nil,
5868 "prebuilt/Android.bp": []byte(`
5869 package {
5870 default_visibility: ["//visibility:private"],
5871 }
5872
5873 java_sdk_library_import {
5874 name: "foo",
5875 visibility: ["//apex", "//source"],
5876 apex_available: ["myapex"],
5877 prefer: true,
5878 public: {
5879 jars: ["a.jar"],
5880 },
5881 }
5882`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005883 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005884 )
5885
5886 // java_sdk_library installs both impl jar and permission XML
5887 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5888 "javalib/bar.jar",
5889 "javalib/foo.jar",
5890 "etc/permissions/foo.xml",
5891 })
5892
5893 // The bar library should depend on the implementation jar.
5894 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5895 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5896 t.Errorf("expected %q, found %#q", expected, actual)
5897 }
5898}
5899
5900func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5901 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5902 apex {
5903 name: "myapex",
5904 key: "myapex.key",
5905 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005906 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005907 }
5908
5909 apex_key {
5910 name: "myapex.key",
5911 public_key: "testkey.avbpubkey",
5912 private_key: "testkey.pem",
5913 }
5914
5915 java_sdk_library_import {
5916 name: "foo",
5917 apex_available: ["myapex"],
5918 prefer: true,
5919 public: {
5920 jars: ["a.jar"],
5921 },
5922 }
5923
5924 `, withFiles(filesForSdkLibrary))
5925}
5926
atrost6e126252020-01-27 17:01:16 +00005927func TestCompatConfig(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005928 ctx := testApex(t, `
atrost6e126252020-01-27 17:01:16 +00005929 apex {
5930 name: "myapex",
5931 key: "myapex.key",
5932 prebuilts: ["myjar-platform-compat-config"],
5933 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005934 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005935 }
5936
5937 apex_key {
5938 name: "myapex.key",
5939 public_key: "testkey.avbpubkey",
5940 private_key: "testkey.pem",
5941 }
5942
5943 platform_compat_config {
5944 name: "myjar-platform-compat-config",
5945 src: ":myjar",
5946 }
5947
5948 java_library {
5949 name: "myjar",
5950 srcs: ["foo/bar/MyClass.java"],
5951 sdk_version: "none",
5952 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005953 apex_available: [ "myapex" ],
5954 }
5955 `)
5956 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5957 "etc/compatconfig/myjar-platform-compat-config.xml",
5958 "javalib/myjar.jar",
5959 })
5960}
5961
Jiyong Park479321d2019-12-16 11:47:12 +09005962func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5963 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5964 apex {
5965 name: "myapex",
5966 key: "myapex.key",
5967 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005968 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09005969 }
5970
5971 apex_key {
5972 name: "myapex.key",
5973 public_key: "testkey.avbpubkey",
5974 private_key: "testkey.pem",
5975 }
5976
5977 java_library {
5978 name: "myjar",
5979 srcs: ["foo/bar/MyClass.java"],
5980 sdk_version: "none",
5981 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005982 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005983 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005984 }
5985 `)
5986}
5987
Jiyong Park7afd1072019-12-30 16:56:33 +09005988func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005989 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005990 apex {
5991 name: "myapex",
5992 key: "myapex.key",
5993 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005994 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09005995 }
5996
5997 apex_key {
5998 name: "myapex.key",
5999 public_key: "testkey.avbpubkey",
6000 private_key: "testkey.pem",
6001 }
6002
6003 cc_library {
6004 name: "mylib",
6005 srcs: ["mylib.cpp"],
6006 system_shared_libs: [],
6007 stl: "none",
6008 required: ["a", "b"],
6009 host_required: ["c", "d"],
6010 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006011 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006012 }
6013 `)
6014
6015 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006016 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006017 name := apexBundle.BaseModuleName()
6018 prefix := "TARGET_"
6019 var builder strings.Builder
6020 data.Custom(&builder, name, prefix, "", data)
6021 androidMk := builder.String()
6022 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6023 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6024 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6025}
6026
Jiyong Park7cd10e32020-01-14 09:22:18 +09006027func TestSymlinksFromApexToSystem(t *testing.T) {
6028 bp := `
6029 apex {
6030 name: "myapex",
6031 key: "myapex.key",
6032 native_shared_libs: ["mylib"],
6033 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006034 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006035 }
6036
Jiyong Park9d677202020-02-19 16:29:35 +09006037 apex {
6038 name: "myapex.updatable",
6039 key: "myapex.key",
6040 native_shared_libs: ["mylib"],
6041 java_libs: ["myjar"],
6042 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006043 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006044 }
6045
Jiyong Park7cd10e32020-01-14 09:22:18 +09006046 apex_key {
6047 name: "myapex.key",
6048 public_key: "testkey.avbpubkey",
6049 private_key: "testkey.pem",
6050 }
6051
6052 cc_library {
6053 name: "mylib",
6054 srcs: ["mylib.cpp"],
6055 shared_libs: ["myotherlib"],
6056 system_shared_libs: [],
6057 stl: "none",
6058 apex_available: [
6059 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006060 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006061 "//apex_available:platform",
6062 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006063 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006064 }
6065
6066 cc_library {
6067 name: "myotherlib",
6068 srcs: ["mylib.cpp"],
6069 system_shared_libs: [],
6070 stl: "none",
6071 apex_available: [
6072 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006073 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006074 "//apex_available:platform",
6075 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006076 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006077 }
6078
6079 java_library {
6080 name: "myjar",
6081 srcs: ["foo/bar/MyClass.java"],
6082 sdk_version: "none",
6083 system_modules: "none",
6084 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006085 apex_available: [
6086 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006087 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006088 "//apex_available:platform",
6089 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006090 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006091 }
6092
6093 java_library {
6094 name: "myotherjar",
6095 srcs: ["foo/bar/MyClass.java"],
6096 sdk_version: "none",
6097 system_modules: "none",
6098 apex_available: [
6099 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006100 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006101 "//apex_available:platform",
6102 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006103 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006104 }
6105 `
6106
6107 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6108 for _, f := range files {
6109 if f.path == file {
6110 if f.isLink {
6111 t.Errorf("%q is not a real file", file)
6112 }
6113 return
6114 }
6115 }
6116 t.Errorf("%q is not found", file)
6117 }
6118
6119 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6120 for _, f := range files {
6121 if f.path == file {
6122 if !f.isLink {
6123 t.Errorf("%q is not a symlink", file)
6124 }
6125 return
6126 }
6127 }
6128 t.Errorf("%q is not found", file)
6129 }
6130
Jiyong Park9d677202020-02-19 16:29:35 +09006131 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6132 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006133 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006134 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006135 ensureRealfileExists(t, files, "javalib/myjar.jar")
6136 ensureRealfileExists(t, files, "lib64/mylib.so")
6137 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6138
Jiyong Park9d677202020-02-19 16:29:35 +09006139 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6140 ensureRealfileExists(t, files, "javalib/myjar.jar")
6141 ensureRealfileExists(t, files, "lib64/mylib.so")
6142 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6143
6144 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006145 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006146 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006147 ensureRealfileExists(t, files, "javalib/myjar.jar")
6148 ensureRealfileExists(t, files, "lib64/mylib.so")
6149 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006150
6151 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6152 ensureRealfileExists(t, files, "javalib/myjar.jar")
6153 ensureRealfileExists(t, files, "lib64/mylib.so")
6154 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006155}
6156
Yo Chiange8128052020-07-23 20:09:18 +08006157func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006158 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006159 apex {
6160 name: "myapex",
6161 key: "myapex.key",
6162 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006163 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006164 }
6165
6166 apex_key {
6167 name: "myapex.key",
6168 public_key: "testkey.avbpubkey",
6169 private_key: "testkey.pem",
6170 }
6171
6172 cc_library_shared {
6173 name: "mylib",
6174 srcs: ["mylib.cpp"],
6175 shared_libs: ["myotherlib"],
6176 system_shared_libs: [],
6177 stl: "none",
6178 apex_available: [
6179 "myapex",
6180 "//apex_available:platform",
6181 ],
6182 }
6183
6184 cc_prebuilt_library_shared {
6185 name: "myotherlib",
6186 srcs: ["prebuilt.so"],
6187 system_shared_libs: [],
6188 stl: "none",
6189 apex_available: [
6190 "myapex",
6191 "//apex_available:platform",
6192 ],
6193 }
6194 `)
6195
6196 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006197 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006198 var builder strings.Builder
6199 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6200 androidMk := builder.String()
6201 // `myotherlib` is added to `myapex` as symlink
6202 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6203 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6204 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6205 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006206 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 +08006207}
6208
Jooyung Han643adc42020-02-27 13:50:06 +09006209func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006210 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006211 apex {
6212 name: "myapex",
6213 key: "myapex.key",
6214 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006215 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006216 }
6217
6218 apex_key {
6219 name: "myapex.key",
6220 public_key: "testkey.avbpubkey",
6221 private_key: "testkey.pem",
6222 }
6223
6224 cc_library {
6225 name: "mylib",
6226 srcs: ["mylib.cpp"],
6227 shared_libs: ["mylib2"],
6228 system_shared_libs: [],
6229 stl: "none",
6230 apex_available: [ "myapex" ],
6231 }
6232
6233 cc_library {
6234 name: "mylib2",
6235 srcs: ["mylib.cpp"],
6236 system_shared_libs: [],
6237 stl: "none",
6238 apex_available: [ "myapex" ],
6239 }
6240 `)
6241
6242 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6243 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6244 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6245 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6246 "lib64/mylib.so",
6247 "lib64/mylib2.so",
6248 })
6249}
6250
Jooyung Han49f67012020-04-17 13:43:10 +09006251func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006252 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006253 apex {
6254 name: "myapex",
6255 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006256 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006257 }
6258 apex_key {
6259 name: "myapex.key",
6260 public_key: "testkey.avbpubkey",
6261 private_key: "testkey.pem",
6262 }
6263 `, func(fs map[string][]byte, config android.Config) {
6264 delete(config.Targets, android.Android)
6265 config.AndroidCommonTarget = android.Target{}
6266 })
6267
6268 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6269 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6270 }
6271}
6272
Jiyong Parkbd159612020-02-28 15:22:21 +09006273func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006274 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006275 apex {
6276 name: "myapex",
6277 key: "myapex.key",
6278 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006279 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
6288 android_app {
6289 name: "AppFoo",
6290 srcs: ["foo/bar/MyClass.java"],
6291 sdk_version: "none",
6292 system_modules: "none",
6293 apex_available: [ "myapex" ],
6294 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006295 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006296
Colin Crosscf371cc2020-11-13 11:48:42 -08006297 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006298 content := bundleConfigRule.Args["content"]
6299
6300 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006301 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 +09006302}
6303
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006304func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006305 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006306 apex {
6307 name: "myapex",
6308 key: "myapex.key",
6309 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006310 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006311 }
6312
6313 apex_key {
6314 name: "myapex.key",
6315 public_key: "testkey.avbpubkey",
6316 private_key: "testkey.pem",
6317 }
6318
6319 android_app_set {
6320 name: "AppSet",
6321 set: "AppSet.apks",
6322 }`)
6323 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006324 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006325 content := bundleConfigRule.Args["content"]
6326 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6327 s := mod.Rule("apexRule").Args["copy_commands"]
6328 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6329 if len(copyCmds) != 3 {
6330 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6331 }
6332 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6333 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6334 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6335}
6336
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006337func TestAppSetBundlePrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006338 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006339 bp := `
6340 apex_set {
6341 name: "myapex",
6342 filename: "foo_v2.apex",
6343 sanitized: {
6344 none: { set: "myapex.apks", },
6345 hwaddress: { set: "myapex.hwasan.apks", },
6346 },
6347 }`
6348 fs["Android.bp"] = []byte(bp)
6349
6350 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6351 })
6352
6353 m := ctx.ModuleForTests("myapex", "android_common")
6354 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6355
6356 actual := extractedApex.Inputs
6357 if len(actual) != 1 {
6358 t.Errorf("expected a single input")
6359 }
6360
6361 expected := "myapex.hwasan.apks"
6362 if actual[0].String() != expected {
6363 t.Errorf("expected %s, got %s", expected, actual[0].String())
6364 }
6365}
6366
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006367func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006368 t.Helper()
6369
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006370 bp := `
6371 java_library {
6372 name: "some-updatable-apex-lib",
6373 srcs: ["a.java"],
6374 sdk_version: "current",
6375 apex_available: [
6376 "some-updatable-apex",
6377 ],
6378 }
6379
6380 java_library {
6381 name: "some-non-updatable-apex-lib",
6382 srcs: ["a.java"],
6383 apex_available: [
6384 "some-non-updatable-apex",
6385 ],
6386 }
6387
6388 java_library {
6389 name: "some-platform-lib",
6390 srcs: ["a.java"],
6391 sdk_version: "current",
6392 installable: true,
6393 }
6394
6395 java_library {
6396 name: "some-art-lib",
6397 srcs: ["a.java"],
6398 sdk_version: "current",
6399 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006400 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006401 ],
6402 hostdex: true,
6403 }
6404
6405 apex {
6406 name: "some-updatable-apex",
6407 key: "some-updatable-apex.key",
6408 java_libs: ["some-updatable-apex-lib"],
6409 updatable: true,
6410 min_sdk_version: "current",
6411 }
6412
6413 apex {
6414 name: "some-non-updatable-apex",
6415 key: "some-non-updatable-apex.key",
6416 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006417 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006418 }
6419
6420 apex_key {
6421 name: "some-updatable-apex.key",
6422 }
6423
6424 apex_key {
6425 name: "some-non-updatable-apex.key",
6426 }
6427
6428 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006429 name: "com.android.art.debug",
6430 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006431 java_libs: ["some-art-lib"],
6432 updatable: true,
6433 min_sdk_version: "current",
6434 }
6435
6436 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006437 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006438 }
6439
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006440 filegroup {
6441 name: "some-updatable-apex-file_contexts",
6442 srcs: [
6443 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6444 ],
6445 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006446
6447 filegroup {
6448 name: "some-non-updatable-apex-file_contexts",
6449 srcs: [
6450 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6451 ],
6452 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006453 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006454
6455 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6456}
6457
Paul Duffin064b70c2020-11-02 17:32:38 +00006458func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006459 t.Helper()
6460
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006461 bp += cc.GatherRequiredDepsForTest(android.Android)
6462 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006463
6464 fs := map[string][]byte{
6465 "a.java": nil,
6466 "a.jar": nil,
6467 "build/make/target/product/security": nil,
6468 "apex_manifest.json": nil,
6469 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006470 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006471 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6472 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6473 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006474 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006475 }
6476 cc.GatherRequiredFilesForTest(fs)
6477
Paul Duffin39853512021-02-26 11:09:39 +00006478 for k, v := range filesForSdkLibrary {
6479 fs[k] = v
6480 }
Colin Crossae8600b2020-10-29 17:09:13 -07006481 config := android.TestArchConfig(buildDir, nil, bp, fs)
6482
6483 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006484 ctx.RegisterModuleType("apex", BundleFactory)
6485 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006486 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006487 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006488 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006489 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006490 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006491 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006492 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006493 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006494 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6495 ctx.PreDepsMutators(RegisterPreDepsMutators)
6496 ctx.PostDepsMutators(RegisterPostDepsMutators)
6497
Colin Crossae8600b2020-10-29 17:09:13 -07006498 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006499
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006500 pathCtx := android.PathContextForTesting(config)
6501 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6502 transformDexpreoptConfig(dexpreoptConfig)
6503 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6504
Paul Duffinf38931c2021-02-05 16:58:28 +00006505 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006506 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006507 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6508 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6509
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006510 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6511 android.FailIfErrored(t, errs)
6512
6513 _, errs = ctx.PrepareBuildActions(config)
6514 if errmsg == "" {
6515 android.FailIfErrored(t, errs)
6516 } else if len(errs) > 0 {
6517 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006518 } else {
6519 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6520 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006521
6522 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006523}
6524
Jooyung Han548640b2020-04-27 12:10:30 +09006525func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6526 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6527 apex {
6528 name: "myapex",
6529 key: "myapex.key",
6530 updatable: true,
6531 }
6532
6533 apex_key {
6534 name: "myapex.key",
6535 public_key: "testkey.avbpubkey",
6536 private_key: "testkey.pem",
6537 }
6538 `)
6539}
6540
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006541func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6542 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6543 apex {
6544 name: "myapex",
6545 key: "myapex.key",
6546 }
6547
6548 apex_key {
6549 name: "myapex.key",
6550 public_key: "testkey.avbpubkey",
6551 private_key: "testkey.pem",
6552 }
6553 `)
6554}
6555
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006556func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006557 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006558 var transform func(*dexpreopt.GlobalConfig)
6559
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006560 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6561 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006562 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006563 }
6564 testNoUpdatableJarsInBootImage(t, "", transform)
6565 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006566
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006567 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006568 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 +01006569 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006570 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006571 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006572 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006573 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006574
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006575 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 -07006576 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 +01006577 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006578 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006579 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006580 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006581 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006582
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006583 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 -07006584 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006585 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006586 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006587 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006588 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006589 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006590
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006591 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 -07006592 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 +01006593 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006594 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006595 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006596 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006597 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006598
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006599 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6600 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006601 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006602 }
6603 testNoUpdatableJarsInBootImage(t, "", transform)
6604 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006605
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006606 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006607 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006608 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006609 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006610 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006611 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006612 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006613
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006614 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006615 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006616 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006617 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006618 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006619 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006620 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006621
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006622 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006623 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006624 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006625 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006626 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006627 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006628 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006629
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006630 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6631 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006632 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006633 }
6634 testNoUpdatableJarsInBootImage(t, "", transform)
6635 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006636
6637}
6638
6639func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6640 transform := func(config *dexpreopt.GlobalConfig) {
6641 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6642 }
6643 t.Run("prebuilt no source", func(t *testing.T) {
6644 testDexpreoptWithApexes(t, `
6645 prebuilt_apex {
6646 name: "myapex" ,
6647 arch: {
6648 arm64: {
6649 src: "myapex-arm64.apex",
6650 },
6651 arm: {
6652 src: "myapex-arm.apex",
6653 },
6654 },
6655 exported_java_libs: ["libfoo"],
6656 }
6657
6658 java_import {
6659 name: "libfoo",
6660 jars: ["libfoo.jar"],
6661 }
6662`, "", transform)
6663 })
6664
6665 t.Run("prebuilt no source", func(t *testing.T) {
6666 testDexpreoptWithApexes(t, `
6667 prebuilt_apex {
6668 name: "myapex" ,
6669 arch: {
6670 arm64: {
6671 src: "myapex-arm64.apex",
6672 },
6673 arm: {
6674 src: "myapex-arm.apex",
6675 },
6676 },
6677 exported_java_libs: ["libfoo"],
6678 }
6679
6680 java_import {
6681 name: "libfoo",
6682 jars: ["libfoo.jar"],
6683 }
6684`, "", transform)
6685 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006686}
6687
Andrei Onea115e7e72020-06-05 21:14:03 +01006688func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6689 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006690 bp += `
6691 apex_key {
6692 name: "myapex.key",
6693 public_key: "testkey.avbpubkey",
6694 private_key: "testkey.pem",
6695 }`
6696 fs := map[string][]byte{
6697 "lib1/src/A.java": nil,
6698 "lib2/src/B.java": nil,
6699 "system/sepolicy/apex/myapex-file_contexts": nil,
6700 }
6701
Colin Crossae8600b2020-10-29 17:09:13 -07006702 config := android.TestArchConfig(buildDir, nil, bp, fs)
6703 android.SetTestNeverallowRules(config, rules)
6704 updatableBootJars := make([]string, 0, len(apexBootJars))
6705 for _, apexBootJar := range apexBootJars {
6706 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6707 }
6708 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6709
6710 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006711 ctx.RegisterModuleType("apex", BundleFactory)
6712 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6713 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6714 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006715 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006716 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6717 ctx.PreDepsMutators(RegisterPreDepsMutators)
6718 ctx.PostDepsMutators(RegisterPostDepsMutators)
6719 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6720
Colin Crossae8600b2020-10-29 17:09:13 -07006721 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006722
6723 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6724 android.FailIfErrored(t, errs)
6725
6726 _, errs = ctx.PrepareBuildActions(config)
6727 if errmsg == "" {
6728 android.FailIfErrored(t, errs)
6729 } else if len(errs) > 0 {
6730 android.FailIfNoMatchingErrors(t, errmsg, errs)
6731 return
6732 } else {
6733 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6734 }
6735}
6736
6737func TestApexPermittedPackagesRules(t *testing.T) {
6738 testcases := []struct {
6739 name string
6740 expectedError string
6741 bp string
6742 bootJars []string
6743 modulesPackages map[string][]string
6744 }{
6745
6746 {
6747 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6748 expectedError: "",
6749 bp: `
6750 java_library {
6751 name: "bcp_lib1",
6752 srcs: ["lib1/src/*.java"],
6753 permitted_packages: ["foo.bar"],
6754 apex_available: ["myapex"],
6755 sdk_version: "none",
6756 system_modules: "none",
6757 }
6758 java_library {
6759 name: "nonbcp_lib2",
6760 srcs: ["lib2/src/*.java"],
6761 apex_available: ["myapex"],
6762 permitted_packages: ["a.b"],
6763 sdk_version: "none",
6764 system_modules: "none",
6765 }
6766 apex {
6767 name: "myapex",
6768 key: "myapex.key",
6769 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006770 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006771 }`,
6772 bootJars: []string{"bcp_lib1"},
6773 modulesPackages: map[string][]string{
6774 "myapex": []string{
6775 "foo.bar",
6776 },
6777 },
6778 },
6779 {
6780 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6781 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.`,
6782 bp: `
6783 java_library {
6784 name: "bcp_lib1",
6785 srcs: ["lib1/src/*.java"],
6786 apex_available: ["myapex"],
6787 permitted_packages: ["foo.bar"],
6788 sdk_version: "none",
6789 system_modules: "none",
6790 }
6791 java_library {
6792 name: "bcp_lib2",
6793 srcs: ["lib2/src/*.java"],
6794 apex_available: ["myapex"],
6795 permitted_packages: ["foo.bar", "bar.baz"],
6796 sdk_version: "none",
6797 system_modules: "none",
6798 }
6799 apex {
6800 name: "myapex",
6801 key: "myapex.key",
6802 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006803 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006804 }
6805 `,
6806 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6807 modulesPackages: map[string][]string{
6808 "myapex": []string{
6809 "foo.bar",
6810 },
6811 },
6812 },
6813 }
6814 for _, tc := range testcases {
6815 t.Run(tc.name, func(t *testing.T) {
6816 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6817 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6818 })
6819 }
6820}
6821
Jiyong Park62304bb2020-04-13 16:19:48 +09006822func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006823 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006824 apex {
6825 name: "myapex",
6826 key: "myapex.key",
6827 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006828 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006829 }
6830
6831 apex_key {
6832 name: "myapex.key",
6833 public_key: "testkey.avbpubkey",
6834 private_key: "testkey.pem",
6835 }
6836
6837 cc_library {
6838 name: "mylib",
6839 srcs: ["mylib.cpp"],
6840 system_shared_libs: [],
6841 stl: "none",
6842 stubs: {
6843 versions: ["1"],
6844 },
6845 apex_available: ["myapex"],
6846 }
6847
6848 cc_library {
6849 name: "myprivlib",
6850 srcs: ["mylib.cpp"],
6851 system_shared_libs: [],
6852 stl: "none",
6853 apex_available: ["myapex"],
6854 }
6855
6856
6857 cc_test {
6858 name: "mytest",
6859 gtest: false,
6860 srcs: ["mylib.cpp"],
6861 system_shared_libs: [],
6862 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006863 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006864 test_for: ["myapex"]
6865 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006866
6867 cc_library {
6868 name: "mytestlib",
6869 srcs: ["mylib.cpp"],
6870 system_shared_libs: [],
6871 shared_libs: ["mylib", "myprivlib"],
6872 stl: "none",
6873 test_for: ["myapex"],
6874 }
6875
6876 cc_benchmark {
6877 name: "mybench",
6878 srcs: ["mylib.cpp"],
6879 system_shared_libs: [],
6880 shared_libs: ["mylib", "myprivlib"],
6881 stl: "none",
6882 test_for: ["myapex"],
6883 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006884 `)
6885
6886 // the test 'mytest' is a test for the apex, therefore is linked to the
6887 // actual implementation of mylib instead of its stub.
6888 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6889 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6890 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006891
6892 // The same should be true for cc_library
6893 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6894 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6895 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6896
6897 // ... and for cc_benchmark
6898 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6899 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6900 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006901}
6902
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006903// TODO(jungjw): Move this to proptools
6904func intPtr(i int) *int {
6905 return &i
6906}
6907
6908func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006909 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006910 apex_set {
6911 name: "myapex",
6912 set: "myapex.apks",
6913 filename: "foo_v2.apex",
6914 overrides: ["foo"],
6915 }
6916 `, func(fs map[string][]byte, config android.Config) {
6917 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006918 config.Targets[android.Android] = []android.Target{
6919 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6920 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6921 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006922 })
6923
6924 m := ctx.ModuleForTests("myapex", "android_common")
6925
6926 // Check extract_apks tool parameters.
6927 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6928 actual := extractedApex.Args["abis"]
6929 expected := "ARMEABI_V7A,ARM64_V8A"
6930 if actual != expected {
6931 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6932 }
6933 actual = extractedApex.Args["sdk-version"]
6934 expected = "30"
6935 if actual != expected {
6936 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6937 }
6938
6939 a := m.Module().(*ApexSet)
6940 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006941 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006942 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6943 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6944 }
6945}
6946
Jiyong Park7d95a512020-05-10 15:16:24 +09006947func TestNoStaticLinkingToStubsLib(t *testing.T) {
6948 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6949 apex {
6950 name: "myapex",
6951 key: "myapex.key",
6952 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006953 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09006954 }
6955
6956 apex_key {
6957 name: "myapex.key",
6958 public_key: "testkey.avbpubkey",
6959 private_key: "testkey.pem",
6960 }
6961
6962 cc_library {
6963 name: "mylib",
6964 srcs: ["mylib.cpp"],
6965 static_libs: ["otherlib"],
6966 system_shared_libs: [],
6967 stl: "none",
6968 apex_available: [ "myapex" ],
6969 }
6970
6971 cc_library {
6972 name: "otherlib",
6973 srcs: ["mylib.cpp"],
6974 system_shared_libs: [],
6975 stl: "none",
6976 stubs: {
6977 versions: ["1", "2", "3"],
6978 },
6979 apex_available: [ "myapex" ],
6980 }
6981 `)
6982}
6983
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006984func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006985 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006986 apex {
6987 name: "myapex",
6988 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006989 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006990 }
6991
6992 apex_key {
6993 name: "myapex.key",
6994 public_key: "testkey.avbpubkey",
6995 private_key: "testkey.pem",
6996 }
6997
6998 prebuilt_apex {
6999 name: "myapex",
7000 prefer: true,
7001 arch: {
7002 arm64: {
7003 src: "myapex-arm64.apex",
7004 },
7005 arm: {
7006 src: "myapex-arm.apex",
7007 },
7008 },
7009 }
7010
7011 apex_set {
7012 name: "myapex_set",
7013 set: "myapex.apks",
7014 filename: "myapex_set.apex",
7015 overrides: ["myapex"],
7016 }
7017 `)
7018
7019 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7020 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7021 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 +09007022 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 +09007023}
7024
Jooyung Han938b5932020-06-20 12:47:47 +09007025func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007026 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007027 apex {
7028 name: "myapex",
7029 key: "myapex.key",
7030 apps: ["app"],
7031 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007032 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007033 }
7034
7035 apex_key {
7036 name: "myapex.key",
7037 public_key: "testkey.avbpubkey",
7038 private_key: "testkey.pem",
7039 }
7040
7041 android_app {
7042 name: "app",
7043 srcs: ["foo/bar/MyClass.java"],
7044 package_name: "foo",
7045 sdk_version: "none",
7046 system_modules: "none",
7047 apex_available: [ "myapex" ],
7048 }
7049 `, withFiles(map[string][]byte{
7050 "sub/Android.bp": []byte(`
7051 override_apex {
7052 name: "override_myapex",
7053 base: "myapex",
7054 apps: ["override_app"],
7055 allowed_files: ":allowed",
7056 }
7057 // Overridable "path" property should be referenced indirectly
7058 filegroup {
7059 name: "allowed",
7060 srcs: ["allowed.txt"],
7061 }
7062 override_android_app {
7063 name: "override_app",
7064 base: "app",
7065 package_name: "bar",
7066 }
7067 `),
7068 }))
7069
7070 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7071 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7072 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7073 }
7074
7075 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7076 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7077 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7078 }
7079}
7080
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007081func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007082 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007083 apex {
7084 name: "myapex",
7085 key: "myapex.key",
7086 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007087 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007088 }
7089
7090 apex_key {
7091 name: "myapex.key",
7092 public_key: "testkey.avbpubkey",
7093 private_key: "testkey.pem",
7094 }
7095
7096 cc_library {
7097 name: "mylib",
7098 srcs: ["mylib.cpp"],
7099 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007100 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007101 },
7102 apex_available: ["myapex"],
7103 }
7104
7105 cc_prebuilt_library_shared {
7106 name: "mylib",
7107 prefer: false,
7108 srcs: ["prebuilt.so"],
7109 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007110 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007111 },
7112 apex_available: ["myapex"],
7113 }
7114 `)
7115}
7116
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007117func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007118 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007119 apex {
7120 name: "myapex",
7121 key: "myapex.key",
7122 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007123 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007124 }
7125 apex_key {
7126 name: "myapex.key",
7127 public_key: "testkey.avbpubkey",
7128 private_key: "testkey.pem",
7129 }
7130 `, func(fs map[string][]byte, config android.Config) {
7131 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7132 })
7133
7134 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7135 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7136
7137 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7138 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7139
7140 // Make sure output of bundle is .capex
7141 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7142 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7143
7144 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007145 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007146 var builder strings.Builder
7147 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7148 androidMk := builder.String()
7149 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7150}
7151
Martin Stjernholm2856c662020-12-02 15:03:42 +00007152func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007153 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007154 apex {
7155 name: "myapex",
7156 key: "myapex.key",
7157 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007158 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007159 }
7160
7161 apex_key {
7162 name: "myapex.key",
7163 public_key: "testkey.avbpubkey",
7164 private_key: "testkey.pem",
7165 }
7166
7167 cc_library {
7168 name: "mylib",
7169 srcs: ["mylib.cpp"],
7170 apex_available: ["myapex"],
7171 shared_libs: ["otherlib"],
7172 system_shared_libs: [],
7173 }
7174
7175 cc_library {
7176 name: "otherlib",
7177 srcs: ["mylib.cpp"],
7178 stubs: {
7179 versions: ["current"],
7180 },
7181 }
7182
7183 cc_prebuilt_library_shared {
7184 name: "otherlib",
7185 prefer: true,
7186 srcs: ["prebuilt.so"],
7187 stubs: {
7188 versions: ["current"],
7189 },
7190 }
7191 `)
7192
7193 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007194 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007195 var builder strings.Builder
7196 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7197 androidMk := builder.String()
7198
7199 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7200 // a thing there.
7201 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7202}
7203
Jiyong Parke3867542020-12-03 17:28:25 +09007204func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007205 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007206 apex {
7207 name: "myapex",
7208 key: "myapex.key",
7209 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007210 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007211 }
7212
7213 apex_key {
7214 name: "myapex.key",
7215 public_key: "testkey.avbpubkey",
7216 private_key: "testkey.pem",
7217 }
7218
7219 cc_library {
7220 name: "mylib",
7221 srcs: ["mylib.cpp"],
7222 system_shared_libs: [],
7223 stl: "none",
7224 apex_available: ["myapex"],
7225 shared_libs: ["mylib2"],
7226 target: {
7227 apex: {
7228 exclude_shared_libs: ["mylib2"],
7229 },
7230 },
7231 }
7232
7233 cc_library {
7234 name: "mylib2",
7235 srcs: ["mylib.cpp"],
7236 system_shared_libs: [],
7237 stl: "none",
7238 }
7239 `)
7240
7241 // Check if mylib is linked to mylib2 for the non-apex target
7242 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7243 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7244
7245 // Make sure that the link doesn't occur for the apex target
7246 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7247 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7248
7249 // It shouldn't appear in the copy cmd as well.
7250 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7251 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7252}
7253
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007254func TestPrebuiltStubLibDep(t *testing.T) {
7255 bpBase := `
7256 apex {
7257 name: "myapex",
7258 key: "myapex.key",
7259 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007260 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007261 }
7262 apex_key {
7263 name: "myapex.key",
7264 public_key: "testkey.avbpubkey",
7265 private_key: "testkey.pem",
7266 }
7267 cc_library {
7268 name: "mylib",
7269 srcs: ["mylib.cpp"],
7270 apex_available: ["myapex"],
7271 shared_libs: ["stublib"],
7272 system_shared_libs: [],
7273 }
7274 apex {
7275 name: "otherapex",
7276 enabled: %s,
7277 key: "myapex.key",
7278 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007279 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007280 }
7281 `
7282
7283 stublibSourceBp := `
7284 cc_library {
7285 name: "stublib",
7286 srcs: ["mylib.cpp"],
7287 apex_available: ["otherapex"],
7288 system_shared_libs: [],
7289 stl: "none",
7290 stubs: {
7291 versions: ["1"],
7292 },
7293 }
7294 `
7295
7296 stublibPrebuiltBp := `
7297 cc_prebuilt_library_shared {
7298 name: "stublib",
7299 srcs: ["prebuilt.so"],
7300 apex_available: ["otherapex"],
7301 stubs: {
7302 versions: ["1"],
7303 },
7304 %s
7305 }
7306 `
7307
7308 tests := []struct {
7309 name string
7310 stublibBp string
7311 usePrebuilt bool
7312 modNames []string // Modules to collect AndroidMkEntries for
7313 otherApexEnabled []string
7314 }{
7315 {
7316 name: "only_source",
7317 stublibBp: stublibSourceBp,
7318 usePrebuilt: false,
7319 modNames: []string{"stublib"},
7320 otherApexEnabled: []string{"true", "false"},
7321 },
7322 {
7323 name: "source_preferred",
7324 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7325 usePrebuilt: false,
7326 modNames: []string{"stublib", "prebuilt_stublib"},
7327 otherApexEnabled: []string{"true", "false"},
7328 },
7329 {
7330 name: "prebuilt_preferred",
7331 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7332 usePrebuilt: true,
7333 modNames: []string{"stublib", "prebuilt_stublib"},
7334 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7335 },
7336 {
7337 name: "only_prebuilt",
7338 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7339 usePrebuilt: true,
7340 modNames: []string{"stublib"},
7341 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7342 },
7343 }
7344
7345 for _, test := range tests {
7346 t.Run(test.name, func(t *testing.T) {
7347 for _, otherApexEnabled := range test.otherApexEnabled {
7348 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007349 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007350
7351 type modAndMkEntries struct {
7352 mod *cc.Module
7353 mkEntries android.AndroidMkEntries
7354 }
7355 entries := []*modAndMkEntries{}
7356
7357 // Gather shared lib modules that are installable
7358 for _, modName := range test.modNames {
7359 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7360 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7361 continue
7362 }
7363 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007364 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007365 continue
7366 }
Colin Crossaa255532020-07-03 13:18:24 -07007367 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007368 if ent.Disabled {
7369 continue
7370 }
7371 entries = append(entries, &modAndMkEntries{
7372 mod: mod,
7373 mkEntries: ent,
7374 })
7375 }
7376 }
7377 }
7378
7379 var entry *modAndMkEntries = nil
7380 for _, ent := range entries {
7381 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7382 if entry != nil {
7383 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7384 } else {
7385 entry = ent
7386 }
7387 }
7388 }
7389
7390 if entry == nil {
7391 t.Errorf("AndroidMk entry for \"stublib\" missing")
7392 } else {
7393 isPrebuilt := entry.mod.Prebuilt() != nil
7394 if isPrebuilt != test.usePrebuilt {
7395 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7396 }
7397 if !entry.mod.IsStubs() {
7398 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7399 }
7400 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7401 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7402 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007403 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7404 expected := "-D__STUBLIB_API__=1"
7405 if !android.InList(expected, cflags) {
7406 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7407 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007408 }
7409 })
7410 }
7411 })
7412 }
7413}
7414
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007415func TestMain(m *testing.M) {
7416 run := func() int {
7417 setUp()
7418 defer tearDown()
7419
7420 return m.Run()
7421 }
7422
7423 os.Exit(run())
7424}