blob: 506c6fe3b70b117a70aa7ac55f4a60371f6d4773 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "io/ioutil"
20 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090021 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
28 "github.com/google/blueprint/proptools"
29
30 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080031 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090032 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000033 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090035 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090036 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090038)
39
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070040var buildDir string
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Jooyung Han344d5432019-08-23 11:17:39 +090052func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
53 t.Helper()
54 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090055 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
56 if len(errs) > 0 {
57 android.FailIfNoMatchingErrors(t, pattern, errs)
58 return
59 }
60 _, errs = ctx.PrepareBuildActions(config)
61 if len(errs) > 0 {
62 android.FailIfNoMatchingErrors(t, pattern, errs)
63 return
64 }
65
66 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
67}
68
Jooyung Han344d5432019-08-23 11:17:39 +090069func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
70 t.Helper()
71 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010072 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090073 android.FailIfErrored(t, errs)
74 _, errs = ctx.PrepareBuildActions(config)
75 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070076 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Jooyung Han344d5432019-08-23 11:17:39 +090079type testCustomizer func(fs map[string][]byte, config android.Config)
80
81func withFiles(files map[string][]byte) testCustomizer {
82 return func(fs map[string][]byte, config android.Config) {
83 for k, v := range files {
84 fs[k] = v
85 }
86 }
87}
88
89func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
90 return func(fs map[string][]byte, config android.Config) {
91 for k, v := range targets {
92 config.Targets[k] = v
93 }
94 }
95}
96
Jooyung Han35155c42020-02-06 17:33:20 +090097// withNativeBridgeTargets sets configuration with targets including:
98// - X86_64 (primary)
99// - X86 (secondary)
100// - Arm64 on X86_64 (native bridge)
101// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700102func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900103 config.Targets[android.Android] = []android.Target{
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
107 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
110 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
111 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
112 }
113}
114
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900115func withManifestPackageNameOverrides(specs []string) testCustomizer {
116 return func(fs map[string][]byte, config android.Config) {
117 config.TestProductVariables.ManifestPackageNameOverrides = specs
118 }
119}
120
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700121func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900122 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
123}
124
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700125func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900126 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
127}
128
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700129func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900130 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900131 filegroup {
132 name: "myapex-file_contexts",
133 srcs: [
134 "system/sepolicy/apex/myapex-file_contexts",
135 ],
136 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900137 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800138
Colin Crossf9aabd72020-02-15 11:29:50 -0800139 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
140
Jiyong Park99644e92020-11-17 22:21:02 +0900141 bp = bp + rust.GatherRequiredDepsForTest()
142
Dario Frenicde2a032019-10-27 00:29:22 +0100143 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900144
Jooyung Han344d5432019-08-23 11:17:39 +0900145 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900146 "a.java": nil,
147 "PrebuiltAppFoo.apk": nil,
148 "PrebuiltAppFooPriv.apk": nil,
149 "build/make/target/product/security": nil,
150 "apex_manifest.json": nil,
151 "AndroidManifest.xml": nil,
152 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900153 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900154 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900155 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900156 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800158 "mytest.cpp": nil,
159 "mytest1.cpp": nil,
160 "mytest2.cpp": nil,
161 "mytest3.cpp": nil,
162 "myprebuilt": nil,
163 "my_include": nil,
164 "foo/bar/MyClass.java": nil,
165 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100166 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800167 "vendor/foo/devkeys/test.x509.pem": nil,
168 "vendor/foo/devkeys/test.pk8": nil,
169 "testkey.x509.pem": nil,
170 "testkey.pk8": nil,
171 "testkey.override.x509.pem": nil,
172 "testkey.override.pk8": nil,
173 "vendor/foo/devkeys/testkey.avbpubkey": nil,
174 "vendor/foo/devkeys/testkey.pem": nil,
175 "NOTICE": nil,
176 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900177 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800178 "testkey2.avbpubkey": nil,
179 "testkey2.pem": nil,
180 "myapex-arm64.apex": nil,
181 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700182 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800183 "frameworks/base/api/current.txt": nil,
184 "framework/aidl/a.aidl": nil,
185 "build/make/core/proguard.flags": nil,
186 "build/make/core/proguard_basic_keeps.flags": nil,
187 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700188 "baz": nil,
189 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700190 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700191 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900192 "foo.rs": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900193 }
194
Colin Crossf9aabd72020-02-15 11:29:50 -0800195 cc.GatherRequiredFilesForTest(fs)
196
Jooyung Han344d5432019-08-23 11:17:39 +0900197 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800198 // The fs now needs to be populated before creating the config, call handlers twice
199 // for now, once to get any fs changes, and later after the config was created to
200 // set product variables or targets.
201 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
202 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900203 }
204
Colin Cross98be1bb2019-12-13 20:41:13 -0800205 config := android.TestArchConfig(buildDir, nil, bp, fs)
206 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
207 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
208 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
209 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
210 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700211 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800212 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
213
214 for _, handler := range handlers {
215 // The fs now needs to be populated before creating the config, call handlers twice
216 // for now, earlier to get any fs changes, and now after the config was created to
217 // set product variables or targets.
218 tempFS := map[string][]byte{}
219 handler(tempFS, config)
220 }
221
Colin Crossae8600b2020-10-29 17:09:13 -0700222 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100223
224 // from android package
225 android.RegisterPackageBuildComponents(ctx)
226 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
227
Colin Cross98be1bb2019-12-13 20:41:13 -0800228 ctx.RegisterModuleType("apex", BundleFactory)
229 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
230 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
231 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
232 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
233 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
234 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700235 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800236
Jooyung Hana57af4a2020-01-23 05:36:59 +0000237 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100238 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000239 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
240
Paul Duffin021f4e52020-07-30 16:04:17 +0100241 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100242
Paul Duffin021f4e52020-07-30 16:04:17 +0100243 // Register these after the prebuilt mutators have been registered to match what
244 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100245 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
246 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
247
Paul Duffin021f4e52020-07-30 16:04:17 +0100248 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900249 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100250
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800252 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
253 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900254 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000255 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700256 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800257 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000258 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000259 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000260 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100261 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900262 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800263 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800264
Colin Cross98be1bb2019-12-13 20:41:13 -0800265 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800266 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800267
Colin Crossae8600b2020-10-29 17:09:13 -0700268 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269
Jooyung Han5c998b92019-06-27 11:30:33 +0900270 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271}
272
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700273func setUp() {
274 var err error
275 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279}
280
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700281func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700282 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283}
284
Jooyung Han643adc42020-02-27 13:50:06 +0900285// ensure that 'result' equals 'expected'
286func ensureEquals(t *testing.T, result string, expected string) {
287 t.Helper()
288 if result != expected {
289 t.Errorf("%q != %q", expected, result)
290 }
291}
292
Jiyong Park25fc6a92018-11-18 18:02:45 +0900293// ensure that 'result' contains 'expected'
294func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900295 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900296 if !strings.Contains(result, expected) {
297 t.Errorf("%q is not found in %q", expected, result)
298 }
299}
300
Liz Kammer5bd365f2020-05-27 15:15:11 -0700301// ensure that 'result' contains 'expected' exactly one time
302func ensureContainsOnce(t *testing.T, result string, expected string) {
303 t.Helper()
304 count := strings.Count(result, expected)
305 if count != 1 {
306 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310// ensures that 'result' does not contain 'notExpected'
311func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900312 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 if strings.Contains(result, notExpected) {
314 t.Errorf("%q is found in %q", notExpected, result)
315 }
316}
317
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700318func ensureMatches(t *testing.T, result string, expectedRex string) {
319 ok, err := regexp.MatchString(expectedRex, result)
320 if err != nil {
321 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
322 return
323 }
324 if !ok {
325 t.Errorf("%s does not match regular expession %s", result, expectedRex)
326 }
327}
328
Jiyong Park25fc6a92018-11-18 18:02:45 +0900329func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900330 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 if !android.InList(expected, result) {
332 t.Errorf("%q is not found in %v", expected, result)
333 }
334}
335
336func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900337 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 if android.InList(notExpected, result) {
339 t.Errorf("%q is found in %v", notExpected, result)
340 }
341}
342
Jooyung Hane1633032019-08-01 17:41:43 +0900343func ensureListEmpty(t *testing.T, result []string) {
344 t.Helper()
345 if len(result) > 0 {
346 t.Errorf("%q is expected to be empty", result)
347 }
348}
349
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000350func ensureListNotEmpty(t *testing.T, result []string) {
351 t.Helper()
352 if len(result) == 0 {
353 t.Errorf("%q is expected to be not empty", result)
354 }
355}
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357// Minimal test
358func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900359 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900360 apex_defaults {
361 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900362 manifest: ":myapex.manifest",
363 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900365 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900366 native_shared_libs: [
367 "mylib",
368 "libfoo.ffi",
369 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900370 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800371 multilib: {
372 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900373 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800374 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900375 },
Jiyong Park77acec62020-06-01 21:39:15 +0900376 java_libs: [
377 "myjar",
378 "myjar_dex",
379 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900380 }
381
Jiyong Park30ca9372019-02-07 16:27:23 +0900382 apex {
383 name: "myapex",
384 defaults: ["myapex-defaults"],
385 }
386
Jiyong Park25fc6a92018-11-18 18:02:45 +0900387 apex_key {
388 name: "myapex.key",
389 public_key: "testkey.avbpubkey",
390 private_key: "testkey.pem",
391 }
392
Jiyong Park809bb722019-02-13 21:33:49 +0900393 filegroup {
394 name: "myapex.manifest",
395 srcs: ["apex_manifest.json"],
396 }
397
398 filegroup {
399 name: "myapex.androidmanifest",
400 srcs: ["AndroidManifest.xml"],
401 }
402
Jiyong Park25fc6a92018-11-18 18:02:45 +0900403 cc_library {
404 name: "mylib",
405 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900406 shared_libs: [
407 "mylib2",
408 "libbar.ffi",
409 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900410 system_shared_libs: [],
411 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000412 // TODO: remove //apex_available:platform
413 apex_available: [
414 "//apex_available:platform",
415 "myapex",
416 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900417 }
418
Alex Light3d673592019-01-18 14:37:31 -0800419 cc_binary {
420 name: "foo",
421 srcs: ["mylib.cpp"],
422 compile_multilib: "both",
423 multilib: {
424 lib32: {
425 suffix: "32",
426 },
427 lib64: {
428 suffix: "64",
429 },
430 },
431 symlinks: ["foo_link_"],
432 symlink_preferred_arch: true,
433 system_shared_libs: [],
434 static_executable: true,
435 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700436 apex_available: [ "myapex", "com.android.gki.*" ],
437 }
438
Jiyong Park99644e92020-11-17 22:21:02 +0900439 rust_binary {
440 name: "foo.rust",
441 srcs: ["foo.rs"],
442 rlibs: ["libfoo.rlib.rust"],
443 dylibs: ["libfoo.dylib.rust"],
444 apex_available: ["myapex"],
445 }
446
447 rust_library_rlib {
448 name: "libfoo.rlib.rust",
449 srcs: ["foo.rs"],
450 crate_name: "foo",
451 apex_available: ["myapex"],
452 }
453
454 rust_library_dylib {
455 name: "libfoo.dylib.rust",
456 srcs: ["foo.rs"],
457 crate_name: "foo",
458 apex_available: ["myapex"],
459 }
460
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900461 rust_ffi_shared {
462 name: "libfoo.ffi",
463 srcs: ["foo.rs"],
464 crate_name: "foo",
465 apex_available: ["myapex"],
466 }
467
468 rust_ffi_shared {
469 name: "libbar.ffi",
470 srcs: ["foo.rs"],
471 crate_name: "bar",
472 apex_available: ["myapex"],
473 }
474
Yifan Hongd22a84a2020-07-28 17:37:46 -0700475 apex {
476 name: "com.android.gki.fake",
477 binaries: ["foo"],
478 key: "myapex.key",
479 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800480 }
481
Paul Duffindddd5462020-04-07 15:25:44 +0100482 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900483 name: "mylib2",
484 srcs: ["mylib.cpp"],
485 system_shared_libs: [],
486 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900487 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900488 static_libs: ["libstatic"],
489 // TODO: remove //apex_available:platform
490 apex_available: [
491 "//apex_available:platform",
492 "myapex",
493 ],
494 }
495
Paul Duffindddd5462020-04-07 15:25:44 +0100496 cc_prebuilt_library_shared {
497 name: "mylib2",
498 srcs: ["prebuilt.so"],
499 // TODO: remove //apex_available:platform
500 apex_available: [
501 "//apex_available:platform",
502 "myapex",
503 ],
504 }
505
Jiyong Park9918e1a2020-03-17 19:16:40 +0900506 cc_library_static {
507 name: "libstatic",
508 srcs: ["mylib.cpp"],
509 system_shared_libs: [],
510 stl: "none",
511 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000512 // TODO: remove //apex_available:platform
513 apex_available: [
514 "//apex_available:platform",
515 "myapex",
516 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900517 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900518
519 java_library {
520 name: "myjar",
521 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900522 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900523 sdk_version: "none",
524 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900525 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900526 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000527 // TODO: remove //apex_available:platform
528 apex_available: [
529 "//apex_available:platform",
530 "myapex",
531 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900532 }
533
Jiyong Park77acec62020-06-01 21:39:15 +0900534 dex_import {
535 name: "myjar_dex",
536 jars: ["prebuilt.jar"],
537 apex_available: [
538 "//apex_available:platform",
539 "myapex",
540 ],
541 }
542
Jiyong Park7f7766d2019-07-25 22:02:35 +0900543 java_library {
544 name: "myotherjar",
545 srcs: ["foo/bar/MyClass.java"],
546 sdk_version: "none",
547 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900548 // TODO: remove //apex_available:platform
549 apex_available: [
550 "//apex_available:platform",
551 "myapex",
552 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900553 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900554
555 java_library {
556 name: "mysharedjar",
557 srcs: ["foo/bar/MyClass.java"],
558 sdk_version: "none",
559 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900561 `)
562
Sundong Ahnabb64432019-10-22 13:58:29 +0900563 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900564
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900565 // Make sure that Android.mk is created
566 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
567 data := android.AndroidMkDataForTest(t, config, "", ab)
568 var builder strings.Builder
569 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
570
571 androidMk := builder.String()
572 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
573 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
574
Jiyong Park42cca6c2019-04-01 11:15:50 +0900575 optFlags := apexRule.Args["opt_flags"]
576 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700577 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900578 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900579
Jiyong Park25fc6a92018-11-18 18:02:45 +0900580 copyCmds := apexRule.Args["copy_commands"]
581
582 // Ensure that main rule creates an output
583 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
584
585 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700586 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
587 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
588 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900589 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900590 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900591
592 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700593 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
594 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900595 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
596 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900597 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900598
599 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800600 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
601 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900602 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900603 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900604 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900605 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
606 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900607 // .. but not for java libs
608 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900609 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800610
Colin Cross7113d202019-11-20 16:39:12 -0800611 // Ensure that the platform variant ends with _shared or _common
612 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
613 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900614 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
615 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900616 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
617
618 // Ensure that dynamic dependency to java libs are not included
619 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800620
621 // Ensure that all symlinks are present.
622 found_foo_link_64 := false
623 found_foo := false
624 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900625 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800626 if strings.HasSuffix(cmd, "bin/foo") {
627 found_foo = true
628 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
629 found_foo_link_64 = true
630 }
631 }
632 }
633 good := found_foo && found_foo_link_64
634 if !good {
635 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
636 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900637
Sundong Ahnabb64432019-10-22 13:58:29 +0900638 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700639 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900640 if len(noticeInputs) != 3 {
641 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900642 }
643 ensureListContains(t, noticeInputs, "NOTICE")
644 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900645 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900646
Artur Satayeva8bd1132020-04-27 18:07:06 +0100647 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100648 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
649 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
650 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
651 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
652 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100653
654 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100655 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
656 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
657 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
658 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
659 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800660}
661
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662func TestDefaults(t *testing.T) {
663 ctx, _ := testApex(t, `
664 apex_defaults {
665 name: "myapex-defaults",
666 key: "myapex.key",
667 prebuilts: ["myetc"],
668 native_shared_libs: ["mylib"],
669 java_libs: ["myjar"],
670 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900671 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800672 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900673 }
674
675 prebuilt_etc {
676 name: "myetc",
677 src: "myprebuilt",
678 }
679
680 apex {
681 name: "myapex",
682 defaults: ["myapex-defaults"],
683 }
684
685 apex_key {
686 name: "myapex.key",
687 public_key: "testkey.avbpubkey",
688 private_key: "testkey.pem",
689 }
690
691 cc_library {
692 name: "mylib",
693 system_shared_libs: [],
694 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000695 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900696 }
697
698 java_library {
699 name: "myjar",
700 srcs: ["foo/bar/MyClass.java"],
701 sdk_version: "none",
702 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000703 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900704 }
705
706 android_app {
707 name: "AppFoo",
708 srcs: ["foo/bar/MyClass.java"],
709 sdk_version: "none",
710 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000711 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900712 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900713
714 runtime_resource_overlay {
715 name: "rro",
716 theme: "blue",
717 }
718
markchien2f59ec92020-09-02 16:23:38 +0800719 bpf {
720 name: "bpf",
721 srcs: ["bpf.c", "bpf2.c"],
722 }
723
Jooyung Hanf21c7972019-12-16 22:32:06 +0900724 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000725 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900726 "etc/myetc",
727 "javalib/myjar.jar",
728 "lib64/mylib.so",
729 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900730 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800731 "etc/bpf/bpf.o",
732 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900733 })
734}
735
Jooyung Han01a3ee22019-11-02 02:52:25 +0900736func TestApexManifest(t *testing.T) {
737 ctx, _ := testApex(t, `
738 apex {
739 name: "myapex",
740 key: "myapex.key",
741 }
742
743 apex_key {
744 name: "myapex.key",
745 public_key: "testkey.avbpubkey",
746 private_key: "testkey.pem",
747 }
748 `)
749
750 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900751 args := module.Rule("apexRule").Args
752 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
753 t.Error("manifest should be apex_manifest.pb, but " + manifest)
754 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900755}
756
Alex Light5098a612018-11-29 17:12:15 -0800757func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700758 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800759 apex {
760 name: "myapex",
761 key: "myapex.key",
762 payload_type: "zip",
763 native_shared_libs: ["mylib"],
764 }
765
766 apex_key {
767 name: "myapex.key",
768 public_key: "testkey.avbpubkey",
769 private_key: "testkey.pem",
770 }
771
772 cc_library {
773 name: "mylib",
774 srcs: ["mylib.cpp"],
775 shared_libs: ["mylib2"],
776 system_shared_libs: [],
777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000778 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800779 }
780
781 cc_library {
782 name: "mylib2",
783 srcs: ["mylib.cpp"],
784 system_shared_libs: [],
785 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000786 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800787 }
788 `)
789
Sundong Ahnabb64432019-10-22 13:58:29 +0900790 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800791 copyCmds := zipApexRule.Args["copy_commands"]
792
793 // Ensure that main rule creates an output
794 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
795
796 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700797 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800798
799 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700800 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800801
802 // Ensure that both direct and indirect deps are copied into apex
803 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
804 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900805}
806
807func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700808 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809 apex {
810 name: "myapex",
811 key: "myapex.key",
812 native_shared_libs: ["mylib", "mylib3"],
813 }
814
815 apex_key {
816 name: "myapex.key",
817 public_key: "testkey.avbpubkey",
818 private_key: "testkey.pem",
819 }
820
821 cc_library {
822 name: "mylib",
823 srcs: ["mylib.cpp"],
824 shared_libs: ["mylib2", "mylib3"],
825 system_shared_libs: [],
826 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000827 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900828 }
829
830 cc_library {
831 name: "mylib2",
832 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900833 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900834 system_shared_libs: [],
835 stl: "none",
836 stubs: {
837 versions: ["1", "2", "3"],
838 },
839 }
840
841 cc_library {
842 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900843 srcs: ["mylib.cpp"],
844 shared_libs: ["mylib4"],
845 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 stl: "none",
847 stubs: {
848 versions: ["10", "11", "12"],
849 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000850 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900851 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900852
853 cc_library {
854 name: "mylib4",
855 srcs: ["mylib.cpp"],
856 system_shared_libs: [],
857 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000858 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900859 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900860 `)
861
Sundong Ahnabb64432019-10-22 13:58:29 +0900862 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 copyCmds := apexRule.Args["copy_commands"]
864
865 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800866 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867
868 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800869 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870
871 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800872 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873
Colin Crossaede88c2020-08-11 12:17:01 -0700874 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900875
876 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900877 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900879 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880
881 // 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 -0700882 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700884 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900885
886 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900887 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900888 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900889
890 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700891 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900892
Jooyung Hana57af4a2020-01-23 05:36:59 +0000893 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900894 "lib64/mylib.so",
895 "lib64/mylib3.so",
896 "lib64/mylib4.so",
897 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898}
899
Colin Cross7812fd32020-09-25 12:35:10 -0700900func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
901 t.Parallel()
902 ctx, _ := testApex(t, `
903 apex {
904 name: "myapex",
905 key: "myapex.key",
906 native_shared_libs: ["mylib", "mylib3"],
907 min_sdk_version: "29",
908 }
909
910 apex_key {
911 name: "myapex.key",
912 public_key: "testkey.avbpubkey",
913 private_key: "testkey.pem",
914 }
915
916 cc_library {
917 name: "mylib",
918 srcs: ["mylib.cpp"],
919 shared_libs: ["mylib2", "mylib3"],
920 system_shared_libs: [],
921 stl: "none",
922 apex_available: [ "myapex" ],
923 min_sdk_version: "28",
924 }
925
926 cc_library {
927 name: "mylib2",
928 srcs: ["mylib.cpp"],
929 cflags: ["-include mylib.h"],
930 system_shared_libs: [],
931 stl: "none",
932 stubs: {
933 versions: ["28", "29", "30", "current"],
934 },
935 min_sdk_version: "28",
936 }
937
938 cc_library {
939 name: "mylib3",
940 srcs: ["mylib.cpp"],
941 shared_libs: ["mylib4"],
942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
945 versions: ["28", "29", "30", "current"],
946 },
947 apex_available: [ "myapex" ],
948 min_sdk_version: "28",
949 }
950
951 cc_library {
952 name: "mylib4",
953 srcs: ["mylib.cpp"],
954 system_shared_libs: [],
955 stl: "none",
956 apex_available: [ "myapex" ],
957 min_sdk_version: "28",
958 }
959 `)
960
961 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
962 copyCmds := apexRule.Args["copy_commands"]
963
964 // Ensure that direct non-stubs dep is always included
965 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
966
967 // Ensure that indirect stubs dep is not included
968 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
969
970 // Ensure that direct stubs dep is included
971 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
972
973 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
974
975 // Ensure that mylib is linking with the version 29 stubs for mylib2
976 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
977 // ... and not linking to the non-stub (impl) variant of mylib2
978 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
979
980 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
981 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
982 // .. and not linking to the stubs variant of mylib3
983 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
984
985 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700986 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700987 ensureNotContains(t, mylib2Cflags, "-include ")
988
989 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700990 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700991
992 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
993 "lib64/mylib.so",
994 "lib64/mylib3.so",
995 "lib64/mylib4.so",
996 })
997}
998
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900999func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001000 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001001 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001002 name: "myapex2",
1003 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001004 native_shared_libs: ["mylib"],
1005 }
1006
1007 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001008 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001009 public_key: "testkey.avbpubkey",
1010 private_key: "testkey.pem",
1011 }
1012
1013 cc_library {
1014 name: "mylib",
1015 srcs: ["mylib.cpp"],
1016 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001017 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001018 system_shared_libs: [],
1019 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001020 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001021 }
1022
1023 cc_library {
1024 name: "libfoo",
1025 srcs: ["mylib.cpp"],
1026 shared_libs: ["libbar"],
1027 system_shared_libs: [],
1028 stl: "none",
1029 stubs: {
1030 versions: ["10", "20", "30"],
1031 },
1032 }
1033
1034 cc_library {
1035 name: "libbar",
1036 srcs: ["mylib.cpp"],
1037 system_shared_libs: [],
1038 stl: "none",
1039 }
1040
Jiyong Park678c8812020-02-07 17:25:49 +09001041 cc_library_static {
1042 name: "libbaz",
1043 srcs: ["mylib.cpp"],
1044 system_shared_libs: [],
1045 stl: "none",
1046 apex_available: [ "myapex2" ],
1047 }
1048
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001049 `)
1050
Jiyong Park83dc74b2020-01-14 18:38:44 +09001051 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001052 copyCmds := apexRule.Args["copy_commands"]
1053
1054 // Ensure that direct non-stubs dep is always included
1055 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1056
1057 // Ensure that indirect stubs dep is not included
1058 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1059
1060 // Ensure that dependency of stubs is not included
1061 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1062
Colin Crossaede88c2020-08-11 12:17:01 -07001063 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001064
1065 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001066 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001067 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001068 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001069
Jiyong Park3ff16992019-12-27 14:11:47 +09001070 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001071
1072 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1073 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001074
Artur Satayeva8bd1132020-04-27 18:07:06 +01001075 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001076 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1077 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1078 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001079
Artur Satayeva8bd1132020-04-27 18:07:06 +01001080 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001081 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1082 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1083 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001084}
1085
Jooyung Hand3639552019-08-09 12:57:43 +09001086func TestApexWithRuntimeLibsDependency(t *testing.T) {
1087 /*
1088 myapex
1089 |
1090 v (runtime_libs)
1091 mylib ------+------> libfoo [provides stub]
1092 |
1093 `------> libbar
1094 */
1095 ctx, _ := testApex(t, `
1096 apex {
1097 name: "myapex",
1098 key: "myapex.key",
1099 native_shared_libs: ["mylib"],
1100 }
1101
1102 apex_key {
1103 name: "myapex.key",
1104 public_key: "testkey.avbpubkey",
1105 private_key: "testkey.pem",
1106 }
1107
1108 cc_library {
1109 name: "mylib",
1110 srcs: ["mylib.cpp"],
1111 runtime_libs: ["libfoo", "libbar"],
1112 system_shared_libs: [],
1113 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001114 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001115 }
1116
1117 cc_library {
1118 name: "libfoo",
1119 srcs: ["mylib.cpp"],
1120 system_shared_libs: [],
1121 stl: "none",
1122 stubs: {
1123 versions: ["10", "20", "30"],
1124 },
1125 }
1126
1127 cc_library {
1128 name: "libbar",
1129 srcs: ["mylib.cpp"],
1130 system_shared_libs: [],
1131 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001132 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001133 }
1134
1135 `)
1136
Sundong Ahnabb64432019-10-22 13:58:29 +09001137 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001138 copyCmds := apexRule.Args["copy_commands"]
1139
1140 // Ensure that direct non-stubs dep is always included
1141 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1142
1143 // Ensure that indirect stubs dep is not included
1144 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1145
1146 // Ensure that runtime_libs dep in included
1147 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1148
Sundong Ahnabb64432019-10-22 13:58:29 +09001149 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001150 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1151 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001152
1153}
1154
Jooyung Han8ce8db92020-05-15 19:05:05 +09001155func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1156 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1157 bp := `
1158 apex {
1159 name: "com.android.runtime",
1160 key: "com.android.runtime.key",
1161 native_shared_libs: ["libc"],
1162 }
1163
1164 apex_key {
1165 name: "com.android.runtime.key",
1166 public_key: "testkey.avbpubkey",
1167 private_key: "testkey.pem",
1168 }
1169
1170 cc_library {
1171 name: "libc",
1172 no_libcrt: true,
1173 nocrt: true,
1174 stl: "none",
1175 system_shared_libs: [],
1176 stubs: { versions: ["1"] },
1177 apex_available: ["com.android.runtime"],
1178
1179 sanitize: {
1180 hwaddress: true,
1181 }
1182 }
1183
1184 cc_prebuilt_library_shared {
1185 name: "libclang_rt.hwasan-aarch64-android",
1186 no_libcrt: true,
1187 nocrt: true,
1188 stl: "none",
1189 system_shared_libs: [],
1190 srcs: [""],
1191 stubs: { versions: ["1"] },
1192
1193 sanitize: {
1194 never: true,
1195 },
1196 }
1197 `
1198 // override bp to use hard-coded names: com.android.runtime and libc
1199 fs["Android.bp"] = []byte(bp)
1200 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1201 })
1202
1203 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1204 "lib64/bionic/libc.so",
1205 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1206 })
1207
1208 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1209
1210 installed := hwasan.Description("install libclang_rt.hwasan")
1211 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1212
1213 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1214 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1215 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1216}
1217
1218func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1219 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1220 bp := `
1221 apex {
1222 name: "com.android.runtime",
1223 key: "com.android.runtime.key",
1224 native_shared_libs: ["libc"],
1225 }
1226
1227 apex_key {
1228 name: "com.android.runtime.key",
1229 public_key: "testkey.avbpubkey",
1230 private_key: "testkey.pem",
1231 }
1232
1233 cc_library {
1234 name: "libc",
1235 no_libcrt: true,
1236 nocrt: true,
1237 stl: "none",
1238 system_shared_libs: [],
1239 stubs: { versions: ["1"] },
1240 apex_available: ["com.android.runtime"],
1241 }
1242
1243 cc_prebuilt_library_shared {
1244 name: "libclang_rt.hwasan-aarch64-android",
1245 no_libcrt: true,
1246 nocrt: true,
1247 stl: "none",
1248 system_shared_libs: [],
1249 srcs: [""],
1250 stubs: { versions: ["1"] },
1251
1252 sanitize: {
1253 never: true,
1254 },
1255 }
1256 `
1257 // override bp to use hard-coded names: com.android.runtime and libc
1258 fs["Android.bp"] = []byte(bp)
1259 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1260
1261 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1262 })
1263
1264 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1265 "lib64/bionic/libc.so",
1266 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1267 })
1268
1269 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1270
1271 installed := hwasan.Description("install libclang_rt.hwasan")
1272 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1273
1274 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1275 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1276 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1277}
1278
Jooyung Han61b66e92020-03-21 14:21:46 +00001279func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1280 testcases := []struct {
1281 name string
1282 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001283 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001284 shouldLink string
1285 shouldNotLink []string
1286 }{
1287 {
Jooyung Han75568392020-03-20 04:29:24 +09001288 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001289 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001290 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001291 shouldLink: "30",
1292 shouldNotLink: []string{"29"},
1293 },
1294 {
1295 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001296 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001297 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001298 shouldLink: "29",
1299 shouldNotLink: []string{"30"},
1300 },
1301 }
1302 for _, tc := range testcases {
1303 t.Run(tc.name, func(t *testing.T) {
1304 ctx, _ := testApex(t, `
1305 apex {
1306 name: "myapex",
1307 key: "myapex.key",
1308 use_vendor: true,
1309 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001310 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001311 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001312
Jooyung Han61b66e92020-03-21 14:21:46 +00001313 apex_key {
1314 name: "myapex.key",
1315 public_key: "testkey.avbpubkey",
1316 private_key: "testkey.pem",
1317 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001318
Jooyung Han61b66e92020-03-21 14:21:46 +00001319 cc_library {
1320 name: "mylib",
1321 srcs: ["mylib.cpp"],
1322 vendor_available: true,
1323 shared_libs: ["libbar"],
1324 system_shared_libs: [],
1325 stl: "none",
1326 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001327 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001328 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001329
Jooyung Han61b66e92020-03-21 14:21:46 +00001330 cc_library {
1331 name: "libbar",
1332 srcs: ["mylib.cpp"],
1333 system_shared_libs: [],
1334 stl: "none",
1335 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001336 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001337 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001338
Jooyung Han61b66e92020-03-21 14:21:46 +00001339 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001340 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001341 symbol_file: "",
1342 }
1343 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001344 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001345 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001346
Jooyung Han61b66e92020-03-21 14:21:46 +00001347 // Ensure that LLNDK dep is not included
1348 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1349 "lib64/mylib.so",
1350 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001351
Jooyung Han61b66e92020-03-21 14:21:46 +00001352 // Ensure that LLNDK dep is required
1353 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1354 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1355 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001356
Colin Crossaede88c2020-08-11 12:17:01 -07001357 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001358 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1359 for _, ver := range tc.shouldNotLink {
1360 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1361 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001362
Colin Crossaede88c2020-08-11 12:17:01 -07001363 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001364 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1365 })
1366 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001367}
1368
Jiyong Park25fc6a92018-11-18 18:02:45 +09001369func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001370 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001371 apex {
1372 name: "myapex",
1373 key: "myapex.key",
1374 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1375 }
1376
1377 apex_key {
1378 name: "myapex.key",
1379 public_key: "testkey.avbpubkey",
1380 private_key: "testkey.pem",
1381 }
1382
1383 cc_library {
1384 name: "mylib",
1385 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001386 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001387 shared_libs: ["libdl#27"],
1388 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001389 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001390 }
1391
1392 cc_library_shared {
1393 name: "mylib_shared",
1394 srcs: ["mylib.cpp"],
1395 shared_libs: ["libdl#27"],
1396 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001397 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001398 }
1399
1400 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001401 name: "libBootstrap",
1402 srcs: ["mylib.cpp"],
1403 stl: "none",
1404 bootstrap: true,
1405 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001406 `)
1407
Sundong Ahnabb64432019-10-22 13:58:29 +09001408 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001409 copyCmds := apexRule.Args["copy_commands"]
1410
1411 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001412 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001413 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1414 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001415
1416 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001417 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001418
Colin Crossaede88c2020-08-11 12:17:01 -07001419 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1420 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1421 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001422
1423 // For dependency to libc
1424 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001425 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001426 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001427 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001428 // ... Cflags from stub is correctly exported to mylib
1429 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1430 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1431
1432 // For dependency to libm
1433 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001434 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001435 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001436 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001437 // ... and is not compiling with the stub
1438 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1439 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1440
1441 // For dependency to libdl
1442 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001443 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001444 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001445 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1446 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001447 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001448 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001449 // ... Cflags from stub is correctly exported to mylib
1450 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1451 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001452
1453 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001454 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1455 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1456 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1457 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001458}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001459
Jooyung Han749dc692020-04-15 11:03:39 +09001460func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001461 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001462 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1463 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001464 // 3) (platform) -> liba -> libz : this should be non-stub link
1465 ctx, _ := testApex(t, `
1466 apex {
1467 name: "myapex",
1468 key: "myapex.key",
1469 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001470 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001471 }
1472
1473 apex {
1474 name: "otherapex",
1475 key: "myapex.key",
1476 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001477 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001478 }
1479
1480 apex_key {
1481 name: "myapex.key",
1482 public_key: "testkey.avbpubkey",
1483 private_key: "testkey.pem",
1484 }
1485
1486 cc_library {
1487 name: "libx",
1488 shared_libs: ["liba"],
1489 system_shared_libs: [],
1490 stl: "none",
1491 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001492 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001493 }
1494
1495 cc_library {
1496 name: "liby",
1497 shared_libs: ["liba"],
1498 system_shared_libs: [],
1499 stl: "none",
1500 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001501 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001502 }
1503
1504 cc_library {
1505 name: "liba",
1506 shared_libs: ["libz"],
1507 system_shared_libs: [],
1508 stl: "none",
1509 apex_available: [
1510 "//apex_available:anyapex",
1511 "//apex_available:platform",
1512 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001513 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001514 }
1515
1516 cc_library {
1517 name: "libz",
1518 system_shared_libs: [],
1519 stl: "none",
1520 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001521 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001522 },
1523 }
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001525
1526 expectLink := func(from, from_variant, to, to_variant string) {
1527 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1528 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1529 }
1530 expectNoLink := func(from, from_variant, to, to_variant string) {
1531 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1532 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1533 }
1534 // platform liba is linked to non-stub version
1535 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001536 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001537 expectLink("liba", "shared_apex29", "libz", "shared_28")
1538 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1539 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001540 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001541 expectLink("liba", "shared_apex30", "libz", "shared_30")
1542 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1543 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001544}
1545
Jooyung Hanaed150d2020-04-02 01:41:41 +09001546func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1547 ctx, _ := testApex(t, `
1548 apex {
1549 name: "myapex",
1550 key: "myapex.key",
1551 native_shared_libs: ["libx"],
1552 min_sdk_version: "R",
1553 }
1554
1555 apex_key {
1556 name: "myapex.key",
1557 public_key: "testkey.avbpubkey",
1558 private_key: "testkey.pem",
1559 }
1560
1561 cc_library {
1562 name: "libx",
1563 shared_libs: ["libz"],
1564 system_shared_libs: [],
1565 stl: "none",
1566 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001567 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001568 }
1569
1570 cc_library {
1571 name: "libz",
1572 system_shared_libs: [],
1573 stl: "none",
1574 stubs: {
1575 versions: ["29", "R"],
1576 },
1577 }
1578 `, func(fs map[string][]byte, config android.Config) {
1579 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1580 })
1581
1582 expectLink := func(from, from_variant, to, to_variant string) {
1583 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1584 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1585 }
1586 expectNoLink := func(from, from_variant, to, to_variant string) {
1587 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1588 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1589 }
Dan Albertc8060532020-07-22 22:32:17 -07001590 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001591 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1592 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001593}
1594
Jooyung Han749dc692020-04-15 11:03:39 +09001595func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001596 ctx, _ := testApex(t, `
1597 apex {
1598 name: "myapex",
1599 key: "myapex.key",
1600 native_shared_libs: ["libx"],
1601 }
1602
1603 apex_key {
1604 name: "myapex.key",
1605 public_key: "testkey.avbpubkey",
1606 private_key: "testkey.pem",
1607 }
1608
1609 cc_library {
1610 name: "libx",
1611 shared_libs: ["libz"],
1612 system_shared_libs: [],
1613 stl: "none",
1614 apex_available: [ "myapex" ],
1615 }
1616
1617 cc_library {
1618 name: "libz",
1619 system_shared_libs: [],
1620 stl: "none",
1621 stubs: {
1622 versions: ["1", "2"],
1623 },
1624 }
1625 `)
1626
1627 expectLink := func(from, from_variant, to, to_variant string) {
1628 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1629 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1630 }
1631 expectNoLink := func(from, from_variant, to, to_variant string) {
1632 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1633 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1634 }
Colin Crossaede88c2020-08-11 12:17:01 -07001635 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1636 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1637 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001638}
1639
1640func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1641 ctx, _ := testApex(t, `
1642 apex {
1643 name: "myapex",
1644 key: "myapex.key",
1645 native_shared_libs: ["libx"],
1646 }
1647
1648 apex_key {
1649 name: "myapex.key",
1650 public_key: "testkey.avbpubkey",
1651 private_key: "testkey.pem",
1652 }
1653
1654 cc_library {
1655 name: "libx",
1656 system_shared_libs: [],
1657 stl: "none",
1658 apex_available: [ "myapex" ],
1659 stubs: {
1660 versions: ["1", "2"],
1661 },
1662 }
1663
1664 cc_library {
1665 name: "libz",
1666 shared_libs: ["libx"],
1667 system_shared_libs: [],
1668 stl: "none",
1669 }
1670 `)
1671
1672 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001673 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001674 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1675 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1676 }
1677 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001678 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001679 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1680 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1681 }
1682 expectLink("libz", "shared", "libx", "shared_2")
1683 expectNoLink("libz", "shared", "libz", "shared_1")
1684 expectNoLink("libz", "shared", "libz", "shared")
1685}
1686
Jooyung Han75568392020-03-20 04:29:24 +09001687func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001688 ctx, _ := testApex(t, `
1689 apex {
1690 name: "myapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["libx"],
1693 min_sdk_version: "29",
1694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["libbar"],
1705 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001706 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001707 }
1708
1709 cc_library {
1710 name: "libbar",
1711 stubs: {
1712 versions: ["29", "30"],
1713 },
1714 }
Jooyung Han75568392020-03-20 04:29:24 +09001715 `, func(fs map[string][]byte, config android.Config) {
1716 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1717 })
Jooyung Han03b51852020-02-26 22:45:42 +09001718 expectLink := func(from, from_variant, to, to_variant string) {
1719 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1720 libFlags := ld.Args["libFlags"]
1721 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1722 }
Colin Crossaede88c2020-08-11 12:17:01 -07001723 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001724}
1725
Jooyung Han75568392020-03-20 04:29:24 +09001726func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001727 ctx, _ := testApex(t, `
1728 apex {
1729 name: "myapex",
1730 key: "myapex.key",
1731 native_shared_libs: ["libx"],
1732 min_sdk_version: "29",
1733 }
1734
1735 apex_key {
1736 name: "myapex.key",
1737 public_key: "testkey.avbpubkey",
1738 private_key: "testkey.pem",
1739 }
1740
1741 cc_library {
1742 name: "libx",
1743 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001744 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001745 }
Jooyung Han75568392020-03-20 04:29:24 +09001746 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001747
1748 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001749 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001750 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1751 // note that platform variant is not.
1752 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1753 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001754}
1755
Jooyung Han749dc692020-04-15 11:03:39 +09001756func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001757 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001758 apex {
1759 name: "myapex",
1760 key: "myapex.key",
1761 native_shared_libs: ["libx"],
1762 min_sdk_version: "29",
1763 }
1764
1765 apex_key {
1766 name: "myapex.key",
1767 public_key: "testkey.avbpubkey",
1768 private_key: "testkey.pem",
1769 }
1770
1771 cc_library {
1772 name: "libx",
1773 shared_libs: ["libz"],
1774 system_shared_libs: [],
1775 stl: "none",
1776 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001777 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001778 }
1779
1780 cc_library {
1781 name: "libz",
1782 system_shared_libs: [],
1783 stl: "none",
1784 stubs: {
1785 versions: ["30"],
1786 },
1787 }
Jooyung Han75568392020-03-20 04:29:24 +09001788 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001789}
Jooyung Han03b51852020-02-26 22:45:42 +09001790
Jooyung Han749dc692020-04-15 11:03:39 +09001791func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1792 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001793 apex {
1794 name: "myapex",
1795 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001796 native_shared_libs: ["mylib"],
1797 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001798 }
1799
1800 apex_key {
1801 name: "myapex.key",
1802 public_key: "testkey.avbpubkey",
1803 private_key: "testkey.pem",
1804 }
Jooyung Han749dc692020-04-15 11:03:39 +09001805
1806 cc_library {
1807 name: "mylib",
1808 srcs: ["mylib.cpp"],
1809 system_shared_libs: [],
1810 stl: "none",
1811 apex_available: [
1812 "myapex",
1813 ],
1814 min_sdk_version: "30",
1815 }
1816 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001817
1818 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1819 apex {
1820 name: "myapex",
1821 key: "myapex.key",
1822 native_shared_libs: ["libfoo.ffi"],
1823 min_sdk_version: "29",
1824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 rust_ffi_shared {
1833 name: "libfoo.ffi",
1834 srcs: ["foo.rs"],
1835 crate_name: "foo",
1836 apex_available: [
1837 "myapex",
1838 ],
1839 min_sdk_version: "30",
1840 }
1841 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001842}
1843
1844func TestApexMinSdkVersion_Okay(t *testing.T) {
1845 testApex(t, `
1846 apex {
1847 name: "myapex",
1848 key: "myapex.key",
1849 native_shared_libs: ["libfoo"],
1850 java_libs: ["libbar"],
1851 min_sdk_version: "29",
1852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libfoo",
1862 srcs: ["mylib.cpp"],
1863 shared_libs: ["libfoo_dep"],
1864 apex_available: ["myapex"],
1865 min_sdk_version: "29",
1866 }
1867
1868 cc_library {
1869 name: "libfoo_dep",
1870 srcs: ["mylib.cpp"],
1871 apex_available: ["myapex"],
1872 min_sdk_version: "29",
1873 }
1874
1875 java_library {
1876 name: "libbar",
1877 sdk_version: "current",
1878 srcs: ["a.java"],
1879 static_libs: ["libbar_dep"],
1880 apex_available: ["myapex"],
1881 min_sdk_version: "29",
1882 }
1883
1884 java_library {
1885 name: "libbar_dep",
1886 sdk_version: "current",
1887 srcs: ["a.java"],
1888 apex_available: ["myapex"],
1889 min_sdk_version: "29",
1890 }
Jooyung Han03b51852020-02-26 22:45:42 +09001891 `)
1892}
1893
Artur Satayev8cf899a2020-04-15 17:29:42 +01001894func TestJavaStableSdkVersion(t *testing.T) {
1895 testCases := []struct {
1896 name string
1897 expectedError string
1898 bp string
1899 }{
1900 {
1901 name: "Non-updatable apex with non-stable dep",
1902 bp: `
1903 apex {
1904 name: "myapex",
1905 java_libs: ["myjar"],
1906 key: "myapex.key",
1907 }
1908 apex_key {
1909 name: "myapex.key",
1910 public_key: "testkey.avbpubkey",
1911 private_key: "testkey.pem",
1912 }
1913 java_library {
1914 name: "myjar",
1915 srcs: ["foo/bar/MyClass.java"],
1916 sdk_version: "core_platform",
1917 apex_available: ["myapex"],
1918 }
1919 `,
1920 },
1921 {
1922 name: "Updatable apex with stable dep",
1923 bp: `
1924 apex {
1925 name: "myapex",
1926 java_libs: ["myjar"],
1927 key: "myapex.key",
1928 updatable: true,
1929 min_sdk_version: "29",
1930 }
1931 apex_key {
1932 name: "myapex.key",
1933 public_key: "testkey.avbpubkey",
1934 private_key: "testkey.pem",
1935 }
1936 java_library {
1937 name: "myjar",
1938 srcs: ["foo/bar/MyClass.java"],
1939 sdk_version: "current",
1940 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001941 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001942 }
1943 `,
1944 },
1945 {
1946 name: "Updatable apex with non-stable dep",
1947 expectedError: "cannot depend on \"myjar\"",
1948 bp: `
1949 apex {
1950 name: "myapex",
1951 java_libs: ["myjar"],
1952 key: "myapex.key",
1953 updatable: true,
1954 }
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960 java_library {
1961 name: "myjar",
1962 srcs: ["foo/bar/MyClass.java"],
1963 sdk_version: "core_platform",
1964 apex_available: ["myapex"],
1965 }
1966 `,
1967 },
1968 {
1969 name: "Updatable apex with non-stable transitive dep",
1970 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1971 bp: `
1972 apex {
1973 name: "myapex",
1974 java_libs: ["myjar"],
1975 key: "myapex.key",
1976 updatable: true,
1977 }
1978 apex_key {
1979 name: "myapex.key",
1980 public_key: "testkey.avbpubkey",
1981 private_key: "testkey.pem",
1982 }
1983 java_library {
1984 name: "myjar",
1985 srcs: ["foo/bar/MyClass.java"],
1986 sdk_version: "current",
1987 apex_available: ["myapex"],
1988 static_libs: ["transitive-jar"],
1989 }
1990 java_library {
1991 name: "transitive-jar",
1992 srcs: ["foo/bar/MyClass.java"],
1993 sdk_version: "core_platform",
1994 apex_available: ["myapex"],
1995 }
1996 `,
1997 },
1998 }
1999
2000 for _, test := range testCases {
2001 t.Run(test.name, func(t *testing.T) {
2002 if test.expectedError == "" {
2003 testApex(t, test.bp)
2004 } else {
2005 testApexError(t, test.expectedError, test.bp)
2006 }
2007 })
2008 }
2009}
2010
Jooyung Han749dc692020-04-15 11:03:39 +09002011func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2012 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2013 apex {
2014 name: "myapex",
2015 key: "myapex.key",
2016 native_shared_libs: ["mylib"],
2017 min_sdk_version: "29",
2018 }
2019
2020 apex_key {
2021 name: "myapex.key",
2022 public_key: "testkey.avbpubkey",
2023 private_key: "testkey.pem",
2024 }
2025
2026 cc_library {
2027 name: "mylib",
2028 srcs: ["mylib.cpp"],
2029 shared_libs: ["mylib2"],
2030 system_shared_libs: [],
2031 stl: "none",
2032 apex_available: [
2033 "myapex",
2034 ],
2035 min_sdk_version: "29",
2036 }
2037
2038 // indirect part of the apex
2039 cc_library {
2040 name: "mylib2",
2041 srcs: ["mylib.cpp"],
2042 system_shared_libs: [],
2043 stl: "none",
2044 apex_available: [
2045 "myapex",
2046 ],
2047 min_sdk_version: "30",
2048 }
2049 `)
2050}
2051
2052func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2053 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2054 apex {
2055 name: "myapex",
2056 key: "myapex.key",
2057 apps: ["AppFoo"],
2058 min_sdk_version: "29",
2059 }
2060
2061 apex_key {
2062 name: "myapex.key",
2063 public_key: "testkey.avbpubkey",
2064 private_key: "testkey.pem",
2065 }
2066
2067 android_app {
2068 name: "AppFoo",
2069 srcs: ["foo/bar/MyClass.java"],
2070 sdk_version: "current",
2071 min_sdk_version: "29",
2072 system_modules: "none",
2073 stl: "none",
2074 static_libs: ["bar"],
2075 apex_available: [ "myapex" ],
2076 }
2077
2078 java_library {
2079 name: "bar",
2080 sdk_version: "current",
2081 srcs: ["a.java"],
2082 apex_available: [ "myapex" ],
2083 }
2084 `)
2085}
2086
2087func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2088 ctx, _ := testApex(t, `
2089 apex {
2090 name: "myapex",
2091 key: "myapex.key",
2092 native_shared_libs: ["mylib"],
2093 min_sdk_version: "29",
2094 }
2095
2096 apex_key {
2097 name: "myapex.key",
2098 public_key: "testkey.avbpubkey",
2099 private_key: "testkey.pem",
2100 }
2101
2102 // mylib in myapex will link to mylib2#29
2103 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2104 cc_library {
2105 name: "mylib",
2106 srcs: ["mylib.cpp"],
2107 shared_libs: ["mylib2"],
2108 system_shared_libs: [],
2109 stl: "none",
2110 apex_available: ["myapex", "otherapex"],
2111 min_sdk_version: "29",
2112 }
2113
2114 cc_library {
2115 name: "mylib2",
2116 srcs: ["mylib.cpp"],
2117 system_shared_libs: [],
2118 stl: "none",
2119 apex_available: ["otherapex"],
2120 stubs: { versions: ["29", "30"] },
2121 min_sdk_version: "30",
2122 }
2123
2124 apex {
2125 name: "otherapex",
2126 key: "myapex.key",
2127 native_shared_libs: ["mylib", "mylib2"],
2128 min_sdk_version: "30",
2129 }
2130 `)
2131 expectLink := func(from, from_variant, to, to_variant string) {
2132 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2133 libFlags := ld.Args["libFlags"]
2134 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2135 }
Colin Crossaede88c2020-08-11 12:17:01 -07002136 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2137 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002138}
2139
Jiyong Park7c2ee712018-12-07 00:42:25 +09002140func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002141 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002142 apex {
2143 name: "myapex",
2144 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002145 native_shared_libs: ["mylib"],
2146 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002147 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002148 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002149 }
2150
2151 apex_key {
2152 name: "myapex.key",
2153 public_key: "testkey.avbpubkey",
2154 private_key: "testkey.pem",
2155 }
2156
2157 prebuilt_etc {
2158 name: "myetc",
2159 src: "myprebuilt",
2160 sub_dir: "foo/bar",
2161 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002162
2163 cc_library {
2164 name: "mylib",
2165 srcs: ["mylib.cpp"],
2166 relative_install_path: "foo/bar",
2167 system_shared_libs: [],
2168 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002169 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002170 }
2171
2172 cc_binary {
2173 name: "mybin",
2174 srcs: ["mylib.cpp"],
2175 relative_install_path: "foo/bar",
2176 system_shared_libs: [],
2177 static_executable: true,
2178 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002179 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002180 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002181 `)
2182
Sundong Ahnabb64432019-10-22 13:58:29 +09002183 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002184 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2185
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002186 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002187 ensureListContains(t, dirs, "etc")
2188 ensureListContains(t, dirs, "etc/foo")
2189 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002190 ensureListContains(t, dirs, "lib64")
2191 ensureListContains(t, dirs, "lib64/foo")
2192 ensureListContains(t, dirs, "lib64/foo/bar")
2193 ensureListContains(t, dirs, "lib")
2194 ensureListContains(t, dirs, "lib/foo")
2195 ensureListContains(t, dirs, "lib/foo/bar")
2196
Jiyong Parkbd13e442019-03-15 18:10:35 +09002197 ensureListContains(t, dirs, "bin")
2198 ensureListContains(t, dirs, "bin/foo")
2199 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002200}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002201
Jooyung Han35155c42020-02-06 17:33:20 +09002202func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2203 ctx, _ := testApex(t, `
2204 apex {
2205 name: "myapex",
2206 key: "myapex.key",
2207 multilib: {
2208 both: {
2209 native_shared_libs: ["mylib"],
2210 binaries: ["mybin"],
2211 },
2212 },
2213 compile_multilib: "both",
2214 native_bridge_supported: true,
2215 }
2216
2217 apex_key {
2218 name: "myapex.key",
2219 public_key: "testkey.avbpubkey",
2220 private_key: "testkey.pem",
2221 }
2222
2223 cc_library {
2224 name: "mylib",
2225 relative_install_path: "foo/bar",
2226 system_shared_libs: [],
2227 stl: "none",
2228 apex_available: [ "myapex" ],
2229 native_bridge_supported: true,
2230 }
2231
2232 cc_binary {
2233 name: "mybin",
2234 relative_install_path: "foo/bar",
2235 system_shared_libs: [],
2236 static_executable: true,
2237 stl: "none",
2238 apex_available: [ "myapex" ],
2239 native_bridge_supported: true,
2240 compile_multilib: "both", // default is "first" for binary
2241 multilib: {
2242 lib64: {
2243 suffix: "64",
2244 },
2245 },
2246 }
2247 `, withNativeBridgeEnabled)
2248 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2249 "bin/foo/bar/mybin",
2250 "bin/foo/bar/mybin64",
2251 "bin/arm/foo/bar/mybin",
2252 "bin/arm64/foo/bar/mybin64",
2253 "lib/foo/bar/mylib.so",
2254 "lib/arm/foo/bar/mylib.so",
2255 "lib64/foo/bar/mylib.so",
2256 "lib64/arm64/foo/bar/mylib.so",
2257 })
2258}
2259
Jiyong Parkda6eb592018-12-19 17:12:36 +09002260func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002261 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002262 apex {
2263 name: "myapex",
2264 key: "myapex.key",
2265 native_shared_libs: ["mylib"],
2266 use_vendor: true,
2267 }
2268
2269 apex_key {
2270 name: "myapex.key",
2271 public_key: "testkey.avbpubkey",
2272 private_key: "testkey.pem",
2273 }
2274
2275 cc_library {
2276 name: "mylib",
2277 srcs: ["mylib.cpp"],
2278 shared_libs: ["mylib2"],
2279 system_shared_libs: [],
2280 vendor_available: true,
2281 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002282 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002283 }
2284
2285 cc_library {
2286 name: "mylib2",
2287 srcs: ["mylib.cpp"],
2288 system_shared_libs: [],
2289 vendor_available: true,
2290 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002291 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002292 }
Jooyung Handc782442019-11-01 03:14:38 +09002293 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002294 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002295 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002296
2297 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002298 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002299 for _, implicit := range i.Implicits {
2300 inputsList = append(inputsList, implicit.String())
2301 }
2302 }
2303 inputsString := strings.Join(inputsList, " ")
2304
2305 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002306 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2307 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002308
2309 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002310 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2311 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002312}
Jiyong Park16e91a02018-12-20 18:18:08 +09002313
Jooyung Han85d61762020-06-24 23:50:26 +09002314func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002315 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2316 apex {
2317 name: "myapex",
2318 key: "myapex.key",
2319 use_vendor: true,
2320 }
2321 apex_key {
2322 name: "myapex.key",
2323 public_key: "testkey.avbpubkey",
2324 private_key: "testkey.pem",
2325 }
2326 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002327 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002328 })
Colin Cross440e0d02020-06-11 11:32:11 -07002329 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002330 testApex(t, `
2331 apex {
2332 name: "myapex",
2333 key: "myapex.key",
2334 use_vendor: true,
2335 }
2336 apex_key {
2337 name: "myapex.key",
2338 public_key: "testkey.avbpubkey",
2339 private_key: "testkey.pem",
2340 }
2341 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002342 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002343 })
2344}
2345
Jooyung Han5c998b92019-06-27 11:30:33 +09002346func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2347 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2348 apex {
2349 name: "myapex",
2350 key: "myapex.key",
2351 native_shared_libs: ["mylib"],
2352 use_vendor: true,
2353 }
2354
2355 apex_key {
2356 name: "myapex.key",
2357 public_key: "testkey.avbpubkey",
2358 private_key: "testkey.pem",
2359 }
2360
2361 cc_library {
2362 name: "mylib",
2363 srcs: ["mylib.cpp"],
2364 system_shared_libs: [],
2365 stl: "none",
2366 }
2367 `)
2368}
2369
Jooyung Han85d61762020-06-24 23:50:26 +09002370func TestVendorApex(t *testing.T) {
2371 ctx, config := testApex(t, `
2372 apex {
2373 name: "myapex",
2374 key: "myapex.key",
2375 binaries: ["mybin"],
2376 vendor: true,
2377 }
2378 apex_key {
2379 name: "myapex.key",
2380 public_key: "testkey.avbpubkey",
2381 private_key: "testkey.pem",
2382 }
2383 cc_binary {
2384 name: "mybin",
2385 vendor: true,
2386 shared_libs: ["libfoo"],
2387 }
2388 cc_library {
2389 name: "libfoo",
2390 proprietary: true,
2391 }
2392 `)
2393
2394 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2395 "bin/mybin",
2396 "lib64/libfoo.so",
2397 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2398 "lib64/libc++.so",
2399 })
2400
2401 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2402 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2403 name := apexBundle.BaseModuleName()
2404 prefix := "TARGET_"
2405 var builder strings.Builder
2406 data.Custom(&builder, name, prefix, "", data)
2407 androidMk := builder.String()
2408 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002409
2410 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2411 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2412 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002413}
2414
Jooyung Handf78e212020-07-22 15:54:47 +09002415func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2416 ctx, _ := testApex(t, `
2417 apex {
2418 name: "myapex",
2419 key: "myapex.key",
2420 binaries: ["mybin"],
2421 vendor: true,
2422 use_vndk_as_stable: true,
2423 }
2424 apex_key {
2425 name: "myapex.key",
2426 public_key: "testkey.avbpubkey",
2427 private_key: "testkey.pem",
2428 }
2429 cc_binary {
2430 name: "mybin",
2431 vendor: true,
2432 shared_libs: ["libvndk", "libvendor"],
2433 }
2434 cc_library {
2435 name: "libvndk",
2436 vndk: {
2437 enabled: true,
2438 },
2439 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002440 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002441 }
2442 cc_library {
2443 name: "libvendor",
2444 vendor: true,
2445 }
2446 `)
2447
2448 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2449
Colin Crossaede88c2020-08-11 12:17:01 -07002450 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002451 libs := names(ldRule.Args["libFlags"])
2452 // VNDK libs(libvndk/libc++) as they are
2453 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2454 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2455 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002456 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002457
2458 // VNDK libs are not included when use_vndk_as_stable: true
2459 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2460 "bin/mybin",
2461 "lib64/libvendor.so",
2462 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002463
2464 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2465 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2466 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002467}
2468
Jooyung Han8e5685d2020-09-21 11:02:57 +09002469func TestApex_withPrebuiltFirmware(t *testing.T) {
2470 testCases := []struct {
2471 name string
2472 additionalProp string
2473 }{
2474 {"system apex with prebuilt_firmware", ""},
2475 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2476 }
2477 for _, tc := range testCases {
2478 t.Run(tc.name, func(t *testing.T) {
2479 ctx, _ := testApex(t, `
2480 apex {
2481 name: "myapex",
2482 key: "myapex.key",
2483 prebuilts: ["myfirmware"],
2484 `+tc.additionalProp+`
2485 }
2486 apex_key {
2487 name: "myapex.key",
2488 public_key: "testkey.avbpubkey",
2489 private_key: "testkey.pem",
2490 }
2491 prebuilt_firmware {
2492 name: "myfirmware",
2493 src: "myfirmware.bin",
2494 filename_from_src: true,
2495 `+tc.additionalProp+`
2496 }
2497 `)
2498 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2499 "etc/firmware/myfirmware.bin",
2500 })
2501 })
2502 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002503}
2504
Jooyung Hanefb184e2020-06-25 17:14:25 +09002505func TestAndroidMk_UseVendorRequired(t *testing.T) {
2506 ctx, config := testApex(t, `
2507 apex {
2508 name: "myapex",
2509 key: "myapex.key",
2510 use_vendor: true,
2511 native_shared_libs: ["mylib"],
2512 }
2513
2514 apex_key {
2515 name: "myapex.key",
2516 public_key: "testkey.avbpubkey",
2517 private_key: "testkey.pem",
2518 }
2519
2520 cc_library {
2521 name: "mylib",
2522 vendor_available: true,
2523 apex_available: ["myapex"],
2524 }
2525 `, func(fs map[string][]byte, config android.Config) {
2526 setUseVendorAllowListForTest(config, []string{"myapex"})
2527 })
2528
2529 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2530 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2531 name := apexBundle.BaseModuleName()
2532 prefix := "TARGET_"
2533 var builder strings.Builder
2534 data.Custom(&builder, name, prefix, "", data)
2535 androidMk := builder.String()
2536 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2537}
2538
2539func TestAndroidMk_VendorApexRequired(t *testing.T) {
2540 ctx, config := testApex(t, `
2541 apex {
2542 name: "myapex",
2543 key: "myapex.key",
2544 vendor: true,
2545 native_shared_libs: ["mylib"],
2546 }
2547
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553
2554 cc_library {
2555 name: "mylib",
2556 vendor_available: true,
2557 }
2558 `)
2559
2560 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2561 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2562 name := apexBundle.BaseModuleName()
2563 prefix := "TARGET_"
2564 var builder strings.Builder
2565 data.Custom(&builder, name, prefix, "", data)
2566 androidMk := builder.String()
2567 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2568}
2569
Jooyung Han2ed99d02020-06-24 23:26:26 +09002570func TestAndroidMkWritesCommonProperties(t *testing.T) {
2571 ctx, config := testApex(t, `
2572 apex {
2573 name: "myapex",
2574 key: "myapex.key",
2575 vintf_fragments: ["fragment.xml"],
2576 init_rc: ["init.rc"],
2577 }
2578 apex_key {
2579 name: "myapex.key",
2580 public_key: "testkey.avbpubkey",
2581 private_key: "testkey.pem",
2582 }
2583 cc_binary {
2584 name: "mybin",
2585 }
2586 `)
2587
2588 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2589 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2590 name := apexBundle.BaseModuleName()
2591 prefix := "TARGET_"
2592 var builder strings.Builder
2593 data.Custom(&builder, name, prefix, "", data)
2594 androidMk := builder.String()
2595 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2596 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2597}
2598
Jiyong Park16e91a02018-12-20 18:18:08 +09002599func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002600 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002601 apex {
2602 name: "myapex",
2603 key: "myapex.key",
2604 native_shared_libs: ["mylib"],
2605 }
2606
2607 apex_key {
2608 name: "myapex.key",
2609 public_key: "testkey.avbpubkey",
2610 private_key: "testkey.pem",
2611 }
2612
2613 cc_library {
2614 name: "mylib",
2615 srcs: ["mylib.cpp"],
2616 system_shared_libs: [],
2617 stl: "none",
2618 stubs: {
2619 versions: ["1", "2", "3"],
2620 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002621 apex_available: [
2622 "//apex_available:platform",
2623 "myapex",
2624 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002625 }
2626
2627 cc_binary {
2628 name: "not_in_apex",
2629 srcs: ["mylib.cpp"],
2630 static_libs: ["mylib"],
2631 static_executable: true,
2632 system_shared_libs: [],
2633 stl: "none",
2634 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002635 `)
2636
Colin Cross7113d202019-11-20 16:39:12 -08002637 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002638
2639 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002640 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002641}
Jiyong Park9335a262018-12-24 11:31:58 +09002642
2643func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002644 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002645 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002646 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002647 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002648 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002649 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002650 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002651 }
2652
2653 cc_library {
2654 name: "mylib",
2655 srcs: ["mylib.cpp"],
2656 system_shared_libs: [],
2657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002658 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002659 }
2660
2661 apex_key {
2662 name: "myapex.key",
2663 public_key: "testkey.avbpubkey",
2664 private_key: "testkey.pem",
2665 }
2666
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002667 android_app_certificate {
2668 name: "myapex.certificate",
2669 certificate: "testkey",
2670 }
2671
2672 android_app_certificate {
2673 name: "myapex.certificate.override",
2674 certificate: "testkey.override",
2675 }
2676
Jiyong Park9335a262018-12-24 11:31:58 +09002677 `)
2678
2679 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002680 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002681
2682 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2683 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2684 "vendor/foo/devkeys/testkey.avbpubkey")
2685 }
2686 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2687 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2688 "vendor/foo/devkeys/testkey.pem")
2689 }
2690
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002691 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002692 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002693 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002694 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002695 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002696 }
2697}
Jiyong Park58e364a2019-01-19 19:24:06 +09002698
Jooyung Hanf121a652019-12-17 14:30:11 +09002699func TestCertificate(t *testing.T) {
2700 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2701 ctx, _ := testApex(t, `
2702 apex {
2703 name: "myapex",
2704 key: "myapex.key",
2705 }
2706 apex_key {
2707 name: "myapex.key",
2708 public_key: "testkey.avbpubkey",
2709 private_key: "testkey.pem",
2710 }`)
2711 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2712 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2713 if actual := rule.Args["certificates"]; actual != expected {
2714 t.Errorf("certificates should be %q, not %q", expected, actual)
2715 }
2716 })
2717 t.Run("override when unspecified", func(t *testing.T) {
2718 ctx, _ := testApex(t, `
2719 apex {
2720 name: "myapex_keytest",
2721 key: "myapex.key",
2722 file_contexts: ":myapex-file_contexts",
2723 }
2724 apex_key {
2725 name: "myapex.key",
2726 public_key: "testkey.avbpubkey",
2727 private_key: "testkey.pem",
2728 }
2729 android_app_certificate {
2730 name: "myapex.certificate.override",
2731 certificate: "testkey.override",
2732 }`)
2733 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2734 expected := "testkey.override.x509.pem testkey.override.pk8"
2735 if actual := rule.Args["certificates"]; actual != expected {
2736 t.Errorf("certificates should be %q, not %q", expected, actual)
2737 }
2738 })
2739 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2740 ctx, _ := testApex(t, `
2741 apex {
2742 name: "myapex",
2743 key: "myapex.key",
2744 certificate: ":myapex.certificate",
2745 }
2746 apex_key {
2747 name: "myapex.key",
2748 public_key: "testkey.avbpubkey",
2749 private_key: "testkey.pem",
2750 }
2751 android_app_certificate {
2752 name: "myapex.certificate",
2753 certificate: "testkey",
2754 }`)
2755 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2756 expected := "testkey.x509.pem testkey.pk8"
2757 if actual := rule.Args["certificates"]; actual != expected {
2758 t.Errorf("certificates should be %q, not %q", expected, actual)
2759 }
2760 })
2761 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2762 ctx, _ := testApex(t, `
2763 apex {
2764 name: "myapex_keytest",
2765 key: "myapex.key",
2766 file_contexts: ":myapex-file_contexts",
2767 certificate: ":myapex.certificate",
2768 }
2769 apex_key {
2770 name: "myapex.key",
2771 public_key: "testkey.avbpubkey",
2772 private_key: "testkey.pem",
2773 }
2774 android_app_certificate {
2775 name: "myapex.certificate.override",
2776 certificate: "testkey.override",
2777 }`)
2778 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2779 expected := "testkey.override.x509.pem testkey.override.pk8"
2780 if actual := rule.Args["certificates"]; actual != expected {
2781 t.Errorf("certificates should be %q, not %q", expected, actual)
2782 }
2783 })
2784 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2785 ctx, _ := testApex(t, `
2786 apex {
2787 name: "myapex",
2788 key: "myapex.key",
2789 certificate: "testkey",
2790 }
2791 apex_key {
2792 name: "myapex.key",
2793 public_key: "testkey.avbpubkey",
2794 private_key: "testkey.pem",
2795 }`)
2796 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2797 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2798 if actual := rule.Args["certificates"]; actual != expected {
2799 t.Errorf("certificates should be %q, not %q", expected, actual)
2800 }
2801 })
2802 t.Run("override when specified as <name>", func(t *testing.T) {
2803 ctx, _ := testApex(t, `
2804 apex {
2805 name: "myapex_keytest",
2806 key: "myapex.key",
2807 file_contexts: ":myapex-file_contexts",
2808 certificate: "testkey",
2809 }
2810 apex_key {
2811 name: "myapex.key",
2812 public_key: "testkey.avbpubkey",
2813 private_key: "testkey.pem",
2814 }
2815 android_app_certificate {
2816 name: "myapex.certificate.override",
2817 certificate: "testkey.override",
2818 }`)
2819 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2820 expected := "testkey.override.x509.pem testkey.override.pk8"
2821 if actual := rule.Args["certificates"]; actual != expected {
2822 t.Errorf("certificates should be %q, not %q", expected, actual)
2823 }
2824 })
2825}
2826
Jiyong Park58e364a2019-01-19 19:24:06 +09002827func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002828 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002829 apex {
2830 name: "myapex",
2831 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002832 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002833 }
2834
2835 apex {
2836 name: "otherapex",
2837 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002838 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002839 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002840 }
2841
2842 apex_key {
2843 name: "myapex.key",
2844 public_key: "testkey.avbpubkey",
2845 private_key: "testkey.pem",
2846 }
2847
2848 cc_library {
2849 name: "mylib",
2850 srcs: ["mylib.cpp"],
2851 system_shared_libs: [],
2852 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002853 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002854 "myapex",
2855 "otherapex",
2856 ],
Jooyung Han24282772020-03-21 23:20:55 +09002857 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002858 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002859 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002860 cc_library {
2861 name: "mylib2",
2862 srcs: ["mylib.cpp"],
2863 system_shared_libs: [],
2864 stl: "none",
2865 apex_available: [
2866 "myapex",
2867 "otherapex",
2868 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002869 static_libs: ["mylib3"],
2870 recovery_available: true,
2871 min_sdk_version: "29",
2872 }
2873 cc_library {
2874 name: "mylib3",
2875 srcs: ["mylib.cpp"],
2876 system_shared_libs: [],
2877 stl: "none",
2878 apex_available: [
2879 "myapex",
2880 "otherapex",
2881 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002882 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002883 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002884 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002885 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002886 `)
2887
Jooyung Hanc87a0592020-03-02 17:44:33 +09002888 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002889 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002890 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002891 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002892
Jooyung Hanccce2f22020-03-07 03:45:53 +09002893 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002894 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002895 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002896 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002897 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002898
Jooyung Hanccce2f22020-03-07 03:45:53 +09002899 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002900 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002901 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002902 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002903 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002904
Colin Crossaede88c2020-08-11 12:17:01 -07002905 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2906 // each variant defines additional macros to distinguish which apex variant it is built for
2907
2908 // non-APEX variant does not have __ANDROID_APEX__ defined
2909 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2910 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2911
2912 // APEX variant has __ANDROID_APEX__ defined
2913 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2914 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2915 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2916 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2917
2918 // APEX variant has __ANDROID_APEX__ defined
2919 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2920 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2921 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2922 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2923
Dan Albertb19953d2020-11-17 15:29:36 -08002924 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002925 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2926 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002927 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002928
2929 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2930 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002931
2932 // non-APEX variant does not have __ANDROID_APEX__ defined
2933 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2934 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2935
2936 // APEX variant has __ANDROID_APEX__ defined
2937 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002938 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002939 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002940 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002941
Jooyung Hanc87a0592020-03-02 17:44:33 +09002942 // APEX variant has __ANDROID_APEX__ defined
2943 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002944 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002945 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002946 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002947
Dan Albertb19953d2020-11-17 15:29:36 -08002948 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002949 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002950 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002951 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002952}
Jiyong Park7e636d02019-01-28 16:16:54 +09002953
2954func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002955 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002956 apex {
2957 name: "myapex",
2958 key: "myapex.key",
2959 native_shared_libs: ["mylib"],
2960 }
2961
2962 apex_key {
2963 name: "myapex.key",
2964 public_key: "testkey.avbpubkey",
2965 private_key: "testkey.pem",
2966 }
2967
2968 cc_library_headers {
2969 name: "mylib_headers",
2970 export_include_dirs: ["my_include"],
2971 system_shared_libs: [],
2972 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002973 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002974 }
2975
2976 cc_library {
2977 name: "mylib",
2978 srcs: ["mylib.cpp"],
2979 system_shared_libs: [],
2980 stl: "none",
2981 header_libs: ["mylib_headers"],
2982 export_header_lib_headers: ["mylib_headers"],
2983 stubs: {
2984 versions: ["1", "2", "3"],
2985 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002986 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002987 }
2988
2989 cc_library {
2990 name: "otherlib",
2991 srcs: ["mylib.cpp"],
2992 system_shared_libs: [],
2993 stl: "none",
2994 shared_libs: ["mylib"],
2995 }
2996 `)
2997
Colin Cross7113d202019-11-20 16:39:12 -08002998 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002999
3000 // Ensure that the include path of the header lib is exported to 'otherlib'
3001 ensureContains(t, cFlags, "-Imy_include")
3002}
Alex Light9670d332019-01-29 18:07:33 -08003003
Jiyong Park7cd10e32020-01-14 09:22:18 +09003004type fileInApex struct {
3005 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003006 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003007 isLink bool
3008}
3009
Jooyung Hana57af4a2020-01-23 05:36:59 +00003010func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003011 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003012 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003013 copyCmds := apexRule.Args["copy_commands"]
3014 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003015 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003016 for _, cmd := range strings.Split(copyCmds, "&&") {
3017 cmd = strings.TrimSpace(cmd)
3018 if cmd == "" {
3019 continue
3020 }
3021 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003022 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003023 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003024 switch terms[0] {
3025 case "mkdir":
3026 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003027 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003028 t.Fatal("copyCmds contains invalid cp command", cmd)
3029 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003030 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003031 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003032 isLink = false
3033 case "ln":
3034 if len(terms) != 3 && len(terms) != 4 {
3035 // ln LINK TARGET or ln -s LINK TARGET
3036 t.Fatal("copyCmds contains invalid ln command", cmd)
3037 }
3038 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003039 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003040 isLink = true
3041 default:
3042 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3043 }
3044 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003045 index := strings.Index(dst, imageApexDir)
3046 if index == -1 {
3047 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3048 }
3049 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003050 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003051 }
3052 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003053 return ret
3054}
3055
Jooyung Hana57af4a2020-01-23 05:36:59 +00003056func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3057 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003058 var failed bool
3059 var surplus []string
3060 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003061 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003062 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003063 for _, expected := range files {
3064 if matched, _ := path.Match(expected, file.path); matched {
3065 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003066 mactchFound = true
3067 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003068 }
3069 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003070 if !mactchFound {
3071 surplus = append(surplus, file.path)
3072 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003073 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003074
Jooyung Han31c470b2019-10-18 16:26:59 +09003075 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003076 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003077 t.Log("surplus files", surplus)
3078 failed = true
3079 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003080
3081 if len(files) > len(filesMatched) {
3082 var missing []string
3083 for _, expected := range files {
3084 if !filesMatched[expected] {
3085 missing = append(missing, expected)
3086 }
3087 }
3088 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003089 t.Log("missing files", missing)
3090 failed = true
3091 }
3092 if failed {
3093 t.Fail()
3094 }
3095}
3096
Jooyung Han344d5432019-08-23 11:17:39 +09003097func TestVndkApexCurrent(t *testing.T) {
3098 ctx, _ := testApex(t, `
3099 apex_vndk {
3100 name: "myapex",
3101 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003102 }
3103
3104 apex_key {
3105 name: "myapex.key",
3106 public_key: "testkey.avbpubkey",
3107 private_key: "testkey.pem",
3108 }
3109
3110 cc_library {
3111 name: "libvndk",
3112 srcs: ["mylib.cpp"],
3113 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003114 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003115 vndk: {
3116 enabled: true,
3117 },
3118 system_shared_libs: [],
3119 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003120 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003121 }
3122
3123 cc_library {
3124 name: "libvndksp",
3125 srcs: ["mylib.cpp"],
3126 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003127 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003128 vndk: {
3129 enabled: true,
3130 support_system_process: true,
3131 },
3132 system_shared_libs: [],
3133 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003134 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003135 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003136 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003137
Jooyung Hana57af4a2020-01-23 05:36:59 +00003138 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003139 "lib/libvndk.so",
3140 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003141 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003142 "lib64/libvndk.so",
3143 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003144 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003145 "etc/llndk.libraries.VER.txt",
3146 "etc/vndkcore.libraries.VER.txt",
3147 "etc/vndksp.libraries.VER.txt",
3148 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003149 })
Jooyung Han344d5432019-08-23 11:17:39 +09003150}
3151
3152func TestVndkApexWithPrebuilt(t *testing.T) {
3153 ctx, _ := testApex(t, `
3154 apex_vndk {
3155 name: "myapex",
3156 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003157 }
3158
3159 apex_key {
3160 name: "myapex.key",
3161 public_key: "testkey.avbpubkey",
3162 private_key: "testkey.pem",
3163 }
3164
3165 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003166 name: "libvndk",
3167 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003168 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003169 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003170 vndk: {
3171 enabled: true,
3172 },
3173 system_shared_libs: [],
3174 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003175 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003176 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003177
3178 cc_prebuilt_library_shared {
3179 name: "libvndk.arm",
3180 srcs: ["libvndk.arm.so"],
3181 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003182 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003183 vndk: {
3184 enabled: true,
3185 },
3186 enabled: false,
3187 arch: {
3188 arm: {
3189 enabled: true,
3190 },
3191 },
3192 system_shared_libs: [],
3193 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003194 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003195 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003196 `+vndkLibrariesTxtFiles("current"),
3197 withFiles(map[string][]byte{
3198 "libvndk.so": nil,
3199 "libvndk.arm.so": nil,
3200 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003201
Jooyung Hana57af4a2020-01-23 05:36:59 +00003202 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003203 "lib/libvndk.so",
3204 "lib/libvndk.arm.so",
3205 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003206 "lib/libc++.so",
3207 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003208 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003209 })
Jooyung Han344d5432019-08-23 11:17:39 +09003210}
3211
Jooyung Han39edb6c2019-11-06 16:53:07 +09003212func vndkLibrariesTxtFiles(vers ...string) (result string) {
3213 for _, v := range vers {
3214 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003215 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003216 result += `
3217 vndk_libraries_txt {
3218 name: "` + txt + `.libraries.txt",
3219 }
3220 `
3221 }
3222 } else {
3223 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3224 result += `
3225 prebuilt_etc {
3226 name: "` + txt + `.libraries.` + v + `.txt",
3227 src: "dummy.txt",
3228 }
3229 `
3230 }
3231 }
3232 }
3233 return
3234}
3235
Jooyung Han344d5432019-08-23 11:17:39 +09003236func TestVndkApexVersion(t *testing.T) {
3237 ctx, _ := testApex(t, `
3238 apex_vndk {
3239 name: "myapex_v27",
3240 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003241 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003242 vndk_version: "27",
3243 }
3244
3245 apex_key {
3246 name: "myapex.key",
3247 public_key: "testkey.avbpubkey",
3248 private_key: "testkey.pem",
3249 }
3250
Jooyung Han31c470b2019-10-18 16:26:59 +09003251 vndk_prebuilt_shared {
3252 name: "libvndk27",
3253 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003254 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003255 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003256 vndk: {
3257 enabled: true,
3258 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003259 target_arch: "arm64",
3260 arch: {
3261 arm: {
3262 srcs: ["libvndk27_arm.so"],
3263 },
3264 arm64: {
3265 srcs: ["libvndk27_arm64.so"],
3266 },
3267 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003268 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003269 }
3270
3271 vndk_prebuilt_shared {
3272 name: "libvndk27",
3273 version: "27",
3274 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003275 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003276 vndk: {
3277 enabled: true,
3278 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003279 target_arch: "x86_64",
3280 arch: {
3281 x86: {
3282 srcs: ["libvndk27_x86.so"],
3283 },
3284 x86_64: {
3285 srcs: ["libvndk27_x86_64.so"],
3286 },
3287 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003288 }
3289 `+vndkLibrariesTxtFiles("27"),
3290 withFiles(map[string][]byte{
3291 "libvndk27_arm.so": nil,
3292 "libvndk27_arm64.so": nil,
3293 "libvndk27_x86.so": nil,
3294 "libvndk27_x86_64.so": nil,
3295 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003296
Jooyung Hana57af4a2020-01-23 05:36:59 +00003297 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003298 "lib/libvndk27_arm.so",
3299 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003300 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003301 })
Jooyung Han344d5432019-08-23 11:17:39 +09003302}
3303
3304func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3305 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3306 apex_vndk {
3307 name: "myapex_v27",
3308 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003309 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003310 vndk_version: "27",
3311 }
3312 apex_vndk {
3313 name: "myapex_v27_other",
3314 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003315 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003316 vndk_version: "27",
3317 }
3318
3319 apex_key {
3320 name: "myapex.key",
3321 public_key: "testkey.avbpubkey",
3322 private_key: "testkey.pem",
3323 }
3324
3325 cc_library {
3326 name: "libvndk",
3327 srcs: ["mylib.cpp"],
3328 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003329 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003330 vndk: {
3331 enabled: true,
3332 },
3333 system_shared_libs: [],
3334 stl: "none",
3335 }
3336
3337 vndk_prebuilt_shared {
3338 name: "libvndk",
3339 version: "27",
3340 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003341 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003342 vndk: {
3343 enabled: true,
3344 },
3345 srcs: ["libvndk.so"],
3346 }
3347 `, withFiles(map[string][]byte{
3348 "libvndk.so": nil,
3349 }))
3350}
3351
Jooyung Han90eee022019-10-01 20:02:42 +09003352func TestVndkApexNameRule(t *testing.T) {
3353 ctx, _ := testApex(t, `
3354 apex_vndk {
3355 name: "myapex",
3356 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003357 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003358 }
3359 apex_vndk {
3360 name: "myapex_v28",
3361 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003362 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003363 vndk_version: "28",
3364 }
3365 apex_key {
3366 name: "myapex.key",
3367 public_key: "testkey.avbpubkey",
3368 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003369 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003370
3371 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003372 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003373 actual := proptools.String(bundle.properties.Apex_name)
3374 if !reflect.DeepEqual(actual, expected) {
3375 t.Errorf("Got '%v', expected '%v'", actual, expected)
3376 }
3377 }
3378
3379 assertApexName("com.android.vndk.vVER", "myapex")
3380 assertApexName("com.android.vndk.v28", "myapex_v28")
3381}
3382
Jooyung Han344d5432019-08-23 11:17:39 +09003383func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3384 ctx, _ := testApex(t, `
3385 apex_vndk {
3386 name: "myapex",
3387 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003388 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003389 }
3390
3391 apex_key {
3392 name: "myapex.key",
3393 public_key: "testkey.avbpubkey",
3394 private_key: "testkey.pem",
3395 }
3396
3397 cc_library {
3398 name: "libvndk",
3399 srcs: ["mylib.cpp"],
3400 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003401 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003402 native_bridge_supported: true,
3403 host_supported: true,
3404 vndk: {
3405 enabled: true,
3406 },
3407 system_shared_libs: [],
3408 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003409 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003410 }
Jooyung Han35155c42020-02-06 17:33:20 +09003411 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003412
Jooyung Hana57af4a2020-01-23 05:36:59 +00003413 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003414 "lib/libvndk.so",
3415 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003416 "lib/libc++.so",
3417 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003418 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003419 })
Jooyung Han344d5432019-08-23 11:17:39 +09003420}
3421
3422func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3423 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3424 apex_vndk {
3425 name: "myapex",
3426 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003427 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003428 native_bridge_supported: true,
3429 }
3430
3431 apex_key {
3432 name: "myapex.key",
3433 public_key: "testkey.avbpubkey",
3434 private_key: "testkey.pem",
3435 }
3436
3437 cc_library {
3438 name: "libvndk",
3439 srcs: ["mylib.cpp"],
3440 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003441 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003442 native_bridge_supported: true,
3443 host_supported: true,
3444 vndk: {
3445 enabled: true,
3446 },
3447 system_shared_libs: [],
3448 stl: "none",
3449 }
3450 `)
3451}
3452
Jooyung Han31c470b2019-10-18 16:26:59 +09003453func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003454 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003455 apex_vndk {
3456 name: "myapex_v27",
3457 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003458 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 vndk_version: "27",
3460 }
3461
3462 apex_key {
3463 name: "myapex.key",
3464 public_key: "testkey.avbpubkey",
3465 private_key: "testkey.pem",
3466 }
3467
3468 vndk_prebuilt_shared {
3469 name: "libvndk27",
3470 version: "27",
3471 target_arch: "arm",
3472 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003473 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003474 vndk: {
3475 enabled: true,
3476 },
3477 arch: {
3478 arm: {
3479 srcs: ["libvndk27.so"],
3480 }
3481 },
3482 }
3483
3484 vndk_prebuilt_shared {
3485 name: "libvndk27",
3486 version: "27",
3487 target_arch: "arm",
3488 binder32bit: true,
3489 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003490 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003491 vndk: {
3492 enabled: true,
3493 },
3494 arch: {
3495 arm: {
3496 srcs: ["libvndk27binder32.so"],
3497 }
3498 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003499 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003500 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003501 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 withFiles(map[string][]byte{
3503 "libvndk27.so": nil,
3504 "libvndk27binder32.so": nil,
3505 }),
3506 withBinder32bit,
3507 withTargets(map[android.OsType][]android.Target{
3508 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003509 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3510 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003511 },
3512 }),
3513 )
3514
Jooyung Hana57af4a2020-01-23 05:36:59 +00003515 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003516 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003517 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003518 })
3519}
3520
Jooyung Han45a96772020-06-15 14:59:42 +09003521func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3522 ctx, _ := testApex(t, `
3523 apex_vndk {
3524 name: "myapex",
3525 key: "myapex.key",
3526 file_contexts: ":myapex-file_contexts",
3527 }
3528
3529 apex_key {
3530 name: "myapex.key",
3531 public_key: "testkey.avbpubkey",
3532 private_key: "testkey.pem",
3533 }
3534
3535 cc_library {
3536 name: "libz",
3537 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003538 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003539 vndk: {
3540 enabled: true,
3541 },
3542 stubs: {
3543 symbol_file: "libz.map.txt",
3544 versions: ["30"],
3545 }
3546 }
3547 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3548 "libz.map.txt": nil,
3549 }))
3550
3551 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3552 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3553 ensureListEmpty(t, provideNativeLibs)
3554}
3555
Jooyung Hane1633032019-08-01 17:41:43 +09003556func TestDependenciesInApexManifest(t *testing.T) {
3557 ctx, _ := testApex(t, `
3558 apex {
3559 name: "myapex_nodep",
3560 key: "myapex.key",
3561 native_shared_libs: ["lib_nodep"],
3562 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003563 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003564 }
3565
3566 apex {
3567 name: "myapex_dep",
3568 key: "myapex.key",
3569 native_shared_libs: ["lib_dep"],
3570 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003571 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003572 }
3573
3574 apex {
3575 name: "myapex_provider",
3576 key: "myapex.key",
3577 native_shared_libs: ["libfoo"],
3578 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003579 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003580 }
3581
3582 apex {
3583 name: "myapex_selfcontained",
3584 key: "myapex.key",
3585 native_shared_libs: ["lib_dep", "libfoo"],
3586 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003587 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003588 }
3589
3590 apex_key {
3591 name: "myapex.key",
3592 public_key: "testkey.avbpubkey",
3593 private_key: "testkey.pem",
3594 }
3595
3596 cc_library {
3597 name: "lib_nodep",
3598 srcs: ["mylib.cpp"],
3599 system_shared_libs: [],
3600 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003601 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003602 }
3603
3604 cc_library {
3605 name: "lib_dep",
3606 srcs: ["mylib.cpp"],
3607 shared_libs: ["libfoo"],
3608 system_shared_libs: [],
3609 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003610 apex_available: [
3611 "myapex_dep",
3612 "myapex_provider",
3613 "myapex_selfcontained",
3614 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003615 }
3616
3617 cc_library {
3618 name: "libfoo",
3619 srcs: ["mytest.cpp"],
3620 stubs: {
3621 versions: ["1"],
3622 },
3623 system_shared_libs: [],
3624 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003625 apex_available: [
3626 "myapex_provider",
3627 "myapex_selfcontained",
3628 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003629 }
3630 `)
3631
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003632 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003633 var provideNativeLibs, requireNativeLibs []string
3634
Sundong Ahnabb64432019-10-22 13:58:29 +09003635 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003636 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3637 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003638 ensureListEmpty(t, provideNativeLibs)
3639 ensureListEmpty(t, requireNativeLibs)
3640
Sundong Ahnabb64432019-10-22 13:58:29 +09003641 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003642 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3643 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003644 ensureListEmpty(t, provideNativeLibs)
3645 ensureListContains(t, requireNativeLibs, "libfoo.so")
3646
Sundong Ahnabb64432019-10-22 13:58:29 +09003647 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003648 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3649 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003650 ensureListContains(t, provideNativeLibs, "libfoo.so")
3651 ensureListEmpty(t, requireNativeLibs)
3652
Sundong Ahnabb64432019-10-22 13:58:29 +09003653 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003654 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3655 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003656 ensureListContains(t, provideNativeLibs, "libfoo.so")
3657 ensureListEmpty(t, requireNativeLibs)
3658}
3659
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003660func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003661 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003662 apex {
3663 name: "myapex",
3664 key: "myapex.key",
3665 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003666 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003667 }
3668
3669 apex_key {
3670 name: "myapex.key",
3671 public_key: "testkey.avbpubkey",
3672 private_key: "testkey.pem",
3673 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003674
3675 cc_library {
3676 name: "mylib",
3677 srcs: ["mylib.cpp"],
3678 system_shared_libs: [],
3679 stl: "none",
3680 apex_available: [
3681 "//apex_available:platform",
3682 "myapex",
3683 ],
3684 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003685 `)
3686
Sundong Ahnabb64432019-10-22 13:58:29 +09003687 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003688 apexManifestRule := module.Rule("apexManifestRule")
3689 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3690 apexRule := module.Rule("apexRule")
3691 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003692
3693 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3694 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3695 name := apexBundle.BaseModuleName()
3696 prefix := "TARGET_"
3697 var builder strings.Builder
3698 data.Custom(&builder, name, prefix, "", data)
3699 androidMk := builder.String()
3700 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3701 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003702}
3703
Alex Light0851b882019-02-07 13:20:53 -08003704func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003705 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003706 apex {
3707 name: "myapex",
3708 key: "myapex.key",
3709 native_shared_libs: ["mylib_common"],
3710 }
3711
3712 apex_key {
3713 name: "myapex.key",
3714 public_key: "testkey.avbpubkey",
3715 private_key: "testkey.pem",
3716 }
3717
3718 cc_library {
3719 name: "mylib_common",
3720 srcs: ["mylib.cpp"],
3721 system_shared_libs: [],
3722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003723 apex_available: [
3724 "//apex_available:platform",
3725 "myapex",
3726 ],
Alex Light0851b882019-02-07 13:20:53 -08003727 }
3728 `)
3729
Sundong Ahnabb64432019-10-22 13:58:29 +09003730 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003731 apexRule := module.Rule("apexRule")
3732 copyCmds := apexRule.Args["copy_commands"]
3733
3734 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3735 t.Log("Apex was a test apex!")
3736 t.Fail()
3737 }
3738 // Ensure that main rule creates an output
3739 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3740
3741 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003742 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003743
3744 // Ensure that both direct and indirect deps are copied into apex
3745 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3746
Colin Cross7113d202019-11-20 16:39:12 -08003747 // Ensure that the platform variant ends with _shared
3748 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003749
Colin Cross56a83212020-09-15 18:30:11 -07003750 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003751 t.Log("Found mylib_common not in any apex!")
3752 t.Fail()
3753 }
3754}
3755
3756func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003757 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003758 apex_test {
3759 name: "myapex",
3760 key: "myapex.key",
3761 native_shared_libs: ["mylib_common_test"],
3762 }
3763
3764 apex_key {
3765 name: "myapex.key",
3766 public_key: "testkey.avbpubkey",
3767 private_key: "testkey.pem",
3768 }
3769
3770 cc_library {
3771 name: "mylib_common_test",
3772 srcs: ["mylib.cpp"],
3773 system_shared_libs: [],
3774 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003775 // TODO: remove //apex_available:platform
3776 apex_available: [
3777 "//apex_available:platform",
3778 "myapex",
3779 ],
Alex Light0851b882019-02-07 13:20:53 -08003780 }
3781 `)
3782
Sundong Ahnabb64432019-10-22 13:58:29 +09003783 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003784 apexRule := module.Rule("apexRule")
3785 copyCmds := apexRule.Args["copy_commands"]
3786
3787 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3788 t.Log("Apex was not a test apex!")
3789 t.Fail()
3790 }
3791 // Ensure that main rule creates an output
3792 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3793
3794 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003795 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003796
3797 // Ensure that both direct and indirect deps are copied into apex
3798 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3799
Colin Cross7113d202019-11-20 16:39:12 -08003800 // Ensure that the platform variant ends with _shared
3801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003802}
3803
Alex Light9670d332019-01-29 18:07:33 -08003804func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003805 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003806 apex {
3807 name: "myapex",
3808 key: "myapex.key",
3809 multilib: {
3810 first: {
3811 native_shared_libs: ["mylib_common"],
3812 }
3813 },
3814 target: {
3815 android: {
3816 multilib: {
3817 first: {
3818 native_shared_libs: ["mylib"],
3819 }
3820 }
3821 },
3822 host: {
3823 multilib: {
3824 first: {
3825 native_shared_libs: ["mylib2"],
3826 }
3827 }
3828 }
3829 }
3830 }
3831
3832 apex_key {
3833 name: "myapex.key",
3834 public_key: "testkey.avbpubkey",
3835 private_key: "testkey.pem",
3836 }
3837
3838 cc_library {
3839 name: "mylib",
3840 srcs: ["mylib.cpp"],
3841 system_shared_libs: [],
3842 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003843 // TODO: remove //apex_available:platform
3844 apex_available: [
3845 "//apex_available:platform",
3846 "myapex",
3847 ],
Alex Light9670d332019-01-29 18:07:33 -08003848 }
3849
3850 cc_library {
3851 name: "mylib_common",
3852 srcs: ["mylib.cpp"],
3853 system_shared_libs: [],
3854 stl: "none",
3855 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003856 // TODO: remove //apex_available:platform
3857 apex_available: [
3858 "//apex_available:platform",
3859 "myapex",
3860 ],
Alex Light9670d332019-01-29 18:07:33 -08003861 }
3862
3863 cc_library {
3864 name: "mylib2",
3865 srcs: ["mylib.cpp"],
3866 system_shared_libs: [],
3867 stl: "none",
3868 compile_multilib: "first",
3869 }
3870 `)
3871
Sundong Ahnabb64432019-10-22 13:58:29 +09003872 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003873 copyCmds := apexRule.Args["copy_commands"]
3874
3875 // Ensure that main rule creates an output
3876 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3877
3878 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003879 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3880 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3881 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003882
3883 // Ensure that both direct and indirect deps are copied into apex
3884 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3885 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3886 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3887
Colin Cross7113d202019-11-20 16:39:12 -08003888 // Ensure that the platform variant ends with _shared
3889 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3890 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3891 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003892}
Jiyong Park04480cf2019-02-06 00:16:29 +09003893
3894func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003895 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003896 apex {
3897 name: "myapex",
3898 key: "myapex.key",
3899 binaries: ["myscript"],
3900 }
3901
3902 apex_key {
3903 name: "myapex.key",
3904 public_key: "testkey.avbpubkey",
3905 private_key: "testkey.pem",
3906 }
3907
3908 sh_binary {
3909 name: "myscript",
3910 src: "mylib.cpp",
3911 filename: "myscript.sh",
3912 sub_dir: "script",
3913 }
3914 `)
3915
Sundong Ahnabb64432019-10-22 13:58:29 +09003916 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003917 copyCmds := apexRule.Args["copy_commands"]
3918
3919 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3920}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003921
Jooyung Han91df2082019-11-20 01:49:42 +09003922func TestApexInVariousPartition(t *testing.T) {
3923 testcases := []struct {
3924 propName, parition, flattenedPartition string
3925 }{
3926 {"", "system", "system_ext"},
3927 {"product_specific: true", "product", "product"},
3928 {"soc_specific: true", "vendor", "vendor"},
3929 {"proprietary: true", "vendor", "vendor"},
3930 {"vendor: true", "vendor", "vendor"},
3931 {"system_ext_specific: true", "system_ext", "system_ext"},
3932 }
3933 for _, tc := range testcases {
3934 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3935 ctx, _ := testApex(t, `
3936 apex {
3937 name: "myapex",
3938 key: "myapex.key",
3939 `+tc.propName+`
3940 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003941
Jooyung Han91df2082019-11-20 01:49:42 +09003942 apex_key {
3943 name: "myapex.key",
3944 public_key: "testkey.avbpubkey",
3945 private_key: "testkey.pem",
3946 }
3947 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003948
Jooyung Han91df2082019-11-20 01:49:42 +09003949 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3950 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3951 actual := apex.installDir.String()
3952 if actual != expected {
3953 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3954 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003955
Jooyung Han91df2082019-11-20 01:49:42 +09003956 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3957 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3958 actual = flattened.installDir.String()
3959 if actual != expected {
3960 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3961 }
3962 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003963 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003964}
Jiyong Park67882562019-03-21 01:11:21 +09003965
Jooyung Han580eb4f2020-06-24 19:33:06 +09003966func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003967 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003968 apex {
3969 name: "myapex",
3970 key: "myapex.key",
3971 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003972
Jooyung Han580eb4f2020-06-24 19:33:06 +09003973 apex_key {
3974 name: "myapex.key",
3975 public_key: "testkey.avbpubkey",
3976 private_key: "testkey.pem",
3977 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003978 `)
3979 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003980 rule := module.Output("file_contexts")
3981 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3982}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003983
Jooyung Han580eb4f2020-06-24 19:33:06 +09003984func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003985 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003986 apex {
3987 name: "myapex",
3988 key: "myapex.key",
3989 file_contexts: "my_own_file_contexts",
3990 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003991
Jooyung Han580eb4f2020-06-24 19:33:06 +09003992 apex_key {
3993 name: "myapex.key",
3994 public_key: "testkey.avbpubkey",
3995 private_key: "testkey.pem",
3996 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003997 `, withFiles(map[string][]byte{
3998 "my_own_file_contexts": nil,
3999 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004000}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004001
Jooyung Han580eb4f2020-06-24 19:33:06 +09004002func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004003 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004004 apex {
4005 name: "myapex",
4006 key: "myapex.key",
4007 product_specific: true,
4008 file_contexts: "product_specific_file_contexts",
4009 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004010
Jooyung Han580eb4f2020-06-24 19:33:06 +09004011 apex_key {
4012 name: "myapex.key",
4013 public_key: "testkey.avbpubkey",
4014 private_key: "testkey.pem",
4015 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004016 `)
4017
Jooyung Han580eb4f2020-06-24 19:33:06 +09004018 ctx, _ := testApex(t, `
4019 apex {
4020 name: "myapex",
4021 key: "myapex.key",
4022 product_specific: true,
4023 file_contexts: "product_specific_file_contexts",
4024 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025
Jooyung Han580eb4f2020-06-24 19:33:06 +09004026 apex_key {
4027 name: "myapex.key",
4028 public_key: "testkey.avbpubkey",
4029 private_key: "testkey.pem",
4030 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031 `, withFiles(map[string][]byte{
4032 "product_specific_file_contexts": nil,
4033 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004034 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4035 rule := module.Output("file_contexts")
4036 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4037}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004038
Jooyung Han580eb4f2020-06-24 19:33:06 +09004039func TestFileContexts_SetViaFileGroup(t *testing.T) {
4040 ctx, _ := testApex(t, `
4041 apex {
4042 name: "myapex",
4043 key: "myapex.key",
4044 product_specific: true,
4045 file_contexts: ":my-file-contexts",
4046 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004047
Jooyung Han580eb4f2020-06-24 19:33:06 +09004048 apex_key {
4049 name: "myapex.key",
4050 public_key: "testkey.avbpubkey",
4051 private_key: "testkey.pem",
4052 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004053
Jooyung Han580eb4f2020-06-24 19:33:06 +09004054 filegroup {
4055 name: "my-file-contexts",
4056 srcs: ["product_specific_file_contexts"],
4057 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004058 `, withFiles(map[string][]byte{
4059 "product_specific_file_contexts": nil,
4060 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004061 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4062 rule := module.Output("file_contexts")
4063 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004064}
4065
Jiyong Park67882562019-03-21 01:11:21 +09004066func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004067 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004068 apex_key {
4069 name: "myapex.key",
4070 public_key: ":my.avbpubkey",
4071 private_key: ":my.pem",
4072 product_specific: true,
4073 }
4074
4075 filegroup {
4076 name: "my.avbpubkey",
4077 srcs: ["testkey2.avbpubkey"],
4078 }
4079
4080 filegroup {
4081 name: "my.pem",
4082 srcs: ["testkey2.pem"],
4083 }
4084 `)
4085
4086 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4087 expected_pubkey := "testkey2.avbpubkey"
4088 actual_pubkey := apex_key.public_key_file.String()
4089 if actual_pubkey != expected_pubkey {
4090 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4091 }
4092 expected_privkey := "testkey2.pem"
4093 actual_privkey := apex_key.private_key_file.String()
4094 if actual_privkey != expected_privkey {
4095 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4096 }
4097}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004098
4099func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004100 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004101 prebuilt_apex {
4102 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004103 arch: {
4104 arm64: {
4105 src: "myapex-arm64.apex",
4106 },
4107 arm: {
4108 src: "myapex-arm.apex",
4109 },
4110 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004111 }
4112 `)
4113
4114 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4115
Jiyong Parkc95714e2019-03-29 14:23:10 +09004116 expectedInput := "myapex-arm64.apex"
4117 if prebuilt.inputApex.String() != expectedInput {
4118 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4119 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004120}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004121
4122func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004123 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004124 prebuilt_apex {
4125 name: "myapex",
4126 src: "myapex-arm.apex",
4127 filename: "notmyapex.apex",
4128 }
4129 `)
4130
4131 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4132
4133 expected := "notmyapex.apex"
4134 if p.installFilename != expected {
4135 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4136 }
4137}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004138
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004139func TestPrebuiltOverrides(t *testing.T) {
4140 ctx, config := testApex(t, `
4141 prebuilt_apex {
4142 name: "myapex.prebuilt",
4143 src: "myapex-arm.apex",
4144 overrides: [
4145 "myapex",
4146 ],
4147 }
4148 `)
4149
4150 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4151
4152 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004153 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004154 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004155 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004156 }
4157}
4158
Roland Levillain630846d2019-06-26 12:48:34 +01004159func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004160 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004161 apex_test {
4162 name: "myapex",
4163 key: "myapex.key",
4164 tests: [
4165 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004166 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004167 ],
4168 }
4169
4170 apex_key {
4171 name: "myapex.key",
4172 public_key: "testkey.avbpubkey",
4173 private_key: "testkey.pem",
4174 }
4175
Liz Kammer1c14a212020-05-12 15:26:55 -07004176 filegroup {
4177 name: "fg",
4178 srcs: [
4179 "baz",
4180 "bar/baz"
4181 ],
4182 }
4183
Roland Levillain630846d2019-06-26 12:48:34 +01004184 cc_test {
4185 name: "mytest",
4186 gtest: false,
4187 srcs: ["mytest.cpp"],
4188 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004189 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004190 system_shared_libs: [],
4191 static_executable: true,
4192 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004193 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004194 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004195
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004196 cc_library {
4197 name: "mylib",
4198 srcs: ["mylib.cpp"],
4199 system_shared_libs: [],
4200 stl: "none",
4201 }
4202
Liz Kammer5bd365f2020-05-27 15:15:11 -07004203 filegroup {
4204 name: "fg2",
4205 srcs: [
4206 "testdata/baz"
4207 ],
4208 }
4209
Roland Levillain9b5fde92019-06-28 15:41:19 +01004210 cc_test {
4211 name: "mytests",
4212 gtest: false,
4213 srcs: [
4214 "mytest1.cpp",
4215 "mytest2.cpp",
4216 "mytest3.cpp",
4217 ],
4218 test_per_src: true,
4219 relative_install_path: "test",
4220 system_shared_libs: [],
4221 static_executable: true,
4222 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004223 data: [
4224 ":fg",
4225 ":fg2",
4226 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004227 }
Roland Levillain630846d2019-06-26 12:48:34 +01004228 `)
4229
Sundong Ahnabb64432019-10-22 13:58:29 +09004230 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004231 copyCmds := apexRule.Args["copy_commands"]
4232
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004233 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004234 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004235 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004236
Liz Kammer1c14a212020-05-12 15:26:55 -07004237 //Ensure that test data are copied into apex.
4238 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4239 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4240
Roland Levillain9b5fde92019-06-28 15:41:19 +01004241 // Ensure that test deps built with `test_per_src` are copied into apex.
4242 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4243 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4244 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004245
4246 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004247 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4248 data := android.AndroidMkDataForTest(t, config, "", bundle)
4249 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004250 prefix := "TARGET_"
4251 var builder strings.Builder
4252 data.Custom(&builder, name, prefix, "", data)
4253 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004254 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4255 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4256 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4257 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004258 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004259 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004260 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004261
4262 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4263 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4264 data.Custom(&builder, name, prefix, "", data)
4265 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004266 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4267 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004268}
4269
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004270func TestInstallExtraFlattenedApexes(t *testing.T) {
4271 ctx, config := testApex(t, `
4272 apex {
4273 name: "myapex",
4274 key: "myapex.key",
4275 }
4276 apex_key {
4277 name: "myapex.key",
4278 public_key: "testkey.avbpubkey",
4279 private_key: "testkey.pem",
4280 }
4281 `, func(fs map[string][]byte, config android.Config) {
4282 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4283 })
4284 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004285 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004286 mk := android.AndroidMkDataForTest(t, config, "", ab)
4287 var builder strings.Builder
4288 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4289 androidMk := builder.String()
4290 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4291}
4292
Jooyung Hand48f3c32019-08-23 11:18:57 +09004293func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4294 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4295 apex {
4296 name: "myapex",
4297 key: "myapex.key",
4298 native_shared_libs: ["libfoo"],
4299 }
4300
4301 apex_key {
4302 name: "myapex.key",
4303 public_key: "testkey.avbpubkey",
4304 private_key: "testkey.pem",
4305 }
4306
4307 cc_library {
4308 name: "libfoo",
4309 stl: "none",
4310 system_shared_libs: [],
4311 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004312 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004313 }
4314 `)
4315 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4316 apex {
4317 name: "myapex",
4318 key: "myapex.key",
4319 java_libs: ["myjar"],
4320 }
4321
4322 apex_key {
4323 name: "myapex.key",
4324 public_key: "testkey.avbpubkey",
4325 private_key: "testkey.pem",
4326 }
4327
4328 java_library {
4329 name: "myjar",
4330 srcs: ["foo/bar/MyClass.java"],
4331 sdk_version: "none",
4332 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004333 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004334 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004335 }
4336 `)
4337}
4338
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004339func TestApexWithApps(t *testing.T) {
4340 ctx, _ := testApex(t, `
4341 apex {
4342 name: "myapex",
4343 key: "myapex.key",
4344 apps: [
4345 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004346 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004347 ],
4348 }
4349
4350 apex_key {
4351 name: "myapex.key",
4352 public_key: "testkey.avbpubkey",
4353 private_key: "testkey.pem",
4354 }
4355
4356 android_app {
4357 name: "AppFoo",
4358 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004359 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004360 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004361 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004363 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004364 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004365
4366 android_app {
4367 name: "AppFooPriv",
4368 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004369 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004370 system_modules: "none",
4371 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004373 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004374 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004375
4376 cc_library_shared {
4377 name: "libjni",
4378 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004379 shared_libs: ["libfoo"],
4380 stl: "none",
4381 system_shared_libs: [],
4382 apex_available: [ "myapex" ],
4383 sdk_version: "current",
4384 }
4385
4386 cc_library_shared {
4387 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004388 stl: "none",
4389 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004390 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004391 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004392 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004393 `)
4394
Sundong Ahnabb64432019-10-22 13:58:29 +09004395 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004396 apexRule := module.Rule("apexRule")
4397 copyCmds := apexRule.Args["copy_commands"]
4398
4399 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004400 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004401
Colin Crossaede88c2020-08-11 12:17:01 -07004402 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004403 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004404 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004405 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004406 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004407 // JNI libraries including transitive deps are
4408 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004409 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004410 // ... embedded inside APK (jnilibs.zip)
4411 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4412 // ... and not directly inside the APEX
4413 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4414 }
Dario Frenicde2a032019-10-27 00:29:22 +01004415}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004416
Dario Frenicde2a032019-10-27 00:29:22 +01004417func TestApexWithAppImports(t *testing.T) {
4418 ctx, _ := testApex(t, `
4419 apex {
4420 name: "myapex",
4421 key: "myapex.key",
4422 apps: [
4423 "AppFooPrebuilt",
4424 "AppFooPrivPrebuilt",
4425 ],
4426 }
4427
4428 apex_key {
4429 name: "myapex.key",
4430 public_key: "testkey.avbpubkey",
4431 private_key: "testkey.pem",
4432 }
4433
4434 android_app_import {
4435 name: "AppFooPrebuilt",
4436 apk: "PrebuiltAppFoo.apk",
4437 presigned: true,
4438 dex_preopt: {
4439 enabled: false,
4440 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004441 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004442 }
4443
4444 android_app_import {
4445 name: "AppFooPrivPrebuilt",
4446 apk: "PrebuiltAppFooPriv.apk",
4447 privileged: true,
4448 presigned: true,
4449 dex_preopt: {
4450 enabled: false,
4451 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004452 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004453 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004454 }
4455 `)
4456
Sundong Ahnabb64432019-10-22 13:58:29 +09004457 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004458 apexRule := module.Rule("apexRule")
4459 copyCmds := apexRule.Args["copy_commands"]
4460
4461 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004462 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4463}
4464
4465func TestApexWithAppImportsPrefer(t *testing.T) {
4466 ctx, _ := testApex(t, `
4467 apex {
4468 name: "myapex",
4469 key: "myapex.key",
4470 apps: [
4471 "AppFoo",
4472 ],
4473 }
4474
4475 apex_key {
4476 name: "myapex.key",
4477 public_key: "testkey.avbpubkey",
4478 private_key: "testkey.pem",
4479 }
4480
4481 android_app {
4482 name: "AppFoo",
4483 srcs: ["foo/bar/MyClass.java"],
4484 sdk_version: "none",
4485 system_modules: "none",
4486 apex_available: [ "myapex" ],
4487 }
4488
4489 android_app_import {
4490 name: "AppFoo",
4491 apk: "AppFooPrebuilt.apk",
4492 filename: "AppFooPrebuilt.apk",
4493 presigned: true,
4494 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004495 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004496 }
4497 `, withFiles(map[string][]byte{
4498 "AppFooPrebuilt.apk": nil,
4499 }))
4500
4501 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4502 "app/AppFoo/AppFooPrebuilt.apk",
4503 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004504}
4505
Dario Freni6f3937c2019-12-20 22:58:03 +00004506func TestApexWithTestHelperApp(t *testing.T) {
4507 ctx, _ := testApex(t, `
4508 apex {
4509 name: "myapex",
4510 key: "myapex.key",
4511 apps: [
4512 "TesterHelpAppFoo",
4513 ],
4514 }
4515
4516 apex_key {
4517 name: "myapex.key",
4518 public_key: "testkey.avbpubkey",
4519 private_key: "testkey.pem",
4520 }
4521
4522 android_test_helper_app {
4523 name: "TesterHelpAppFoo",
4524 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004525 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004526 }
4527
4528 `)
4529
4530 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4531 apexRule := module.Rule("apexRule")
4532 copyCmds := apexRule.Args["copy_commands"]
4533
4534 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4535}
4536
Jooyung Han18020ea2019-11-13 10:50:48 +09004537func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4538 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004539 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004540 apex {
4541 name: "myapex",
4542 key: "myapex.key",
4543 native_shared_libs: ["libfoo"],
4544 }
4545
4546 apex_key {
4547 name: "myapex.key",
4548 public_key: "testkey.avbpubkey",
4549 private_key: "testkey.pem",
4550 }
4551
4552 apex {
4553 name: "otherapex",
4554 key: "myapex.key",
4555 native_shared_libs: ["libfoo"],
4556 }
4557
4558 cc_defaults {
4559 name: "libfoo-defaults",
4560 apex_available: ["otherapex"],
4561 }
4562
4563 cc_library {
4564 name: "libfoo",
4565 defaults: ["libfoo-defaults"],
4566 stl: "none",
4567 system_shared_libs: [],
4568 }`)
4569}
4570
Paul Duffine52e66f2020-03-30 17:54:29 +01004571func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004572 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004573 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004574 apex {
4575 name: "myapex",
4576 key: "myapex.key",
4577 native_shared_libs: ["libfoo"],
4578 }
4579
4580 apex_key {
4581 name: "myapex.key",
4582 public_key: "testkey.avbpubkey",
4583 private_key: "testkey.pem",
4584 }
4585
4586 apex {
4587 name: "otherapex",
4588 key: "otherapex.key",
4589 native_shared_libs: ["libfoo"],
4590 }
4591
4592 apex_key {
4593 name: "otherapex.key",
4594 public_key: "testkey.avbpubkey",
4595 private_key: "testkey.pem",
4596 }
4597
4598 cc_library {
4599 name: "libfoo",
4600 stl: "none",
4601 system_shared_libs: [],
4602 apex_available: ["otherapex"],
4603 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004604}
Jiyong Park127b40b2019-09-30 16:04:35 +09004605
Paul Duffine52e66f2020-03-30 17:54:29 +01004606func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004607 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004608 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004609.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004610.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004611.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004612.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004613.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004614.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004615 apex {
4616 name: "myapex",
4617 key: "myapex.key",
4618 native_shared_libs: ["libfoo"],
4619 }
4620
4621 apex_key {
4622 name: "myapex.key",
4623 public_key: "testkey.avbpubkey",
4624 private_key: "testkey.pem",
4625 }
4626
Jiyong Park127b40b2019-09-30 16:04:35 +09004627 cc_library {
4628 name: "libfoo",
4629 stl: "none",
4630 shared_libs: ["libbar"],
4631 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004632 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004633 }
4634
4635 cc_library {
4636 name: "libbar",
4637 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004638 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004639 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004640 apex_available: ["myapex"],
4641 }
4642
4643 cc_library {
4644 name: "libbaz",
4645 stl: "none",
4646 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004647 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004648}
Jiyong Park127b40b2019-09-30 16:04:35 +09004649
Paul Duffine52e66f2020-03-30 17:54:29 +01004650func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004651 testApexError(t, "\"otherapex\" is not a valid module name", `
4652 apex {
4653 name: "myapex",
4654 key: "myapex.key",
4655 native_shared_libs: ["libfoo"],
4656 }
4657
4658 apex_key {
4659 name: "myapex.key",
4660 public_key: "testkey.avbpubkey",
4661 private_key: "testkey.pem",
4662 }
4663
4664 cc_library {
4665 name: "libfoo",
4666 stl: "none",
4667 system_shared_libs: [],
4668 apex_available: ["otherapex"],
4669 }`)
4670
Paul Duffine52e66f2020-03-30 17:54:29 +01004671 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004672 apex {
4673 name: "myapex",
4674 key: "myapex.key",
4675 native_shared_libs: ["libfoo", "libbar"],
4676 }
4677
4678 apex_key {
4679 name: "myapex.key",
4680 public_key: "testkey.avbpubkey",
4681 private_key: "testkey.pem",
4682 }
4683
4684 cc_library {
4685 name: "libfoo",
4686 stl: "none",
4687 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004688 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004689 apex_available: ["myapex"],
4690 }
4691
4692 cc_library {
4693 name: "libbar",
4694 stl: "none",
4695 system_shared_libs: [],
4696 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004697 }
4698
4699 cc_library {
4700 name: "libbaz",
4701 stl: "none",
4702 system_shared_libs: [],
4703 stubs: {
4704 versions: ["10", "20", "30"],
4705 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004706 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004707}
Jiyong Park127b40b2019-09-30 16:04:35 +09004708
Jiyong Park89e850a2020-04-07 16:37:39 +09004709func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004710 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004711 apex {
4712 name: "myapex",
4713 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004714 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004715 }
4716
4717 apex_key {
4718 name: "myapex.key",
4719 public_key: "testkey.avbpubkey",
4720 private_key: "testkey.pem",
4721 }
4722
4723 cc_library {
4724 name: "libfoo",
4725 stl: "none",
4726 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004727 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004728 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004729 }
4730
4731 cc_library {
4732 name: "libfoo2",
4733 stl: "none",
4734 system_shared_libs: [],
4735 shared_libs: ["libbaz"],
4736 apex_available: ["//apex_available:platform"],
4737 }
4738
4739 cc_library {
4740 name: "libbar",
4741 stl: "none",
4742 system_shared_libs: [],
4743 apex_available: ["myapex"],
4744 }
4745
4746 cc_library {
4747 name: "libbaz",
4748 stl: "none",
4749 system_shared_libs: [],
4750 apex_available: ["myapex"],
4751 stubs: {
4752 versions: ["1"],
4753 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004754 }`)
4755
Jiyong Park89e850a2020-04-07 16:37:39 +09004756 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4757 // because it depends on libbar which isn't available to platform
4758 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4759 if libfoo.NotAvailableForPlatform() != true {
4760 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4761 }
4762
4763 // libfoo2 however can be available to platform because it depends on libbaz which provides
4764 // stubs
4765 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4766 if libfoo2.NotAvailableForPlatform() == true {
4767 t.Errorf("%q should be available to platform", libfoo2.String())
4768 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004769}
Jiyong Parka90ca002019-10-07 15:47:24 +09004770
Paul Duffine52e66f2020-03-30 17:54:29 +01004771func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004772 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004773 apex {
4774 name: "myapex",
4775 key: "myapex.key",
4776 native_shared_libs: ["libfoo"],
4777 }
4778
4779 apex_key {
4780 name: "myapex.key",
4781 public_key: "testkey.avbpubkey",
4782 private_key: "testkey.pem",
4783 }
4784
4785 cc_library {
4786 name: "libfoo",
4787 stl: "none",
4788 system_shared_libs: [],
4789 apex_available: ["myapex"],
4790 static: {
4791 apex_available: ["//apex_available:platform"],
4792 },
4793 }`)
4794
Jiyong Park89e850a2020-04-07 16:37:39 +09004795 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4796 if libfooShared.NotAvailableForPlatform() != true {
4797 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4798 }
4799 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4800 if libfooStatic.NotAvailableForPlatform() != false {
4801 t.Errorf("%q should be available to platform", libfooStatic.String())
4802 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004803}
4804
Jiyong Park5d790c32019-11-15 18:40:32 +09004805func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004806 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004807 apex {
4808 name: "myapex",
4809 key: "myapex.key",
4810 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004811 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004812 }
4813
4814 override_apex {
4815 name: "override_myapex",
4816 base: "myapex",
4817 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004818 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004819 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004820 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004821 }
4822
4823 apex_key {
4824 name: "myapex.key",
4825 public_key: "testkey.avbpubkey",
4826 private_key: "testkey.pem",
4827 }
4828
4829 android_app {
4830 name: "app",
4831 srcs: ["foo/bar/MyClass.java"],
4832 package_name: "foo",
4833 sdk_version: "none",
4834 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004835 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004836 }
4837
4838 override_android_app {
4839 name: "override_app",
4840 base: "app",
4841 package_name: "bar",
4842 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004843 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004844
Jiyong Park317645e2019-12-05 13:20:58 +09004845 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4846 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4847 if originalVariant.GetOverriddenBy() != "" {
4848 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4849 }
4850 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4851 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4852 }
4853
Jiyong Park5d790c32019-11-15 18:40:32 +09004854 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4855 apexRule := module.Rule("apexRule")
4856 copyCmds := apexRule.Args["copy_commands"]
4857
4858 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004859 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004860
4861 apexBundle := module.Module().(*apexBundle)
4862 name := apexBundle.Name()
4863 if name != "override_myapex" {
4864 t.Errorf("name should be \"override_myapex\", but was %q", name)
4865 }
4866
Baligh Uddin004d7172020-02-19 21:29:28 -08004867 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4868 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4869 }
4870
Jiyong Park20bacab2020-03-03 11:45:41 +09004871 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004872 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004873
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004874 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4875 var builder strings.Builder
4876 data.Custom(&builder, name, "TARGET_", "", data)
4877 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004878 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004879 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4880 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004881 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004882 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004883 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004884 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4885 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004886}
4887
Jooyung Han214bf372019-11-12 13:03:50 +09004888func TestLegacyAndroid10Support(t *testing.T) {
4889 ctx, _ := testApex(t, `
4890 apex {
4891 name: "myapex",
4892 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004893 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004894 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004895 }
4896
4897 apex_key {
4898 name: "myapex.key",
4899 public_key: "testkey.avbpubkey",
4900 private_key: "testkey.pem",
4901 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004902
4903 cc_library {
4904 name: "mylib",
4905 srcs: ["mylib.cpp"],
4906 stl: "libc++",
4907 system_shared_libs: [],
4908 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004909 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004910 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004911 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004912
4913 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4914 args := module.Rule("apexRule").Args
4915 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004916 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004917
4918 // The copies of the libraries in the apex should have one more dependency than
4919 // the ones outside the apex, namely the unwinder. Ideally we should check
4920 // the dependency names directly here but for some reason the names are blank in
4921 // this test.
4922 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004923 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004924 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4925 if len(apexImplicits) != len(nonApexImplicits)+1 {
4926 t.Errorf("%q missing unwinder dep", lib)
4927 }
4928 }
Jooyung Han214bf372019-11-12 13:03:50 +09004929}
4930
Paul Duffin9b879592020-05-26 13:21:35 +01004931var filesForSdkLibrary = map[string][]byte{
4932 "api/current.txt": nil,
4933 "api/removed.txt": nil,
4934 "api/system-current.txt": nil,
4935 "api/system-removed.txt": nil,
4936 "api/test-current.txt": nil,
4937 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004938
4939 // For java_sdk_library_import
4940 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004941}
4942
Jooyung Han58f26ab2019-12-18 15:34:32 +09004943func TestJavaSDKLibrary(t *testing.T) {
4944 ctx, _ := testApex(t, `
4945 apex {
4946 name: "myapex",
4947 key: "myapex.key",
4948 java_libs: ["foo"],
4949 }
4950
4951 apex_key {
4952 name: "myapex.key",
4953 public_key: "testkey.avbpubkey",
4954 private_key: "testkey.pem",
4955 }
4956
4957 java_sdk_library {
4958 name: "foo",
4959 srcs: ["a.java"],
4960 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004961 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004962 }
Paul Duffin9b879592020-05-26 13:21:35 +01004963 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004964
4965 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004966 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004967 "javalib/foo.jar",
4968 "etc/permissions/foo.xml",
4969 })
4970 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004971 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4972 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004973}
4974
Paul Duffin9b879592020-05-26 13:21:35 +01004975func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4976 ctx, _ := testApex(t, `
4977 apex {
4978 name: "myapex",
4979 key: "myapex.key",
4980 java_libs: ["foo", "bar"],
4981 }
4982
4983 apex_key {
4984 name: "myapex.key",
4985 public_key: "testkey.avbpubkey",
4986 private_key: "testkey.pem",
4987 }
4988
4989 java_sdk_library {
4990 name: "foo",
4991 srcs: ["a.java"],
4992 api_packages: ["foo"],
4993 apex_available: ["myapex"],
4994 sdk_version: "none",
4995 system_modules: "none",
4996 }
4997
4998 java_library {
4999 name: "bar",
5000 srcs: ["a.java"],
5001 libs: ["foo"],
5002 apex_available: ["myapex"],
5003 sdk_version: "none",
5004 system_modules: "none",
5005 }
5006 `, withFiles(filesForSdkLibrary))
5007
5008 // java_sdk_library installs both impl jar and permission XML
5009 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5010 "javalib/bar.jar",
5011 "javalib/foo.jar",
5012 "etc/permissions/foo.xml",
5013 })
5014
5015 // The bar library should depend on the implementation jar.
5016 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5017 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5018 t.Errorf("expected %q, found %#q", expected, actual)
5019 }
5020}
5021
5022func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5023 ctx, _ := testApex(t, `
5024 apex {
5025 name: "myapex",
5026 key: "myapex.key",
5027 java_libs: ["foo"],
5028 }
5029
5030 apex_key {
5031 name: "myapex.key",
5032 public_key: "testkey.avbpubkey",
5033 private_key: "testkey.pem",
5034 }
5035
5036 java_sdk_library {
5037 name: "foo",
5038 srcs: ["a.java"],
5039 api_packages: ["foo"],
5040 apex_available: ["myapex"],
5041 sdk_version: "none",
5042 system_modules: "none",
5043 }
5044
5045 java_library {
5046 name: "bar",
5047 srcs: ["a.java"],
5048 libs: ["foo"],
5049 sdk_version: "none",
5050 system_modules: "none",
5051 }
5052 `, withFiles(filesForSdkLibrary))
5053
5054 // java_sdk_library installs both impl jar and permission XML
5055 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5056 "javalib/foo.jar",
5057 "etc/permissions/foo.xml",
5058 })
5059
5060 // The bar library should depend on the stubs jar.
5061 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5062 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5063 t.Errorf("expected %q, found %#q", expected, actual)
5064 }
5065}
5066
Paul Duffineedc5d52020-06-12 17:46:39 +01005067func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5068 ctx, _ := testApex(t, ``,
5069 withFiles(map[string][]byte{
5070 "apex/a.java": nil,
5071 "apex/apex_manifest.json": nil,
5072 "apex/Android.bp": []byte(`
5073 package {
5074 default_visibility: ["//visibility:private"],
5075 }
5076
5077 apex {
5078 name: "myapex",
5079 key: "myapex.key",
5080 java_libs: ["foo", "bar"],
5081 }
5082
5083 apex_key {
5084 name: "myapex.key",
5085 public_key: "testkey.avbpubkey",
5086 private_key: "testkey.pem",
5087 }
5088
5089 java_library {
5090 name: "bar",
5091 srcs: ["a.java"],
5092 libs: ["foo"],
5093 apex_available: ["myapex"],
5094 sdk_version: "none",
5095 system_modules: "none",
5096 }
5097`),
5098 "source/a.java": nil,
5099 "source/api/current.txt": nil,
5100 "source/api/removed.txt": nil,
5101 "source/Android.bp": []byte(`
5102 package {
5103 default_visibility: ["//visibility:private"],
5104 }
5105
5106 java_sdk_library {
5107 name: "foo",
5108 visibility: ["//apex"],
5109 srcs: ["a.java"],
5110 api_packages: ["foo"],
5111 apex_available: ["myapex"],
5112 sdk_version: "none",
5113 system_modules: "none",
5114 public: {
5115 enabled: true,
5116 },
5117 }
5118`),
5119 "prebuilt/a.jar": nil,
5120 "prebuilt/Android.bp": []byte(`
5121 package {
5122 default_visibility: ["//visibility:private"],
5123 }
5124
5125 java_sdk_library_import {
5126 name: "foo",
5127 visibility: ["//apex", "//source"],
5128 apex_available: ["myapex"],
5129 prefer: true,
5130 public: {
5131 jars: ["a.jar"],
5132 },
5133 }
5134`),
5135 }),
5136 )
5137
5138 // java_sdk_library installs both impl jar and permission XML
5139 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5140 "javalib/bar.jar",
5141 "javalib/foo.jar",
5142 "etc/permissions/foo.xml",
5143 })
5144
5145 // The bar library should depend on the implementation jar.
5146 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5147 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5148 t.Errorf("expected %q, found %#q", expected, actual)
5149 }
5150}
5151
5152func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5153 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5154 apex {
5155 name: "myapex",
5156 key: "myapex.key",
5157 java_libs: ["foo"],
5158 }
5159
5160 apex_key {
5161 name: "myapex.key",
5162 public_key: "testkey.avbpubkey",
5163 private_key: "testkey.pem",
5164 }
5165
5166 java_sdk_library_import {
5167 name: "foo",
5168 apex_available: ["myapex"],
5169 prefer: true,
5170 public: {
5171 jars: ["a.jar"],
5172 },
5173 }
5174
5175 `, withFiles(filesForSdkLibrary))
5176}
5177
atrost6e126252020-01-27 17:01:16 +00005178func TestCompatConfig(t *testing.T) {
5179 ctx, _ := testApex(t, `
5180 apex {
5181 name: "myapex",
5182 key: "myapex.key",
5183 prebuilts: ["myjar-platform-compat-config"],
5184 java_libs: ["myjar"],
5185 }
5186
5187 apex_key {
5188 name: "myapex.key",
5189 public_key: "testkey.avbpubkey",
5190 private_key: "testkey.pem",
5191 }
5192
5193 platform_compat_config {
5194 name: "myjar-platform-compat-config",
5195 src: ":myjar",
5196 }
5197
5198 java_library {
5199 name: "myjar",
5200 srcs: ["foo/bar/MyClass.java"],
5201 sdk_version: "none",
5202 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005203 apex_available: [ "myapex" ],
5204 }
5205 `)
5206 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5207 "etc/compatconfig/myjar-platform-compat-config.xml",
5208 "javalib/myjar.jar",
5209 })
5210}
5211
Jiyong Park479321d2019-12-16 11:47:12 +09005212func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5213 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5214 apex {
5215 name: "myapex",
5216 key: "myapex.key",
5217 java_libs: ["myjar"],
5218 }
5219
5220 apex_key {
5221 name: "myapex.key",
5222 public_key: "testkey.avbpubkey",
5223 private_key: "testkey.pem",
5224 }
5225
5226 java_library {
5227 name: "myjar",
5228 srcs: ["foo/bar/MyClass.java"],
5229 sdk_version: "none",
5230 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005231 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005232 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005233 }
5234 `)
5235}
5236
Jiyong Park7afd1072019-12-30 16:56:33 +09005237func TestCarryRequiredModuleNames(t *testing.T) {
5238 ctx, config := testApex(t, `
5239 apex {
5240 name: "myapex",
5241 key: "myapex.key",
5242 native_shared_libs: ["mylib"],
5243 }
5244
5245 apex_key {
5246 name: "myapex.key",
5247 public_key: "testkey.avbpubkey",
5248 private_key: "testkey.pem",
5249 }
5250
5251 cc_library {
5252 name: "mylib",
5253 srcs: ["mylib.cpp"],
5254 system_shared_libs: [],
5255 stl: "none",
5256 required: ["a", "b"],
5257 host_required: ["c", "d"],
5258 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005259 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005260 }
5261 `)
5262
5263 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5264 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5265 name := apexBundle.BaseModuleName()
5266 prefix := "TARGET_"
5267 var builder strings.Builder
5268 data.Custom(&builder, name, prefix, "", data)
5269 androidMk := builder.String()
5270 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5271 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5272 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5273}
5274
Jiyong Park7cd10e32020-01-14 09:22:18 +09005275func TestSymlinksFromApexToSystem(t *testing.T) {
5276 bp := `
5277 apex {
5278 name: "myapex",
5279 key: "myapex.key",
5280 native_shared_libs: ["mylib"],
5281 java_libs: ["myjar"],
5282 }
5283
Jiyong Park9d677202020-02-19 16:29:35 +09005284 apex {
5285 name: "myapex.updatable",
5286 key: "myapex.key",
5287 native_shared_libs: ["mylib"],
5288 java_libs: ["myjar"],
5289 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005290 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005291 }
5292
Jiyong Park7cd10e32020-01-14 09:22:18 +09005293 apex_key {
5294 name: "myapex.key",
5295 public_key: "testkey.avbpubkey",
5296 private_key: "testkey.pem",
5297 }
5298
5299 cc_library {
5300 name: "mylib",
5301 srcs: ["mylib.cpp"],
5302 shared_libs: ["myotherlib"],
5303 system_shared_libs: [],
5304 stl: "none",
5305 apex_available: [
5306 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005307 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005308 "//apex_available:platform",
5309 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005310 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005311 }
5312
5313 cc_library {
5314 name: "myotherlib",
5315 srcs: ["mylib.cpp"],
5316 system_shared_libs: [],
5317 stl: "none",
5318 apex_available: [
5319 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005320 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005321 "//apex_available:platform",
5322 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005323 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005324 }
5325
5326 java_library {
5327 name: "myjar",
5328 srcs: ["foo/bar/MyClass.java"],
5329 sdk_version: "none",
5330 system_modules: "none",
5331 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005332 apex_available: [
5333 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005334 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005335 "//apex_available:platform",
5336 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005337 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005338 }
5339
5340 java_library {
5341 name: "myotherjar",
5342 srcs: ["foo/bar/MyClass.java"],
5343 sdk_version: "none",
5344 system_modules: "none",
5345 apex_available: [
5346 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005347 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005348 "//apex_available:platform",
5349 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005350 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005351 }
5352 `
5353
5354 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5355 for _, f := range files {
5356 if f.path == file {
5357 if f.isLink {
5358 t.Errorf("%q is not a real file", file)
5359 }
5360 return
5361 }
5362 }
5363 t.Errorf("%q is not found", file)
5364 }
5365
5366 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5367 for _, f := range files {
5368 if f.path == file {
5369 if !f.isLink {
5370 t.Errorf("%q is not a symlink", file)
5371 }
5372 return
5373 }
5374 }
5375 t.Errorf("%q is not found", file)
5376 }
5377
Jiyong Park9d677202020-02-19 16:29:35 +09005378 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5379 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005380 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005381 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005382 ensureRealfileExists(t, files, "javalib/myjar.jar")
5383 ensureRealfileExists(t, files, "lib64/mylib.so")
5384 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5385
Jiyong Park9d677202020-02-19 16:29:35 +09005386 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5387 ensureRealfileExists(t, files, "javalib/myjar.jar")
5388 ensureRealfileExists(t, files, "lib64/mylib.so")
5389 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5390
5391 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005392 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005393 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005394 ensureRealfileExists(t, files, "javalib/myjar.jar")
5395 ensureRealfileExists(t, files, "lib64/mylib.so")
5396 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005397
5398 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5399 ensureRealfileExists(t, files, "javalib/myjar.jar")
5400 ensureRealfileExists(t, files, "lib64/mylib.so")
5401 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005402}
5403
Yo Chiange8128052020-07-23 20:09:18 +08005404func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5405 ctx, config := testApex(t, `
5406 apex {
5407 name: "myapex",
5408 key: "myapex.key",
5409 native_shared_libs: ["mylib"],
5410 }
5411
5412 apex_key {
5413 name: "myapex.key",
5414 public_key: "testkey.avbpubkey",
5415 private_key: "testkey.pem",
5416 }
5417
5418 cc_library_shared {
5419 name: "mylib",
5420 srcs: ["mylib.cpp"],
5421 shared_libs: ["myotherlib"],
5422 system_shared_libs: [],
5423 stl: "none",
5424 apex_available: [
5425 "myapex",
5426 "//apex_available:platform",
5427 ],
5428 }
5429
5430 cc_prebuilt_library_shared {
5431 name: "myotherlib",
5432 srcs: ["prebuilt.so"],
5433 system_shared_libs: [],
5434 stl: "none",
5435 apex_available: [
5436 "myapex",
5437 "//apex_available:platform",
5438 ],
5439 }
5440 `)
5441
5442 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5443 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5444 var builder strings.Builder
5445 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5446 androidMk := builder.String()
5447 // `myotherlib` is added to `myapex` as symlink
5448 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5449 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5450 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5451 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5452 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5453}
5454
Jooyung Han643adc42020-02-27 13:50:06 +09005455func TestApexWithJniLibs(t *testing.T) {
5456 ctx, _ := testApex(t, `
5457 apex {
5458 name: "myapex",
5459 key: "myapex.key",
5460 jni_libs: ["mylib"],
5461 }
5462
5463 apex_key {
5464 name: "myapex.key",
5465 public_key: "testkey.avbpubkey",
5466 private_key: "testkey.pem",
5467 }
5468
5469 cc_library {
5470 name: "mylib",
5471 srcs: ["mylib.cpp"],
5472 shared_libs: ["mylib2"],
5473 system_shared_libs: [],
5474 stl: "none",
5475 apex_available: [ "myapex" ],
5476 }
5477
5478 cc_library {
5479 name: "mylib2",
5480 srcs: ["mylib.cpp"],
5481 system_shared_libs: [],
5482 stl: "none",
5483 apex_available: [ "myapex" ],
5484 }
5485 `)
5486
5487 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5488 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5489 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5490 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5491 "lib64/mylib.so",
5492 "lib64/mylib2.so",
5493 })
5494}
5495
Jooyung Han49f67012020-04-17 13:43:10 +09005496func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5497 ctx, _ := testApex(t, `
5498 apex {
5499 name: "myapex",
5500 key: "myapex.key",
5501 }
5502 apex_key {
5503 name: "myapex.key",
5504 public_key: "testkey.avbpubkey",
5505 private_key: "testkey.pem",
5506 }
5507 `, func(fs map[string][]byte, config android.Config) {
5508 delete(config.Targets, android.Android)
5509 config.AndroidCommonTarget = android.Target{}
5510 })
5511
5512 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5513 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5514 }
5515}
5516
Jiyong Parkbd159612020-02-28 15:22:21 +09005517func TestAppBundle(t *testing.T) {
5518 ctx, _ := testApex(t, `
5519 apex {
5520 name: "myapex",
5521 key: "myapex.key",
5522 apps: ["AppFoo"],
5523 }
5524
5525 apex_key {
5526 name: "myapex.key",
5527 public_key: "testkey.avbpubkey",
5528 private_key: "testkey.pem",
5529 }
5530
5531 android_app {
5532 name: "AppFoo",
5533 srcs: ["foo/bar/MyClass.java"],
5534 sdk_version: "none",
5535 system_modules: "none",
5536 apex_available: [ "myapex" ],
5537 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005538 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005539
Colin Crosscf371cc2020-11-13 11:48:42 -08005540 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005541 content := bundleConfigRule.Args["content"]
5542
5543 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005544 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 +09005545}
5546
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005547func TestAppSetBundle(t *testing.T) {
5548 ctx, _ := testApex(t, `
5549 apex {
5550 name: "myapex",
5551 key: "myapex.key",
5552 apps: ["AppSet"],
5553 }
5554
5555 apex_key {
5556 name: "myapex.key",
5557 public_key: "testkey.avbpubkey",
5558 private_key: "testkey.pem",
5559 }
5560
5561 android_app_set {
5562 name: "AppSet",
5563 set: "AppSet.apks",
5564 }`)
5565 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005566 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005567 content := bundleConfigRule.Args["content"]
5568 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5569 s := mod.Rule("apexRule").Args["copy_commands"]
5570 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5571 if len(copyCmds) != 3 {
5572 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5573 }
5574 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5575 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5576 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5577}
5578
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005579func TestAppSetBundlePrebuilt(t *testing.T) {
5580 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5581 bp := `
5582 apex_set {
5583 name: "myapex",
5584 filename: "foo_v2.apex",
5585 sanitized: {
5586 none: { set: "myapex.apks", },
5587 hwaddress: { set: "myapex.hwasan.apks", },
5588 },
5589 }`
5590 fs["Android.bp"] = []byte(bp)
5591
5592 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5593 })
5594
5595 m := ctx.ModuleForTests("myapex", "android_common")
5596 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5597
5598 actual := extractedApex.Inputs
5599 if len(actual) != 1 {
5600 t.Errorf("expected a single input")
5601 }
5602
5603 expected := "myapex.hwasan.apks"
5604 if actual[0].String() != expected {
5605 t.Errorf("expected %s, got %s", expected, actual[0].String())
5606 }
5607}
5608
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005609func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005610 t.Helper()
5611
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005612 bp := `
5613 java_library {
5614 name: "some-updatable-apex-lib",
5615 srcs: ["a.java"],
5616 sdk_version: "current",
5617 apex_available: [
5618 "some-updatable-apex",
5619 ],
5620 }
5621
5622 java_library {
5623 name: "some-non-updatable-apex-lib",
5624 srcs: ["a.java"],
5625 apex_available: [
5626 "some-non-updatable-apex",
5627 ],
5628 }
5629
5630 java_library {
5631 name: "some-platform-lib",
5632 srcs: ["a.java"],
5633 sdk_version: "current",
5634 installable: true,
5635 }
5636
5637 java_library {
5638 name: "some-art-lib",
5639 srcs: ["a.java"],
5640 sdk_version: "current",
5641 apex_available: [
5642 "com.android.art.something",
5643 ],
5644 hostdex: true,
5645 }
5646
5647 apex {
5648 name: "some-updatable-apex",
5649 key: "some-updatable-apex.key",
5650 java_libs: ["some-updatable-apex-lib"],
5651 updatable: true,
5652 min_sdk_version: "current",
5653 }
5654
5655 apex {
5656 name: "some-non-updatable-apex",
5657 key: "some-non-updatable-apex.key",
5658 java_libs: ["some-non-updatable-apex-lib"],
5659 }
5660
5661 apex_key {
5662 name: "some-updatable-apex.key",
5663 }
5664
5665 apex_key {
5666 name: "some-non-updatable-apex.key",
5667 }
5668
5669 apex {
5670 name: "com.android.art.something",
5671 key: "com.android.art.something.key",
5672 java_libs: ["some-art-lib"],
5673 updatable: true,
5674 min_sdk_version: "current",
5675 }
5676
5677 apex_key {
5678 name: "com.android.art.something.key",
5679 }
5680
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005681 filegroup {
5682 name: "some-updatable-apex-file_contexts",
5683 srcs: [
5684 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5685 ],
5686 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005687
5688 filegroup {
5689 name: "some-non-updatable-apex-file_contexts",
5690 srcs: [
5691 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5692 ],
5693 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005694 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005695
5696 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5697}
5698
5699func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5700 t.Helper()
5701
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005702 bp += cc.GatherRequiredDepsForTest(android.Android)
5703 bp += java.GatherRequiredDepsForTest()
5704 bp += dexpreopt.BpToolModulesForTest()
5705
5706 fs := map[string][]byte{
5707 "a.java": nil,
5708 "a.jar": nil,
5709 "build/make/target/product/security": nil,
5710 "apex_manifest.json": nil,
5711 "AndroidManifest.xml": nil,
5712 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005713 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005714 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5715 "framework/aidl/a.aidl": nil,
5716 }
5717 cc.GatherRequiredFilesForTest(fs)
5718
Colin Crossae8600b2020-10-29 17:09:13 -07005719 config := android.TestArchConfig(buildDir, nil, bp, fs)
5720
5721 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005722 ctx.RegisterModuleType("apex", BundleFactory)
5723 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5724 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005725 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005726 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005727 cc.RegisterRequiredBuildComponentsForTest(ctx)
5728 java.RegisterJavaBuildComponents(ctx)
5729 java.RegisterSystemModulesBuildComponents(ctx)
5730 java.RegisterAppBuildComponents(ctx)
5731 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005732 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5733 ctx.PreDepsMutators(RegisterPreDepsMutators)
5734 ctx.PostDepsMutators(RegisterPostDepsMutators)
5735
Colin Crossae8600b2020-10-29 17:09:13 -07005736 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005737
5738 _ = dexpreopt.GlobalSoongConfigForTests(config)
5739 dexpreopt.RegisterToolModulesForTest(ctx)
5740 pathCtx := android.PathContextForTesting(config)
5741 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5742 transformDexpreoptConfig(dexpreoptConfig)
5743 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5744
5745 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5746 android.FailIfErrored(t, errs)
5747
5748 _, errs = ctx.PrepareBuildActions(config)
5749 if errmsg == "" {
5750 android.FailIfErrored(t, errs)
5751 } else if len(errs) > 0 {
5752 android.FailIfNoMatchingErrors(t, errmsg, errs)
5753 return
5754 } else {
5755 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5756 }
5757}
5758
Jooyung Han548640b2020-04-27 12:10:30 +09005759func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5760 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5761 apex {
5762 name: "myapex",
5763 key: "myapex.key",
5764 updatable: true,
5765 }
5766
5767 apex_key {
5768 name: "myapex.key",
5769 public_key: "testkey.avbpubkey",
5770 private_key: "testkey.pem",
5771 }
5772 `)
5773}
5774
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005775func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005776 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005777 var transform func(*dexpreopt.GlobalConfig)
5778
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005779 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5780 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005781 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005782 }
5783 testNoUpdatableJarsInBootImage(t, "", transform)
5784 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005785
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005786 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005787 err = `module "some-art-lib" from updatable apexes \["com.android.art.something"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005788 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005789 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005790 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005791 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005792 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005793
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005794 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 -07005795 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 +01005796 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005797 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005798 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005799 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005800 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005801
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005802 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 -07005803 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005804 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005805 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005806 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005807 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005808 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005809
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005810 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 -07005811 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 +01005812 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005813 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005814 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005815 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005816 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005817
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005818 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5819 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005820 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005821 }
5822 testNoUpdatableJarsInBootImage(t, "", transform)
5823 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005824
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005825 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005826 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005827 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005828 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005829 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005830 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005831 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005832
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005833 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005834 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005835 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005836 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005837 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005838 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005839 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005840
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005841 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005842 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005843 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005844 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005845 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005846 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005847 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005848
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005849 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5850 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005851 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005852 }
5853 testNoUpdatableJarsInBootImage(t, "", transform)
5854 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005855}
5856
Andrei Onea115e7e72020-06-05 21:14:03 +01005857func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5858 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005859 bp += `
5860 apex_key {
5861 name: "myapex.key",
5862 public_key: "testkey.avbpubkey",
5863 private_key: "testkey.pem",
5864 }`
5865 fs := map[string][]byte{
5866 "lib1/src/A.java": nil,
5867 "lib2/src/B.java": nil,
5868 "system/sepolicy/apex/myapex-file_contexts": nil,
5869 }
5870
Colin Crossae8600b2020-10-29 17:09:13 -07005871 config := android.TestArchConfig(buildDir, nil, bp, fs)
5872 android.SetTestNeverallowRules(config, rules)
5873 updatableBootJars := make([]string, 0, len(apexBootJars))
5874 for _, apexBootJar := range apexBootJars {
5875 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5876 }
5877 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5878
5879 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005880 ctx.RegisterModuleType("apex", BundleFactory)
5881 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5882 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5883 cc.RegisterRequiredBuildComponentsForTest(ctx)
5884 java.RegisterJavaBuildComponents(ctx)
5885 java.RegisterSystemModulesBuildComponents(ctx)
5886 java.RegisterDexpreoptBootJarsComponents(ctx)
5887 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5888 ctx.PreDepsMutators(RegisterPreDepsMutators)
5889 ctx.PostDepsMutators(RegisterPostDepsMutators)
5890 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5891
Colin Crossae8600b2020-10-29 17:09:13 -07005892 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005893
5894 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5895 android.FailIfErrored(t, errs)
5896
5897 _, errs = ctx.PrepareBuildActions(config)
5898 if errmsg == "" {
5899 android.FailIfErrored(t, errs)
5900 } else if len(errs) > 0 {
5901 android.FailIfNoMatchingErrors(t, errmsg, errs)
5902 return
5903 } else {
5904 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5905 }
5906}
5907
5908func TestApexPermittedPackagesRules(t *testing.T) {
5909 testcases := []struct {
5910 name string
5911 expectedError string
5912 bp string
5913 bootJars []string
5914 modulesPackages map[string][]string
5915 }{
5916
5917 {
5918 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5919 expectedError: "",
5920 bp: `
5921 java_library {
5922 name: "bcp_lib1",
5923 srcs: ["lib1/src/*.java"],
5924 permitted_packages: ["foo.bar"],
5925 apex_available: ["myapex"],
5926 sdk_version: "none",
5927 system_modules: "none",
5928 }
5929 java_library {
5930 name: "nonbcp_lib2",
5931 srcs: ["lib2/src/*.java"],
5932 apex_available: ["myapex"],
5933 permitted_packages: ["a.b"],
5934 sdk_version: "none",
5935 system_modules: "none",
5936 }
5937 apex {
5938 name: "myapex",
5939 key: "myapex.key",
5940 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5941 }`,
5942 bootJars: []string{"bcp_lib1"},
5943 modulesPackages: map[string][]string{
5944 "myapex": []string{
5945 "foo.bar",
5946 },
5947 },
5948 },
5949 {
5950 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5951 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.`,
5952 bp: `
5953 java_library {
5954 name: "bcp_lib1",
5955 srcs: ["lib1/src/*.java"],
5956 apex_available: ["myapex"],
5957 permitted_packages: ["foo.bar"],
5958 sdk_version: "none",
5959 system_modules: "none",
5960 }
5961 java_library {
5962 name: "bcp_lib2",
5963 srcs: ["lib2/src/*.java"],
5964 apex_available: ["myapex"],
5965 permitted_packages: ["foo.bar", "bar.baz"],
5966 sdk_version: "none",
5967 system_modules: "none",
5968 }
5969 apex {
5970 name: "myapex",
5971 key: "myapex.key",
5972 java_libs: ["bcp_lib1", "bcp_lib2"],
5973 }
5974 `,
5975 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5976 modulesPackages: map[string][]string{
5977 "myapex": []string{
5978 "foo.bar",
5979 },
5980 },
5981 },
5982 }
5983 for _, tc := range testcases {
5984 t.Run(tc.name, func(t *testing.T) {
5985 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5986 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5987 })
5988 }
5989}
5990
Jiyong Park62304bb2020-04-13 16:19:48 +09005991func TestTestFor(t *testing.T) {
5992 ctx, _ := testApex(t, `
5993 apex {
5994 name: "myapex",
5995 key: "myapex.key",
5996 native_shared_libs: ["mylib", "myprivlib"],
5997 }
5998
5999 apex_key {
6000 name: "myapex.key",
6001 public_key: "testkey.avbpubkey",
6002 private_key: "testkey.pem",
6003 }
6004
6005 cc_library {
6006 name: "mylib",
6007 srcs: ["mylib.cpp"],
6008 system_shared_libs: [],
6009 stl: "none",
6010 stubs: {
6011 versions: ["1"],
6012 },
6013 apex_available: ["myapex"],
6014 }
6015
6016 cc_library {
6017 name: "myprivlib",
6018 srcs: ["mylib.cpp"],
6019 system_shared_libs: [],
6020 stl: "none",
6021 apex_available: ["myapex"],
6022 }
6023
6024
6025 cc_test {
6026 name: "mytest",
6027 gtest: false,
6028 srcs: ["mylib.cpp"],
6029 system_shared_libs: [],
6030 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006031 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006032 test_for: ["myapex"]
6033 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006034
6035 cc_library {
6036 name: "mytestlib",
6037 srcs: ["mylib.cpp"],
6038 system_shared_libs: [],
6039 shared_libs: ["mylib", "myprivlib"],
6040 stl: "none",
6041 test_for: ["myapex"],
6042 }
6043
6044 cc_benchmark {
6045 name: "mybench",
6046 srcs: ["mylib.cpp"],
6047 system_shared_libs: [],
6048 shared_libs: ["mylib", "myprivlib"],
6049 stl: "none",
6050 test_for: ["myapex"],
6051 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006052 `)
6053
6054 // the test 'mytest' is a test for the apex, therefore is linked to the
6055 // actual implementation of mylib instead of its stub.
6056 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6057 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6058 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006059
6060 // The same should be true for cc_library
6061 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6062 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6063 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6064
6065 // ... and for cc_benchmark
6066 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6067 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6068 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006069}
6070
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006071// TODO(jungjw): Move this to proptools
6072func intPtr(i int) *int {
6073 return &i
6074}
6075
6076func TestApexSet(t *testing.T) {
6077 ctx, config := testApex(t, `
6078 apex_set {
6079 name: "myapex",
6080 set: "myapex.apks",
6081 filename: "foo_v2.apex",
6082 overrides: ["foo"],
6083 }
6084 `, func(fs map[string][]byte, config android.Config) {
6085 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006086 config.Targets[android.Android] = []android.Target{
6087 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6088 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6089 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006090 })
6091
6092 m := ctx.ModuleForTests("myapex", "android_common")
6093
6094 // Check extract_apks tool parameters.
6095 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6096 actual := extractedApex.Args["abis"]
6097 expected := "ARMEABI_V7A,ARM64_V8A"
6098 if actual != expected {
6099 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6100 }
6101 actual = extractedApex.Args["sdk-version"]
6102 expected = "30"
6103 if actual != expected {
6104 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6105 }
6106
6107 a := m.Module().(*ApexSet)
6108 expectedOverrides := []string{"foo"}
6109 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6110 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6111 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6112 }
6113}
6114
Jiyong Park7d95a512020-05-10 15:16:24 +09006115func TestNoStaticLinkingToStubsLib(t *testing.T) {
6116 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6117 apex {
6118 name: "myapex",
6119 key: "myapex.key",
6120 native_shared_libs: ["mylib"],
6121 }
6122
6123 apex_key {
6124 name: "myapex.key",
6125 public_key: "testkey.avbpubkey",
6126 private_key: "testkey.pem",
6127 }
6128
6129 cc_library {
6130 name: "mylib",
6131 srcs: ["mylib.cpp"],
6132 static_libs: ["otherlib"],
6133 system_shared_libs: [],
6134 stl: "none",
6135 apex_available: [ "myapex" ],
6136 }
6137
6138 cc_library {
6139 name: "otherlib",
6140 srcs: ["mylib.cpp"],
6141 system_shared_libs: [],
6142 stl: "none",
6143 stubs: {
6144 versions: ["1", "2", "3"],
6145 },
6146 apex_available: [ "myapex" ],
6147 }
6148 `)
6149}
6150
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006151func TestApexKeysTxt(t *testing.T) {
6152 ctx, _ := testApex(t, `
6153 apex {
6154 name: "myapex",
6155 key: "myapex.key",
6156 }
6157
6158 apex_key {
6159 name: "myapex.key",
6160 public_key: "testkey.avbpubkey",
6161 private_key: "testkey.pem",
6162 }
6163
6164 prebuilt_apex {
6165 name: "myapex",
6166 prefer: true,
6167 arch: {
6168 arm64: {
6169 src: "myapex-arm64.apex",
6170 },
6171 arm: {
6172 src: "myapex-arm.apex",
6173 },
6174 },
6175 }
6176
6177 apex_set {
6178 name: "myapex_set",
6179 set: "myapex.apks",
6180 filename: "myapex_set.apex",
6181 overrides: ["myapex"],
6182 }
6183 `)
6184
6185 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6186 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6187 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 +09006188 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 +09006189}
6190
Jooyung Han938b5932020-06-20 12:47:47 +09006191func TestAllowedFiles(t *testing.T) {
6192 ctx, _ := testApex(t, `
6193 apex {
6194 name: "myapex",
6195 key: "myapex.key",
6196 apps: ["app"],
6197 allowed_files: "allowed.txt",
6198 }
6199
6200 apex_key {
6201 name: "myapex.key",
6202 public_key: "testkey.avbpubkey",
6203 private_key: "testkey.pem",
6204 }
6205
6206 android_app {
6207 name: "app",
6208 srcs: ["foo/bar/MyClass.java"],
6209 package_name: "foo",
6210 sdk_version: "none",
6211 system_modules: "none",
6212 apex_available: [ "myapex" ],
6213 }
6214 `, withFiles(map[string][]byte{
6215 "sub/Android.bp": []byte(`
6216 override_apex {
6217 name: "override_myapex",
6218 base: "myapex",
6219 apps: ["override_app"],
6220 allowed_files: ":allowed",
6221 }
6222 // Overridable "path" property should be referenced indirectly
6223 filegroup {
6224 name: "allowed",
6225 srcs: ["allowed.txt"],
6226 }
6227 override_android_app {
6228 name: "override_app",
6229 base: "app",
6230 package_name: "bar",
6231 }
6232 `),
6233 }))
6234
6235 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6236 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6237 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6238 }
6239
6240 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6241 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6242 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6243 }
6244}
6245
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006246func TestNonPreferredPrebuiltDependency(t *testing.T) {
6247 _, _ = testApex(t, `
6248 apex {
6249 name: "myapex",
6250 key: "myapex.key",
6251 native_shared_libs: ["mylib"],
6252 }
6253
6254 apex_key {
6255 name: "myapex.key",
6256 public_key: "testkey.avbpubkey",
6257 private_key: "testkey.pem",
6258 }
6259
6260 cc_library {
6261 name: "mylib",
6262 srcs: ["mylib.cpp"],
6263 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006264 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006265 },
6266 apex_available: ["myapex"],
6267 }
6268
6269 cc_prebuilt_library_shared {
6270 name: "mylib",
6271 prefer: false,
6272 srcs: ["prebuilt.so"],
6273 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006274 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006275 },
6276 apex_available: ["myapex"],
6277 }
6278 `)
6279}
6280
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006281func TestCompressedApex(t *testing.T) {
6282 ctx, config := testApex(t, `
6283 apex {
6284 name: "myapex",
6285 key: "myapex.key",
6286 compressible: true,
6287 }
6288 apex_key {
6289 name: "myapex.key",
6290 public_key: "testkey.avbpubkey",
6291 private_key: "testkey.pem",
6292 }
6293 `, func(fs map[string][]byte, config android.Config) {
6294 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6295 })
6296
6297 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6298 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6299
6300 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6301 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6302
6303 // Make sure output of bundle is .capex
6304 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6305 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6306
6307 // Verify android.mk rules
6308 data := android.AndroidMkDataForTest(t, config, "", ab)
6309 var builder strings.Builder
6310 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6311 androidMk := builder.String()
6312 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6313}
6314
Martin Stjernholm2856c662020-12-02 15:03:42 +00006315func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6316 ctx, config := testApex(t, `
6317 apex {
6318 name: "myapex",
6319 key: "myapex.key",
6320 native_shared_libs: ["mylib"],
6321 }
6322
6323 apex_key {
6324 name: "myapex.key",
6325 public_key: "testkey.avbpubkey",
6326 private_key: "testkey.pem",
6327 }
6328
6329 cc_library {
6330 name: "mylib",
6331 srcs: ["mylib.cpp"],
6332 apex_available: ["myapex"],
6333 shared_libs: ["otherlib"],
6334 system_shared_libs: [],
6335 }
6336
6337 cc_library {
6338 name: "otherlib",
6339 srcs: ["mylib.cpp"],
6340 stubs: {
6341 versions: ["current"],
6342 },
6343 }
6344
6345 cc_prebuilt_library_shared {
6346 name: "otherlib",
6347 prefer: true,
6348 srcs: ["prebuilt.so"],
6349 stubs: {
6350 versions: ["current"],
6351 },
6352 }
6353 `)
6354
6355 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6356 data := android.AndroidMkDataForTest(t, config, "", ab)
6357 var builder strings.Builder
6358 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6359 androidMk := builder.String()
6360
6361 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6362 // a thing there.
6363 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6364}
6365
Jiyong Parke3867542020-12-03 17:28:25 +09006366func TestExcludeDependency(t *testing.T) {
6367 ctx, _ := testApex(t, `
6368 apex {
6369 name: "myapex",
6370 key: "myapex.key",
6371 native_shared_libs: ["mylib"],
6372 }
6373
6374 apex_key {
6375 name: "myapex.key",
6376 public_key: "testkey.avbpubkey",
6377 private_key: "testkey.pem",
6378 }
6379
6380 cc_library {
6381 name: "mylib",
6382 srcs: ["mylib.cpp"],
6383 system_shared_libs: [],
6384 stl: "none",
6385 apex_available: ["myapex"],
6386 shared_libs: ["mylib2"],
6387 target: {
6388 apex: {
6389 exclude_shared_libs: ["mylib2"],
6390 },
6391 },
6392 }
6393
6394 cc_library {
6395 name: "mylib2",
6396 srcs: ["mylib.cpp"],
6397 system_shared_libs: [],
6398 stl: "none",
6399 }
6400 `)
6401
6402 // Check if mylib is linked to mylib2 for the non-apex target
6403 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6404 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6405
6406 // Make sure that the link doesn't occur for the apex target
6407 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6408 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6409
6410 // It shouldn't appear in the copy cmd as well.
6411 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6412 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6413}
6414
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006415func TestPrebuiltStubLibDep(t *testing.T) {
6416 bpBase := `
6417 apex {
6418 name: "myapex",
6419 key: "myapex.key",
6420 native_shared_libs: ["mylib"],
6421 }
6422 apex_key {
6423 name: "myapex.key",
6424 public_key: "testkey.avbpubkey",
6425 private_key: "testkey.pem",
6426 }
6427 cc_library {
6428 name: "mylib",
6429 srcs: ["mylib.cpp"],
6430 apex_available: ["myapex"],
6431 shared_libs: ["stublib"],
6432 system_shared_libs: [],
6433 }
6434 apex {
6435 name: "otherapex",
6436 enabled: %s,
6437 key: "myapex.key",
6438 native_shared_libs: ["stublib"],
6439 }
6440 `
6441
6442 stublibSourceBp := `
6443 cc_library {
6444 name: "stublib",
6445 srcs: ["mylib.cpp"],
6446 apex_available: ["otherapex"],
6447 system_shared_libs: [],
6448 stl: "none",
6449 stubs: {
6450 versions: ["1"],
6451 },
6452 }
6453 `
6454
6455 stublibPrebuiltBp := `
6456 cc_prebuilt_library_shared {
6457 name: "stublib",
6458 srcs: ["prebuilt.so"],
6459 apex_available: ["otherapex"],
6460 stubs: {
6461 versions: ["1"],
6462 },
6463 %s
6464 }
6465 `
6466
6467 tests := []struct {
6468 name string
6469 stublibBp string
6470 usePrebuilt bool
6471 modNames []string // Modules to collect AndroidMkEntries for
6472 otherApexEnabled []string
6473 }{
6474 {
6475 name: "only_source",
6476 stublibBp: stublibSourceBp,
6477 usePrebuilt: false,
6478 modNames: []string{"stublib"},
6479 otherApexEnabled: []string{"true", "false"},
6480 },
6481 {
6482 name: "source_preferred",
6483 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
6484 usePrebuilt: false,
6485 modNames: []string{"stublib", "prebuilt_stublib"},
6486 otherApexEnabled: []string{"true", "false"},
6487 },
6488 {
6489 name: "prebuilt_preferred",
6490 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
6491 usePrebuilt: true,
6492 modNames: []string{"stublib", "prebuilt_stublib"},
6493 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6494 },
6495 {
6496 name: "only_prebuilt",
6497 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
6498 usePrebuilt: true,
6499 modNames: []string{"stublib"},
6500 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6501 },
6502 }
6503
6504 for _, test := range tests {
6505 t.Run(test.name, func(t *testing.T) {
6506 for _, otherApexEnabled := range test.otherApexEnabled {
6507 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
6508 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
6509
6510 type modAndMkEntries struct {
6511 mod *cc.Module
6512 mkEntries android.AndroidMkEntries
6513 }
6514 entries := []*modAndMkEntries{}
6515
6516 // Gather shared lib modules that are installable
6517 for _, modName := range test.modNames {
6518 for _, variant := range ctx.ModuleVariantsForTests(modName) {
6519 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
6520 continue
6521 }
6522 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
6523 if !mod.Enabled() || mod.IsSkipInstall() {
6524 continue
6525 }
6526 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
6527 if ent.Disabled {
6528 continue
6529 }
6530 entries = append(entries, &modAndMkEntries{
6531 mod: mod,
6532 mkEntries: ent,
6533 })
6534 }
6535 }
6536 }
6537
6538 var entry *modAndMkEntries = nil
6539 for _, ent := range entries {
6540 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
6541 if entry != nil {
6542 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
6543 } else {
6544 entry = ent
6545 }
6546 }
6547 }
6548
6549 if entry == nil {
6550 t.Errorf("AndroidMk entry for \"stublib\" missing")
6551 } else {
6552 isPrebuilt := entry.mod.Prebuilt() != nil
6553 if isPrebuilt != test.usePrebuilt {
6554 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
6555 }
6556 if !entry.mod.IsStubs() {
6557 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
6558 }
6559 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
6560 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
6561 }
Jiyong Park892a98f2020-12-14 09:20:00 +09006562 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
6563 expected := "-D__STUBLIB_API__=1"
6564 if !android.InList(expected, cflags) {
6565 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
6566 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006567 }
6568 })
6569 }
6570 })
6571 }
6572}
6573
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006574func TestMain(m *testing.M) {
6575 run := func() int {
6576 setUp()
6577 defer tearDown()
6578
6579 return m.Run()
6580 }
6581
6582 os.Exit(run())
6583}