blob: fcf2343cabdca93bfbbf77d4d93a83c9c2260478 [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
Jooyung Han344d5432019-08-23 11:17:39 +090070func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
71 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)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070077 return ctx, config
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 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
244
Paul Duffin021f4e52020-07-30 16:04:17 +0100245 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100246
Paul Duffin021f4e52020-07-30 16:04:17 +0100247 // Register these after the prebuilt mutators have been registered to match what
248 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100249 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
250 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
251
Paul Duffin021f4e52020-07-30 16:04:17 +0100252 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900253 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +0000254 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100255
Colin Cross98be1bb2019-12-13 20:41:13 -0800256 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800257 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800258 cc.RegisterVndkLibraryTxtTypes(ctx)
Jooyung Han0703fd82020-08-26 22:11:53 +0900259 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000260 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700261 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900263 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800264 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265
Colin Cross98be1bb2019-12-13 20:41:13 -0800266 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800267 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800268
Colin Crossae8600b2020-10-29 17:09:13 -0700269 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270
Jooyung Han5c998b92019-06-27 11:30:33 +0900271 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272}
273
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700274func setUp() {
275 var err error
276 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700278 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280}
281
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700282func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700283 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284}
285
Jooyung Han643adc42020-02-27 13:50:06 +0900286// ensure that 'result' equals 'expected'
287func ensureEquals(t *testing.T, result string, expected string) {
288 t.Helper()
289 if result != expected {
290 t.Errorf("%q != %q", expected, result)
291 }
292}
293
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294// ensure that 'result' contains 'expected'
295func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900296 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297 if !strings.Contains(result, expected) {
298 t.Errorf("%q is not found in %q", expected, result)
299 }
300}
301
Liz Kammer5bd365f2020-05-27 15:15:11 -0700302// ensure that 'result' contains 'expected' exactly one time
303func ensureContainsOnce(t *testing.T, result string, expected string) {
304 t.Helper()
305 count := strings.Count(result, expected)
306 if count != 1 {
307 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
308 }
309}
310
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311// ensures that 'result' does not contain 'notExpected'
312func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900313 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 if strings.Contains(result, notExpected) {
315 t.Errorf("%q is found in %q", notExpected, result)
316 }
317}
318
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700319func ensureMatches(t *testing.T, result string, expectedRex string) {
320 ok, err := regexp.MatchString(expectedRex, result)
321 if err != nil {
322 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
323 return
324 }
325 if !ok {
326 t.Errorf("%s does not match regular expession %s", result, expectedRex)
327 }
328}
329
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900331 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 if !android.InList(expected, result) {
333 t.Errorf("%q is not found in %v", expected, result)
334 }
335}
336
337func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900338 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 if android.InList(notExpected, result) {
340 t.Errorf("%q is found in %v", notExpected, result)
341 }
342}
343
Jooyung Hane1633032019-08-01 17:41:43 +0900344func ensureListEmpty(t *testing.T, result []string) {
345 t.Helper()
346 if len(result) > 0 {
347 t.Errorf("%q is expected to be empty", result)
348 }
349}
350
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000351func ensureListNotEmpty(t *testing.T, result []string) {
352 t.Helper()
353 if len(result) == 0 {
354 t.Errorf("%q is expected to be not empty", result)
355 }
356}
357
Jiyong Park25fc6a92018-11-18 18:02:45 +0900358// Minimal test
359func TestBasicApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -0700360 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900361 apex_defaults {
362 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900363 manifest: ":myapex.manifest",
364 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900365 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900366 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900367 native_shared_libs: [
368 "mylib",
369 "libfoo.ffi",
370 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900371 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800372 multilib: {
373 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900374 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800375 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900376 },
Jiyong Park77acec62020-06-01 21:39:15 +0900377 java_libs: [
378 "myjar",
379 "myjar_dex",
380 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000381 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900382 }
383
Jiyong Park30ca9372019-02-07 16:27:23 +0900384 apex {
385 name: "myapex",
386 defaults: ["myapex-defaults"],
387 }
388
Jiyong Park25fc6a92018-11-18 18:02:45 +0900389 apex_key {
390 name: "myapex.key",
391 public_key: "testkey.avbpubkey",
392 private_key: "testkey.pem",
393 }
394
Jiyong Park809bb722019-02-13 21:33:49 +0900395 filegroup {
396 name: "myapex.manifest",
397 srcs: ["apex_manifest.json"],
398 }
399
400 filegroup {
401 name: "myapex.androidmanifest",
402 srcs: ["AndroidManifest.xml"],
403 }
404
Jiyong Park25fc6a92018-11-18 18:02:45 +0900405 cc_library {
406 name: "mylib",
407 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900408 shared_libs: [
409 "mylib2",
410 "libbar.ffi",
411 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900412 system_shared_libs: [],
413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000414 // TODO: remove //apex_available:platform
415 apex_available: [
416 "//apex_available:platform",
417 "myapex",
418 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900419 }
420
Alex Light3d673592019-01-18 14:37:31 -0800421 cc_binary {
422 name: "foo",
423 srcs: ["mylib.cpp"],
424 compile_multilib: "both",
425 multilib: {
426 lib32: {
427 suffix: "32",
428 },
429 lib64: {
430 suffix: "64",
431 },
432 },
433 symlinks: ["foo_link_"],
434 symlink_preferred_arch: true,
435 system_shared_libs: [],
436 static_executable: true,
437 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700438 apex_available: [ "myapex", "com.android.gki.*" ],
439 }
440
Jiyong Park99644e92020-11-17 22:21:02 +0900441 rust_binary {
442 name: "foo.rust",
443 srcs: ["foo.rs"],
444 rlibs: ["libfoo.rlib.rust"],
445 dylibs: ["libfoo.dylib.rust"],
446 apex_available: ["myapex"],
447 }
448
449 rust_library_rlib {
450 name: "libfoo.rlib.rust",
451 srcs: ["foo.rs"],
452 crate_name: "foo",
453 apex_available: ["myapex"],
454 }
455
456 rust_library_dylib {
457 name: "libfoo.dylib.rust",
458 srcs: ["foo.rs"],
459 crate_name: "foo",
460 apex_available: ["myapex"],
461 }
462
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900463 rust_ffi_shared {
464 name: "libfoo.ffi",
465 srcs: ["foo.rs"],
466 crate_name: "foo",
467 apex_available: ["myapex"],
468 }
469
470 rust_ffi_shared {
471 name: "libbar.ffi",
472 srcs: ["foo.rs"],
473 crate_name: "bar",
474 apex_available: ["myapex"],
475 }
476
Yifan Hongd22a84a2020-07-28 17:37:46 -0700477 apex {
478 name: "com.android.gki.fake",
479 binaries: ["foo"],
480 key: "myapex.key",
481 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000482 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800483 }
484
Paul Duffindddd5462020-04-07 15:25:44 +0100485 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900486 name: "mylib2",
487 srcs: ["mylib.cpp"],
488 system_shared_libs: [],
489 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900490 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900491 static_libs: ["libstatic"],
492 // TODO: remove //apex_available:platform
493 apex_available: [
494 "//apex_available:platform",
495 "myapex",
496 ],
497 }
498
Paul Duffindddd5462020-04-07 15:25:44 +0100499 cc_prebuilt_library_shared {
500 name: "mylib2",
501 srcs: ["prebuilt.so"],
502 // TODO: remove //apex_available:platform
503 apex_available: [
504 "//apex_available:platform",
505 "myapex",
506 ],
507 }
508
Jiyong Park9918e1a2020-03-17 19:16:40 +0900509 cc_library_static {
510 name: "libstatic",
511 srcs: ["mylib.cpp"],
512 system_shared_libs: [],
513 stl: "none",
514 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000515 // TODO: remove //apex_available:platform
516 apex_available: [
517 "//apex_available:platform",
518 "myapex",
519 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900520 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900521
522 java_library {
523 name: "myjar",
524 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900525 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900526 sdk_version: "none",
527 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900528 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900529 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000530 // TODO: remove //apex_available:platform
531 apex_available: [
532 "//apex_available:platform",
533 "myapex",
534 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900535 }
536
Jiyong Park77acec62020-06-01 21:39:15 +0900537 dex_import {
538 name: "myjar_dex",
539 jars: ["prebuilt.jar"],
540 apex_available: [
541 "//apex_available:platform",
542 "myapex",
543 ],
544 }
545
Jiyong Park7f7766d2019-07-25 22:02:35 +0900546 java_library {
547 name: "myotherjar",
548 srcs: ["foo/bar/MyClass.java"],
549 sdk_version: "none",
550 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900551 // TODO: remove //apex_available:platform
552 apex_available: [
553 "//apex_available:platform",
554 "myapex",
555 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900556 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900557
558 java_library {
559 name: "mysharedjar",
560 srcs: ["foo/bar/MyClass.java"],
561 sdk_version: "none",
562 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900563 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900564 `)
565
Sundong Ahnabb64432019-10-22 13:58:29 +0900566 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900567
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900568 // Make sure that Android.mk is created
569 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700570 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900571 var builder strings.Builder
572 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
573
574 androidMk := builder.String()
575 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
576 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
577
Jiyong Park42cca6c2019-04-01 11:15:50 +0900578 optFlags := apexRule.Args["opt_flags"]
579 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700580 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900581 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900582
Jiyong Park25fc6a92018-11-18 18:02:45 +0900583 copyCmds := apexRule.Args["copy_commands"]
584
585 // Ensure that main rule creates an output
586 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
587
588 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700589 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
590 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
591 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900592 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900593 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900594
595 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700596 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
597 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900598 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
599 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900600 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900601
602 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800603 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
604 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900605 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900606 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900607 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900608 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
609 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900610 // .. but not for java libs
611 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900612 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800613
Colin Cross7113d202019-11-20 16:39:12 -0800614 // Ensure that the platform variant ends with _shared or _common
615 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
616 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900617 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
618 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900619 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
620
621 // Ensure that dynamic dependency to java libs are not included
622 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800623
624 // Ensure that all symlinks are present.
625 found_foo_link_64 := false
626 found_foo := false
627 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900628 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800629 if strings.HasSuffix(cmd, "bin/foo") {
630 found_foo = true
631 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
632 found_foo_link_64 = true
633 }
634 }
635 }
636 good := found_foo && found_foo_link_64
637 if !good {
638 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
639 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900640
Sundong Ahnabb64432019-10-22 13:58:29 +0900641 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700642 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900643 if len(noticeInputs) != 3 {
644 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900645 }
646 ensureListContains(t, noticeInputs, "NOTICE")
647 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900648 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900649
Artur Satayeva8bd1132020-04-27 18:07:06 +0100650 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100651 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
652 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
653 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
654 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
655 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100656
657 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100658 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
659 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
660 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
661 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
662 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800663}
664
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665func TestDefaults(t *testing.T) {
666 ctx, _ := testApex(t, `
667 apex_defaults {
668 name: "myapex-defaults",
669 key: "myapex.key",
670 prebuilts: ["myetc"],
671 native_shared_libs: ["mylib"],
672 java_libs: ["myjar"],
673 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900674 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800675 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000676 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 }
678
679 prebuilt_etc {
680 name: "myetc",
681 src: "myprebuilt",
682 }
683
684 apex {
685 name: "myapex",
686 defaults: ["myapex-defaults"],
687 }
688
689 apex_key {
690 name: "myapex.key",
691 public_key: "testkey.avbpubkey",
692 private_key: "testkey.pem",
693 }
694
695 cc_library {
696 name: "mylib",
697 system_shared_libs: [],
698 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000699 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900700 }
701
702 java_library {
703 name: "myjar",
704 srcs: ["foo/bar/MyClass.java"],
705 sdk_version: "none",
706 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000707 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900708 }
709
710 android_app {
711 name: "AppFoo",
712 srcs: ["foo/bar/MyClass.java"],
713 sdk_version: "none",
714 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000715 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900716 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900717
718 runtime_resource_overlay {
719 name: "rro",
720 theme: "blue",
721 }
722
markchien2f59ec92020-09-02 16:23:38 +0800723 bpf {
724 name: "bpf",
725 srcs: ["bpf.c", "bpf2.c"],
726 }
727
Jooyung Hanf21c7972019-12-16 22:32:06 +0900728 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000729 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900730 "etc/myetc",
731 "javalib/myjar.jar",
732 "lib64/mylib.so",
733 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900734 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800735 "etc/bpf/bpf.o",
736 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900737 })
738}
739
Jooyung Han01a3ee22019-11-02 02:52:25 +0900740func TestApexManifest(t *testing.T) {
741 ctx, _ := testApex(t, `
742 apex {
743 name: "myapex",
744 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000745 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900746 }
747
748 apex_key {
749 name: "myapex.key",
750 public_key: "testkey.avbpubkey",
751 private_key: "testkey.pem",
752 }
753 `)
754
755 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900756 args := module.Rule("apexRule").Args
757 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
758 t.Error("manifest should be apex_manifest.pb, but " + manifest)
759 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900760}
761
Alex Light5098a612018-11-29 17:12:15 -0800762func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700763 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800764 apex {
765 name: "myapex",
766 key: "myapex.key",
767 payload_type: "zip",
768 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000769 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800770 }
771
772 apex_key {
773 name: "myapex.key",
774 public_key: "testkey.avbpubkey",
775 private_key: "testkey.pem",
776 }
777
778 cc_library {
779 name: "mylib",
780 srcs: ["mylib.cpp"],
781 shared_libs: ["mylib2"],
782 system_shared_libs: [],
783 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000784 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800785 }
786
787 cc_library {
788 name: "mylib2",
789 srcs: ["mylib.cpp"],
790 system_shared_libs: [],
791 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000792 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800793 }
794 `)
795
Sundong Ahnabb64432019-10-22 13:58:29 +0900796 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800797 copyCmds := zipApexRule.Args["copy_commands"]
798
799 // Ensure that main rule creates an output
800 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
801
802 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700803 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800804
805 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700806 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800807
808 // Ensure that both direct and indirect deps are copied into apex
809 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
810 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900811}
812
813func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700814 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900815 apex {
816 name: "myapex",
817 key: "myapex.key",
818 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000819 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900820 }
821
822 apex_key {
823 name: "myapex.key",
824 public_key: "testkey.avbpubkey",
825 private_key: "testkey.pem",
826 }
827
828 cc_library {
829 name: "mylib",
830 srcs: ["mylib.cpp"],
831 shared_libs: ["mylib2", "mylib3"],
832 system_shared_libs: [],
833 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000834 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835 }
836
837 cc_library {
838 name: "mylib2",
839 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900840 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900841 system_shared_libs: [],
842 stl: "none",
843 stubs: {
844 versions: ["1", "2", "3"],
845 },
846 }
847
848 cc_library {
849 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900850 srcs: ["mylib.cpp"],
851 shared_libs: ["mylib4"],
852 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900853 stl: "none",
854 stubs: {
855 versions: ["10", "11", "12"],
856 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000857 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900858 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900859
860 cc_library {
861 name: "mylib4",
862 srcs: ["mylib.cpp"],
863 system_shared_libs: [],
864 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000865 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900866 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 `)
868
Sundong Ahnabb64432019-10-22 13:58:29 +0900869 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 copyCmds := apexRule.Args["copy_commands"]
871
872 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800873 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874
875 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800876 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877
878 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800879 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880
Colin Crossaede88c2020-08-11 12:17:01 -0700881 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900882
883 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900884 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900886 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900887
888 // 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 -0700889 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700891 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900892
893 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900894 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900895 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900896
897 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700898 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900899
Jooyung Hana57af4a2020-01-23 05:36:59 +0000900 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900901 "lib64/mylib.so",
902 "lib64/mylib3.so",
903 "lib64/mylib4.so",
904 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905}
906
Colin Cross7812fd32020-09-25 12:35:10 -0700907func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
908 t.Parallel()
909 ctx, _ := testApex(t, `
910 apex {
911 name: "myapex",
912 key: "myapex.key",
913 native_shared_libs: ["mylib", "mylib3"],
914 min_sdk_version: "29",
915 }
916
917 apex_key {
918 name: "myapex.key",
919 public_key: "testkey.avbpubkey",
920 private_key: "testkey.pem",
921 }
922
923 cc_library {
924 name: "mylib",
925 srcs: ["mylib.cpp"],
926 shared_libs: ["mylib2", "mylib3"],
927 system_shared_libs: [],
928 stl: "none",
929 apex_available: [ "myapex" ],
930 min_sdk_version: "28",
931 }
932
933 cc_library {
934 name: "mylib2",
935 srcs: ["mylib.cpp"],
936 cflags: ["-include mylib.h"],
937 system_shared_libs: [],
938 stl: "none",
939 stubs: {
940 versions: ["28", "29", "30", "current"],
941 },
942 min_sdk_version: "28",
943 }
944
945 cc_library {
946 name: "mylib3",
947 srcs: ["mylib.cpp"],
948 shared_libs: ["mylib4"],
949 system_shared_libs: [],
950 stl: "none",
951 stubs: {
952 versions: ["28", "29", "30", "current"],
953 },
954 apex_available: [ "myapex" ],
955 min_sdk_version: "28",
956 }
957
958 cc_library {
959 name: "mylib4",
960 srcs: ["mylib.cpp"],
961 system_shared_libs: [],
962 stl: "none",
963 apex_available: [ "myapex" ],
964 min_sdk_version: "28",
965 }
966 `)
967
968 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
969 copyCmds := apexRule.Args["copy_commands"]
970
971 // Ensure that direct non-stubs dep is always included
972 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
973
974 // Ensure that indirect stubs dep is not included
975 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
976
977 // Ensure that direct stubs dep is included
978 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
979
980 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
981
Jiyong Park55549df2021-02-26 23:57:23 +0900982 // Ensure that mylib is linking with the latest version of stub for mylib2
983 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -0700984 // ... and not linking to the non-stub (impl) variant of mylib2
985 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
986
987 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
988 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
989 // .. and not linking to the stubs variant of mylib3
990 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
991
992 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700993 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700994 ensureNotContains(t, mylib2Cflags, "-include ")
995
996 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700997 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700998
999 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1000 "lib64/mylib.so",
1001 "lib64/mylib3.so",
1002 "lib64/mylib4.so",
1003 })
1004}
1005
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001006func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1007 t.Parallel()
1008 // myapex (Z)
1009 // mylib -----------------.
1010 // |
1011 // otherapex (29) |
1012 // libstub's versions: 29 Z current
1013 // |
1014 // <platform> |
1015 // libplatform ----------------'
1016 ctx, _ := testApex(t, `
1017 apex {
1018 name: "myapex",
1019 key: "myapex.key",
1020 native_shared_libs: ["mylib"],
1021 min_sdk_version: "Z", // non-final
1022 }
1023
1024 cc_library {
1025 name: "mylib",
1026 srcs: ["mylib.cpp"],
1027 shared_libs: ["libstub"],
1028 apex_available: ["myapex"],
1029 min_sdk_version: "Z",
1030 }
1031
1032 apex_key {
1033 name: "myapex.key",
1034 public_key: "testkey.avbpubkey",
1035 private_key: "testkey.pem",
1036 }
1037
1038 apex {
1039 name: "otherapex",
1040 key: "myapex.key",
1041 native_shared_libs: ["libstub"],
1042 min_sdk_version: "29",
1043 }
1044
1045 cc_library {
1046 name: "libstub",
1047 srcs: ["mylib.cpp"],
1048 stubs: {
1049 versions: ["29", "Z", "current"],
1050 },
1051 apex_available: ["otherapex"],
1052 min_sdk_version: "29",
1053 }
1054
1055 // platform module depending on libstub from otherapex should use the latest stub("current")
1056 cc_library {
1057 name: "libplatform",
1058 srcs: ["mylib.cpp"],
1059 shared_libs: ["libstub"],
1060 }
1061 `, func(fs map[string][]byte, config android.Config) {
1062 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1063 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1064 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1065 })
1066
Jiyong Park55549df2021-02-26 23:57:23 +09001067 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001068 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001069 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001070 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001071 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001072
1073 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1074 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1075 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1076 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1077 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1078}
1079
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001080func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001081 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001082 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001083 name: "myapex2",
1084 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001085 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001086 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001087 }
1088
1089 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001090 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001091 public_key: "testkey.avbpubkey",
1092 private_key: "testkey.pem",
1093 }
1094
1095 cc_library {
1096 name: "mylib",
1097 srcs: ["mylib.cpp"],
1098 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001099 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001100 system_shared_libs: [],
1101 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001102 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001103 }
1104
1105 cc_library {
1106 name: "libfoo",
1107 srcs: ["mylib.cpp"],
1108 shared_libs: ["libbar"],
1109 system_shared_libs: [],
1110 stl: "none",
1111 stubs: {
1112 versions: ["10", "20", "30"],
1113 },
1114 }
1115
1116 cc_library {
1117 name: "libbar",
1118 srcs: ["mylib.cpp"],
1119 system_shared_libs: [],
1120 stl: "none",
1121 }
1122
Jiyong Park678c8812020-02-07 17:25:49 +09001123 cc_library_static {
1124 name: "libbaz",
1125 srcs: ["mylib.cpp"],
1126 system_shared_libs: [],
1127 stl: "none",
1128 apex_available: [ "myapex2" ],
1129 }
1130
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001131 `)
1132
Jiyong Park83dc74b2020-01-14 18:38:44 +09001133 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001134 copyCmds := apexRule.Args["copy_commands"]
1135
1136 // Ensure that direct non-stubs dep is always included
1137 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1138
1139 // Ensure that indirect stubs dep is not included
1140 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1141
1142 // Ensure that dependency of stubs is not included
1143 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1144
Colin Crossaede88c2020-08-11 12:17:01 -07001145 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001146
1147 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001148 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001149 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001150 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001151
Jiyong Park3ff16992019-12-27 14:11:47 +09001152 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001153
1154 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1155 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001156
Artur Satayeva8bd1132020-04-27 18:07:06 +01001157 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001158 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1159 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1160 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001161
Artur Satayeva8bd1132020-04-27 18:07:06 +01001162 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001163 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1164 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1165 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001166}
1167
Jooyung Hand3639552019-08-09 12:57:43 +09001168func TestApexWithRuntimeLibsDependency(t *testing.T) {
1169 /*
1170 myapex
1171 |
1172 v (runtime_libs)
1173 mylib ------+------> libfoo [provides stub]
1174 |
1175 `------> libbar
1176 */
1177 ctx, _ := testApex(t, `
1178 apex {
1179 name: "myapex",
1180 key: "myapex.key",
1181 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001182 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001183 }
1184
1185 apex_key {
1186 name: "myapex.key",
1187 public_key: "testkey.avbpubkey",
1188 private_key: "testkey.pem",
1189 }
1190
1191 cc_library {
1192 name: "mylib",
1193 srcs: ["mylib.cpp"],
1194 runtime_libs: ["libfoo", "libbar"],
1195 system_shared_libs: [],
1196 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001197 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001198 }
1199
1200 cc_library {
1201 name: "libfoo",
1202 srcs: ["mylib.cpp"],
1203 system_shared_libs: [],
1204 stl: "none",
1205 stubs: {
1206 versions: ["10", "20", "30"],
1207 },
1208 }
1209
1210 cc_library {
1211 name: "libbar",
1212 srcs: ["mylib.cpp"],
1213 system_shared_libs: [],
1214 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001215 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001216 }
1217
1218 `)
1219
Sundong Ahnabb64432019-10-22 13:58:29 +09001220 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001221 copyCmds := apexRule.Args["copy_commands"]
1222
1223 // Ensure that direct non-stubs dep is always included
1224 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1225
1226 // Ensure that indirect stubs dep is not included
1227 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1228
1229 // Ensure that runtime_libs dep in included
1230 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1231
Sundong Ahnabb64432019-10-22 13:58:29 +09001232 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001233 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1234 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001235
1236}
1237
Jooyung Han8ce8db92020-05-15 19:05:05 +09001238func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1239 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1240 bp := `
1241 apex {
1242 name: "com.android.runtime",
1243 key: "com.android.runtime.key",
1244 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001245 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001246 }
1247
1248 apex_key {
1249 name: "com.android.runtime.key",
1250 public_key: "testkey.avbpubkey",
1251 private_key: "testkey.pem",
1252 }
1253
1254 cc_library {
1255 name: "libc",
1256 no_libcrt: true,
1257 nocrt: true,
1258 stl: "none",
1259 system_shared_libs: [],
1260 stubs: { versions: ["1"] },
1261 apex_available: ["com.android.runtime"],
1262
1263 sanitize: {
1264 hwaddress: true,
1265 }
1266 }
1267
1268 cc_prebuilt_library_shared {
1269 name: "libclang_rt.hwasan-aarch64-android",
1270 no_libcrt: true,
1271 nocrt: true,
1272 stl: "none",
1273 system_shared_libs: [],
1274 srcs: [""],
1275 stubs: { versions: ["1"] },
1276
1277 sanitize: {
1278 never: true,
1279 },
1280 }
1281 `
1282 // override bp to use hard-coded names: com.android.runtime and libc
1283 fs["Android.bp"] = []byte(bp)
1284 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1285 })
1286
1287 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1288 "lib64/bionic/libc.so",
1289 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1290 })
1291
1292 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1293
1294 installed := hwasan.Description("install libclang_rt.hwasan")
1295 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1296
1297 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1298 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1299 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1300}
1301
1302func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1303 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1304 bp := `
1305 apex {
1306 name: "com.android.runtime",
1307 key: "com.android.runtime.key",
1308 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001309 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001310 }
1311
1312 apex_key {
1313 name: "com.android.runtime.key",
1314 public_key: "testkey.avbpubkey",
1315 private_key: "testkey.pem",
1316 }
1317
1318 cc_library {
1319 name: "libc",
1320 no_libcrt: true,
1321 nocrt: true,
1322 stl: "none",
1323 system_shared_libs: [],
1324 stubs: { versions: ["1"] },
1325 apex_available: ["com.android.runtime"],
1326 }
1327
1328 cc_prebuilt_library_shared {
1329 name: "libclang_rt.hwasan-aarch64-android",
1330 no_libcrt: true,
1331 nocrt: true,
1332 stl: "none",
1333 system_shared_libs: [],
1334 srcs: [""],
1335 stubs: { versions: ["1"] },
1336
1337 sanitize: {
1338 never: true,
1339 },
1340 }
1341 `
1342 // override bp to use hard-coded names: com.android.runtime and libc
1343 fs["Android.bp"] = []byte(bp)
1344 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1345
1346 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1347 })
1348
1349 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1350 "lib64/bionic/libc.so",
1351 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1352 })
1353
1354 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1355
1356 installed := hwasan.Description("install libclang_rt.hwasan")
1357 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1358
1359 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1360 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1361 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1362}
1363
Jooyung Han61b66e92020-03-21 14:21:46 +00001364func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1365 testcases := []struct {
1366 name string
1367 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001368 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001369 shouldLink string
1370 shouldNotLink []string
1371 }{
1372 {
Jiyong Park55549df2021-02-26 23:57:23 +09001373 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001374 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001375 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001376 shouldLink: "30",
1377 shouldNotLink: []string{"29"},
1378 },
1379 {
Jiyong Park55549df2021-02-26 23:57:23 +09001380 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001381 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001382 apexVariant: "apex29",
Jiyong Park55549df2021-02-26 23:57:23 +09001383 shouldLink: "30",
1384 shouldNotLink: []string{"29"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001385 },
1386 }
1387 for _, tc := range testcases {
1388 t.Run(tc.name, func(t *testing.T) {
1389 ctx, _ := testApex(t, `
1390 apex {
1391 name: "myapex",
1392 key: "myapex.key",
1393 use_vendor: true,
1394 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001395 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001396 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001397 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001398
Jooyung Han61b66e92020-03-21 14:21:46 +00001399 apex_key {
1400 name: "myapex.key",
1401 public_key: "testkey.avbpubkey",
1402 private_key: "testkey.pem",
1403 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001404
Jooyung Han61b66e92020-03-21 14:21:46 +00001405 cc_library {
1406 name: "mylib",
1407 srcs: ["mylib.cpp"],
1408 vendor_available: true,
1409 shared_libs: ["libbar"],
1410 system_shared_libs: [],
1411 stl: "none",
1412 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001413 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001414 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001415
Jooyung Han61b66e92020-03-21 14:21:46 +00001416 cc_library {
1417 name: "libbar",
1418 srcs: ["mylib.cpp"],
1419 system_shared_libs: [],
1420 stl: "none",
1421 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001422 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001423 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001424
Jooyung Han61b66e92020-03-21 14:21:46 +00001425 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001426 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001427 symbol_file: "",
1428 }
1429 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001430 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001431 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001432
Jooyung Han61b66e92020-03-21 14:21:46 +00001433 // Ensure that LLNDK dep is not included
1434 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1435 "lib64/mylib.so",
1436 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001437
Jooyung Han61b66e92020-03-21 14:21:46 +00001438 // Ensure that LLNDK dep is required
1439 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1440 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1441 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001442
Colin Crossaede88c2020-08-11 12:17:01 -07001443 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001444 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001445 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001446 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001447 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001448
Colin Crossaede88c2020-08-11 12:17:01 -07001449 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001450 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1451 })
1452 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001453}
1454
Jiyong Park25fc6a92018-11-18 18:02:45 +09001455func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001456 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001457 apex {
1458 name: "myapex",
1459 key: "myapex.key",
1460 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001461 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001462 }
1463
1464 apex_key {
1465 name: "myapex.key",
1466 public_key: "testkey.avbpubkey",
1467 private_key: "testkey.pem",
1468 }
1469
1470 cc_library {
1471 name: "mylib",
1472 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001473 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001474 shared_libs: ["libdl#27"],
1475 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001476 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001477 }
1478
1479 cc_library_shared {
1480 name: "mylib_shared",
1481 srcs: ["mylib.cpp"],
1482 shared_libs: ["libdl#27"],
1483 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001484 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001485 }
1486
1487 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001488 name: "libBootstrap",
1489 srcs: ["mylib.cpp"],
1490 stl: "none",
1491 bootstrap: true,
1492 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001493 `)
1494
Sundong Ahnabb64432019-10-22 13:58:29 +09001495 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001496 copyCmds := apexRule.Args["copy_commands"]
1497
1498 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001499 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001500 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1501 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001502
1503 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001504 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001505
Colin Crossaede88c2020-08-11 12:17:01 -07001506 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1507 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1508 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001509
1510 // For dependency to libc
1511 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001512 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001513 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001514 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001515 // ... Cflags from stub is correctly exported to mylib
1516 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1517 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1518
1519 // For dependency to libm
1520 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001521 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001522 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001523 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001524 // ... and is not compiling with the stub
1525 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1526 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1527
1528 // For dependency to libdl
1529 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001530 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001531 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001532 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1533 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001534 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001535 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001536 // ... Cflags from stub is correctly exported to mylib
1537 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1538 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001539
1540 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001541 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1542 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1543 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1544 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001545}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001546
Jooyung Han749dc692020-04-15 11:03:39 +09001547func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001548 // there are three links between liba --> libz.
1549 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001550 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001551 // 3) (platform) -> liba -> libz : this should be non-stub link
1552 ctx, _ := testApex(t, `
1553 apex {
1554 name: "myapex",
1555 key: "myapex.key",
1556 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001557 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001558 }
1559
1560 apex {
1561 name: "otherapex",
1562 key: "myapex.key",
1563 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001564 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001565 }
1566
1567 apex_key {
1568 name: "myapex.key",
1569 public_key: "testkey.avbpubkey",
1570 private_key: "testkey.pem",
1571 }
1572
1573 cc_library {
1574 name: "libx",
1575 shared_libs: ["liba"],
1576 system_shared_libs: [],
1577 stl: "none",
1578 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001579 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001580 }
1581
1582 cc_library {
1583 name: "liby",
1584 shared_libs: ["liba"],
1585 system_shared_libs: [],
1586 stl: "none",
1587 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001588 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001589 }
1590
1591 cc_library {
1592 name: "liba",
1593 shared_libs: ["libz"],
1594 system_shared_libs: [],
1595 stl: "none",
1596 apex_available: [
1597 "//apex_available:anyapex",
1598 "//apex_available:platform",
1599 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001600 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001601 }
1602
1603 cc_library {
1604 name: "libz",
1605 system_shared_libs: [],
1606 stl: "none",
1607 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001608 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001609 },
1610 }
Jooyung Han749dc692020-04-15 11:03:39 +09001611 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001612
1613 expectLink := func(from, from_variant, to, to_variant string) {
1614 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1615 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1616 }
1617 expectNoLink := func(from, from_variant, to, to_variant string) {
1618 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1619 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1620 }
1621 // platform liba is linked to non-stub version
1622 expectLink("liba", "shared", "libz", "shared")
Jiyong Park55549df2021-02-26 23:57:23 +09001623 // liba in myapex is linked to #30
1624 expectLink("liba", "shared_apex29", "libz", "shared_30")
1625 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001626 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001627 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001628 expectLink("liba", "shared_apex30", "libz", "shared_30")
1629 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1630 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001631}
1632
Jooyung Hanaed150d2020-04-02 01:41:41 +09001633func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1634 ctx, _ := testApex(t, `
1635 apex {
1636 name: "myapex",
1637 key: "myapex.key",
1638 native_shared_libs: ["libx"],
1639 min_sdk_version: "R",
1640 }
1641
1642 apex_key {
1643 name: "myapex.key",
1644 public_key: "testkey.avbpubkey",
1645 private_key: "testkey.pem",
1646 }
1647
1648 cc_library {
1649 name: "libx",
1650 shared_libs: ["libz"],
1651 system_shared_libs: [],
1652 stl: "none",
1653 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001654 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001655 }
1656
1657 cc_library {
1658 name: "libz",
1659 system_shared_libs: [],
1660 stl: "none",
1661 stubs: {
1662 versions: ["29", "R"],
1663 },
1664 }
1665 `, func(fs map[string][]byte, config android.Config) {
1666 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1667 })
1668
1669 expectLink := func(from, from_variant, to, to_variant string) {
1670 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1671 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1672 }
1673 expectNoLink := func(from, from_variant, to, to_variant string) {
1674 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1675 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1676 }
Dan Albertc8060532020-07-22 22:32:17 -07001677 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001678 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1679 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001680}
1681
Jooyung Han749dc692020-04-15 11:03:39 +09001682func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001683 ctx, _ := testApex(t, `
1684 apex {
1685 name: "myapex",
1686 key: "myapex.key",
1687 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001688 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001689 }
1690
1691 apex_key {
1692 name: "myapex.key",
1693 public_key: "testkey.avbpubkey",
1694 private_key: "testkey.pem",
1695 }
1696
1697 cc_library {
1698 name: "libx",
1699 shared_libs: ["libz"],
1700 system_shared_libs: [],
1701 stl: "none",
1702 apex_available: [ "myapex" ],
1703 }
1704
1705 cc_library {
1706 name: "libz",
1707 system_shared_libs: [],
1708 stl: "none",
1709 stubs: {
1710 versions: ["1", "2"],
1711 },
1712 }
1713 `)
1714
1715 expectLink := func(from, from_variant, to, to_variant string) {
1716 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1717 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1718 }
1719 expectNoLink := func(from, from_variant, to, to_variant string) {
1720 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1721 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1722 }
Colin Crossaede88c2020-08-11 12:17:01 -07001723 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1724 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1725 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001726}
1727
1728func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1729 ctx, _ := testApex(t, `
1730 apex {
1731 name: "myapex",
1732 key: "myapex.key",
1733 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001734 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001735 }
1736
1737 apex_key {
1738 name: "myapex.key",
1739 public_key: "testkey.avbpubkey",
1740 private_key: "testkey.pem",
1741 }
1742
1743 cc_library {
1744 name: "libx",
1745 system_shared_libs: [],
1746 stl: "none",
1747 apex_available: [ "myapex" ],
1748 stubs: {
1749 versions: ["1", "2"],
1750 },
1751 }
1752
1753 cc_library {
1754 name: "libz",
1755 shared_libs: ["libx"],
1756 system_shared_libs: [],
1757 stl: "none",
1758 }
1759 `)
1760
1761 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001762 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001763 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1764 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1765 }
1766 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001767 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001768 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1769 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1770 }
1771 expectLink("libz", "shared", "libx", "shared_2")
1772 expectNoLink("libz", "shared", "libz", "shared_1")
1773 expectNoLink("libz", "shared", "libz", "shared")
1774}
1775
Jooyung Han75568392020-03-20 04:29:24 +09001776func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001777 ctx, _ := testApex(t, `
1778 apex {
1779 name: "myapex",
1780 key: "myapex.key",
1781 native_shared_libs: ["libx"],
1782 min_sdk_version: "29",
1783 }
1784
1785 apex_key {
1786 name: "myapex.key",
1787 public_key: "testkey.avbpubkey",
1788 private_key: "testkey.pem",
1789 }
1790
1791 cc_library {
1792 name: "libx",
1793 shared_libs: ["libbar"],
1794 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001795 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001796 }
1797
1798 cc_library {
1799 name: "libbar",
1800 stubs: {
1801 versions: ["29", "30"],
1802 },
1803 }
Jooyung Han75568392020-03-20 04:29:24 +09001804 `, func(fs map[string][]byte, config android.Config) {
1805 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1806 })
Jooyung Han03b51852020-02-26 22:45:42 +09001807 expectLink := func(from, from_variant, to, to_variant string) {
1808 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1809 libFlags := ld.Args["libFlags"]
1810 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1811 }
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001813}
1814
Jooyung Han75568392020-03-20 04:29:24 +09001815func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001816 ctx, _ := testApex(t, `
1817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 native_shared_libs: ["libx"],
1821 min_sdk_version: "29",
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 cc_library {
1831 name: "libx",
1832 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001833 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001834 }
Jooyung Han75568392020-03-20 04:29:24 +09001835 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001836
1837 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001838 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001839 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001840 // note that platform variant is not.
1841 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001842 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001843}
1844
Jooyung Han749dc692020-04-15 11:03:39 +09001845func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1846 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001850 native_shared_libs: ["mylib"],
1851 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
Jooyung Han749dc692020-04-15 11:03:39 +09001859
1860 cc_library {
1861 name: "mylib",
1862 srcs: ["mylib.cpp"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [
1866 "myapex",
1867 ],
1868 min_sdk_version: "30",
1869 }
1870 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001871
1872 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1873 apex {
1874 name: "myapex",
1875 key: "myapex.key",
1876 native_shared_libs: ["libfoo.ffi"],
1877 min_sdk_version: "29",
1878 }
1879
1880 apex_key {
1881 name: "myapex.key",
1882 public_key: "testkey.avbpubkey",
1883 private_key: "testkey.pem",
1884 }
1885
1886 rust_ffi_shared {
1887 name: "libfoo.ffi",
1888 srcs: ["foo.rs"],
1889 crate_name: "foo",
1890 apex_available: [
1891 "myapex",
1892 ],
1893 min_sdk_version: "30",
1894 }
1895 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001896}
1897
1898func TestApexMinSdkVersion_Okay(t *testing.T) {
1899 testApex(t, `
1900 apex {
1901 name: "myapex",
1902 key: "myapex.key",
1903 native_shared_libs: ["libfoo"],
1904 java_libs: ["libbar"],
1905 min_sdk_version: "29",
1906 }
1907
1908 apex_key {
1909 name: "myapex.key",
1910 public_key: "testkey.avbpubkey",
1911 private_key: "testkey.pem",
1912 }
1913
1914 cc_library {
1915 name: "libfoo",
1916 srcs: ["mylib.cpp"],
1917 shared_libs: ["libfoo_dep"],
1918 apex_available: ["myapex"],
1919 min_sdk_version: "29",
1920 }
1921
1922 cc_library {
1923 name: "libfoo_dep",
1924 srcs: ["mylib.cpp"],
1925 apex_available: ["myapex"],
1926 min_sdk_version: "29",
1927 }
1928
1929 java_library {
1930 name: "libbar",
1931 sdk_version: "current",
1932 srcs: ["a.java"],
1933 static_libs: ["libbar_dep"],
1934 apex_available: ["myapex"],
1935 min_sdk_version: "29",
1936 }
1937
1938 java_library {
1939 name: "libbar_dep",
1940 sdk_version: "current",
1941 srcs: ["a.java"],
1942 apex_available: ["myapex"],
1943 min_sdk_version: "29",
1944 }
Jooyung Han03b51852020-02-26 22:45:42 +09001945 `)
1946}
1947
Artur Satayev8cf899a2020-04-15 17:29:42 +01001948func TestJavaStableSdkVersion(t *testing.T) {
1949 testCases := []struct {
1950 name string
1951 expectedError string
1952 bp string
1953 }{
1954 {
1955 name: "Non-updatable apex with non-stable dep",
1956 bp: `
1957 apex {
1958 name: "myapex",
1959 java_libs: ["myjar"],
1960 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001961 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01001962 }
1963 apex_key {
1964 name: "myapex.key",
1965 public_key: "testkey.avbpubkey",
1966 private_key: "testkey.pem",
1967 }
1968 java_library {
1969 name: "myjar",
1970 srcs: ["foo/bar/MyClass.java"],
1971 sdk_version: "core_platform",
1972 apex_available: ["myapex"],
1973 }
1974 `,
1975 },
1976 {
1977 name: "Updatable apex with stable dep",
1978 bp: `
1979 apex {
1980 name: "myapex",
1981 java_libs: ["myjar"],
1982 key: "myapex.key",
1983 updatable: true,
1984 min_sdk_version: "29",
1985 }
1986 apex_key {
1987 name: "myapex.key",
1988 public_key: "testkey.avbpubkey",
1989 private_key: "testkey.pem",
1990 }
1991 java_library {
1992 name: "myjar",
1993 srcs: ["foo/bar/MyClass.java"],
1994 sdk_version: "current",
1995 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001996 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001997 }
1998 `,
1999 },
2000 {
2001 name: "Updatable apex with non-stable dep",
2002 expectedError: "cannot depend on \"myjar\"",
2003 bp: `
2004 apex {
2005 name: "myapex",
2006 java_libs: ["myjar"],
2007 key: "myapex.key",
2008 updatable: true,
2009 }
2010 apex_key {
2011 name: "myapex.key",
2012 public_key: "testkey.avbpubkey",
2013 private_key: "testkey.pem",
2014 }
2015 java_library {
2016 name: "myjar",
2017 srcs: ["foo/bar/MyClass.java"],
2018 sdk_version: "core_platform",
2019 apex_available: ["myapex"],
2020 }
2021 `,
2022 },
2023 {
2024 name: "Updatable apex with non-stable transitive dep",
Jiyong Park670e0f62021-02-18 13:10:18 +09002025 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002026 bp: `
2027 apex {
2028 name: "myapex",
2029 java_libs: ["myjar"],
2030 key: "myapex.key",
2031 updatable: true,
2032 }
2033 apex_key {
2034 name: "myapex.key",
2035 public_key: "testkey.avbpubkey",
2036 private_key: "testkey.pem",
2037 }
2038 java_library {
2039 name: "myjar",
2040 srcs: ["foo/bar/MyClass.java"],
2041 sdk_version: "current",
2042 apex_available: ["myapex"],
2043 static_libs: ["transitive-jar"],
2044 }
2045 java_library {
2046 name: "transitive-jar",
2047 srcs: ["foo/bar/MyClass.java"],
2048 sdk_version: "core_platform",
2049 apex_available: ["myapex"],
2050 }
2051 `,
2052 },
2053 }
2054
2055 for _, test := range testCases {
2056 t.Run(test.name, func(t *testing.T) {
2057 if test.expectedError == "" {
2058 testApex(t, test.bp)
2059 } else {
2060 testApexError(t, test.expectedError, test.bp)
2061 }
2062 })
2063 }
2064}
2065
Jooyung Han749dc692020-04-15 11:03:39 +09002066func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2067 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2068 apex {
2069 name: "myapex",
2070 key: "myapex.key",
2071 native_shared_libs: ["mylib"],
2072 min_sdk_version: "29",
2073 }
2074
2075 apex_key {
2076 name: "myapex.key",
2077 public_key: "testkey.avbpubkey",
2078 private_key: "testkey.pem",
2079 }
2080
2081 cc_library {
2082 name: "mylib",
2083 srcs: ["mylib.cpp"],
2084 shared_libs: ["mylib2"],
2085 system_shared_libs: [],
2086 stl: "none",
2087 apex_available: [
2088 "myapex",
2089 ],
2090 min_sdk_version: "29",
2091 }
2092
2093 // indirect part of the apex
2094 cc_library {
2095 name: "mylib2",
2096 srcs: ["mylib.cpp"],
2097 system_shared_libs: [],
2098 stl: "none",
2099 apex_available: [
2100 "myapex",
2101 ],
2102 min_sdk_version: "30",
2103 }
2104 `)
2105}
2106
2107func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2108 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 apps: ["AppFoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 android_app {
2123 name: "AppFoo",
2124 srcs: ["foo/bar/MyClass.java"],
2125 sdk_version: "current",
2126 min_sdk_version: "29",
2127 system_modules: "none",
2128 stl: "none",
2129 static_libs: ["bar"],
2130 apex_available: [ "myapex" ],
2131 }
2132
2133 java_library {
2134 name: "bar",
2135 sdk_version: "current",
2136 srcs: ["a.java"],
2137 apex_available: [ "myapex" ],
2138 }
2139 `)
2140}
2141
2142func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2143 ctx, _ := testApex(t, `
2144 apex {
2145 name: "myapex",
2146 key: "myapex.key",
2147 native_shared_libs: ["mylib"],
2148 min_sdk_version: "29",
2149 }
2150
2151 apex_key {
2152 name: "myapex.key",
2153 public_key: "testkey.avbpubkey",
2154 private_key: "testkey.pem",
2155 }
2156
Jiyong Park55549df2021-02-26 23:57:23 +09002157 // mylib in myapex will link to mylib2#30
Jooyung Han749dc692020-04-15 11:03:39 +09002158 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 shared_libs: ["mylib2"],
2163 system_shared_libs: [],
2164 stl: "none",
2165 apex_available: ["myapex", "otherapex"],
2166 min_sdk_version: "29",
2167 }
2168
2169 cc_library {
2170 name: "mylib2",
2171 srcs: ["mylib.cpp"],
2172 system_shared_libs: [],
2173 stl: "none",
2174 apex_available: ["otherapex"],
2175 stubs: { versions: ["29", "30"] },
2176 min_sdk_version: "30",
2177 }
2178
2179 apex {
2180 name: "otherapex",
2181 key: "myapex.key",
2182 native_shared_libs: ["mylib", "mylib2"],
2183 min_sdk_version: "30",
2184 }
2185 `)
2186 expectLink := func(from, from_variant, to, to_variant string) {
2187 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2188 libFlags := ld.Args["libFlags"]
2189 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2190 }
Jiyong Park55549df2021-02-26 23:57:23 +09002191 expectLink("mylib", "shared_apex29", "mylib2", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002192 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002193}
2194
Jooyung Haned124c32021-01-26 11:43:46 +09002195func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2196 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2197 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2198 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2199 }
2200 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2201 apex {
2202 name: "myapex",
2203 key: "myapex.key",
2204 native_shared_libs: ["libfoo"],
2205 min_sdk_version: "S",
2206 }
2207 apex_key {
2208 name: "myapex.key",
2209 public_key: "testkey.avbpubkey",
2210 private_key: "testkey.pem",
2211 }
2212 cc_library {
2213 name: "libfoo",
2214 shared_libs: ["libbar"],
2215 apex_available: ["myapex"],
2216 min_sdk_version: "29",
2217 }
2218 cc_library {
2219 name: "libbar",
2220 apex_available: ["myapex"],
2221 }
2222 `, withSAsActiveCodeNames)
2223}
2224
2225func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2226 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2227 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2228 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2229 }
2230 ctx, _ := testApex(t, `
2231 apex {
2232 name: "myapex",
2233 key: "myapex.key",
2234 native_shared_libs: ["libfoo"],
2235 min_sdk_version: "S",
2236 }
2237 apex_key {
2238 name: "myapex.key",
2239 public_key: "testkey.avbpubkey",
2240 private_key: "testkey.pem",
2241 }
2242 cc_library {
2243 name: "libfoo",
2244 shared_libs: ["libbar"],
2245 apex_available: ["myapex"],
2246 min_sdk_version: "S",
2247 }
2248 cc_library {
2249 name: "libbar",
2250 stubs: {
2251 symbol_file: "libbar.map.txt",
2252 versions: ["30", "S", "T"],
2253 },
2254 }
2255 `, withSAsActiveCodeNames)
2256
2257 // ensure libfoo is linked with "S" version of libbar stub
2258 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2259 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09002260 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_T/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002261}
2262
Jiyong Park7c2ee712018-12-07 00:42:25 +09002263func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002264 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002265 apex {
2266 name: "myapex",
2267 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002268 native_shared_libs: ["mylib"],
2269 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002270 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002271 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002272 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002273 }
2274
2275 apex_key {
2276 name: "myapex.key",
2277 public_key: "testkey.avbpubkey",
2278 private_key: "testkey.pem",
2279 }
2280
2281 prebuilt_etc {
2282 name: "myetc",
2283 src: "myprebuilt",
2284 sub_dir: "foo/bar",
2285 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002286
2287 cc_library {
2288 name: "mylib",
2289 srcs: ["mylib.cpp"],
2290 relative_install_path: "foo/bar",
2291 system_shared_libs: [],
2292 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002293 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002294 }
2295
2296 cc_binary {
2297 name: "mybin",
2298 srcs: ["mylib.cpp"],
2299 relative_install_path: "foo/bar",
2300 system_shared_libs: [],
2301 static_executable: true,
2302 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002303 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002304 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002305 `)
2306
Sundong Ahnabb64432019-10-22 13:58:29 +09002307 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002308 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2309
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002310 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002311 ensureListContains(t, dirs, "etc")
2312 ensureListContains(t, dirs, "etc/foo")
2313 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002314 ensureListContains(t, dirs, "lib64")
2315 ensureListContains(t, dirs, "lib64/foo")
2316 ensureListContains(t, dirs, "lib64/foo/bar")
2317 ensureListContains(t, dirs, "lib")
2318 ensureListContains(t, dirs, "lib/foo")
2319 ensureListContains(t, dirs, "lib/foo/bar")
2320
Jiyong Parkbd13e442019-03-15 18:10:35 +09002321 ensureListContains(t, dirs, "bin")
2322 ensureListContains(t, dirs, "bin/foo")
2323 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002324}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002325
Jooyung Han35155c42020-02-06 17:33:20 +09002326func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2327 ctx, _ := testApex(t, `
2328 apex {
2329 name: "myapex",
2330 key: "myapex.key",
2331 multilib: {
2332 both: {
2333 native_shared_libs: ["mylib"],
2334 binaries: ["mybin"],
2335 },
2336 },
2337 compile_multilib: "both",
2338 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002339 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002340 }
2341
2342 apex_key {
2343 name: "myapex.key",
2344 public_key: "testkey.avbpubkey",
2345 private_key: "testkey.pem",
2346 }
2347
2348 cc_library {
2349 name: "mylib",
2350 relative_install_path: "foo/bar",
2351 system_shared_libs: [],
2352 stl: "none",
2353 apex_available: [ "myapex" ],
2354 native_bridge_supported: true,
2355 }
2356
2357 cc_binary {
2358 name: "mybin",
2359 relative_install_path: "foo/bar",
2360 system_shared_libs: [],
2361 static_executable: true,
2362 stl: "none",
2363 apex_available: [ "myapex" ],
2364 native_bridge_supported: true,
2365 compile_multilib: "both", // default is "first" for binary
2366 multilib: {
2367 lib64: {
2368 suffix: "64",
2369 },
2370 },
2371 }
2372 `, withNativeBridgeEnabled)
2373 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2374 "bin/foo/bar/mybin",
2375 "bin/foo/bar/mybin64",
2376 "bin/arm/foo/bar/mybin",
2377 "bin/arm64/foo/bar/mybin64",
2378 "lib/foo/bar/mylib.so",
2379 "lib/arm/foo/bar/mylib.so",
2380 "lib64/foo/bar/mylib.so",
2381 "lib64/arm64/foo/bar/mylib.so",
2382 })
2383}
2384
Jiyong Parkda6eb592018-12-19 17:12:36 +09002385func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002386 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002387 apex {
2388 name: "myapex",
2389 key: "myapex.key",
2390 native_shared_libs: ["mylib"],
2391 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002392 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002393 }
2394
2395 apex_key {
2396 name: "myapex.key",
2397 public_key: "testkey.avbpubkey",
2398 private_key: "testkey.pem",
2399 }
2400
2401 cc_library {
2402 name: "mylib",
2403 srcs: ["mylib.cpp"],
2404 shared_libs: ["mylib2"],
2405 system_shared_libs: [],
2406 vendor_available: true,
2407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002408 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002409 }
2410
2411 cc_library {
2412 name: "mylib2",
2413 srcs: ["mylib.cpp"],
2414 system_shared_libs: [],
2415 vendor_available: true,
2416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002417 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002418 }
Jooyung Handc782442019-11-01 03:14:38 +09002419 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002420 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002421 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002422
2423 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002424 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002425 for _, implicit := range i.Implicits {
2426 inputsList = append(inputsList, implicit.String())
2427 }
2428 }
2429 inputsString := strings.Join(inputsList, " ")
2430
2431 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002432 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2433 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002434
2435 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002436 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2437 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002438}
Jiyong Park16e91a02018-12-20 18:18:08 +09002439
Jooyung Han85d61762020-06-24 23:50:26 +09002440func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002441 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2442 apex {
2443 name: "myapex",
2444 key: "myapex.key",
2445 use_vendor: true,
2446 }
2447 apex_key {
2448 name: "myapex.key",
2449 public_key: "testkey.avbpubkey",
2450 private_key: "testkey.pem",
2451 }
2452 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002453 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002454 })
Colin Cross440e0d02020-06-11 11:32:11 -07002455 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002456 testApex(t, `
2457 apex {
2458 name: "myapex",
2459 key: "myapex.key",
2460 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002461 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002462 }
2463 apex_key {
2464 name: "myapex.key",
2465 public_key: "testkey.avbpubkey",
2466 private_key: "testkey.pem",
2467 }
2468 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002469 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002470 })
2471}
2472
Jooyung Han5c998b92019-06-27 11:30:33 +09002473func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2474 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2475 apex {
2476 name: "myapex",
2477 key: "myapex.key",
2478 native_shared_libs: ["mylib"],
2479 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002480 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002481 }
2482
2483 apex_key {
2484 name: "myapex.key",
2485 public_key: "testkey.avbpubkey",
2486 private_key: "testkey.pem",
2487 }
2488
2489 cc_library {
2490 name: "mylib",
2491 srcs: ["mylib.cpp"],
2492 system_shared_libs: [],
2493 stl: "none",
2494 }
2495 `)
2496}
2497
Jooyung Han85d61762020-06-24 23:50:26 +09002498func TestVendorApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002499 ctx, _ := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002500 apex {
2501 name: "myapex",
2502 key: "myapex.key",
2503 binaries: ["mybin"],
2504 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002505 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002506 }
2507 apex_key {
2508 name: "myapex.key",
2509 public_key: "testkey.avbpubkey",
2510 private_key: "testkey.pem",
2511 }
2512 cc_binary {
2513 name: "mybin",
2514 vendor: true,
2515 shared_libs: ["libfoo"],
2516 }
2517 cc_library {
2518 name: "libfoo",
2519 proprietary: true,
2520 }
2521 `)
2522
2523 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2524 "bin/mybin",
2525 "lib64/libfoo.so",
2526 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2527 "lib64/libc++.so",
2528 })
2529
2530 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002531 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002532 name := apexBundle.BaseModuleName()
2533 prefix := "TARGET_"
2534 var builder strings.Builder
2535 data.Custom(&builder, name, prefix, "", data)
2536 androidMk := builder.String()
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002537 installPath := path.Join(buildDir, "../target/product/test_device/vendor/apex")
2538 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002539
2540 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2541 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2542 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002543}
2544
Jooyung Handf78e212020-07-22 15:54:47 +09002545func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2546 ctx, _ := testApex(t, `
2547 apex {
2548 name: "myapex",
2549 key: "myapex.key",
2550 binaries: ["mybin"],
2551 vendor: true,
2552 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002553 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_binary {
2561 name: "mybin",
2562 vendor: true,
2563 shared_libs: ["libvndk", "libvendor"],
2564 }
2565 cc_library {
2566 name: "libvndk",
2567 vndk: {
2568 enabled: true,
2569 },
2570 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002571 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002572 }
2573 cc_library {
2574 name: "libvendor",
2575 vendor: true,
2576 }
2577 `)
2578
2579 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2580
Colin Crossaede88c2020-08-11 12:17:01 -07002581 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002582 libs := names(ldRule.Args["libFlags"])
2583 // VNDK libs(libvndk/libc++) as they are
2584 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2585 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2586 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002587 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002588
2589 // VNDK libs are not included when use_vndk_as_stable: true
2590 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2591 "bin/mybin",
2592 "lib64/libvendor.so",
2593 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002594
2595 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2596 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2597 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002598}
2599
Jooyung Han8e5685d2020-09-21 11:02:57 +09002600func TestApex_withPrebuiltFirmware(t *testing.T) {
2601 testCases := []struct {
2602 name string
2603 additionalProp string
2604 }{
2605 {"system apex with prebuilt_firmware", ""},
2606 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2607 }
2608 for _, tc := range testCases {
2609 t.Run(tc.name, func(t *testing.T) {
2610 ctx, _ := testApex(t, `
2611 apex {
2612 name: "myapex",
2613 key: "myapex.key",
2614 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002615 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002616 `+tc.additionalProp+`
2617 }
2618 apex_key {
2619 name: "myapex.key",
2620 public_key: "testkey.avbpubkey",
2621 private_key: "testkey.pem",
2622 }
2623 prebuilt_firmware {
2624 name: "myfirmware",
2625 src: "myfirmware.bin",
2626 filename_from_src: true,
2627 `+tc.additionalProp+`
2628 }
2629 `)
2630 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2631 "etc/firmware/myfirmware.bin",
2632 })
2633 })
2634 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002635}
2636
Jooyung Hanefb184e2020-06-25 17:14:25 +09002637func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002638 ctx, _ := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002639 apex {
2640 name: "myapex",
2641 key: "myapex.key",
2642 use_vendor: true,
2643 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002644 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002645 }
2646
2647 apex_key {
2648 name: "myapex.key",
2649 public_key: "testkey.avbpubkey",
2650 private_key: "testkey.pem",
2651 }
2652
2653 cc_library {
2654 name: "mylib",
2655 vendor_available: true,
2656 apex_available: ["myapex"],
2657 }
2658 `, func(fs map[string][]byte, config android.Config) {
2659 setUseVendorAllowListForTest(config, []string{"myapex"})
2660 })
2661
2662 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002663 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002664 name := apexBundle.BaseModuleName()
2665 prefix := "TARGET_"
2666 var builder strings.Builder
2667 data.Custom(&builder, name, prefix, "", data)
2668 androidMk := builder.String()
2669 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2670}
2671
2672func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002673 ctx, _ := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002674 apex {
2675 name: "myapex",
2676 key: "myapex.key",
2677 vendor: true,
2678 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002679 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002680 }
2681
2682 apex_key {
2683 name: "myapex.key",
2684 public_key: "testkey.avbpubkey",
2685 private_key: "testkey.pem",
2686 }
2687
2688 cc_library {
2689 name: "mylib",
2690 vendor_available: true,
2691 }
2692 `)
2693
2694 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002695 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002696 name := apexBundle.BaseModuleName()
2697 prefix := "TARGET_"
2698 var builder strings.Builder
2699 data.Custom(&builder, name, prefix, "", data)
2700 androidMk := builder.String()
2701 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2702}
2703
Jooyung Han2ed99d02020-06-24 23:26:26 +09002704func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07002705 ctx, _ := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 vintf_fragments: ["fragment.xml"],
2710 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002711 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002712 }
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718 cc_binary {
2719 name: "mybin",
2720 }
2721 `)
2722
2723 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002724 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002725 name := apexBundle.BaseModuleName()
2726 prefix := "TARGET_"
2727 var builder strings.Builder
2728 data.Custom(&builder, name, prefix, "", data)
2729 androidMk := builder.String()
2730 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2731 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2732}
2733
Jiyong Park16e91a02018-12-20 18:18:08 +09002734func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002735 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002736 apex {
2737 name: "myapex",
2738 key: "myapex.key",
2739 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002740 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002741 }
2742
2743 apex_key {
2744 name: "myapex.key",
2745 public_key: "testkey.avbpubkey",
2746 private_key: "testkey.pem",
2747 }
2748
2749 cc_library {
2750 name: "mylib",
2751 srcs: ["mylib.cpp"],
2752 system_shared_libs: [],
2753 stl: "none",
2754 stubs: {
2755 versions: ["1", "2", "3"],
2756 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002757 apex_available: [
2758 "//apex_available:platform",
2759 "myapex",
2760 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002761 }
2762
2763 cc_binary {
2764 name: "not_in_apex",
2765 srcs: ["mylib.cpp"],
2766 static_libs: ["mylib"],
2767 static_executable: true,
2768 system_shared_libs: [],
2769 stl: "none",
2770 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002771 `)
2772
Colin Cross7113d202019-11-20 16:39:12 -08002773 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002774
2775 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002776 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002777}
Jiyong Park9335a262018-12-24 11:31:58 +09002778
2779func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002780 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002781 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002782 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002783 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002784 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002785 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002786 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002787 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002788 }
2789
2790 cc_library {
2791 name: "mylib",
2792 srcs: ["mylib.cpp"],
2793 system_shared_libs: [],
2794 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002795 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002796 }
2797
2798 apex_key {
2799 name: "myapex.key",
2800 public_key: "testkey.avbpubkey",
2801 private_key: "testkey.pem",
2802 }
2803
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002804 android_app_certificate {
2805 name: "myapex.certificate",
2806 certificate: "testkey",
2807 }
2808
2809 android_app_certificate {
2810 name: "myapex.certificate.override",
2811 certificate: "testkey.override",
2812 }
2813
Jiyong Park9335a262018-12-24 11:31:58 +09002814 `)
2815
2816 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002817 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002818
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002819 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2820 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002821 "vendor/foo/devkeys/testkey.avbpubkey")
2822 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002823 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2824 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002825 "vendor/foo/devkeys/testkey.pem")
2826 }
2827
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002828 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002829 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002830 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002831 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002832 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002833 }
2834}
Jiyong Park58e364a2019-01-19 19:24:06 +09002835
Jooyung Hanf121a652019-12-17 14:30:11 +09002836func TestCertificate(t *testing.T) {
2837 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2838 ctx, _ := testApex(t, `
2839 apex {
2840 name: "myapex",
2841 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002842 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002843 }
2844 apex_key {
2845 name: "myapex.key",
2846 public_key: "testkey.avbpubkey",
2847 private_key: "testkey.pem",
2848 }`)
2849 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2850 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2851 if actual := rule.Args["certificates"]; actual != expected {
2852 t.Errorf("certificates should be %q, not %q", expected, actual)
2853 }
2854 })
2855 t.Run("override when unspecified", func(t *testing.T) {
2856 ctx, _ := testApex(t, `
2857 apex {
2858 name: "myapex_keytest",
2859 key: "myapex.key",
2860 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002861 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002862 }
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868 android_app_certificate {
2869 name: "myapex.certificate.override",
2870 certificate: "testkey.override",
2871 }`)
2872 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2873 expected := "testkey.override.x509.pem testkey.override.pk8"
2874 if actual := rule.Args["certificates"]; actual != expected {
2875 t.Errorf("certificates should be %q, not %q", expected, actual)
2876 }
2877 })
2878 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2879 ctx, _ := testApex(t, `
2880 apex {
2881 name: "myapex",
2882 key: "myapex.key",
2883 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002884 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002885 }
2886 apex_key {
2887 name: "myapex.key",
2888 public_key: "testkey.avbpubkey",
2889 private_key: "testkey.pem",
2890 }
2891 android_app_certificate {
2892 name: "myapex.certificate",
2893 certificate: "testkey",
2894 }`)
2895 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2896 expected := "testkey.x509.pem testkey.pk8"
2897 if actual := rule.Args["certificates"]; actual != expected {
2898 t.Errorf("certificates should be %q, not %q", expected, actual)
2899 }
2900 })
2901 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2902 ctx, _ := testApex(t, `
2903 apex {
2904 name: "myapex_keytest",
2905 key: "myapex.key",
2906 file_contexts: ":myapex-file_contexts",
2907 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002908 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002909 }
2910 apex_key {
2911 name: "myapex.key",
2912 public_key: "testkey.avbpubkey",
2913 private_key: "testkey.pem",
2914 }
2915 android_app_certificate {
2916 name: "myapex.certificate.override",
2917 certificate: "testkey.override",
2918 }`)
2919 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2920 expected := "testkey.override.x509.pem testkey.override.pk8"
2921 if actual := rule.Args["certificates"]; actual != expected {
2922 t.Errorf("certificates should be %q, not %q", expected, actual)
2923 }
2924 })
2925 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2926 ctx, _ := testApex(t, `
2927 apex {
2928 name: "myapex",
2929 key: "myapex.key",
2930 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002931 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002932 }
2933 apex_key {
2934 name: "myapex.key",
2935 public_key: "testkey.avbpubkey",
2936 private_key: "testkey.pem",
2937 }`)
2938 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2939 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2940 if actual := rule.Args["certificates"]; actual != expected {
2941 t.Errorf("certificates should be %q, not %q", expected, actual)
2942 }
2943 })
2944 t.Run("override when specified as <name>", func(t *testing.T) {
2945 ctx, _ := testApex(t, `
2946 apex {
2947 name: "myapex_keytest",
2948 key: "myapex.key",
2949 file_contexts: ":myapex-file_contexts",
2950 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002951 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002952 }
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958 android_app_certificate {
2959 name: "myapex.certificate.override",
2960 certificate: "testkey.override",
2961 }`)
2962 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2963 expected := "testkey.override.x509.pem testkey.override.pk8"
2964 if actual := rule.Args["certificates"]; actual != expected {
2965 t.Errorf("certificates should be %q, not %q", expected, actual)
2966 }
2967 })
2968}
2969
Jiyong Park58e364a2019-01-19 19:24:06 +09002970func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002971 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002975 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002976 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09002977 }
2978
2979 apex {
2980 name: "otherapex",
2981 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002982 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002983 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002984 }
2985
2986 apex_key {
2987 name: "myapex.key",
2988 public_key: "testkey.avbpubkey",
2989 private_key: "testkey.pem",
2990 }
2991
2992 cc_library {
2993 name: "mylib",
2994 srcs: ["mylib.cpp"],
2995 system_shared_libs: [],
2996 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002997 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002998 "myapex",
2999 "otherapex",
3000 ],
Jooyung Han24282772020-03-21 23:20:55 +09003001 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003002 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003003 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003004 cc_library {
3005 name: "mylib2",
3006 srcs: ["mylib.cpp"],
3007 system_shared_libs: [],
3008 stl: "none",
3009 apex_available: [
3010 "myapex",
3011 "otherapex",
3012 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003013 static_libs: ["mylib3"],
3014 recovery_available: true,
3015 min_sdk_version: "29",
3016 }
3017 cc_library {
3018 name: "mylib3",
3019 srcs: ["mylib.cpp"],
3020 system_shared_libs: [],
3021 stl: "none",
3022 apex_available: [
3023 "myapex",
3024 "otherapex",
3025 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003026 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003027 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003028 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003029 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003030 `)
3031
Jooyung Hanc87a0592020-03-02 17:44:33 +09003032 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003033 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003034 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003035 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003036
Jooyung Hanccce2f22020-03-07 03:45:53 +09003037 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003038 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003039 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003040 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003041 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003042
Jooyung Hanccce2f22020-03-07 03:45:53 +09003043 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003044 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003045 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003046 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003047 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003048
Colin Crossaede88c2020-08-11 12:17:01 -07003049 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3050 // each variant defines additional macros to distinguish which apex variant it is built for
3051
3052 // non-APEX variant does not have __ANDROID_APEX__ defined
3053 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3054 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3055
3056 // APEX variant has __ANDROID_APEX__ defined
3057 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3058 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3059 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3060 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3061
3062 // APEX variant has __ANDROID_APEX__ defined
3063 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3064 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3065 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3066 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3067
Dan Albertb19953d2020-11-17 15:29:36 -08003068 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003069 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3070 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003071 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003072
3073 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3074 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003075
3076 // non-APEX variant does not have __ANDROID_APEX__ defined
3077 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3078 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3079
3080 // APEX variant has __ANDROID_APEX__ defined
3081 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003082 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003083 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003084 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003085
Jooyung Hanc87a0592020-03-02 17:44:33 +09003086 // APEX variant has __ANDROID_APEX__ defined
3087 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003088 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003089 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003090 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003091
Dan Albertb19953d2020-11-17 15:29:36 -08003092 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003093 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003094 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003095 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003096}
Jiyong Park7e636d02019-01-28 16:16:54 +09003097
3098func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003099 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003100 apex {
3101 name: "myapex",
3102 key: "myapex.key",
3103 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003104 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003105 }
3106
3107 apex_key {
3108 name: "myapex.key",
3109 public_key: "testkey.avbpubkey",
3110 private_key: "testkey.pem",
3111 }
3112
3113 cc_library_headers {
3114 name: "mylib_headers",
3115 export_include_dirs: ["my_include"],
3116 system_shared_libs: [],
3117 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003118 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003119 }
3120
3121 cc_library {
3122 name: "mylib",
3123 srcs: ["mylib.cpp"],
3124 system_shared_libs: [],
3125 stl: "none",
3126 header_libs: ["mylib_headers"],
3127 export_header_lib_headers: ["mylib_headers"],
3128 stubs: {
3129 versions: ["1", "2", "3"],
3130 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003131 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003132 }
3133
3134 cc_library {
3135 name: "otherlib",
3136 srcs: ["mylib.cpp"],
3137 system_shared_libs: [],
3138 stl: "none",
3139 shared_libs: ["mylib"],
3140 }
3141 `)
3142
Colin Cross7113d202019-11-20 16:39:12 -08003143 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003144
3145 // Ensure that the include path of the header lib is exported to 'otherlib'
3146 ensureContains(t, cFlags, "-Imy_include")
3147}
Alex Light9670d332019-01-29 18:07:33 -08003148
Jiyong Park7cd10e32020-01-14 09:22:18 +09003149type fileInApex struct {
3150 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003151 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003152 isLink bool
3153}
3154
Jooyung Hana57af4a2020-01-23 05:36:59 +00003155func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003156 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003157 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003158 copyCmds := apexRule.Args["copy_commands"]
3159 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003160 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003161 for _, cmd := range strings.Split(copyCmds, "&&") {
3162 cmd = strings.TrimSpace(cmd)
3163 if cmd == "" {
3164 continue
3165 }
3166 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003167 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003168 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003169 switch terms[0] {
3170 case "mkdir":
3171 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003172 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003173 t.Fatal("copyCmds contains invalid cp command", cmd)
3174 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003175 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003176 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003177 isLink = false
3178 case "ln":
3179 if len(terms) != 3 && len(terms) != 4 {
3180 // ln LINK TARGET or ln -s LINK TARGET
3181 t.Fatal("copyCmds contains invalid ln command", cmd)
3182 }
3183 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003184 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003185 isLink = true
3186 default:
3187 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3188 }
3189 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003190 index := strings.Index(dst, imageApexDir)
3191 if index == -1 {
3192 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3193 }
3194 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003195 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003196 }
3197 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003198 return ret
3199}
3200
Jooyung Hana57af4a2020-01-23 05:36:59 +00003201func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3202 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003203 var failed bool
3204 var surplus []string
3205 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003206 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003207 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003208 for _, expected := range files {
3209 if matched, _ := path.Match(expected, file.path); matched {
3210 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003211 mactchFound = true
3212 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003213 }
3214 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003215 if !mactchFound {
3216 surplus = append(surplus, file.path)
3217 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003218 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003219
Jooyung Han31c470b2019-10-18 16:26:59 +09003220 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003221 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003222 t.Log("surplus files", surplus)
3223 failed = true
3224 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003225
3226 if len(files) > len(filesMatched) {
3227 var missing []string
3228 for _, expected := range files {
3229 if !filesMatched[expected] {
3230 missing = append(missing, expected)
3231 }
3232 }
3233 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003234 t.Log("missing files", missing)
3235 failed = true
3236 }
3237 if failed {
3238 t.Fail()
3239 }
3240}
3241
Jooyung Han344d5432019-08-23 11:17:39 +09003242func TestVndkApexCurrent(t *testing.T) {
3243 ctx, _ := testApex(t, `
3244 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003245 name: "com.android.vndk.current",
3246 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003247 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003248 }
3249
3250 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003251 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003252 public_key: "testkey.avbpubkey",
3253 private_key: "testkey.pem",
3254 }
3255
3256 cc_library {
3257 name: "libvndk",
3258 srcs: ["mylib.cpp"],
3259 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003260 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003261 vndk: {
3262 enabled: true,
3263 },
3264 system_shared_libs: [],
3265 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003266 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003267 }
3268
3269 cc_library {
3270 name: "libvndksp",
3271 srcs: ["mylib.cpp"],
3272 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003273 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003274 vndk: {
3275 enabled: true,
3276 support_system_process: true,
3277 },
3278 system_shared_libs: [],
3279 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003280 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003281 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003282 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003283
Colin Cross2807f002021-03-02 10:15:29 -08003284 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003285 "lib/libvndk.so",
3286 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003287 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003288 "lib64/libvndk.so",
3289 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003290 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003291 "etc/llndk.libraries.VER.txt",
3292 "etc/vndkcore.libraries.VER.txt",
3293 "etc/vndksp.libraries.VER.txt",
3294 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003295 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003296 })
Jooyung Han344d5432019-08-23 11:17:39 +09003297}
3298
3299func TestVndkApexWithPrebuilt(t *testing.T) {
3300 ctx, _ := testApex(t, `
3301 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003302 name: "com.android.vndk.current",
3303 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003305 }
3306
3307 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003308 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003309 public_key: "testkey.avbpubkey",
3310 private_key: "testkey.pem",
3311 }
3312
3313 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003314 name: "libvndk",
3315 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003316 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003317 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003318 vndk: {
3319 enabled: true,
3320 },
3321 system_shared_libs: [],
3322 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003323 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003324 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003325
3326 cc_prebuilt_library_shared {
3327 name: "libvndk.arm",
3328 srcs: ["libvndk.arm.so"],
3329 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003330 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003331 vndk: {
3332 enabled: true,
3333 },
3334 enabled: false,
3335 arch: {
3336 arm: {
3337 enabled: true,
3338 },
3339 },
3340 system_shared_libs: [],
3341 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003342 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003343 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003344 `+vndkLibrariesTxtFiles("current"),
3345 withFiles(map[string][]byte{
3346 "libvndk.so": nil,
3347 "libvndk.arm.so": nil,
3348 }))
Colin Cross2807f002021-03-02 10:15:29 -08003349 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003350 "lib/libvndk.so",
3351 "lib/libvndk.arm.so",
3352 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003353 "lib/libc++.so",
3354 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003355 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003356 })
Jooyung Han344d5432019-08-23 11:17:39 +09003357}
3358
Jooyung Han39edb6c2019-11-06 16:53:07 +09003359func vndkLibrariesTxtFiles(vers ...string) (result string) {
3360 for _, v := range vers {
3361 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003362 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003363 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003364 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003365 name: "` + txt + `.libraries.txt",
3366 }
3367 `
3368 }
3369 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003370 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003371 result += `
3372 prebuilt_etc {
3373 name: "` + txt + `.libraries.` + v + `.txt",
3374 src: "dummy.txt",
3375 }
3376 `
3377 }
3378 }
3379 }
3380 return
3381}
3382
Jooyung Han344d5432019-08-23 11:17:39 +09003383func TestVndkApexVersion(t *testing.T) {
3384 ctx, _ := testApex(t, `
3385 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003386 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003387 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003388 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003389 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003390 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003391 }
3392
3393 apex_key {
3394 name: "myapex.key",
3395 public_key: "testkey.avbpubkey",
3396 private_key: "testkey.pem",
3397 }
3398
Jooyung Han31c470b2019-10-18 16:26:59 +09003399 vndk_prebuilt_shared {
3400 name: "libvndk27",
3401 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003402 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003403 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003404 vndk: {
3405 enabled: true,
3406 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003407 target_arch: "arm64",
3408 arch: {
3409 arm: {
3410 srcs: ["libvndk27_arm.so"],
3411 },
3412 arm64: {
3413 srcs: ["libvndk27_arm64.so"],
3414 },
3415 },
Colin Cross2807f002021-03-02 10:15:29 -08003416 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003417 }
3418
3419 vndk_prebuilt_shared {
3420 name: "libvndk27",
3421 version: "27",
3422 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003423 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003424 vndk: {
3425 enabled: true,
3426 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003427 target_arch: "x86_64",
3428 arch: {
3429 x86: {
3430 srcs: ["libvndk27_x86.so"],
3431 },
3432 x86_64: {
3433 srcs: ["libvndk27_x86_64.so"],
3434 },
3435 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003436 }
3437 `+vndkLibrariesTxtFiles("27"),
3438 withFiles(map[string][]byte{
3439 "libvndk27_arm.so": nil,
3440 "libvndk27_arm64.so": nil,
3441 "libvndk27_x86.so": nil,
3442 "libvndk27_x86_64.so": nil,
3443 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003444
Colin Cross2807f002021-03-02 10:15:29 -08003445 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003446 "lib/libvndk27_arm.so",
3447 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003448 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003449 })
Jooyung Han344d5432019-08-23 11:17:39 +09003450}
3451
Jooyung Han90eee022019-10-01 20:02:42 +09003452func TestVndkApexNameRule(t *testing.T) {
3453 ctx, _ := testApex(t, `
3454 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003455 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003456 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003457 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003458 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003459 }
3460 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003461 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003462 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003463 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003464 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003465 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003466 }
3467 apex_key {
3468 name: "myapex.key",
3469 public_key: "testkey.avbpubkey",
3470 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003471 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003472
3473 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003474 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003475 actual := proptools.String(bundle.properties.Apex_name)
3476 if !reflect.DeepEqual(actual, expected) {
3477 t.Errorf("Got '%v', expected '%v'", actual, expected)
3478 }
3479 }
3480
Colin Cross2807f002021-03-02 10:15:29 -08003481 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3482 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003483}
3484
Jooyung Han344d5432019-08-23 11:17:39 +09003485func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3486 ctx, _ := testApex(t, `
3487 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003488 name: "com.android.vndk.current",
3489 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003490 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003491 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003492 }
3493
3494 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003495 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003496 public_key: "testkey.avbpubkey",
3497 private_key: "testkey.pem",
3498 }
3499
3500 cc_library {
3501 name: "libvndk",
3502 srcs: ["mylib.cpp"],
3503 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003504 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003505 native_bridge_supported: true,
3506 host_supported: true,
3507 vndk: {
3508 enabled: true,
3509 },
3510 system_shared_libs: [],
3511 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003512 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003513 }
Colin Cross2807f002021-03-02 10:15:29 -08003514 `+vndkLibrariesTxtFiles("current"),
3515 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003516
Colin Cross2807f002021-03-02 10:15:29 -08003517 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003518 "lib/libvndk.so",
3519 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003520 "lib/libc++.so",
3521 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003522 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003523 })
Jooyung Han344d5432019-08-23 11:17:39 +09003524}
3525
3526func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003527 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003528 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003529 name: "com.android.vndk.current",
3530 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003531 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003532 native_bridge_supported: true,
3533 }
3534
3535 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003536 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540
3541 cc_library {
3542 name: "libvndk",
3543 srcs: ["mylib.cpp"],
3544 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003545 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003546 native_bridge_supported: true,
3547 host_supported: true,
3548 vndk: {
3549 enabled: true,
3550 },
3551 system_shared_libs: [],
3552 stl: "none",
3553 }
3554 `)
3555}
3556
Jooyung Han31c470b2019-10-18 16:26:59 +09003557func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003558 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003559 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003560 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003561 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003562 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003563 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003564 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003565 }
3566
3567 apex_key {
3568 name: "myapex.key",
3569 public_key: "testkey.avbpubkey",
3570 private_key: "testkey.pem",
3571 }
3572
3573 vndk_prebuilt_shared {
3574 name: "libvndk27",
3575 version: "27",
3576 target_arch: "arm",
3577 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003578 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003579 vndk: {
3580 enabled: true,
3581 },
3582 arch: {
3583 arm: {
3584 srcs: ["libvndk27.so"],
3585 }
3586 },
3587 }
3588
3589 vndk_prebuilt_shared {
3590 name: "libvndk27",
3591 version: "27",
3592 target_arch: "arm",
3593 binder32bit: true,
3594 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003595 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003596 vndk: {
3597 enabled: true,
3598 },
3599 arch: {
3600 arm: {
3601 srcs: ["libvndk27binder32.so"],
3602 }
3603 },
Colin Cross2807f002021-03-02 10:15:29 -08003604 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003605 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003606 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003607 withFiles(map[string][]byte{
3608 "libvndk27.so": nil,
3609 "libvndk27binder32.so": nil,
3610 }),
3611 withBinder32bit,
3612 withTargets(map[android.OsType][]android.Target{
3613 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003614 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3615 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 },
3617 }),
3618 )
3619
Colin Cross2807f002021-03-02 10:15:29 -08003620 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003621 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003622 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 })
3624}
3625
Jooyung Han45a96772020-06-15 14:59:42 +09003626func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3627 ctx, _ := testApex(t, `
3628 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003629 name: "com.android.vndk.current",
3630 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003631 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003632 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003633 }
3634
3635 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003636 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003637 public_key: "testkey.avbpubkey",
3638 private_key: "testkey.pem",
3639 }
3640
3641 cc_library {
3642 name: "libz",
3643 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003644 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003645 vndk: {
3646 enabled: true,
3647 },
3648 stubs: {
3649 symbol_file: "libz.map.txt",
3650 versions: ["30"],
3651 }
3652 }
3653 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3654 "libz.map.txt": nil,
3655 }))
3656
Colin Cross2807f002021-03-02 10:15:29 -08003657 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003658 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3659 ensureListEmpty(t, provideNativeLibs)
3660}
3661
Jooyung Hane1633032019-08-01 17:41:43 +09003662func TestDependenciesInApexManifest(t *testing.T) {
3663 ctx, _ := testApex(t, `
3664 apex {
3665 name: "myapex_nodep",
3666 key: "myapex.key",
3667 native_shared_libs: ["lib_nodep"],
3668 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003669 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003670 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003671 }
3672
3673 apex {
3674 name: "myapex_dep",
3675 key: "myapex.key",
3676 native_shared_libs: ["lib_dep"],
3677 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003678 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003679 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003680 }
3681
3682 apex {
3683 name: "myapex_provider",
3684 key: "myapex.key",
3685 native_shared_libs: ["libfoo"],
3686 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003687 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003688 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003689 }
3690
3691 apex {
3692 name: "myapex_selfcontained",
3693 key: "myapex.key",
3694 native_shared_libs: ["lib_dep", "libfoo"],
3695 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003696 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003697 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003698 }
3699
3700 apex_key {
3701 name: "myapex.key",
3702 public_key: "testkey.avbpubkey",
3703 private_key: "testkey.pem",
3704 }
3705
3706 cc_library {
3707 name: "lib_nodep",
3708 srcs: ["mylib.cpp"],
3709 system_shared_libs: [],
3710 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003711 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003712 }
3713
3714 cc_library {
3715 name: "lib_dep",
3716 srcs: ["mylib.cpp"],
3717 shared_libs: ["libfoo"],
3718 system_shared_libs: [],
3719 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003720 apex_available: [
3721 "myapex_dep",
3722 "myapex_provider",
3723 "myapex_selfcontained",
3724 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003725 }
3726
3727 cc_library {
3728 name: "libfoo",
3729 srcs: ["mytest.cpp"],
3730 stubs: {
3731 versions: ["1"],
3732 },
3733 system_shared_libs: [],
3734 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003735 apex_available: [
3736 "myapex_provider",
3737 "myapex_selfcontained",
3738 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003739 }
3740 `)
3741
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003742 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003743 var provideNativeLibs, requireNativeLibs []string
3744
Sundong Ahnabb64432019-10-22 13:58:29 +09003745 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003746 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3747 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003748 ensureListEmpty(t, provideNativeLibs)
3749 ensureListEmpty(t, requireNativeLibs)
3750
Sundong Ahnabb64432019-10-22 13:58:29 +09003751 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003752 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3753 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003754 ensureListEmpty(t, provideNativeLibs)
3755 ensureListContains(t, requireNativeLibs, "libfoo.so")
3756
Sundong Ahnabb64432019-10-22 13:58:29 +09003757 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003758 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3759 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003760 ensureListContains(t, provideNativeLibs, "libfoo.so")
3761 ensureListEmpty(t, requireNativeLibs)
3762
Sundong Ahnabb64432019-10-22 13:58:29 +09003763 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003764 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3765 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003766 ensureListContains(t, provideNativeLibs, "libfoo.so")
3767 ensureListEmpty(t, requireNativeLibs)
3768}
3769
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003770func TestApexName(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07003771 ctx, _ := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003772 apex {
3773 name: "myapex",
3774 key: "myapex.key",
3775 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003776 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003777 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003778 }
3779
3780 apex_key {
3781 name: "myapex.key",
3782 public_key: "testkey.avbpubkey",
3783 private_key: "testkey.pem",
3784 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003785
3786 cc_library {
3787 name: "mylib",
3788 srcs: ["mylib.cpp"],
3789 system_shared_libs: [],
3790 stl: "none",
3791 apex_available: [
3792 "//apex_available:platform",
3793 "myapex",
3794 ],
3795 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003796 `)
3797
Sundong Ahnabb64432019-10-22 13:58:29 +09003798 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003799 apexManifestRule := module.Rule("apexManifestRule")
3800 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3801 apexRule := module.Rule("apexRule")
3802 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003803
3804 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003805 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003806 name := apexBundle.BaseModuleName()
3807 prefix := "TARGET_"
3808 var builder strings.Builder
3809 data.Custom(&builder, name, prefix, "", data)
3810 androidMk := builder.String()
3811 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3812 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003813}
3814
Alex Light0851b882019-02-07 13:20:53 -08003815func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003816 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003817 apex {
3818 name: "myapex",
3819 key: "myapex.key",
3820 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003821 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003822 }
3823
3824 apex_key {
3825 name: "myapex.key",
3826 public_key: "testkey.avbpubkey",
3827 private_key: "testkey.pem",
3828 }
3829
3830 cc_library {
3831 name: "mylib_common",
3832 srcs: ["mylib.cpp"],
3833 system_shared_libs: [],
3834 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003835 apex_available: [
3836 "//apex_available:platform",
3837 "myapex",
3838 ],
Alex Light0851b882019-02-07 13:20:53 -08003839 }
3840 `)
3841
Sundong Ahnabb64432019-10-22 13:58:29 +09003842 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003843 apexRule := module.Rule("apexRule")
3844 copyCmds := apexRule.Args["copy_commands"]
3845
3846 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3847 t.Log("Apex was a test apex!")
3848 t.Fail()
3849 }
3850 // Ensure that main rule creates an output
3851 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3852
3853 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003854 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003855
3856 // Ensure that both direct and indirect deps are copied into apex
3857 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3858
Colin Cross7113d202019-11-20 16:39:12 -08003859 // Ensure that the platform variant ends with _shared
3860 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003861
Colin Cross56a83212020-09-15 18:30:11 -07003862 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003863 t.Log("Found mylib_common not in any apex!")
3864 t.Fail()
3865 }
3866}
3867
3868func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003869 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003870 apex_test {
3871 name: "myapex",
3872 key: "myapex.key",
3873 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003874 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003875 }
3876
3877 apex_key {
3878 name: "myapex.key",
3879 public_key: "testkey.avbpubkey",
3880 private_key: "testkey.pem",
3881 }
3882
3883 cc_library {
3884 name: "mylib_common_test",
3885 srcs: ["mylib.cpp"],
3886 system_shared_libs: [],
3887 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003888 // TODO: remove //apex_available:platform
3889 apex_available: [
3890 "//apex_available:platform",
3891 "myapex",
3892 ],
Alex Light0851b882019-02-07 13:20:53 -08003893 }
3894 `)
3895
Sundong Ahnabb64432019-10-22 13:58:29 +09003896 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003897 apexRule := module.Rule("apexRule")
3898 copyCmds := apexRule.Args["copy_commands"]
3899
3900 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3901 t.Log("Apex was not a test apex!")
3902 t.Fail()
3903 }
3904 // Ensure that main rule creates an output
3905 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3906
3907 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003908 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003909
3910 // Ensure that both direct and indirect deps are copied into apex
3911 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3912
Colin Cross7113d202019-11-20 16:39:12 -08003913 // Ensure that the platform variant ends with _shared
3914 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003915}
3916
Alex Light9670d332019-01-29 18:07:33 -08003917func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003918 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003919 apex {
3920 name: "myapex",
3921 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003922 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003923 multilib: {
3924 first: {
3925 native_shared_libs: ["mylib_common"],
3926 }
3927 },
3928 target: {
3929 android: {
3930 multilib: {
3931 first: {
3932 native_shared_libs: ["mylib"],
3933 }
3934 }
3935 },
3936 host: {
3937 multilib: {
3938 first: {
3939 native_shared_libs: ["mylib2"],
3940 }
3941 }
3942 }
3943 }
3944 }
3945
3946 apex_key {
3947 name: "myapex.key",
3948 public_key: "testkey.avbpubkey",
3949 private_key: "testkey.pem",
3950 }
3951
3952 cc_library {
3953 name: "mylib",
3954 srcs: ["mylib.cpp"],
3955 system_shared_libs: [],
3956 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003957 // TODO: remove //apex_available:platform
3958 apex_available: [
3959 "//apex_available:platform",
3960 "myapex",
3961 ],
Alex Light9670d332019-01-29 18:07:33 -08003962 }
3963
3964 cc_library {
3965 name: "mylib_common",
3966 srcs: ["mylib.cpp"],
3967 system_shared_libs: [],
3968 stl: "none",
3969 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003970 // TODO: remove //apex_available:platform
3971 apex_available: [
3972 "//apex_available:platform",
3973 "myapex",
3974 ],
Alex Light9670d332019-01-29 18:07:33 -08003975 }
3976
3977 cc_library {
3978 name: "mylib2",
3979 srcs: ["mylib.cpp"],
3980 system_shared_libs: [],
3981 stl: "none",
3982 compile_multilib: "first",
3983 }
3984 `)
3985
Sundong Ahnabb64432019-10-22 13:58:29 +09003986 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003987 copyCmds := apexRule.Args["copy_commands"]
3988
3989 // Ensure that main rule creates an output
3990 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3991
3992 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003993 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3994 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3995 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003996
3997 // Ensure that both direct and indirect deps are copied into apex
3998 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3999 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4000 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4001
Colin Cross7113d202019-11-20 16:39:12 -08004002 // Ensure that the platform variant ends with _shared
4003 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4004 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4005 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004006}
Jiyong Park04480cf2019-02-06 00:16:29 +09004007
Jiyong Park59140302020-12-14 18:44:04 +09004008func TestApexWithArch(t *testing.T) {
4009 ctx, _ := testApex(t, `
4010 apex {
4011 name: "myapex",
4012 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004013 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004014 arch: {
4015 arm64: {
4016 native_shared_libs: ["mylib.arm64"],
4017 },
4018 x86_64: {
4019 native_shared_libs: ["mylib.x64"],
4020 },
4021 }
4022 }
4023
4024 apex_key {
4025 name: "myapex.key",
4026 public_key: "testkey.avbpubkey",
4027 private_key: "testkey.pem",
4028 }
4029
4030 cc_library {
4031 name: "mylib.arm64",
4032 srcs: ["mylib.cpp"],
4033 system_shared_libs: [],
4034 stl: "none",
4035 // TODO: remove //apex_available:platform
4036 apex_available: [
4037 "//apex_available:platform",
4038 "myapex",
4039 ],
4040 }
4041
4042 cc_library {
4043 name: "mylib.x64",
4044 srcs: ["mylib.cpp"],
4045 system_shared_libs: [],
4046 stl: "none",
4047 // TODO: remove //apex_available:platform
4048 apex_available: [
4049 "//apex_available:platform",
4050 "myapex",
4051 ],
4052 }
4053 `)
4054
4055 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4056 copyCmds := apexRule.Args["copy_commands"]
4057
4058 // Ensure that apex variant is created for the direct dep
4059 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4060 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4061
4062 // Ensure that both direct and indirect deps are copied into apex
4063 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4064 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4065}
4066
Jiyong Park04480cf2019-02-06 00:16:29 +09004067func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004068 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004069 apex {
4070 name: "myapex",
4071 key: "myapex.key",
4072 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004073 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004074 }
4075
4076 apex_key {
4077 name: "myapex.key",
4078 public_key: "testkey.avbpubkey",
4079 private_key: "testkey.pem",
4080 }
4081
4082 sh_binary {
4083 name: "myscript",
4084 src: "mylib.cpp",
4085 filename: "myscript.sh",
4086 sub_dir: "script",
4087 }
4088 `)
4089
Sundong Ahnabb64432019-10-22 13:58:29 +09004090 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004091 copyCmds := apexRule.Args["copy_commands"]
4092
4093 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4094}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004095
Jooyung Han91df2082019-11-20 01:49:42 +09004096func TestApexInVariousPartition(t *testing.T) {
4097 testcases := []struct {
4098 propName, parition, flattenedPartition string
4099 }{
4100 {"", "system", "system_ext"},
4101 {"product_specific: true", "product", "product"},
4102 {"soc_specific: true", "vendor", "vendor"},
4103 {"proprietary: true", "vendor", "vendor"},
4104 {"vendor: true", "vendor", "vendor"},
4105 {"system_ext_specific: true", "system_ext", "system_ext"},
4106 }
4107 for _, tc := range testcases {
4108 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
4109 ctx, _ := testApex(t, `
4110 apex {
4111 name: "myapex",
4112 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004113 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004114 `+tc.propName+`
4115 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004116
Jooyung Han91df2082019-11-20 01:49:42 +09004117 apex_key {
4118 name: "myapex.key",
4119 public_key: "testkey.avbpubkey",
4120 private_key: "testkey.pem",
4121 }
4122 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004123
Jooyung Han91df2082019-11-20 01:49:42 +09004124 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4125 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4126 actual := apex.installDir.String()
4127 if actual != expected {
4128 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4129 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004130
Jooyung Han91df2082019-11-20 01:49:42 +09004131 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4132 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4133 actual = flattened.installDir.String()
4134 if actual != expected {
4135 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4136 }
4137 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004138 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004139}
Jiyong Park67882562019-03-21 01:11:21 +09004140
Jooyung Han580eb4f2020-06-24 19:33:06 +09004141func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004142 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004143 apex {
4144 name: "myapex",
4145 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004146 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004147 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004148
Jooyung Han580eb4f2020-06-24 19:33:06 +09004149 apex_key {
4150 name: "myapex.key",
4151 public_key: "testkey.avbpubkey",
4152 private_key: "testkey.pem",
4153 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004154 `)
4155 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004156 rule := module.Output("file_contexts")
4157 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4158}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004159
Jooyung Han580eb4f2020-06-24 19:33:06 +09004160func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004161 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004162 apex {
4163 name: "myapex",
4164 key: "myapex.key",
4165 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004166 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004167 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004168
Jooyung Han580eb4f2020-06-24 19:33:06 +09004169 apex_key {
4170 name: "myapex.key",
4171 public_key: "testkey.avbpubkey",
4172 private_key: "testkey.pem",
4173 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004174 `, withFiles(map[string][]byte{
4175 "my_own_file_contexts": nil,
4176 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004177}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004178
Jooyung Han580eb4f2020-06-24 19:33:06 +09004179func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004180 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004181 apex {
4182 name: "myapex",
4183 key: "myapex.key",
4184 product_specific: true,
4185 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004186 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004187 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004188
Jooyung Han580eb4f2020-06-24 19:33:06 +09004189 apex_key {
4190 name: "myapex.key",
4191 public_key: "testkey.avbpubkey",
4192 private_key: "testkey.pem",
4193 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004194 `)
4195
Jooyung Han580eb4f2020-06-24 19:33:06 +09004196 ctx, _ := testApex(t, `
4197 apex {
4198 name: "myapex",
4199 key: "myapex.key",
4200 product_specific: true,
4201 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004202 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004203 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004204
Jooyung Han580eb4f2020-06-24 19:33:06 +09004205 apex_key {
4206 name: "myapex.key",
4207 public_key: "testkey.avbpubkey",
4208 private_key: "testkey.pem",
4209 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004210 `, withFiles(map[string][]byte{
4211 "product_specific_file_contexts": nil,
4212 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004213 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4214 rule := module.Output("file_contexts")
4215 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4216}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004217
Jooyung Han580eb4f2020-06-24 19:33:06 +09004218func TestFileContexts_SetViaFileGroup(t *testing.T) {
4219 ctx, _ := testApex(t, `
4220 apex {
4221 name: "myapex",
4222 key: "myapex.key",
4223 product_specific: true,
4224 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004225 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004226 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004227
Jooyung Han580eb4f2020-06-24 19:33:06 +09004228 apex_key {
4229 name: "myapex.key",
4230 public_key: "testkey.avbpubkey",
4231 private_key: "testkey.pem",
4232 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004233
Jooyung Han580eb4f2020-06-24 19:33:06 +09004234 filegroup {
4235 name: "my-file-contexts",
4236 srcs: ["product_specific_file_contexts"],
4237 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004238 `, withFiles(map[string][]byte{
4239 "product_specific_file_contexts": nil,
4240 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004241 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4242 rule := module.Output("file_contexts")
4243 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004244}
4245
Jiyong Park67882562019-03-21 01:11:21 +09004246func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004247 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004248 apex_key {
4249 name: "myapex.key",
4250 public_key: ":my.avbpubkey",
4251 private_key: ":my.pem",
4252 product_specific: true,
4253 }
4254
4255 filegroup {
4256 name: "my.avbpubkey",
4257 srcs: ["testkey2.avbpubkey"],
4258 }
4259
4260 filegroup {
4261 name: "my.pem",
4262 srcs: ["testkey2.pem"],
4263 }
4264 `)
4265
4266 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4267 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004268 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004269 if actual_pubkey != expected_pubkey {
4270 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4271 }
4272 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004273 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004274 if actual_privkey != expected_privkey {
4275 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4276 }
4277}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004278
4279func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004280 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004281 prebuilt_apex {
4282 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004283 arch: {
4284 arm64: {
4285 src: "myapex-arm64.apex",
4286 },
4287 arm: {
4288 src: "myapex-arm.apex",
4289 },
4290 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004291 }
4292 `)
4293
4294 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4295
Jiyong Parkc95714e2019-03-29 14:23:10 +09004296 expectedInput := "myapex-arm64.apex"
4297 if prebuilt.inputApex.String() != expectedInput {
4298 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4299 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004300}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004301
4302func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004303 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004304 prebuilt_apex {
4305 name: "myapex",
4306 src: "myapex-arm.apex",
4307 filename: "notmyapex.apex",
4308 }
4309 `)
4310
4311 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4312
4313 expected := "notmyapex.apex"
4314 if p.installFilename != expected {
4315 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4316 }
4317}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004318
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004319func TestPrebuiltOverrides(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004320 ctx, _ := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004321 prebuilt_apex {
4322 name: "myapex.prebuilt",
4323 src: "myapex-arm.apex",
4324 overrides: [
4325 "myapex",
4326 ],
4327 }
4328 `)
4329
4330 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4331
4332 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004333 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004334 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004335 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004336 }
4337}
4338
Paul Duffin092153d2021-01-26 11:42:39 +00004339// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4340// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004341func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4342 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004343 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004344 }
4345
Paul Duffin89886cb2021-02-05 16:44:03 +00004346 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004347 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004348 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004349 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004350 stem := android.RemoveOptionalPrebuiltPrefix(name)
4351 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004352 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4353 }
4354 }
4355
Paul Duffin39853512021-02-26 11:09:39 +00004356 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004357 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004358 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004359 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4360 }
4361 }
4362
4363 t.Run("prebuilt only", func(t *testing.T) {
4364 bp := `
4365 prebuilt_apex {
4366 name: "myapex",
4367 arch: {
4368 arm64: {
4369 src: "myapex-arm64.apex",
4370 },
4371 arm: {
4372 src: "myapex-arm.apex",
4373 },
4374 },
Paul Duffin39853512021-02-26 11:09:39 +00004375 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004376 }
4377
4378 java_import {
4379 name: "libfoo",
4380 jars: ["libfoo.jar"],
4381 }
Paul Duffin39853512021-02-26 11:09:39 +00004382
4383 java_sdk_library_import {
4384 name: "libbar",
4385 public: {
4386 jars: ["libbar.jar"],
4387 },
4388 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004389 `
4390
4391 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4392 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4393
Paul Duffinf6932af2021-02-26 18:21:56 +00004394 // Make sure that the deapexer has the correct input APEX.
4395 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4396 rule := deapexer.Rule("deapexer")
4397 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4398 t.Errorf("expected: %q, found: %q", expected, actual)
4399 }
4400
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004401 // Make sure that the prebuilt_apex has the correct input APEX.
4402 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4403 rule = prebuiltApex.Rule("android/soong/android.Cp")
4404 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4405 t.Errorf("expected: %q, found: %q", expected, actual)
4406 }
4407
Paul Duffin89886cb2021-02-05 16:44:03 +00004408 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004409
4410 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004411 })
4412
4413 t.Run("prebuilt with source preferred", func(t *testing.T) {
4414
4415 bp := `
4416 prebuilt_apex {
4417 name: "myapex",
4418 arch: {
4419 arm64: {
4420 src: "myapex-arm64.apex",
4421 },
4422 arm: {
4423 src: "myapex-arm.apex",
4424 },
4425 },
Paul Duffin39853512021-02-26 11:09:39 +00004426 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004427 }
4428
4429 java_import {
4430 name: "libfoo",
4431 jars: ["libfoo.jar"],
4432 }
4433
4434 java_library {
4435 name: "libfoo",
4436 }
Paul Duffin39853512021-02-26 11:09:39 +00004437
4438 java_sdk_library_import {
4439 name: "libbar",
4440 public: {
4441 jars: ["libbar.jar"],
4442 },
4443 }
4444
4445 java_sdk_library {
4446 name: "libbar",
4447 srcs: ["foo/bar/MyClass.java"],
4448 unsafe_ignore_missing_latest_api: true,
4449 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004450 `
4451
4452 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4453 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4454
Paul Duffin89886cb2021-02-05 16:44:03 +00004455 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004456 ensureNoSourceVariant(t, ctx, "libfoo")
4457
4458 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4459 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004460 })
4461
4462 t.Run("prebuilt preferred with source", func(t *testing.T) {
4463 bp := `
4464 prebuilt_apex {
4465 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004466 arch: {
4467 arm64: {
4468 src: "myapex-arm64.apex",
4469 },
4470 arm: {
4471 src: "myapex-arm.apex",
4472 },
4473 },
Paul Duffin39853512021-02-26 11:09:39 +00004474 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004475 }
4476
4477 java_import {
4478 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004479 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004480 jars: ["libfoo.jar"],
4481 }
4482
4483 java_library {
4484 name: "libfoo",
4485 }
Paul Duffin39853512021-02-26 11:09:39 +00004486
4487 java_sdk_library_import {
4488 name: "libbar",
4489 prefer: true,
4490 public: {
4491 jars: ["libbar.jar"],
4492 },
4493 }
4494
4495 java_sdk_library {
4496 name: "libbar",
4497 srcs: ["foo/bar/MyClass.java"],
4498 unsafe_ignore_missing_latest_api: true,
4499 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004500 `
4501
4502 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4503 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4504
Paul Duffin89886cb2021-02-05 16:44:03 +00004505 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004506 ensureNoSourceVariant(t, ctx, "libfoo")
4507
4508 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4509 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004510 })
4511}
4512
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004513func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4514 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004515 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004516 }
4517
Paul Duffin37856732021-02-26 14:24:15 +00004518 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4519 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004520 s := ctx.SingletonForTests("dex_bootjars")
4521 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004522 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004523 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004524 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004525 foundLibfooJar = true
4526 buildRule := s.Output(output)
4527 actual := android.NormalizePathForTesting(buildRule.Input)
4528 if actual != bootDexJarPath {
4529 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4530 }
4531 }
4532 }
4533 if !foundLibfooJar {
4534 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4535 }
4536 }
4537
Paul Duffin4fd997b2021-02-03 20:06:33 +00004538 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004539 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004540 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4541 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4542 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4543 }
4544
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004545 t.Run("prebuilt only", func(t *testing.T) {
4546 bp := `
4547 prebuilt_apex {
4548 name: "myapex",
4549 arch: {
4550 arm64: {
4551 src: "myapex-arm64.apex",
4552 },
4553 arm: {
4554 src: "myapex-arm.apex",
4555 },
4556 },
Paul Duffin37856732021-02-26 14:24:15 +00004557 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004558 }
4559
4560 java_import {
4561 name: "libfoo",
4562 jars: ["libfoo.jar"],
4563 apex_available: ["myapex"],
4564 }
Paul Duffin37856732021-02-26 14:24:15 +00004565
4566 java_sdk_library_import {
4567 name: "libbar",
4568 public: {
4569 jars: ["libbar.jar"],
4570 },
4571 apex_available: ["myapex"],
4572 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004573 `
4574
4575 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004576 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4577 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004578
Paul Duffin9d67ca62021-02-03 20:06:33 +00004579 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4580 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004581.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004582.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4583`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004584 })
4585
4586 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4587 bp := `
4588 prebuilt_apex {
4589 name: "myapex",
4590 arch: {
4591 arm64: {
4592 src: "myapex-arm64.apex",
4593 },
4594 arm: {
4595 src: "myapex-arm.apex",
4596 },
4597 },
Paul Duffin37856732021-02-26 14:24:15 +00004598 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004599 }
4600
4601 java_import {
4602 name: "libfoo",
4603 jars: ["libfoo.jar"],
4604 apex_available: ["myapex"],
4605 }
4606
4607 java_library {
4608 name: "libfoo",
4609 srcs: ["foo/bar/MyClass.java"],
4610 apex_available: ["myapex"],
4611 }
Paul Duffin37856732021-02-26 14:24:15 +00004612
4613 java_sdk_library_import {
4614 name: "libbar",
4615 public: {
4616 jars: ["libbar.jar"],
4617 },
4618 apex_available: ["myapex"],
4619 }
4620
4621 java_sdk_library {
4622 name: "libbar",
4623 srcs: ["foo/bar/MyClass.java"],
4624 unsafe_ignore_missing_latest_api: true,
4625 apex_available: ["myapex"],
4626 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004627 `
4628
4629 // In this test the source (java_library) libfoo is active since the
4630 // prebuilt (java_import) defaults to prefer:false. However the
4631 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4632 // find the dex boot jar in it. We either need to disable the source libfoo
4633 // or make the prebuilt libfoo preferred.
4634 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4635 })
4636
4637 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4638 bp := `
4639 prebuilt_apex {
4640 name: "myapex",
4641 arch: {
4642 arm64: {
4643 src: "myapex-arm64.apex",
4644 },
4645 arm: {
4646 src: "myapex-arm.apex",
4647 },
4648 },
Paul Duffin37856732021-02-26 14:24:15 +00004649 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004650 }
4651
4652 java_import {
4653 name: "libfoo",
4654 prefer: true,
4655 jars: ["libfoo.jar"],
4656 apex_available: ["myapex"],
4657 }
4658
4659 java_library {
4660 name: "libfoo",
4661 srcs: ["foo/bar/MyClass.java"],
4662 apex_available: ["myapex"],
4663 }
Paul Duffin37856732021-02-26 14:24:15 +00004664
4665 java_sdk_library_import {
4666 name: "libbar",
4667 prefer: true,
4668 public: {
4669 jars: ["libbar.jar"],
4670 },
4671 apex_available: ["myapex"],
4672 }
4673
4674 java_sdk_library {
4675 name: "libbar",
4676 srcs: ["foo/bar/MyClass.java"],
4677 unsafe_ignore_missing_latest_api: true,
4678 apex_available: ["myapex"],
4679 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004680 `
4681
4682 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004683 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4684 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004685
Paul Duffin9d67ca62021-02-03 20:06:33 +00004686 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4687 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004688.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004689.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4690`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004691 })
4692
4693 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4694 bp := `
4695 apex {
4696 name: "myapex",
4697 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004698 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004699 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004700 }
4701
4702 apex_key {
4703 name: "myapex.key",
4704 public_key: "testkey.avbpubkey",
4705 private_key: "testkey.pem",
4706 }
4707
4708 prebuilt_apex {
4709 name: "myapex",
4710 arch: {
4711 arm64: {
4712 src: "myapex-arm64.apex",
4713 },
4714 arm: {
4715 src: "myapex-arm.apex",
4716 },
4717 },
Paul Duffin37856732021-02-26 14:24:15 +00004718 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004719 }
4720
4721 java_import {
4722 name: "libfoo",
4723 jars: ["libfoo.jar"],
4724 apex_available: ["myapex"],
4725 }
4726
4727 java_library {
4728 name: "libfoo",
4729 srcs: ["foo/bar/MyClass.java"],
4730 apex_available: ["myapex"],
4731 }
Paul Duffin37856732021-02-26 14:24:15 +00004732
4733 java_sdk_library_import {
4734 name: "libbar",
4735 public: {
4736 jars: ["libbar.jar"],
4737 },
4738 apex_available: ["myapex"],
4739 }
4740
4741 java_sdk_library {
4742 name: "libbar",
4743 srcs: ["foo/bar/MyClass.java"],
4744 unsafe_ignore_missing_latest_api: true,
4745 apex_available: ["myapex"],
4746 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004747 `
4748
4749 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004750 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4751 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004752
4753 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4754 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004755.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004756.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4757`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004758 })
4759
4760 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4761 bp := `
4762 apex {
4763 name: "myapex",
4764 enabled: false,
4765 key: "myapex.key",
4766 java_libs: ["libfoo"],
4767 }
4768
4769 apex_key {
4770 name: "myapex.key",
4771 public_key: "testkey.avbpubkey",
4772 private_key: "testkey.pem",
4773 }
4774
4775 prebuilt_apex {
4776 name: "myapex",
4777 arch: {
4778 arm64: {
4779 src: "myapex-arm64.apex",
4780 },
4781 arm: {
4782 src: "myapex-arm.apex",
4783 },
4784 },
Paul Duffin37856732021-02-26 14:24:15 +00004785 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004786 }
4787
4788 java_import {
4789 name: "libfoo",
4790 prefer: true,
4791 jars: ["libfoo.jar"],
4792 apex_available: ["myapex"],
4793 }
4794
4795 java_library {
4796 name: "libfoo",
4797 srcs: ["foo/bar/MyClass.java"],
4798 apex_available: ["myapex"],
4799 }
Paul Duffin37856732021-02-26 14:24:15 +00004800
4801 java_sdk_library_import {
4802 name: "libbar",
4803 prefer: true,
4804 public: {
4805 jars: ["libbar.jar"],
4806 },
4807 apex_available: ["myapex"],
4808 }
4809
4810 java_sdk_library {
4811 name: "libbar",
4812 srcs: ["foo/bar/MyClass.java"],
4813 unsafe_ignore_missing_latest_api: true,
4814 apex_available: ["myapex"],
4815 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004816 `
4817
4818 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004819 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4820 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004821
Paul Duffin9d67ca62021-02-03 20:06:33 +00004822 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4823 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004824.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004825.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4826`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004827 })
4828}
4829
Roland Levillain630846d2019-06-26 12:48:34 +01004830func TestApexWithTests(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004831 ctx, _ := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004832 apex_test {
4833 name: "myapex",
4834 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004835 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004836 tests: [
4837 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004838 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004839 ],
4840 }
4841
4842 apex_key {
4843 name: "myapex.key",
4844 public_key: "testkey.avbpubkey",
4845 private_key: "testkey.pem",
4846 }
4847
Liz Kammer1c14a212020-05-12 15:26:55 -07004848 filegroup {
4849 name: "fg",
4850 srcs: [
4851 "baz",
4852 "bar/baz"
4853 ],
4854 }
4855
Roland Levillain630846d2019-06-26 12:48:34 +01004856 cc_test {
4857 name: "mytest",
4858 gtest: false,
4859 srcs: ["mytest.cpp"],
4860 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004861 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004862 system_shared_libs: [],
4863 static_executable: true,
4864 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004865 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004866 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004867
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004868 cc_library {
4869 name: "mylib",
4870 srcs: ["mylib.cpp"],
4871 system_shared_libs: [],
4872 stl: "none",
4873 }
4874
Liz Kammer5bd365f2020-05-27 15:15:11 -07004875 filegroup {
4876 name: "fg2",
4877 srcs: [
4878 "testdata/baz"
4879 ],
4880 }
4881
Roland Levillain9b5fde92019-06-28 15:41:19 +01004882 cc_test {
4883 name: "mytests",
4884 gtest: false,
4885 srcs: [
4886 "mytest1.cpp",
4887 "mytest2.cpp",
4888 "mytest3.cpp",
4889 ],
4890 test_per_src: true,
4891 relative_install_path: "test",
4892 system_shared_libs: [],
4893 static_executable: true,
4894 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004895 data: [
4896 ":fg",
4897 ":fg2",
4898 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004899 }
Roland Levillain630846d2019-06-26 12:48:34 +01004900 `)
4901
Sundong Ahnabb64432019-10-22 13:58:29 +09004902 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004903 copyCmds := apexRule.Args["copy_commands"]
4904
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004905 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004906 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004907 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004908
Liz Kammer1c14a212020-05-12 15:26:55 -07004909 //Ensure that test data are copied into apex.
4910 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4911 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4912
Roland Levillain9b5fde92019-06-28 15:41:19 +01004913 // Ensure that test deps built with `test_per_src` are copied into apex.
4914 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4915 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4916 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004917
4918 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004919 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004920 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004921 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004922 prefix := "TARGET_"
4923 var builder strings.Builder
4924 data.Custom(&builder, name, prefix, "", data)
4925 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004926 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4927 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4928 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4929 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004930 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004931 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004932 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004933
4934 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004935 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004936 data.Custom(&builder, name, prefix, "", data)
4937 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004938 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4939 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004940}
4941
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004942func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07004943 ctx, _ := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004944 apex {
4945 name: "myapex",
4946 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004947 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004948 }
4949 apex_key {
4950 name: "myapex.key",
4951 public_key: "testkey.avbpubkey",
4952 private_key: "testkey.pem",
4953 }
4954 `, func(fs map[string][]byte, config android.Config) {
4955 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4956 })
4957 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004958 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004959 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004960 var builder strings.Builder
4961 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4962 androidMk := builder.String()
4963 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4964}
4965
Jooyung Hand48f3c32019-08-23 11:18:57 +09004966func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4967 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4968 apex {
4969 name: "myapex",
4970 key: "myapex.key",
4971 native_shared_libs: ["libfoo"],
4972 }
4973
4974 apex_key {
4975 name: "myapex.key",
4976 public_key: "testkey.avbpubkey",
4977 private_key: "testkey.pem",
4978 }
4979
4980 cc_library {
4981 name: "libfoo",
4982 stl: "none",
4983 system_shared_libs: [],
4984 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004985 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004986 }
4987 `)
4988 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4989 apex {
4990 name: "myapex",
4991 key: "myapex.key",
4992 java_libs: ["myjar"],
4993 }
4994
4995 apex_key {
4996 name: "myapex.key",
4997 public_key: "testkey.avbpubkey",
4998 private_key: "testkey.pem",
4999 }
5000
5001 java_library {
5002 name: "myjar",
5003 srcs: ["foo/bar/MyClass.java"],
5004 sdk_version: "none",
5005 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005006 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005007 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005008 }
5009 `)
5010}
5011
Bill Peckhama41a6962021-01-11 10:58:54 -08005012func TestApexWithJavaImport(t *testing.T) {
5013 ctx, _ := testApex(t, `
5014 apex {
5015 name: "myapex",
5016 key: "myapex.key",
5017 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005018 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005019 }
5020
5021 apex_key {
5022 name: "myapex.key",
5023 public_key: "testkey.avbpubkey",
5024 private_key: "testkey.pem",
5025 }
5026
5027 java_import {
5028 name: "myjavaimport",
5029 apex_available: ["myapex"],
5030 jars: ["my.jar"],
5031 compile_dex: true,
5032 }
5033 `)
5034
5035 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5036 apexRule := module.Rule("apexRule")
5037 copyCmds := apexRule.Args["copy_commands"]
5038 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5039}
5040
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005041func TestApexWithApps(t *testing.T) {
5042 ctx, _ := testApex(t, `
5043 apex {
5044 name: "myapex",
5045 key: "myapex.key",
5046 apps: [
5047 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005048 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005049 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005050 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005051 }
5052
5053 apex_key {
5054 name: "myapex.key",
5055 public_key: "testkey.avbpubkey",
5056 private_key: "testkey.pem",
5057 }
5058
5059 android_app {
5060 name: "AppFoo",
5061 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005062 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005063 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005064 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005065 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005066 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005067 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005068
5069 android_app {
5070 name: "AppFooPriv",
5071 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005072 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005073 system_modules: "none",
5074 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005075 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005076 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005077 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005078
5079 cc_library_shared {
5080 name: "libjni",
5081 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005082 shared_libs: ["libfoo"],
5083 stl: "none",
5084 system_shared_libs: [],
5085 apex_available: [ "myapex" ],
5086 sdk_version: "current",
5087 }
5088
5089 cc_library_shared {
5090 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005091 stl: "none",
5092 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005093 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005094 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005095 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005096 `)
5097
Sundong Ahnabb64432019-10-22 13:58:29 +09005098 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005099 apexRule := module.Rule("apexRule")
5100 copyCmds := apexRule.Args["copy_commands"]
5101
5102 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005103 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005104
Colin Crossaede88c2020-08-11 12:17:01 -07005105 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005106 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005107 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005108 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005109 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005110 // JNI libraries including transitive deps are
5111 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005112 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005113 // ... embedded inside APK (jnilibs.zip)
5114 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5115 // ... and not directly inside the APEX
5116 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5117 }
Dario Frenicde2a032019-10-27 00:29:22 +01005118}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005119
Dario Frenicde2a032019-10-27 00:29:22 +01005120func TestApexWithAppImports(t *testing.T) {
5121 ctx, _ := testApex(t, `
5122 apex {
5123 name: "myapex",
5124 key: "myapex.key",
5125 apps: [
5126 "AppFooPrebuilt",
5127 "AppFooPrivPrebuilt",
5128 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005129 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005130 }
5131
5132 apex_key {
5133 name: "myapex.key",
5134 public_key: "testkey.avbpubkey",
5135 private_key: "testkey.pem",
5136 }
5137
5138 android_app_import {
5139 name: "AppFooPrebuilt",
5140 apk: "PrebuiltAppFoo.apk",
5141 presigned: true,
5142 dex_preopt: {
5143 enabled: false,
5144 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005145 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005146 }
5147
5148 android_app_import {
5149 name: "AppFooPrivPrebuilt",
5150 apk: "PrebuiltAppFooPriv.apk",
5151 privileged: true,
5152 presigned: true,
5153 dex_preopt: {
5154 enabled: false,
5155 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005156 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005157 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005158 }
5159 `)
5160
Sundong Ahnabb64432019-10-22 13:58:29 +09005161 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005162 apexRule := module.Rule("apexRule")
5163 copyCmds := apexRule.Args["copy_commands"]
5164
5165 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005166 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5167}
5168
5169func TestApexWithAppImportsPrefer(t *testing.T) {
5170 ctx, _ := testApex(t, `
5171 apex {
5172 name: "myapex",
5173 key: "myapex.key",
5174 apps: [
5175 "AppFoo",
5176 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005177 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005178 }
5179
5180 apex_key {
5181 name: "myapex.key",
5182 public_key: "testkey.avbpubkey",
5183 private_key: "testkey.pem",
5184 }
5185
5186 android_app {
5187 name: "AppFoo",
5188 srcs: ["foo/bar/MyClass.java"],
5189 sdk_version: "none",
5190 system_modules: "none",
5191 apex_available: [ "myapex" ],
5192 }
5193
5194 android_app_import {
5195 name: "AppFoo",
5196 apk: "AppFooPrebuilt.apk",
5197 filename: "AppFooPrebuilt.apk",
5198 presigned: true,
5199 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005200 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005201 }
5202 `, withFiles(map[string][]byte{
5203 "AppFooPrebuilt.apk": nil,
5204 }))
5205
5206 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5207 "app/AppFoo/AppFooPrebuilt.apk",
5208 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005209}
5210
Dario Freni6f3937c2019-12-20 22:58:03 +00005211func TestApexWithTestHelperApp(t *testing.T) {
5212 ctx, _ := testApex(t, `
5213 apex {
5214 name: "myapex",
5215 key: "myapex.key",
5216 apps: [
5217 "TesterHelpAppFoo",
5218 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005219 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005220 }
5221
5222 apex_key {
5223 name: "myapex.key",
5224 public_key: "testkey.avbpubkey",
5225 private_key: "testkey.pem",
5226 }
5227
5228 android_test_helper_app {
5229 name: "TesterHelpAppFoo",
5230 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005231 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005232 }
5233
5234 `)
5235
5236 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5237 apexRule := module.Rule("apexRule")
5238 copyCmds := apexRule.Args["copy_commands"]
5239
5240 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5241}
5242
Jooyung Han18020ea2019-11-13 10:50:48 +09005243func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5244 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005245 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005246 apex {
5247 name: "myapex",
5248 key: "myapex.key",
5249 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005250 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005251 }
5252
5253 apex_key {
5254 name: "myapex.key",
5255 public_key: "testkey.avbpubkey",
5256 private_key: "testkey.pem",
5257 }
5258
5259 apex {
5260 name: "otherapex",
5261 key: "myapex.key",
5262 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005263 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005264 }
5265
5266 cc_defaults {
5267 name: "libfoo-defaults",
5268 apex_available: ["otherapex"],
5269 }
5270
5271 cc_library {
5272 name: "libfoo",
5273 defaults: ["libfoo-defaults"],
5274 stl: "none",
5275 system_shared_libs: [],
5276 }`)
5277}
5278
Paul Duffine52e66f2020-03-30 17:54:29 +01005279func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005280 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005281 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005282 apex {
5283 name: "myapex",
5284 key: "myapex.key",
5285 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005286 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005287 }
5288
5289 apex_key {
5290 name: "myapex.key",
5291 public_key: "testkey.avbpubkey",
5292 private_key: "testkey.pem",
5293 }
5294
5295 apex {
5296 name: "otherapex",
5297 key: "otherapex.key",
5298 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005299 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005300 }
5301
5302 apex_key {
5303 name: "otherapex.key",
5304 public_key: "testkey.avbpubkey",
5305 private_key: "testkey.pem",
5306 }
5307
5308 cc_library {
5309 name: "libfoo",
5310 stl: "none",
5311 system_shared_libs: [],
5312 apex_available: ["otherapex"],
5313 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005314}
Jiyong Park127b40b2019-09-30 16:04:35 +09005315
Paul Duffine52e66f2020-03-30 17:54:29 +01005316func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005317 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005318 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005319.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005320.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005321.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005322.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005323.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005324.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005325 apex {
5326 name: "myapex",
5327 key: "myapex.key",
5328 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005329 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005330 }
5331
5332 apex_key {
5333 name: "myapex.key",
5334 public_key: "testkey.avbpubkey",
5335 private_key: "testkey.pem",
5336 }
5337
Jiyong Park127b40b2019-09-30 16:04:35 +09005338 cc_library {
5339 name: "libfoo",
5340 stl: "none",
5341 shared_libs: ["libbar"],
5342 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005343 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005344 }
5345
5346 cc_library {
5347 name: "libbar",
5348 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005349 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005350 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005351 apex_available: ["myapex"],
5352 }
5353
5354 cc_library {
5355 name: "libbaz",
5356 stl: "none",
5357 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005358 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005359}
Jiyong Park127b40b2019-09-30 16:04:35 +09005360
Paul Duffine52e66f2020-03-30 17:54:29 +01005361func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005362 testApexError(t, "\"otherapex\" is not a valid module name", `
5363 apex {
5364 name: "myapex",
5365 key: "myapex.key",
5366 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005367 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005368 }
5369
5370 apex_key {
5371 name: "myapex.key",
5372 public_key: "testkey.avbpubkey",
5373 private_key: "testkey.pem",
5374 }
5375
5376 cc_library {
5377 name: "libfoo",
5378 stl: "none",
5379 system_shared_libs: [],
5380 apex_available: ["otherapex"],
5381 }`)
5382
Paul Duffine52e66f2020-03-30 17:54:29 +01005383 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005384 apex {
5385 name: "myapex",
5386 key: "myapex.key",
5387 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005388 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005389 }
5390
5391 apex_key {
5392 name: "myapex.key",
5393 public_key: "testkey.avbpubkey",
5394 private_key: "testkey.pem",
5395 }
5396
5397 cc_library {
5398 name: "libfoo",
5399 stl: "none",
5400 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005401 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005402 apex_available: ["myapex"],
5403 }
5404
5405 cc_library {
5406 name: "libbar",
5407 stl: "none",
5408 system_shared_libs: [],
5409 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005410 }
5411
5412 cc_library {
5413 name: "libbaz",
5414 stl: "none",
5415 system_shared_libs: [],
5416 stubs: {
5417 versions: ["10", "20", "30"],
5418 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005419 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005420}
Jiyong Park127b40b2019-09-30 16:04:35 +09005421
Jiyong Park89e850a2020-04-07 16:37:39 +09005422func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01005423 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005424 apex {
5425 name: "myapex",
5426 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005427 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005428 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005429 }
5430
5431 apex_key {
5432 name: "myapex.key",
5433 public_key: "testkey.avbpubkey",
5434 private_key: "testkey.pem",
5435 }
5436
5437 cc_library {
5438 name: "libfoo",
5439 stl: "none",
5440 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005441 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005442 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005443 }
5444
5445 cc_library {
5446 name: "libfoo2",
5447 stl: "none",
5448 system_shared_libs: [],
5449 shared_libs: ["libbaz"],
5450 apex_available: ["//apex_available:platform"],
5451 }
5452
5453 cc_library {
5454 name: "libbar",
5455 stl: "none",
5456 system_shared_libs: [],
5457 apex_available: ["myapex"],
5458 }
5459
5460 cc_library {
5461 name: "libbaz",
5462 stl: "none",
5463 system_shared_libs: [],
5464 apex_available: ["myapex"],
5465 stubs: {
5466 versions: ["1"],
5467 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005468 }`)
5469
Jiyong Park89e850a2020-04-07 16:37:39 +09005470 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5471 // because it depends on libbar which isn't available to platform
5472 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5473 if libfoo.NotAvailableForPlatform() != true {
5474 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5475 }
5476
5477 // libfoo2 however can be available to platform because it depends on libbaz which provides
5478 // stubs
5479 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5480 if libfoo2.NotAvailableForPlatform() == true {
5481 t.Errorf("%q should be available to platform", libfoo2.String())
5482 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005483}
Jiyong Parka90ca002019-10-07 15:47:24 +09005484
Paul Duffine52e66f2020-03-30 17:54:29 +01005485func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09005486 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005487 apex {
5488 name: "myapex",
5489 key: "myapex.key",
5490 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005491 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005492 }
5493
5494 apex_key {
5495 name: "myapex.key",
5496 public_key: "testkey.avbpubkey",
5497 private_key: "testkey.pem",
5498 }
5499
5500 cc_library {
5501 name: "libfoo",
5502 stl: "none",
5503 system_shared_libs: [],
5504 apex_available: ["myapex"],
5505 static: {
5506 apex_available: ["//apex_available:platform"],
5507 },
5508 }`)
5509
Jiyong Park89e850a2020-04-07 16:37:39 +09005510 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5511 if libfooShared.NotAvailableForPlatform() != true {
5512 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5513 }
5514 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5515 if libfooStatic.NotAvailableForPlatform() != false {
5516 t.Errorf("%q should be available to platform", libfooStatic.String())
5517 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005518}
5519
Jiyong Park5d790c32019-11-15 18:40:32 +09005520func TestOverrideApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005521 ctx, _ := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005522 apex {
5523 name: "myapex",
5524 key: "myapex.key",
5525 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005526 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005527 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005528 }
5529
5530 override_apex {
5531 name: "override_myapex",
5532 base: "myapex",
5533 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005534 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005535 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005536 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005537 }
5538
5539 apex_key {
5540 name: "myapex.key",
5541 public_key: "testkey.avbpubkey",
5542 private_key: "testkey.pem",
5543 }
5544
5545 android_app {
5546 name: "app",
5547 srcs: ["foo/bar/MyClass.java"],
5548 package_name: "foo",
5549 sdk_version: "none",
5550 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005551 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005552 }
5553
5554 override_android_app {
5555 name: "override_app",
5556 base: "app",
5557 package_name: "bar",
5558 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005559 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005560
Jiyong Park317645e2019-12-05 13:20:58 +09005561 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5562 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5563 if originalVariant.GetOverriddenBy() != "" {
5564 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5565 }
5566 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5567 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5568 }
5569
Jiyong Park5d790c32019-11-15 18:40:32 +09005570 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5571 apexRule := module.Rule("apexRule")
5572 copyCmds := apexRule.Args["copy_commands"]
5573
5574 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005575 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005576
5577 apexBundle := module.Module().(*apexBundle)
5578 name := apexBundle.Name()
5579 if name != "override_myapex" {
5580 t.Errorf("name should be \"override_myapex\", but was %q", name)
5581 }
5582
Baligh Uddin004d7172020-02-19 21:29:28 -08005583 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5584 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5585 }
5586
Jiyong Park20bacab2020-03-03 11:45:41 +09005587 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005588 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005589
Colin Crossaa255532020-07-03 13:18:24 -07005590 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005591 var builder strings.Builder
5592 data.Custom(&builder, name, "TARGET_", "", data)
5593 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005594 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005595 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5596 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005597 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005598 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005599 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005600 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5601 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005602}
5603
Jooyung Han214bf372019-11-12 13:03:50 +09005604func TestLegacyAndroid10Support(t *testing.T) {
5605 ctx, _ := testApex(t, `
5606 apex {
5607 name: "myapex",
5608 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005609 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005610 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005611 }
5612
5613 apex_key {
5614 name: "myapex.key",
5615 public_key: "testkey.avbpubkey",
5616 private_key: "testkey.pem",
5617 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005618
5619 cc_library {
5620 name: "mylib",
5621 srcs: ["mylib.cpp"],
5622 stl: "libc++",
5623 system_shared_libs: [],
5624 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005625 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005626 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005627 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005628
5629 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5630 args := module.Rule("apexRule").Args
5631 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005632 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005633
5634 // The copies of the libraries in the apex should have one more dependency than
5635 // the ones outside the apex, namely the unwinder. Ideally we should check
5636 // the dependency names directly here but for some reason the names are blank in
5637 // this test.
5638 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005639 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005640 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5641 if len(apexImplicits) != len(nonApexImplicits)+1 {
5642 t.Errorf("%q missing unwinder dep", lib)
5643 }
5644 }
Jooyung Han214bf372019-11-12 13:03:50 +09005645}
5646
Paul Duffin9b879592020-05-26 13:21:35 +01005647var filesForSdkLibrary = map[string][]byte{
5648 "api/current.txt": nil,
5649 "api/removed.txt": nil,
5650 "api/system-current.txt": nil,
5651 "api/system-removed.txt": nil,
5652 "api/test-current.txt": nil,
5653 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005654
Anton Hanssondff2c782020-12-21 17:10:01 +00005655 "100/public/api/foo.txt": nil,
5656 "100/public/api/foo-removed.txt": nil,
5657 "100/system/api/foo.txt": nil,
5658 "100/system/api/foo-removed.txt": nil,
5659
Paul Duffineedc5d52020-06-12 17:46:39 +01005660 // For java_sdk_library_import
5661 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005662}
5663
Jooyung Han58f26ab2019-12-18 15:34:32 +09005664func TestJavaSDKLibrary(t *testing.T) {
5665 ctx, _ := testApex(t, `
5666 apex {
5667 name: "myapex",
5668 key: "myapex.key",
5669 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005670 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005671 }
5672
5673 apex_key {
5674 name: "myapex.key",
5675 public_key: "testkey.avbpubkey",
5676 private_key: "testkey.pem",
5677 }
5678
5679 java_sdk_library {
5680 name: "foo",
5681 srcs: ["a.java"],
5682 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005683 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005684 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005685
5686 prebuilt_apis {
5687 name: "sdk",
5688 api_dirs: ["100"],
5689 }
Paul Duffin9b879592020-05-26 13:21:35 +01005690 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005691
5692 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005693 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005694 "javalib/foo.jar",
5695 "etc/permissions/foo.xml",
5696 })
5697 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005698 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5699 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005700}
5701
Paul Duffin9b879592020-05-26 13:21:35 +01005702func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5703 ctx, _ := testApex(t, `
5704 apex {
5705 name: "myapex",
5706 key: "myapex.key",
5707 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005708 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005709 }
5710
5711 apex_key {
5712 name: "myapex.key",
5713 public_key: "testkey.avbpubkey",
5714 private_key: "testkey.pem",
5715 }
5716
5717 java_sdk_library {
5718 name: "foo",
5719 srcs: ["a.java"],
5720 api_packages: ["foo"],
5721 apex_available: ["myapex"],
5722 sdk_version: "none",
5723 system_modules: "none",
5724 }
5725
5726 java_library {
5727 name: "bar",
5728 srcs: ["a.java"],
5729 libs: ["foo"],
5730 apex_available: ["myapex"],
5731 sdk_version: "none",
5732 system_modules: "none",
5733 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005734
5735 prebuilt_apis {
5736 name: "sdk",
5737 api_dirs: ["100"],
5738 }
Paul Duffin9b879592020-05-26 13:21:35 +01005739 `, withFiles(filesForSdkLibrary))
5740
5741 // java_sdk_library installs both impl jar and permission XML
5742 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5743 "javalib/bar.jar",
5744 "javalib/foo.jar",
5745 "etc/permissions/foo.xml",
5746 })
5747
5748 // The bar library should depend on the implementation jar.
5749 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5750 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5751 t.Errorf("expected %q, found %#q", expected, actual)
5752 }
5753}
5754
5755func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5756 ctx, _ := testApex(t, `
5757 apex {
5758 name: "myapex",
5759 key: "myapex.key",
5760 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005761 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005762 }
5763
5764 apex_key {
5765 name: "myapex.key",
5766 public_key: "testkey.avbpubkey",
5767 private_key: "testkey.pem",
5768 }
5769
5770 java_sdk_library {
5771 name: "foo",
5772 srcs: ["a.java"],
5773 api_packages: ["foo"],
5774 apex_available: ["myapex"],
5775 sdk_version: "none",
5776 system_modules: "none",
5777 }
5778
5779 java_library {
5780 name: "bar",
5781 srcs: ["a.java"],
5782 libs: ["foo"],
5783 sdk_version: "none",
5784 system_modules: "none",
5785 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005786
5787 prebuilt_apis {
5788 name: "sdk",
5789 api_dirs: ["100"],
5790 }
Paul Duffin9b879592020-05-26 13:21:35 +01005791 `, withFiles(filesForSdkLibrary))
5792
5793 // java_sdk_library installs both impl jar and permission XML
5794 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5795 "javalib/foo.jar",
5796 "etc/permissions/foo.xml",
5797 })
5798
5799 // The bar library should depend on the stubs jar.
5800 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5801 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5802 t.Errorf("expected %q, found %#q", expected, actual)
5803 }
5804}
5805
Paul Duffineedc5d52020-06-12 17:46:39 +01005806func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005807 ctx, _ := testApex(t, `
5808 prebuilt_apis {
5809 name: "sdk",
5810 api_dirs: ["100"],
5811 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005812 withFiles(map[string][]byte{
5813 "apex/a.java": nil,
5814 "apex/apex_manifest.json": nil,
5815 "apex/Android.bp": []byte(`
5816 package {
5817 default_visibility: ["//visibility:private"],
5818 }
5819
5820 apex {
5821 name: "myapex",
5822 key: "myapex.key",
5823 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005824 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005825 }
5826
5827 apex_key {
5828 name: "myapex.key",
5829 public_key: "testkey.avbpubkey",
5830 private_key: "testkey.pem",
5831 }
5832
5833 java_library {
5834 name: "bar",
5835 srcs: ["a.java"],
5836 libs: ["foo"],
5837 apex_available: ["myapex"],
5838 sdk_version: "none",
5839 system_modules: "none",
5840 }
5841`),
5842 "source/a.java": nil,
5843 "source/api/current.txt": nil,
5844 "source/api/removed.txt": nil,
5845 "source/Android.bp": []byte(`
5846 package {
5847 default_visibility: ["//visibility:private"],
5848 }
5849
5850 java_sdk_library {
5851 name: "foo",
5852 visibility: ["//apex"],
5853 srcs: ["a.java"],
5854 api_packages: ["foo"],
5855 apex_available: ["myapex"],
5856 sdk_version: "none",
5857 system_modules: "none",
5858 public: {
5859 enabled: true,
5860 },
5861 }
5862`),
5863 "prebuilt/a.jar": nil,
5864 "prebuilt/Android.bp": []byte(`
5865 package {
5866 default_visibility: ["//visibility:private"],
5867 }
5868
5869 java_sdk_library_import {
5870 name: "foo",
5871 visibility: ["//apex", "//source"],
5872 apex_available: ["myapex"],
5873 prefer: true,
5874 public: {
5875 jars: ["a.jar"],
5876 },
5877 }
5878`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005879 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005880 )
5881
5882 // java_sdk_library installs both impl jar and permission XML
5883 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5884 "javalib/bar.jar",
5885 "javalib/foo.jar",
5886 "etc/permissions/foo.xml",
5887 })
5888
5889 // The bar library should depend on the implementation jar.
5890 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5891 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5892 t.Errorf("expected %q, found %#q", expected, actual)
5893 }
5894}
5895
5896func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5897 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5898 apex {
5899 name: "myapex",
5900 key: "myapex.key",
5901 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005902 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005903 }
5904
5905 apex_key {
5906 name: "myapex.key",
5907 public_key: "testkey.avbpubkey",
5908 private_key: "testkey.pem",
5909 }
5910
5911 java_sdk_library_import {
5912 name: "foo",
5913 apex_available: ["myapex"],
5914 prefer: true,
5915 public: {
5916 jars: ["a.jar"],
5917 },
5918 }
5919
5920 `, withFiles(filesForSdkLibrary))
5921}
5922
atrost6e126252020-01-27 17:01:16 +00005923func TestCompatConfig(t *testing.T) {
5924 ctx, _ := testApex(t, `
5925 apex {
5926 name: "myapex",
5927 key: "myapex.key",
5928 prebuilts: ["myjar-platform-compat-config"],
5929 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005930 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005931 }
5932
5933 apex_key {
5934 name: "myapex.key",
5935 public_key: "testkey.avbpubkey",
5936 private_key: "testkey.pem",
5937 }
5938
5939 platform_compat_config {
5940 name: "myjar-platform-compat-config",
5941 src: ":myjar",
5942 }
5943
5944 java_library {
5945 name: "myjar",
5946 srcs: ["foo/bar/MyClass.java"],
5947 sdk_version: "none",
5948 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005949 apex_available: [ "myapex" ],
5950 }
5951 `)
5952 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5953 "etc/compatconfig/myjar-platform-compat-config.xml",
5954 "javalib/myjar.jar",
5955 })
5956}
5957
Jiyong Park479321d2019-12-16 11:47:12 +09005958func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5959 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5960 apex {
5961 name: "myapex",
5962 key: "myapex.key",
5963 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005964 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09005965 }
5966
5967 apex_key {
5968 name: "myapex.key",
5969 public_key: "testkey.avbpubkey",
5970 private_key: "testkey.pem",
5971 }
5972
5973 java_library {
5974 name: "myjar",
5975 srcs: ["foo/bar/MyClass.java"],
5976 sdk_version: "none",
5977 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005978 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005979 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005980 }
5981 `)
5982}
5983
Jiyong Park7afd1072019-12-30 16:56:33 +09005984func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07005985 ctx, _ := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005986 apex {
5987 name: "myapex",
5988 key: "myapex.key",
5989 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005990 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09005991 }
5992
5993 apex_key {
5994 name: "myapex.key",
5995 public_key: "testkey.avbpubkey",
5996 private_key: "testkey.pem",
5997 }
5998
5999 cc_library {
6000 name: "mylib",
6001 srcs: ["mylib.cpp"],
6002 system_shared_libs: [],
6003 stl: "none",
6004 required: ["a", "b"],
6005 host_required: ["c", "d"],
6006 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006007 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006008 }
6009 `)
6010
6011 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006012 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006013 name := apexBundle.BaseModuleName()
6014 prefix := "TARGET_"
6015 var builder strings.Builder
6016 data.Custom(&builder, name, prefix, "", data)
6017 androidMk := builder.String()
6018 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6019 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6020 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6021}
6022
Jiyong Park7cd10e32020-01-14 09:22:18 +09006023func TestSymlinksFromApexToSystem(t *testing.T) {
6024 bp := `
6025 apex {
6026 name: "myapex",
6027 key: "myapex.key",
6028 native_shared_libs: ["mylib"],
6029 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006030 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006031 }
6032
Jiyong Park9d677202020-02-19 16:29:35 +09006033 apex {
6034 name: "myapex.updatable",
6035 key: "myapex.key",
6036 native_shared_libs: ["mylib"],
6037 java_libs: ["myjar"],
6038 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006039 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006040 }
6041
Jiyong Park7cd10e32020-01-14 09:22:18 +09006042 apex_key {
6043 name: "myapex.key",
6044 public_key: "testkey.avbpubkey",
6045 private_key: "testkey.pem",
6046 }
6047
6048 cc_library {
6049 name: "mylib",
6050 srcs: ["mylib.cpp"],
6051 shared_libs: ["myotherlib"],
6052 system_shared_libs: [],
6053 stl: "none",
6054 apex_available: [
6055 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006056 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006057 "//apex_available:platform",
6058 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006059 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006060 }
6061
6062 cc_library {
6063 name: "myotherlib",
6064 srcs: ["mylib.cpp"],
6065 system_shared_libs: [],
6066 stl: "none",
6067 apex_available: [
6068 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006069 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006070 "//apex_available:platform",
6071 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006072 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006073 }
6074
6075 java_library {
6076 name: "myjar",
6077 srcs: ["foo/bar/MyClass.java"],
6078 sdk_version: "none",
6079 system_modules: "none",
6080 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006081 apex_available: [
6082 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006083 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006084 "//apex_available:platform",
6085 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006086 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006087 }
6088
6089 java_library {
6090 name: "myotherjar",
6091 srcs: ["foo/bar/MyClass.java"],
6092 sdk_version: "none",
6093 system_modules: "none",
6094 apex_available: [
6095 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006096 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006097 "//apex_available:platform",
6098 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006099 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006100 }
6101 `
6102
6103 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6104 for _, f := range files {
6105 if f.path == file {
6106 if f.isLink {
6107 t.Errorf("%q is not a real file", file)
6108 }
6109 return
6110 }
6111 }
6112 t.Errorf("%q is not found", file)
6113 }
6114
6115 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6116 for _, f := range files {
6117 if f.path == file {
6118 if !f.isLink {
6119 t.Errorf("%q is not a symlink", file)
6120 }
6121 return
6122 }
6123 }
6124 t.Errorf("%q is not found", file)
6125 }
6126
Jiyong Park9d677202020-02-19 16:29:35 +09006127 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6128 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09006129 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006130 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006131 ensureRealfileExists(t, files, "javalib/myjar.jar")
6132 ensureRealfileExists(t, files, "lib64/mylib.so")
6133 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6134
Jiyong Park9d677202020-02-19 16:29:35 +09006135 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6136 ensureRealfileExists(t, files, "javalib/myjar.jar")
6137 ensureRealfileExists(t, files, "lib64/mylib.so")
6138 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6139
6140 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09006141 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006142 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006143 ensureRealfileExists(t, files, "javalib/myjar.jar")
6144 ensureRealfileExists(t, files, "lib64/mylib.so")
6145 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006146
6147 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6148 ensureRealfileExists(t, files, "javalib/myjar.jar")
6149 ensureRealfileExists(t, files, "lib64/mylib.so")
6150 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006151}
6152
Yo Chiange8128052020-07-23 20:09:18 +08006153func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006154 ctx, _ := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006155 apex {
6156 name: "myapex",
6157 key: "myapex.key",
6158 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006159 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006160 }
6161
6162 apex_key {
6163 name: "myapex.key",
6164 public_key: "testkey.avbpubkey",
6165 private_key: "testkey.pem",
6166 }
6167
6168 cc_library_shared {
6169 name: "mylib",
6170 srcs: ["mylib.cpp"],
6171 shared_libs: ["myotherlib"],
6172 system_shared_libs: [],
6173 stl: "none",
6174 apex_available: [
6175 "myapex",
6176 "//apex_available:platform",
6177 ],
6178 }
6179
6180 cc_prebuilt_library_shared {
6181 name: "myotherlib",
6182 srcs: ["prebuilt.so"],
6183 system_shared_libs: [],
6184 stl: "none",
6185 apex_available: [
6186 "myapex",
6187 "//apex_available:platform",
6188 ],
6189 }
6190 `)
6191
6192 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006193 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006194 var builder strings.Builder
6195 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6196 androidMk := builder.String()
6197 // `myotherlib` is added to `myapex` as symlink
6198 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6199 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6200 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6201 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006202 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 +08006203}
6204
Jooyung Han643adc42020-02-27 13:50:06 +09006205func TestApexWithJniLibs(t *testing.T) {
6206 ctx, _ := testApex(t, `
6207 apex {
6208 name: "myapex",
6209 key: "myapex.key",
6210 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006211 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006212 }
6213
6214 apex_key {
6215 name: "myapex.key",
6216 public_key: "testkey.avbpubkey",
6217 private_key: "testkey.pem",
6218 }
6219
6220 cc_library {
6221 name: "mylib",
6222 srcs: ["mylib.cpp"],
6223 shared_libs: ["mylib2"],
6224 system_shared_libs: [],
6225 stl: "none",
6226 apex_available: [ "myapex" ],
6227 }
6228
6229 cc_library {
6230 name: "mylib2",
6231 srcs: ["mylib.cpp"],
6232 system_shared_libs: [],
6233 stl: "none",
6234 apex_available: [ "myapex" ],
6235 }
6236 `)
6237
6238 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6239 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6240 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6241 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6242 "lib64/mylib.so",
6243 "lib64/mylib2.so",
6244 })
6245}
6246
Jooyung Han49f67012020-04-17 13:43:10 +09006247func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
6248 ctx, _ := testApex(t, `
6249 apex {
6250 name: "myapex",
6251 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006252 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006253 }
6254 apex_key {
6255 name: "myapex.key",
6256 public_key: "testkey.avbpubkey",
6257 private_key: "testkey.pem",
6258 }
6259 `, func(fs map[string][]byte, config android.Config) {
6260 delete(config.Targets, android.Android)
6261 config.AndroidCommonTarget = android.Target{}
6262 })
6263
6264 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6265 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6266 }
6267}
6268
Jiyong Parkbd159612020-02-28 15:22:21 +09006269func TestAppBundle(t *testing.T) {
6270 ctx, _ := testApex(t, `
6271 apex {
6272 name: "myapex",
6273 key: "myapex.key",
6274 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006275 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006276 }
6277
6278 apex_key {
6279 name: "myapex.key",
6280 public_key: "testkey.avbpubkey",
6281 private_key: "testkey.pem",
6282 }
6283
6284 android_app {
6285 name: "AppFoo",
6286 srcs: ["foo/bar/MyClass.java"],
6287 sdk_version: "none",
6288 system_modules: "none",
6289 apex_available: [ "myapex" ],
6290 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006291 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006292
Colin Crosscf371cc2020-11-13 11:48:42 -08006293 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006294 content := bundleConfigRule.Args["content"]
6295
6296 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006297 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 +09006298}
6299
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006300func TestAppSetBundle(t *testing.T) {
6301 ctx, _ := testApex(t, `
6302 apex {
6303 name: "myapex",
6304 key: "myapex.key",
6305 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006306 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006307 }
6308
6309 apex_key {
6310 name: "myapex.key",
6311 public_key: "testkey.avbpubkey",
6312 private_key: "testkey.pem",
6313 }
6314
6315 android_app_set {
6316 name: "AppSet",
6317 set: "AppSet.apks",
6318 }`)
6319 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006320 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006321 content := bundleConfigRule.Args["content"]
6322 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6323 s := mod.Rule("apexRule").Args["copy_commands"]
6324 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6325 if len(copyCmds) != 3 {
6326 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6327 }
6328 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6329 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6330 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6331}
6332
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006333func TestAppSetBundlePrebuilt(t *testing.T) {
6334 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
6335 bp := `
6336 apex_set {
6337 name: "myapex",
6338 filename: "foo_v2.apex",
6339 sanitized: {
6340 none: { set: "myapex.apks", },
6341 hwaddress: { set: "myapex.hwasan.apks", },
6342 },
6343 }`
6344 fs["Android.bp"] = []byte(bp)
6345
6346 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6347 })
6348
6349 m := ctx.ModuleForTests("myapex", "android_common")
6350 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6351
6352 actual := extractedApex.Inputs
6353 if len(actual) != 1 {
6354 t.Errorf("expected a single input")
6355 }
6356
6357 expected := "myapex.hwasan.apks"
6358 if actual[0].String() != expected {
6359 t.Errorf("expected %s, got %s", expected, actual[0].String())
6360 }
6361}
6362
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006363func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006364 t.Helper()
6365
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006366 bp := `
6367 java_library {
6368 name: "some-updatable-apex-lib",
6369 srcs: ["a.java"],
6370 sdk_version: "current",
6371 apex_available: [
6372 "some-updatable-apex",
6373 ],
6374 }
6375
6376 java_library {
6377 name: "some-non-updatable-apex-lib",
6378 srcs: ["a.java"],
6379 apex_available: [
6380 "some-non-updatable-apex",
6381 ],
6382 }
6383
6384 java_library {
6385 name: "some-platform-lib",
6386 srcs: ["a.java"],
6387 sdk_version: "current",
6388 installable: true,
6389 }
6390
6391 java_library {
6392 name: "some-art-lib",
6393 srcs: ["a.java"],
6394 sdk_version: "current",
6395 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006396 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006397 ],
6398 hostdex: true,
6399 }
6400
6401 apex {
6402 name: "some-updatable-apex",
6403 key: "some-updatable-apex.key",
6404 java_libs: ["some-updatable-apex-lib"],
6405 updatable: true,
6406 min_sdk_version: "current",
6407 }
6408
6409 apex {
6410 name: "some-non-updatable-apex",
6411 key: "some-non-updatable-apex.key",
6412 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006413 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006414 }
6415
6416 apex_key {
6417 name: "some-updatable-apex.key",
6418 }
6419
6420 apex_key {
6421 name: "some-non-updatable-apex.key",
6422 }
6423
6424 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006425 name: "com.android.art.debug",
6426 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006427 java_libs: ["some-art-lib"],
6428 updatable: true,
6429 min_sdk_version: "current",
6430 }
6431
6432 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006433 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006434 }
6435
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006436 filegroup {
6437 name: "some-updatable-apex-file_contexts",
6438 srcs: [
6439 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6440 ],
6441 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006442
6443 filegroup {
6444 name: "some-non-updatable-apex-file_contexts",
6445 srcs: [
6446 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6447 ],
6448 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006449 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006450
6451 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6452}
6453
Paul Duffin064b70c2020-11-02 17:32:38 +00006454func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006455 t.Helper()
6456
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006457 bp += cc.GatherRequiredDepsForTest(android.Android)
6458 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006459
6460 fs := map[string][]byte{
6461 "a.java": nil,
6462 "a.jar": nil,
6463 "build/make/target/product/security": nil,
6464 "apex_manifest.json": nil,
6465 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006466 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006467 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6468 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6469 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006470 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006471 }
6472 cc.GatherRequiredFilesForTest(fs)
6473
Paul Duffin39853512021-02-26 11:09:39 +00006474 for k, v := range filesForSdkLibrary {
6475 fs[k] = v
6476 }
Colin Crossae8600b2020-10-29 17:09:13 -07006477 config := android.TestArchConfig(buildDir, nil, bp, fs)
6478
6479 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006480 ctx.RegisterModuleType("apex", BundleFactory)
6481 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006482 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006483 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006484 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006485 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006486 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006487 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006488 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006489 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006490 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6491 ctx.PreDepsMutators(RegisterPreDepsMutators)
6492 ctx.PostDepsMutators(RegisterPostDepsMutators)
6493
Colin Crossae8600b2020-10-29 17:09:13 -07006494 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006495
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006496 pathCtx := android.PathContextForTesting(config)
6497 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6498 transformDexpreoptConfig(dexpreoptConfig)
6499 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6500
Paul Duffinf38931c2021-02-05 16:58:28 +00006501 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006502 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006503 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6504 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6505
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006506 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6507 android.FailIfErrored(t, errs)
6508
6509 _, errs = ctx.PrepareBuildActions(config)
6510 if errmsg == "" {
6511 android.FailIfErrored(t, errs)
6512 } else if len(errs) > 0 {
6513 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006514 } else {
6515 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6516 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006517
6518 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006519}
6520
Jooyung Han548640b2020-04-27 12:10:30 +09006521func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6522 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6523 apex {
6524 name: "myapex",
6525 key: "myapex.key",
6526 updatable: true,
6527 }
6528
6529 apex_key {
6530 name: "myapex.key",
6531 public_key: "testkey.avbpubkey",
6532 private_key: "testkey.pem",
6533 }
6534 `)
6535}
6536
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006537func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6538 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6539 apex {
6540 name: "myapex",
6541 key: "myapex.key",
6542 }
6543
6544 apex_key {
6545 name: "myapex.key",
6546 public_key: "testkey.avbpubkey",
6547 private_key: "testkey.pem",
6548 }
6549 `)
6550}
6551
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006552func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006553 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006554 var transform func(*dexpreopt.GlobalConfig)
6555
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006556 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6557 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006558 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006559 }
6560 testNoUpdatableJarsInBootImage(t, "", transform)
6561 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006562
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006563 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006564 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 +01006565 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006566 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006567 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006568 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006569 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006570
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006571 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 -07006572 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 +01006573 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006574 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006575 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006576 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006577 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006578
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006579 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 -07006580 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006581 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006582 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006583 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006584 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006585 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006586
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006587 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 -07006588 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 +01006589 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006590 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006591 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006592 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006593 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006594
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006595 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6596 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006597 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006598 }
6599 testNoUpdatableJarsInBootImage(t, "", transform)
6600 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006601
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006602 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006603 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006604 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006605 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006606 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006607 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006608 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006609
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006610 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006611 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006612 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006613 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006614 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006615 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006616 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006617
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006618 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006619 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006620 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006621 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006622 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006623 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006624 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006625
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006626 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6627 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006628 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006629 }
6630 testNoUpdatableJarsInBootImage(t, "", transform)
6631 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006632
6633}
6634
6635func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6636 transform := func(config *dexpreopt.GlobalConfig) {
6637 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6638 }
6639 t.Run("prebuilt no source", func(t *testing.T) {
6640 testDexpreoptWithApexes(t, `
6641 prebuilt_apex {
6642 name: "myapex" ,
6643 arch: {
6644 arm64: {
6645 src: "myapex-arm64.apex",
6646 },
6647 arm: {
6648 src: "myapex-arm.apex",
6649 },
6650 },
6651 exported_java_libs: ["libfoo"],
6652 }
6653
6654 java_import {
6655 name: "libfoo",
6656 jars: ["libfoo.jar"],
6657 }
6658`, "", transform)
6659 })
6660
6661 t.Run("prebuilt no source", func(t *testing.T) {
6662 testDexpreoptWithApexes(t, `
6663 prebuilt_apex {
6664 name: "myapex" ,
6665 arch: {
6666 arm64: {
6667 src: "myapex-arm64.apex",
6668 },
6669 arm: {
6670 src: "myapex-arm.apex",
6671 },
6672 },
6673 exported_java_libs: ["libfoo"],
6674 }
6675
6676 java_import {
6677 name: "libfoo",
6678 jars: ["libfoo.jar"],
6679 }
6680`, "", transform)
6681 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006682}
6683
Andrei Onea115e7e72020-06-05 21:14:03 +01006684func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6685 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006686 bp += `
6687 apex_key {
6688 name: "myapex.key",
6689 public_key: "testkey.avbpubkey",
6690 private_key: "testkey.pem",
6691 }`
6692 fs := map[string][]byte{
6693 "lib1/src/A.java": nil,
6694 "lib2/src/B.java": nil,
6695 "system/sepolicy/apex/myapex-file_contexts": nil,
6696 }
6697
Colin Crossae8600b2020-10-29 17:09:13 -07006698 config := android.TestArchConfig(buildDir, nil, bp, fs)
6699 android.SetTestNeverallowRules(config, rules)
6700 updatableBootJars := make([]string, 0, len(apexBootJars))
6701 for _, apexBootJar := range apexBootJars {
6702 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6703 }
6704 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6705
6706 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006707 ctx.RegisterModuleType("apex", BundleFactory)
6708 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6709 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6710 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006711 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006712 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6713 ctx.PreDepsMutators(RegisterPreDepsMutators)
6714 ctx.PostDepsMutators(RegisterPostDepsMutators)
6715 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6716
Colin Crossae8600b2020-10-29 17:09:13 -07006717 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006718
6719 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6720 android.FailIfErrored(t, errs)
6721
6722 _, errs = ctx.PrepareBuildActions(config)
6723 if errmsg == "" {
6724 android.FailIfErrored(t, errs)
6725 } else if len(errs) > 0 {
6726 android.FailIfNoMatchingErrors(t, errmsg, errs)
6727 return
6728 } else {
6729 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6730 }
6731}
6732
6733func TestApexPermittedPackagesRules(t *testing.T) {
6734 testcases := []struct {
6735 name string
6736 expectedError string
6737 bp string
6738 bootJars []string
6739 modulesPackages map[string][]string
6740 }{
6741
6742 {
6743 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6744 expectedError: "",
6745 bp: `
6746 java_library {
6747 name: "bcp_lib1",
6748 srcs: ["lib1/src/*.java"],
6749 permitted_packages: ["foo.bar"],
6750 apex_available: ["myapex"],
6751 sdk_version: "none",
6752 system_modules: "none",
6753 }
6754 java_library {
6755 name: "nonbcp_lib2",
6756 srcs: ["lib2/src/*.java"],
6757 apex_available: ["myapex"],
6758 permitted_packages: ["a.b"],
6759 sdk_version: "none",
6760 system_modules: "none",
6761 }
6762 apex {
6763 name: "myapex",
6764 key: "myapex.key",
6765 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006766 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006767 }`,
6768 bootJars: []string{"bcp_lib1"},
6769 modulesPackages: map[string][]string{
6770 "myapex": []string{
6771 "foo.bar",
6772 },
6773 },
6774 },
6775 {
6776 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6777 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.`,
6778 bp: `
6779 java_library {
6780 name: "bcp_lib1",
6781 srcs: ["lib1/src/*.java"],
6782 apex_available: ["myapex"],
6783 permitted_packages: ["foo.bar"],
6784 sdk_version: "none",
6785 system_modules: "none",
6786 }
6787 java_library {
6788 name: "bcp_lib2",
6789 srcs: ["lib2/src/*.java"],
6790 apex_available: ["myapex"],
6791 permitted_packages: ["foo.bar", "bar.baz"],
6792 sdk_version: "none",
6793 system_modules: "none",
6794 }
6795 apex {
6796 name: "myapex",
6797 key: "myapex.key",
6798 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006799 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006800 }
6801 `,
6802 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6803 modulesPackages: map[string][]string{
6804 "myapex": []string{
6805 "foo.bar",
6806 },
6807 },
6808 },
6809 }
6810 for _, tc := range testcases {
6811 t.Run(tc.name, func(t *testing.T) {
6812 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6813 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6814 })
6815 }
6816}
6817
Jiyong Park62304bb2020-04-13 16:19:48 +09006818func TestTestFor(t *testing.T) {
6819 ctx, _ := testApex(t, `
6820 apex {
6821 name: "myapex",
6822 key: "myapex.key",
6823 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006824 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006825 }
6826
6827 apex_key {
6828 name: "myapex.key",
6829 public_key: "testkey.avbpubkey",
6830 private_key: "testkey.pem",
6831 }
6832
6833 cc_library {
6834 name: "mylib",
6835 srcs: ["mylib.cpp"],
6836 system_shared_libs: [],
6837 stl: "none",
6838 stubs: {
6839 versions: ["1"],
6840 },
6841 apex_available: ["myapex"],
6842 }
6843
6844 cc_library {
6845 name: "myprivlib",
6846 srcs: ["mylib.cpp"],
6847 system_shared_libs: [],
6848 stl: "none",
6849 apex_available: ["myapex"],
6850 }
6851
6852
6853 cc_test {
6854 name: "mytest",
6855 gtest: false,
6856 srcs: ["mylib.cpp"],
6857 system_shared_libs: [],
6858 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006859 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006860 test_for: ["myapex"]
6861 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006862
6863 cc_library {
6864 name: "mytestlib",
6865 srcs: ["mylib.cpp"],
6866 system_shared_libs: [],
6867 shared_libs: ["mylib", "myprivlib"],
6868 stl: "none",
6869 test_for: ["myapex"],
6870 }
6871
6872 cc_benchmark {
6873 name: "mybench",
6874 srcs: ["mylib.cpp"],
6875 system_shared_libs: [],
6876 shared_libs: ["mylib", "myprivlib"],
6877 stl: "none",
6878 test_for: ["myapex"],
6879 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006880 `)
6881
6882 // the test 'mytest' is a test for the apex, therefore is linked to the
6883 // actual implementation of mylib instead of its stub.
6884 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6885 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6886 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006887
6888 // The same should be true for cc_library
6889 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6890 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6891 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6892
6893 // ... and for cc_benchmark
6894 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6895 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6896 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006897}
6898
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006899// TODO(jungjw): Move this to proptools
6900func intPtr(i int) *int {
6901 return &i
6902}
6903
6904func TestApexSet(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07006905 ctx, _ := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006906 apex_set {
6907 name: "myapex",
6908 set: "myapex.apks",
6909 filename: "foo_v2.apex",
6910 overrides: ["foo"],
6911 }
6912 `, func(fs map[string][]byte, config android.Config) {
6913 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006914 config.Targets[android.Android] = []android.Target{
6915 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6916 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6917 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006918 })
6919
6920 m := ctx.ModuleForTests("myapex", "android_common")
6921
6922 // Check extract_apks tool parameters.
6923 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6924 actual := extractedApex.Args["abis"]
6925 expected := "ARMEABI_V7A,ARM64_V8A"
6926 if actual != expected {
6927 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6928 }
6929 actual = extractedApex.Args["sdk-version"]
6930 expected = "30"
6931 if actual != expected {
6932 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6933 }
6934
6935 a := m.Module().(*ApexSet)
6936 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006937 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006938 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6939 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6940 }
6941}
6942
Jiyong Park7d95a512020-05-10 15:16:24 +09006943func TestNoStaticLinkingToStubsLib(t *testing.T) {
6944 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6945 apex {
6946 name: "myapex",
6947 key: "myapex.key",
6948 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006949 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09006950 }
6951
6952 apex_key {
6953 name: "myapex.key",
6954 public_key: "testkey.avbpubkey",
6955 private_key: "testkey.pem",
6956 }
6957
6958 cc_library {
6959 name: "mylib",
6960 srcs: ["mylib.cpp"],
6961 static_libs: ["otherlib"],
6962 system_shared_libs: [],
6963 stl: "none",
6964 apex_available: [ "myapex" ],
6965 }
6966
6967 cc_library {
6968 name: "otherlib",
6969 srcs: ["mylib.cpp"],
6970 system_shared_libs: [],
6971 stl: "none",
6972 stubs: {
6973 versions: ["1", "2", "3"],
6974 },
6975 apex_available: [ "myapex" ],
6976 }
6977 `)
6978}
6979
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006980func TestApexKeysTxt(t *testing.T) {
6981 ctx, _ := testApex(t, `
6982 apex {
6983 name: "myapex",
6984 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006985 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006986 }
6987
6988 apex_key {
6989 name: "myapex.key",
6990 public_key: "testkey.avbpubkey",
6991 private_key: "testkey.pem",
6992 }
6993
6994 prebuilt_apex {
6995 name: "myapex",
6996 prefer: true,
6997 arch: {
6998 arm64: {
6999 src: "myapex-arm64.apex",
7000 },
7001 arm: {
7002 src: "myapex-arm.apex",
7003 },
7004 },
7005 }
7006
7007 apex_set {
7008 name: "myapex_set",
7009 set: "myapex.apks",
7010 filename: "myapex_set.apex",
7011 overrides: ["myapex"],
7012 }
7013 `)
7014
7015 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7016 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7017 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 +09007018 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 +09007019}
7020
Jooyung Han938b5932020-06-20 12:47:47 +09007021func TestAllowedFiles(t *testing.T) {
7022 ctx, _ := testApex(t, `
7023 apex {
7024 name: "myapex",
7025 key: "myapex.key",
7026 apps: ["app"],
7027 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007028 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007029 }
7030
7031 apex_key {
7032 name: "myapex.key",
7033 public_key: "testkey.avbpubkey",
7034 private_key: "testkey.pem",
7035 }
7036
7037 android_app {
7038 name: "app",
7039 srcs: ["foo/bar/MyClass.java"],
7040 package_name: "foo",
7041 sdk_version: "none",
7042 system_modules: "none",
7043 apex_available: [ "myapex" ],
7044 }
7045 `, withFiles(map[string][]byte{
7046 "sub/Android.bp": []byte(`
7047 override_apex {
7048 name: "override_myapex",
7049 base: "myapex",
7050 apps: ["override_app"],
7051 allowed_files: ":allowed",
7052 }
7053 // Overridable "path" property should be referenced indirectly
7054 filegroup {
7055 name: "allowed",
7056 srcs: ["allowed.txt"],
7057 }
7058 override_android_app {
7059 name: "override_app",
7060 base: "app",
7061 package_name: "bar",
7062 }
7063 `),
7064 }))
7065
7066 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7067 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7068 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7069 }
7070
7071 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7072 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7073 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7074 }
7075}
7076
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007077func TestNonPreferredPrebuiltDependency(t *testing.T) {
7078 _, _ = testApex(t, `
7079 apex {
7080 name: "myapex",
7081 key: "myapex.key",
7082 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007083 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007084 }
7085
7086 apex_key {
7087 name: "myapex.key",
7088 public_key: "testkey.avbpubkey",
7089 private_key: "testkey.pem",
7090 }
7091
7092 cc_library {
7093 name: "mylib",
7094 srcs: ["mylib.cpp"],
7095 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007096 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007097 },
7098 apex_available: ["myapex"],
7099 }
7100
7101 cc_prebuilt_library_shared {
7102 name: "mylib",
7103 prefer: false,
7104 srcs: ["prebuilt.so"],
7105 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007106 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007107 },
7108 apex_available: ["myapex"],
7109 }
7110 `)
7111}
7112
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007113func TestCompressedApex(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07007114 ctx, _ := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007115 apex {
7116 name: "myapex",
7117 key: "myapex.key",
7118 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007119 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007120 }
7121 apex_key {
7122 name: "myapex.key",
7123 public_key: "testkey.avbpubkey",
7124 private_key: "testkey.pem",
7125 }
7126 `, func(fs map[string][]byte, config android.Config) {
7127 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7128 })
7129
7130 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7131 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7132
7133 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7134 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7135
7136 // Make sure output of bundle is .capex
7137 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7138 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7139
7140 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007141 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007142 var builder strings.Builder
7143 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7144 androidMk := builder.String()
7145 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7146}
7147
Martin Stjernholm2856c662020-12-02 15:03:42 +00007148func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07007149 ctx, _ := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
7153 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007155 }
7156
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
7162
7163 cc_library {
7164 name: "mylib",
7165 srcs: ["mylib.cpp"],
7166 apex_available: ["myapex"],
7167 shared_libs: ["otherlib"],
7168 system_shared_libs: [],
7169 }
7170
7171 cc_library {
7172 name: "otherlib",
7173 srcs: ["mylib.cpp"],
7174 stubs: {
7175 versions: ["current"],
7176 },
7177 }
7178
7179 cc_prebuilt_library_shared {
7180 name: "otherlib",
7181 prefer: true,
7182 srcs: ["prebuilt.so"],
7183 stubs: {
7184 versions: ["current"],
7185 },
7186 }
7187 `)
7188
7189 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007190 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007191 var builder strings.Builder
7192 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7193 androidMk := builder.String()
7194
7195 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7196 // a thing there.
7197 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7198}
7199
Jiyong Parke3867542020-12-03 17:28:25 +09007200func TestExcludeDependency(t *testing.T) {
7201 ctx, _ := testApex(t, `
7202 apex {
7203 name: "myapex",
7204 key: "myapex.key",
7205 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007206 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007207 }
7208
7209 apex_key {
7210 name: "myapex.key",
7211 public_key: "testkey.avbpubkey",
7212 private_key: "testkey.pem",
7213 }
7214
7215 cc_library {
7216 name: "mylib",
7217 srcs: ["mylib.cpp"],
7218 system_shared_libs: [],
7219 stl: "none",
7220 apex_available: ["myapex"],
7221 shared_libs: ["mylib2"],
7222 target: {
7223 apex: {
7224 exclude_shared_libs: ["mylib2"],
7225 },
7226 },
7227 }
7228
7229 cc_library {
7230 name: "mylib2",
7231 srcs: ["mylib.cpp"],
7232 system_shared_libs: [],
7233 stl: "none",
7234 }
7235 `)
7236
7237 // Check if mylib is linked to mylib2 for the non-apex target
7238 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7239 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7240
7241 // Make sure that the link doesn't occur for the apex target
7242 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7243 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7244
7245 // It shouldn't appear in the copy cmd as well.
7246 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7247 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7248}
7249
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007250func TestPrebuiltStubLibDep(t *testing.T) {
7251 bpBase := `
7252 apex {
7253 name: "myapex",
7254 key: "myapex.key",
7255 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007256 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007257 }
7258 apex_key {
7259 name: "myapex.key",
7260 public_key: "testkey.avbpubkey",
7261 private_key: "testkey.pem",
7262 }
7263 cc_library {
7264 name: "mylib",
7265 srcs: ["mylib.cpp"],
7266 apex_available: ["myapex"],
7267 shared_libs: ["stublib"],
7268 system_shared_libs: [],
7269 }
7270 apex {
7271 name: "otherapex",
7272 enabled: %s,
7273 key: "myapex.key",
7274 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007275 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007276 }
7277 `
7278
7279 stublibSourceBp := `
7280 cc_library {
7281 name: "stublib",
7282 srcs: ["mylib.cpp"],
7283 apex_available: ["otherapex"],
7284 system_shared_libs: [],
7285 stl: "none",
7286 stubs: {
7287 versions: ["1"],
7288 },
7289 }
7290 `
7291
7292 stublibPrebuiltBp := `
7293 cc_prebuilt_library_shared {
7294 name: "stublib",
7295 srcs: ["prebuilt.so"],
7296 apex_available: ["otherapex"],
7297 stubs: {
7298 versions: ["1"],
7299 },
7300 %s
7301 }
7302 `
7303
7304 tests := []struct {
7305 name string
7306 stublibBp string
7307 usePrebuilt bool
7308 modNames []string // Modules to collect AndroidMkEntries for
7309 otherApexEnabled []string
7310 }{
7311 {
7312 name: "only_source",
7313 stublibBp: stublibSourceBp,
7314 usePrebuilt: false,
7315 modNames: []string{"stublib"},
7316 otherApexEnabled: []string{"true", "false"},
7317 },
7318 {
7319 name: "source_preferred",
7320 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7321 usePrebuilt: false,
7322 modNames: []string{"stublib", "prebuilt_stublib"},
7323 otherApexEnabled: []string{"true", "false"},
7324 },
7325 {
7326 name: "prebuilt_preferred",
7327 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7328 usePrebuilt: true,
7329 modNames: []string{"stublib", "prebuilt_stublib"},
7330 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7331 },
7332 {
7333 name: "only_prebuilt",
7334 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7335 usePrebuilt: true,
7336 modNames: []string{"stublib"},
7337 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7338 },
7339 }
7340
7341 for _, test := range tests {
7342 t.Run(test.name, func(t *testing.T) {
7343 for _, otherApexEnabled := range test.otherApexEnabled {
7344 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossaa255532020-07-03 13:18:24 -07007345 ctx, _ := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007346
7347 type modAndMkEntries struct {
7348 mod *cc.Module
7349 mkEntries android.AndroidMkEntries
7350 }
7351 entries := []*modAndMkEntries{}
7352
7353 // Gather shared lib modules that are installable
7354 for _, modName := range test.modNames {
7355 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7356 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7357 continue
7358 }
7359 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007360 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007361 continue
7362 }
Colin Crossaa255532020-07-03 13:18:24 -07007363 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007364 if ent.Disabled {
7365 continue
7366 }
7367 entries = append(entries, &modAndMkEntries{
7368 mod: mod,
7369 mkEntries: ent,
7370 })
7371 }
7372 }
7373 }
7374
7375 var entry *modAndMkEntries = nil
7376 for _, ent := range entries {
7377 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7378 if entry != nil {
7379 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7380 } else {
7381 entry = ent
7382 }
7383 }
7384 }
7385
7386 if entry == nil {
7387 t.Errorf("AndroidMk entry for \"stublib\" missing")
7388 } else {
7389 isPrebuilt := entry.mod.Prebuilt() != nil
7390 if isPrebuilt != test.usePrebuilt {
7391 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7392 }
7393 if !entry.mod.IsStubs() {
7394 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7395 }
7396 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7397 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7398 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007399 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7400 expected := "-D__STUBLIB_API__=1"
7401 if !android.InList(expected, cflags) {
7402 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7403 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007404 }
7405 })
7406 }
7407 })
7408 }
7409}
7410
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007411func TestMain(m *testing.M) {
7412 run := func() int {
7413 setUp()
7414 defer tearDown()
7415
7416 return m.Run()
7417 }
7418
7419 os.Exit(run())
7420}