blob: 9761e55ecc60ac2df94d39a3d4c3e29c1440930e [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,
Paul Duffin064b70c2020-11-02 17:32:38 +0000193 "libfoo.jar": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900194 }
195
Colin Crossf9aabd72020-02-15 11:29:50 -0800196 cc.GatherRequiredFilesForTest(fs)
197
Jooyung Han344d5432019-08-23 11:17:39 +0900198 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800199 // The fs now needs to be populated before creating the config, call handlers twice
200 // for now, once to get any fs changes, and later after the config was created to
201 // set product variables or targets.
202 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
203 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900204 }
205
Colin Cross98be1bb2019-12-13 20:41:13 -0800206 config := android.TestArchConfig(buildDir, nil, bp, fs)
207 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
208 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
209 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
210 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
211 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700212 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800213 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
214
215 for _, handler := range handlers {
216 // The fs now needs to be populated before creating the config, call handlers twice
217 // for now, earlier to get any fs changes, and now after the config was created to
218 // set product variables or targets.
219 tempFS := map[string][]byte{}
220 handler(tempFS, config)
221 }
222
Colin Crossae8600b2020-10-29 17:09:13 -0700223 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100224
225 // from android package
226 android.RegisterPackageBuildComponents(ctx)
227 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
228
Colin Cross98be1bb2019-12-13 20:41:13 -0800229 ctx.RegisterModuleType("apex", BundleFactory)
230 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
231 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
232 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
233 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
234 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
235 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700236 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800237
Jooyung Hana57af4a2020-01-23 05:36:59 +0000238 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100239 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000240 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
241
Paul Duffin021f4e52020-07-30 16:04:17 +0100242 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100243
Paul Duffin021f4e52020-07-30 16:04:17 +0100244 // Register these after the prebuilt mutators have been registered to match what
245 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100246 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
247 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
248
Paul Duffin021f4e52020-07-30 16:04:17 +0100249 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900250 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +0000251 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100252
Colin Cross98be1bb2019-12-13 20:41:13 -0800253 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800254 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800255 cc.RegisterVndkLibraryTxtTypes(ctx)
Jooyung Han0703fd82020-08-26 22:11:53 +0900256 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000257 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700258 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900260 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800261 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262
Colin Cross98be1bb2019-12-13 20:41:13 -0800263 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265
Colin Crossae8600b2020-10-29 17:09:13 -0700266 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269}
270
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271func setUp() {
272 var err error
273 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700279func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700280 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281}
282
Jooyung Han643adc42020-02-27 13:50:06 +0900283// ensure that 'result' equals 'expected'
284func ensureEquals(t *testing.T, result string, expected string) {
285 t.Helper()
286 if result != expected {
287 t.Errorf("%q != %q", expected, result)
288 }
289}
290
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291// ensure that 'result' contains 'expected'
292func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if !strings.Contains(result, expected) {
295 t.Errorf("%q is not found in %q", expected, result)
296 }
297}
298
Liz Kammer5bd365f2020-05-27 15:15:11 -0700299// ensure that 'result' contains 'expected' exactly one time
300func ensureContainsOnce(t *testing.T, result string, expected string) {
301 t.Helper()
302 count := strings.Count(result, expected)
303 if count != 1 {
304 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// ensures that 'result' does not contain 'notExpected'
309func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900310 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311 if strings.Contains(result, notExpected) {
312 t.Errorf("%q is found in %q", notExpected, result)
313 }
314}
315
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700316func ensureMatches(t *testing.T, result string, expectedRex string) {
317 ok, err := regexp.MatchString(expectedRex, result)
318 if err != nil {
319 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
320 return
321 }
322 if !ok {
323 t.Errorf("%s does not match regular expession %s", result, expectedRex)
324 }
325}
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900328 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900329 if !android.InList(expected, result) {
330 t.Errorf("%q is not found in %v", expected, result)
331 }
332}
333
334func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900335 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900336 if android.InList(notExpected, result) {
337 t.Errorf("%q is found in %v", notExpected, result)
338 }
339}
340
Jooyung Hane1633032019-08-01 17:41:43 +0900341func ensureListEmpty(t *testing.T, result []string) {
342 t.Helper()
343 if len(result) > 0 {
344 t.Errorf("%q is expected to be empty", result)
345 }
346}
347
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000348func ensureListNotEmpty(t *testing.T, result []string) {
349 t.Helper()
350 if len(result) == 0 {
351 t.Errorf("%q is expected to be not empty", result)
352 }
353}
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355// Minimal test
356func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900357 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900358 apex_defaults {
359 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900360 manifest: ":myapex.manifest",
361 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900363 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900364 native_shared_libs: [
365 "mylib",
366 "libfoo.ffi",
367 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900368 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800369 multilib: {
370 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900371 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800372 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900373 },
Jiyong Park77acec62020-06-01 21:39:15 +0900374 java_libs: [
375 "myjar",
376 "myjar_dex",
377 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900378 }
379
Jiyong Park30ca9372019-02-07 16:27:23 +0900380 apex {
381 name: "myapex",
382 defaults: ["myapex-defaults"],
383 }
384
Jiyong Park25fc6a92018-11-18 18:02:45 +0900385 apex_key {
386 name: "myapex.key",
387 public_key: "testkey.avbpubkey",
388 private_key: "testkey.pem",
389 }
390
Jiyong Park809bb722019-02-13 21:33:49 +0900391 filegroup {
392 name: "myapex.manifest",
393 srcs: ["apex_manifest.json"],
394 }
395
396 filegroup {
397 name: "myapex.androidmanifest",
398 srcs: ["AndroidManifest.xml"],
399 }
400
Jiyong Park25fc6a92018-11-18 18:02:45 +0900401 cc_library {
402 name: "mylib",
403 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900404 shared_libs: [
405 "mylib2",
406 "libbar.ffi",
407 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900408 system_shared_libs: [],
409 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000410 // TODO: remove //apex_available:platform
411 apex_available: [
412 "//apex_available:platform",
413 "myapex",
414 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900415 }
416
Alex Light3d673592019-01-18 14:37:31 -0800417 cc_binary {
418 name: "foo",
419 srcs: ["mylib.cpp"],
420 compile_multilib: "both",
421 multilib: {
422 lib32: {
423 suffix: "32",
424 },
425 lib64: {
426 suffix: "64",
427 },
428 },
429 symlinks: ["foo_link_"],
430 symlink_preferred_arch: true,
431 system_shared_libs: [],
432 static_executable: true,
433 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex_available: [ "myapex", "com.android.gki.*" ],
435 }
436
Jiyong Park99644e92020-11-17 22:21:02 +0900437 rust_binary {
438 name: "foo.rust",
439 srcs: ["foo.rs"],
440 rlibs: ["libfoo.rlib.rust"],
441 dylibs: ["libfoo.dylib.rust"],
442 apex_available: ["myapex"],
443 }
444
445 rust_library_rlib {
446 name: "libfoo.rlib.rust",
447 srcs: ["foo.rs"],
448 crate_name: "foo",
449 apex_available: ["myapex"],
450 }
451
452 rust_library_dylib {
453 name: "libfoo.dylib.rust",
454 srcs: ["foo.rs"],
455 crate_name: "foo",
456 apex_available: ["myapex"],
457 }
458
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900459 rust_ffi_shared {
460 name: "libfoo.ffi",
461 srcs: ["foo.rs"],
462 crate_name: "foo",
463 apex_available: ["myapex"],
464 }
465
466 rust_ffi_shared {
467 name: "libbar.ffi",
468 srcs: ["foo.rs"],
469 crate_name: "bar",
470 apex_available: ["myapex"],
471 }
472
Yifan Hongd22a84a2020-07-28 17:37:46 -0700473 apex {
474 name: "com.android.gki.fake",
475 binaries: ["foo"],
476 key: "myapex.key",
477 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800478 }
479
Paul Duffindddd5462020-04-07 15:25:44 +0100480 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900481 name: "mylib2",
482 srcs: ["mylib.cpp"],
483 system_shared_libs: [],
484 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900485 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900486 static_libs: ["libstatic"],
487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
492 }
493
Paul Duffindddd5462020-04-07 15:25:44 +0100494 cc_prebuilt_library_shared {
495 name: "mylib2",
496 srcs: ["prebuilt.so"],
497 // TODO: remove //apex_available:platform
498 apex_available: [
499 "//apex_available:platform",
500 "myapex",
501 ],
502 }
503
Jiyong Park9918e1a2020-03-17 19:16:40 +0900504 cc_library_static {
505 name: "libstatic",
506 srcs: ["mylib.cpp"],
507 system_shared_libs: [],
508 stl: "none",
509 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000510 // TODO: remove //apex_available:platform
511 apex_available: [
512 "//apex_available:platform",
513 "myapex",
514 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900516
517 java_library {
518 name: "myjar",
519 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900520 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900521 sdk_version: "none",
522 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900523 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900524 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000525 // TODO: remove //apex_available:platform
526 apex_available: [
527 "//apex_available:platform",
528 "myapex",
529 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900530 }
531
Jiyong Park77acec62020-06-01 21:39:15 +0900532 dex_import {
533 name: "myjar_dex",
534 jars: ["prebuilt.jar"],
535 apex_available: [
536 "//apex_available:platform",
537 "myapex",
538 ],
539 }
540
Jiyong Park7f7766d2019-07-25 22:02:35 +0900541 java_library {
542 name: "myotherjar",
543 srcs: ["foo/bar/MyClass.java"],
544 sdk_version: "none",
545 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900546 // TODO: remove //apex_available:platform
547 apex_available: [
548 "//apex_available:platform",
549 "myapex",
550 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900551 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900552
553 java_library {
554 name: "mysharedjar",
555 srcs: ["foo/bar/MyClass.java"],
556 sdk_version: "none",
557 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900558 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559 `)
560
Sundong Ahnabb64432019-10-22 13:58:29 +0900561 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900562
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900563 // Make sure that Android.mk is created
564 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
565 data := android.AndroidMkDataForTest(t, config, "", ab)
566 var builder strings.Builder
567 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
568
569 androidMk := builder.String()
570 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
571 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
572
Jiyong Park42cca6c2019-04-01 11:15:50 +0900573 optFlags := apexRule.Args["opt_flags"]
574 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700575 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900576 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900577
Jiyong Park25fc6a92018-11-18 18:02:45 +0900578 copyCmds := apexRule.Args["copy_commands"]
579
580 // Ensure that main rule creates an output
581 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
582
583 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700584 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
585 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900587 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900588 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900589
590 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700591 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
592 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900593 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
594 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900595 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900596
597 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800598 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
599 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900600 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900601 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900602 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900603 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
604 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900605 // .. but not for java libs
606 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900607 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800608
Colin Cross7113d202019-11-20 16:39:12 -0800609 // Ensure that the platform variant ends with _shared or _common
610 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
611 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900612 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
613 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900614 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
615
616 // Ensure that dynamic dependency to java libs are not included
617 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800618
619 // Ensure that all symlinks are present.
620 found_foo_link_64 := false
621 found_foo := false
622 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900623 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800624 if strings.HasSuffix(cmd, "bin/foo") {
625 found_foo = true
626 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
627 found_foo_link_64 = true
628 }
629 }
630 }
631 good := found_foo && found_foo_link_64
632 if !good {
633 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
634 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900635
Sundong Ahnabb64432019-10-22 13:58:29 +0900636 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700637 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900638 if len(noticeInputs) != 3 {
639 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900640 }
641 ensureListContains(t, noticeInputs, "NOTICE")
642 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900643 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900644
Artur Satayeva8bd1132020-04-27 18:07:06 +0100645 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100646 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
647 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
648 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
649 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
650 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100651
652 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100653 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
654 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
655 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
656 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
657 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800658}
659
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660func TestDefaults(t *testing.T) {
661 ctx, _ := testApex(t, `
662 apex_defaults {
663 name: "myapex-defaults",
664 key: "myapex.key",
665 prebuilts: ["myetc"],
666 native_shared_libs: ["mylib"],
667 java_libs: ["myjar"],
668 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900669 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800670 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900671 }
672
673 prebuilt_etc {
674 name: "myetc",
675 src: "myprebuilt",
676 }
677
678 apex {
679 name: "myapex",
680 defaults: ["myapex-defaults"],
681 }
682
683 apex_key {
684 name: "myapex.key",
685 public_key: "testkey.avbpubkey",
686 private_key: "testkey.pem",
687 }
688
689 cc_library {
690 name: "mylib",
691 system_shared_libs: [],
692 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000693 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900694 }
695
696 java_library {
697 name: "myjar",
698 srcs: ["foo/bar/MyClass.java"],
699 sdk_version: "none",
700 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000701 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900702 }
703
704 android_app {
705 name: "AppFoo",
706 srcs: ["foo/bar/MyClass.java"],
707 sdk_version: "none",
708 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000709 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900710 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900711
712 runtime_resource_overlay {
713 name: "rro",
714 theme: "blue",
715 }
716
markchien2f59ec92020-09-02 16:23:38 +0800717 bpf {
718 name: "bpf",
719 srcs: ["bpf.c", "bpf2.c"],
720 }
721
Jooyung Hanf21c7972019-12-16 22:32:06 +0900722 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000723 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900724 "etc/myetc",
725 "javalib/myjar.jar",
726 "lib64/mylib.so",
727 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900728 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800729 "etc/bpf/bpf.o",
730 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900731 })
732}
733
Jooyung Han01a3ee22019-11-02 02:52:25 +0900734func TestApexManifest(t *testing.T) {
735 ctx, _ := testApex(t, `
736 apex {
737 name: "myapex",
738 key: "myapex.key",
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746 `)
747
748 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900749 args := module.Rule("apexRule").Args
750 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
751 t.Error("manifest should be apex_manifest.pb, but " + manifest)
752 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900753}
754
Alex Light5098a612018-11-29 17:12:15 -0800755func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700756 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800757 apex {
758 name: "myapex",
759 key: "myapex.key",
760 payload_type: "zip",
761 native_shared_libs: ["mylib"],
762 }
763
764 apex_key {
765 name: "myapex.key",
766 public_key: "testkey.avbpubkey",
767 private_key: "testkey.pem",
768 }
769
770 cc_library {
771 name: "mylib",
772 srcs: ["mylib.cpp"],
773 shared_libs: ["mylib2"],
774 system_shared_libs: [],
775 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000776 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800777 }
778
779 cc_library {
780 name: "mylib2",
781 srcs: ["mylib.cpp"],
782 system_shared_libs: [],
783 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000784 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800785 }
786 `)
787
Sundong Ahnabb64432019-10-22 13:58:29 +0900788 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800789 copyCmds := zipApexRule.Args["copy_commands"]
790
791 // Ensure that main rule creates an output
792 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
793
794 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700795 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800796
797 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700798 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800799
800 // Ensure that both direct and indirect deps are copied into apex
801 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
802 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900803}
804
805func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700806 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807 apex {
808 name: "myapex",
809 key: "myapex.key",
810 native_shared_libs: ["mylib", "mylib3"],
811 }
812
813 apex_key {
814 name: "myapex.key",
815 public_key: "testkey.avbpubkey",
816 private_key: "testkey.pem",
817 }
818
819 cc_library {
820 name: "mylib",
821 srcs: ["mylib.cpp"],
822 shared_libs: ["mylib2", "mylib3"],
823 system_shared_libs: [],
824 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000825 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826 }
827
828 cc_library {
829 name: "mylib2",
830 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900831 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900832 system_shared_libs: [],
833 stl: "none",
834 stubs: {
835 versions: ["1", "2", "3"],
836 },
837 }
838
839 cc_library {
840 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900841 srcs: ["mylib.cpp"],
842 shared_libs: ["mylib4"],
843 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900844 stl: "none",
845 stubs: {
846 versions: ["10", "11", "12"],
847 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000848 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900849 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900850
851 cc_library {
852 name: "mylib4",
853 srcs: ["mylib.cpp"],
854 system_shared_libs: [],
855 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000856 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900857 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900858 `)
859
Sundong Ahnabb64432019-10-22 13:58:29 +0900860 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 copyCmds := apexRule.Args["copy_commands"]
862
863 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800864 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865
866 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800867 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868
869 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800870 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871
Colin Crossaede88c2020-08-11 12:17:01 -0700872 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873
874 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900875 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900876 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900877 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878
879 // 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 -0700880 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700882 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900883
884 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900885 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900886 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900887
888 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700889 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900890
Jooyung Hana57af4a2020-01-23 05:36:59 +0000891 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900892 "lib64/mylib.so",
893 "lib64/mylib3.so",
894 "lib64/mylib4.so",
895 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896}
897
Colin Cross7812fd32020-09-25 12:35:10 -0700898func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
899 t.Parallel()
900 ctx, _ := testApex(t, `
901 apex {
902 name: "myapex",
903 key: "myapex.key",
904 native_shared_libs: ["mylib", "mylib3"],
905 min_sdk_version: "29",
906 }
907
908 apex_key {
909 name: "myapex.key",
910 public_key: "testkey.avbpubkey",
911 private_key: "testkey.pem",
912 }
913
914 cc_library {
915 name: "mylib",
916 srcs: ["mylib.cpp"],
917 shared_libs: ["mylib2", "mylib3"],
918 system_shared_libs: [],
919 stl: "none",
920 apex_available: [ "myapex" ],
921 min_sdk_version: "28",
922 }
923
924 cc_library {
925 name: "mylib2",
926 srcs: ["mylib.cpp"],
927 cflags: ["-include mylib.h"],
928 system_shared_libs: [],
929 stl: "none",
930 stubs: {
931 versions: ["28", "29", "30", "current"],
932 },
933 min_sdk_version: "28",
934 }
935
936 cc_library {
937 name: "mylib3",
938 srcs: ["mylib.cpp"],
939 shared_libs: ["mylib4"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["28", "29", "30", "current"],
944 },
945 apex_available: [ "myapex" ],
946 min_sdk_version: "28",
947 }
948
949 cc_library {
950 name: "mylib4",
951 srcs: ["mylib.cpp"],
952 system_shared_libs: [],
953 stl: "none",
954 apex_available: [ "myapex" ],
955 min_sdk_version: "28",
956 }
957 `)
958
959 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
960 copyCmds := apexRule.Args["copy_commands"]
961
962 // Ensure that direct non-stubs dep is always included
963 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
964
965 // Ensure that indirect stubs dep is not included
966 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
967
968 // Ensure that direct stubs dep is included
969 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
970
971 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
972
973 // Ensure that mylib is linking with the version 29 stubs for mylib2
974 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
975 // ... and not linking to the non-stub (impl) variant of mylib2
976 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
977
978 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
979 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
980 // .. and not linking to the stubs variant of mylib3
981 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
982
983 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700984 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700985 ensureNotContains(t, mylib2Cflags, "-include ")
986
987 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700988 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700989
990 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
991 "lib64/mylib.so",
992 "lib64/mylib3.so",
993 "lib64/mylib4.so",
994 })
995}
996
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900997func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700998 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900999 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001000 name: "myapex2",
1001 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001002 native_shared_libs: ["mylib"],
1003 }
1004
1005 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001006 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001007 public_key: "testkey.avbpubkey",
1008 private_key: "testkey.pem",
1009 }
1010
1011 cc_library {
1012 name: "mylib",
1013 srcs: ["mylib.cpp"],
1014 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001015 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001016 system_shared_libs: [],
1017 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001018 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001019 }
1020
1021 cc_library {
1022 name: "libfoo",
1023 srcs: ["mylib.cpp"],
1024 shared_libs: ["libbar"],
1025 system_shared_libs: [],
1026 stl: "none",
1027 stubs: {
1028 versions: ["10", "20", "30"],
1029 },
1030 }
1031
1032 cc_library {
1033 name: "libbar",
1034 srcs: ["mylib.cpp"],
1035 system_shared_libs: [],
1036 stl: "none",
1037 }
1038
Jiyong Park678c8812020-02-07 17:25:49 +09001039 cc_library_static {
1040 name: "libbaz",
1041 srcs: ["mylib.cpp"],
1042 system_shared_libs: [],
1043 stl: "none",
1044 apex_available: [ "myapex2" ],
1045 }
1046
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001047 `)
1048
Jiyong Park83dc74b2020-01-14 18:38:44 +09001049 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001050 copyCmds := apexRule.Args["copy_commands"]
1051
1052 // Ensure that direct non-stubs dep is always included
1053 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1054
1055 // Ensure that indirect stubs dep is not included
1056 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1057
1058 // Ensure that dependency of stubs is not included
1059 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1060
Colin Crossaede88c2020-08-11 12:17:01 -07001061 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001062
1063 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001064 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001065 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001066 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001067
Jiyong Park3ff16992019-12-27 14:11:47 +09001068 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001069
1070 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1071 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001072
Artur Satayeva8bd1132020-04-27 18:07:06 +01001073 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001074 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1075 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1076 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001077
Artur Satayeva8bd1132020-04-27 18:07:06 +01001078 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001079 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1080 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1081 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001082}
1083
Jooyung Hand3639552019-08-09 12:57:43 +09001084func TestApexWithRuntimeLibsDependency(t *testing.T) {
1085 /*
1086 myapex
1087 |
1088 v (runtime_libs)
1089 mylib ------+------> libfoo [provides stub]
1090 |
1091 `------> libbar
1092 */
1093 ctx, _ := testApex(t, `
1094 apex {
1095 name: "myapex",
1096 key: "myapex.key",
1097 native_shared_libs: ["mylib"],
1098 }
1099
1100 apex_key {
1101 name: "myapex.key",
1102 public_key: "testkey.avbpubkey",
1103 private_key: "testkey.pem",
1104 }
1105
1106 cc_library {
1107 name: "mylib",
1108 srcs: ["mylib.cpp"],
1109 runtime_libs: ["libfoo", "libbar"],
1110 system_shared_libs: [],
1111 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001112 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001113 }
1114
1115 cc_library {
1116 name: "libfoo",
1117 srcs: ["mylib.cpp"],
1118 system_shared_libs: [],
1119 stl: "none",
1120 stubs: {
1121 versions: ["10", "20", "30"],
1122 },
1123 }
1124
1125 cc_library {
1126 name: "libbar",
1127 srcs: ["mylib.cpp"],
1128 system_shared_libs: [],
1129 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001130 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001131 }
1132
1133 `)
1134
Sundong Ahnabb64432019-10-22 13:58:29 +09001135 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001136 copyCmds := apexRule.Args["copy_commands"]
1137
1138 // Ensure that direct non-stubs dep is always included
1139 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1140
1141 // Ensure that indirect stubs dep is not included
1142 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1143
1144 // Ensure that runtime_libs dep in included
1145 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1146
Sundong Ahnabb64432019-10-22 13:58:29 +09001147 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001148 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1149 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001150
1151}
1152
Jooyung Han8ce8db92020-05-15 19:05:05 +09001153func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1154 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1155 bp := `
1156 apex {
1157 name: "com.android.runtime",
1158 key: "com.android.runtime.key",
1159 native_shared_libs: ["libc"],
1160 }
1161
1162 apex_key {
1163 name: "com.android.runtime.key",
1164 public_key: "testkey.avbpubkey",
1165 private_key: "testkey.pem",
1166 }
1167
1168 cc_library {
1169 name: "libc",
1170 no_libcrt: true,
1171 nocrt: true,
1172 stl: "none",
1173 system_shared_libs: [],
1174 stubs: { versions: ["1"] },
1175 apex_available: ["com.android.runtime"],
1176
1177 sanitize: {
1178 hwaddress: true,
1179 }
1180 }
1181
1182 cc_prebuilt_library_shared {
1183 name: "libclang_rt.hwasan-aarch64-android",
1184 no_libcrt: true,
1185 nocrt: true,
1186 stl: "none",
1187 system_shared_libs: [],
1188 srcs: [""],
1189 stubs: { versions: ["1"] },
1190
1191 sanitize: {
1192 never: true,
1193 },
1194 }
1195 `
1196 // override bp to use hard-coded names: com.android.runtime and libc
1197 fs["Android.bp"] = []byte(bp)
1198 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1199 })
1200
1201 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1202 "lib64/bionic/libc.so",
1203 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1204 })
1205
1206 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1207
1208 installed := hwasan.Description("install libclang_rt.hwasan")
1209 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1210
1211 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1212 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1213 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1214}
1215
1216func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1217 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1218 bp := `
1219 apex {
1220 name: "com.android.runtime",
1221 key: "com.android.runtime.key",
1222 native_shared_libs: ["libc"],
1223 }
1224
1225 apex_key {
1226 name: "com.android.runtime.key",
1227 public_key: "testkey.avbpubkey",
1228 private_key: "testkey.pem",
1229 }
1230
1231 cc_library {
1232 name: "libc",
1233 no_libcrt: true,
1234 nocrt: true,
1235 stl: "none",
1236 system_shared_libs: [],
1237 stubs: { versions: ["1"] },
1238 apex_available: ["com.android.runtime"],
1239 }
1240
1241 cc_prebuilt_library_shared {
1242 name: "libclang_rt.hwasan-aarch64-android",
1243 no_libcrt: true,
1244 nocrt: true,
1245 stl: "none",
1246 system_shared_libs: [],
1247 srcs: [""],
1248 stubs: { versions: ["1"] },
1249
1250 sanitize: {
1251 never: true,
1252 },
1253 }
1254 `
1255 // override bp to use hard-coded names: com.android.runtime and libc
1256 fs["Android.bp"] = []byte(bp)
1257 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1258
1259 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1260 })
1261
1262 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1263 "lib64/bionic/libc.so",
1264 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1265 })
1266
1267 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1268
1269 installed := hwasan.Description("install libclang_rt.hwasan")
1270 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1271
1272 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1273 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1274 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1275}
1276
Jooyung Han61b66e92020-03-21 14:21:46 +00001277func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1278 testcases := []struct {
1279 name string
1280 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001281 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001282 shouldLink string
1283 shouldNotLink []string
1284 }{
1285 {
Jooyung Han75568392020-03-20 04:29:24 +09001286 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001287 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001288 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001289 shouldLink: "30",
1290 shouldNotLink: []string{"29"},
1291 },
1292 {
1293 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001294 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001295 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001296 shouldLink: "29",
1297 shouldNotLink: []string{"30"},
1298 },
1299 }
1300 for _, tc := range testcases {
1301 t.Run(tc.name, func(t *testing.T) {
1302 ctx, _ := testApex(t, `
1303 apex {
1304 name: "myapex",
1305 key: "myapex.key",
1306 use_vendor: true,
1307 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001308 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001309 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001310
Jooyung Han61b66e92020-03-21 14:21:46 +00001311 apex_key {
1312 name: "myapex.key",
1313 public_key: "testkey.avbpubkey",
1314 private_key: "testkey.pem",
1315 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001316
Jooyung Han61b66e92020-03-21 14:21:46 +00001317 cc_library {
1318 name: "mylib",
1319 srcs: ["mylib.cpp"],
1320 vendor_available: true,
1321 shared_libs: ["libbar"],
1322 system_shared_libs: [],
1323 stl: "none",
1324 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001325 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001326 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001327
Jooyung Han61b66e92020-03-21 14:21:46 +00001328 cc_library {
1329 name: "libbar",
1330 srcs: ["mylib.cpp"],
1331 system_shared_libs: [],
1332 stl: "none",
1333 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001334 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001335 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001336
Jooyung Han61b66e92020-03-21 14:21:46 +00001337 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001338 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001339 symbol_file: "",
1340 }
1341 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001342 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001343 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001344
Jooyung Han61b66e92020-03-21 14:21:46 +00001345 // Ensure that LLNDK dep is not included
1346 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1347 "lib64/mylib.so",
1348 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001349
Jooyung Han61b66e92020-03-21 14:21:46 +00001350 // Ensure that LLNDK dep is required
1351 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1352 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1353 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001354
Colin Crossaede88c2020-08-11 12:17:01 -07001355 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001356 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001357 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001358 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001359 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001360
Colin Crossaede88c2020-08-11 12:17:01 -07001361 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001362 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1363 })
1364 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001365}
1366
Jiyong Park25fc6a92018-11-18 18:02:45 +09001367func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001368 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001369 apex {
1370 name: "myapex",
1371 key: "myapex.key",
1372 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1373 }
1374
1375 apex_key {
1376 name: "myapex.key",
1377 public_key: "testkey.avbpubkey",
1378 private_key: "testkey.pem",
1379 }
1380
1381 cc_library {
1382 name: "mylib",
1383 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001384 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001385 shared_libs: ["libdl#27"],
1386 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001387 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001388 }
1389
1390 cc_library_shared {
1391 name: "mylib_shared",
1392 srcs: ["mylib.cpp"],
1393 shared_libs: ["libdl#27"],
1394 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001395 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001396 }
1397
1398 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001399 name: "libBootstrap",
1400 srcs: ["mylib.cpp"],
1401 stl: "none",
1402 bootstrap: true,
1403 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001404 `)
1405
Sundong Ahnabb64432019-10-22 13:58:29 +09001406 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001407 copyCmds := apexRule.Args["copy_commands"]
1408
1409 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001410 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001411 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1412 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001413
1414 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001415 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001416
Colin Crossaede88c2020-08-11 12:17:01 -07001417 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1418 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1419 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001420
1421 // For dependency to libc
1422 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001423 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001424 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001425 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001426 // ... Cflags from stub is correctly exported to mylib
1427 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1428 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1429
1430 // For dependency to libm
1431 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001432 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001433 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001434 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001435 // ... and is not compiling with the stub
1436 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1437 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1438
1439 // For dependency to libdl
1440 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001441 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001442 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001443 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1444 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001445 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001446 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001447 // ... Cflags from stub is correctly exported to mylib
1448 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1449 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001450
1451 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001452 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1453 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1454 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1455 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001456}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001457
Jooyung Han749dc692020-04-15 11:03:39 +09001458func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001459 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001460 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1461 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001462 // 3) (platform) -> liba -> libz : this should be non-stub link
1463 ctx, _ := testApex(t, `
1464 apex {
1465 name: "myapex",
1466 key: "myapex.key",
1467 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001468 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001469 }
1470
1471 apex {
1472 name: "otherapex",
1473 key: "myapex.key",
1474 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001475 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001476 }
1477
1478 apex_key {
1479 name: "myapex.key",
1480 public_key: "testkey.avbpubkey",
1481 private_key: "testkey.pem",
1482 }
1483
1484 cc_library {
1485 name: "libx",
1486 shared_libs: ["liba"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001490 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001491 }
1492
1493 cc_library {
1494 name: "liby",
1495 shared_libs: ["liba"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001499 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001500 }
1501
1502 cc_library {
1503 name: "liba",
1504 shared_libs: ["libz"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [
1508 "//apex_available:anyapex",
1509 "//apex_available:platform",
1510 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001511 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001512 }
1513
1514 cc_library {
1515 name: "libz",
1516 system_shared_libs: [],
1517 stl: "none",
1518 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001519 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001520 },
1521 }
Jooyung Han749dc692020-04-15 11:03:39 +09001522 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001523
1524 expectLink := func(from, from_variant, to, to_variant string) {
1525 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1526 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1527 }
1528 expectNoLink := func(from, from_variant, to, to_variant string) {
1529 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1530 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1531 }
1532 // platform liba is linked to non-stub version
1533 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001534 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001535 expectLink("liba", "shared_apex29", "libz", "shared_28")
1536 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1537 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001538 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001539 expectLink("liba", "shared_apex30", "libz", "shared_30")
1540 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1541 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001542}
1543
Jooyung Hanaed150d2020-04-02 01:41:41 +09001544func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1545 ctx, _ := testApex(t, `
1546 apex {
1547 name: "myapex",
1548 key: "myapex.key",
1549 native_shared_libs: ["libx"],
1550 min_sdk_version: "R",
1551 }
1552
1553 apex_key {
1554 name: "myapex.key",
1555 public_key: "testkey.avbpubkey",
1556 private_key: "testkey.pem",
1557 }
1558
1559 cc_library {
1560 name: "libx",
1561 shared_libs: ["libz"],
1562 system_shared_libs: [],
1563 stl: "none",
1564 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001565 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001566 }
1567
1568 cc_library {
1569 name: "libz",
1570 system_shared_libs: [],
1571 stl: "none",
1572 stubs: {
1573 versions: ["29", "R"],
1574 },
1575 }
1576 `, func(fs map[string][]byte, config android.Config) {
1577 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1578 })
1579
1580 expectLink := func(from, from_variant, to, to_variant string) {
1581 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1582 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1583 }
1584 expectNoLink := func(from, from_variant, to, to_variant string) {
1585 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1586 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1587 }
Dan Albertc8060532020-07-22 22:32:17 -07001588 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001589 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1590 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001591}
1592
Jooyung Han749dc692020-04-15 11:03:39 +09001593func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001594 ctx, _ := testApex(t, `
1595 apex {
1596 name: "myapex",
1597 key: "myapex.key",
1598 native_shared_libs: ["libx"],
1599 }
1600
1601 apex_key {
1602 name: "myapex.key",
1603 public_key: "testkey.avbpubkey",
1604 private_key: "testkey.pem",
1605 }
1606
1607 cc_library {
1608 name: "libx",
1609 shared_libs: ["libz"],
1610 system_shared_libs: [],
1611 stl: "none",
1612 apex_available: [ "myapex" ],
1613 }
1614
1615 cc_library {
1616 name: "libz",
1617 system_shared_libs: [],
1618 stl: "none",
1619 stubs: {
1620 versions: ["1", "2"],
1621 },
1622 }
1623 `)
1624
1625 expectLink := func(from, from_variant, to, to_variant string) {
1626 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1627 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1628 }
1629 expectNoLink := func(from, from_variant, to, to_variant string) {
1630 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1631 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1632 }
Colin Crossaede88c2020-08-11 12:17:01 -07001633 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1634 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1635 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001636}
1637
1638func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1639 ctx, _ := testApex(t, `
1640 apex {
1641 name: "myapex",
1642 key: "myapex.key",
1643 native_shared_libs: ["libx"],
1644 }
1645
1646 apex_key {
1647 name: "myapex.key",
1648 public_key: "testkey.avbpubkey",
1649 private_key: "testkey.pem",
1650 }
1651
1652 cc_library {
1653 name: "libx",
1654 system_shared_libs: [],
1655 stl: "none",
1656 apex_available: [ "myapex" ],
1657 stubs: {
1658 versions: ["1", "2"],
1659 },
1660 }
1661
1662 cc_library {
1663 name: "libz",
1664 shared_libs: ["libx"],
1665 system_shared_libs: [],
1666 stl: "none",
1667 }
1668 `)
1669
1670 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001671 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001672 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1673 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1674 }
1675 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001676 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001677 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1678 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1679 }
1680 expectLink("libz", "shared", "libx", "shared_2")
1681 expectNoLink("libz", "shared", "libz", "shared_1")
1682 expectNoLink("libz", "shared", "libz", "shared")
1683}
1684
Jooyung Han75568392020-03-20 04:29:24 +09001685func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001686 ctx, _ := testApex(t, `
1687 apex {
1688 name: "myapex",
1689 key: "myapex.key",
1690 native_shared_libs: ["libx"],
1691 min_sdk_version: "29",
1692 }
1693
1694 apex_key {
1695 name: "myapex.key",
1696 public_key: "testkey.avbpubkey",
1697 private_key: "testkey.pem",
1698 }
1699
1700 cc_library {
1701 name: "libx",
1702 shared_libs: ["libbar"],
1703 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001704 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001705 }
1706
1707 cc_library {
1708 name: "libbar",
1709 stubs: {
1710 versions: ["29", "30"],
1711 },
1712 }
Jooyung Han75568392020-03-20 04:29:24 +09001713 `, func(fs map[string][]byte, config android.Config) {
1714 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1715 })
Jooyung Han03b51852020-02-26 22:45:42 +09001716 expectLink := func(from, from_variant, to, to_variant string) {
1717 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1718 libFlags := ld.Args["libFlags"]
1719 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1720 }
Colin Crossaede88c2020-08-11 12:17:01 -07001721 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001722}
1723
Jooyung Han75568392020-03-20 04:29:24 +09001724func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001725 ctx, _ := testApex(t, `
1726 apex {
1727 name: "myapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["libx"],
1730 min_sdk_version: "29",
1731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "libx",
1741 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001742 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001743 }
Jooyung Han75568392020-03-20 04:29:24 +09001744 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001745
1746 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001747 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001748 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001749 // note that platform variant is not.
1750 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001751 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001752}
1753
Jooyung Han749dc692020-04-15 11:03:39 +09001754func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001755 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001756 apex {
1757 name: "myapex",
1758 key: "myapex.key",
1759 native_shared_libs: ["libx"],
1760 min_sdk_version: "29",
1761 }
1762
1763 apex_key {
1764 name: "myapex.key",
1765 public_key: "testkey.avbpubkey",
1766 private_key: "testkey.pem",
1767 }
1768
1769 cc_library {
1770 name: "libx",
1771 shared_libs: ["libz"],
1772 system_shared_libs: [],
1773 stl: "none",
1774 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001775 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001776 }
1777
1778 cc_library {
1779 name: "libz",
1780 system_shared_libs: [],
1781 stl: "none",
1782 stubs: {
1783 versions: ["30"],
1784 },
1785 }
Jooyung Han75568392020-03-20 04:29:24 +09001786 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001787}
Jooyung Han03b51852020-02-26 22:45:42 +09001788
Jooyung Han749dc692020-04-15 11:03:39 +09001789func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1790 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001791 apex {
1792 name: "myapex",
1793 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001794 native_shared_libs: ["mylib"],
1795 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001796 }
1797
1798 apex_key {
1799 name: "myapex.key",
1800 public_key: "testkey.avbpubkey",
1801 private_key: "testkey.pem",
1802 }
Jooyung Han749dc692020-04-15 11:03:39 +09001803
1804 cc_library {
1805 name: "mylib",
1806 srcs: ["mylib.cpp"],
1807 system_shared_libs: [],
1808 stl: "none",
1809 apex_available: [
1810 "myapex",
1811 ],
1812 min_sdk_version: "30",
1813 }
1814 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001815
1816 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 native_shared_libs: ["libfoo.ffi"],
1821 min_sdk_version: "29",
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 rust_ffi_shared {
1831 name: "libfoo.ffi",
1832 srcs: ["foo.rs"],
1833 crate_name: "foo",
1834 apex_available: [
1835 "myapex",
1836 ],
1837 min_sdk_version: "30",
1838 }
1839 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001840}
1841
1842func TestApexMinSdkVersion_Okay(t *testing.T) {
1843 testApex(t, `
1844 apex {
1845 name: "myapex",
1846 key: "myapex.key",
1847 native_shared_libs: ["libfoo"],
1848 java_libs: ["libbar"],
1849 min_sdk_version: "29",
1850 }
1851
1852 apex_key {
1853 name: "myapex.key",
1854 public_key: "testkey.avbpubkey",
1855 private_key: "testkey.pem",
1856 }
1857
1858 cc_library {
1859 name: "libfoo",
1860 srcs: ["mylib.cpp"],
1861 shared_libs: ["libfoo_dep"],
1862 apex_available: ["myapex"],
1863 min_sdk_version: "29",
1864 }
1865
1866 cc_library {
1867 name: "libfoo_dep",
1868 srcs: ["mylib.cpp"],
1869 apex_available: ["myapex"],
1870 min_sdk_version: "29",
1871 }
1872
1873 java_library {
1874 name: "libbar",
1875 sdk_version: "current",
1876 srcs: ["a.java"],
1877 static_libs: ["libbar_dep"],
1878 apex_available: ["myapex"],
1879 min_sdk_version: "29",
1880 }
1881
1882 java_library {
1883 name: "libbar_dep",
1884 sdk_version: "current",
1885 srcs: ["a.java"],
1886 apex_available: ["myapex"],
1887 min_sdk_version: "29",
1888 }
Jooyung Han03b51852020-02-26 22:45:42 +09001889 `)
1890}
1891
Artur Satayev8cf899a2020-04-15 17:29:42 +01001892func TestJavaStableSdkVersion(t *testing.T) {
1893 testCases := []struct {
1894 name string
1895 expectedError string
1896 bp string
1897 }{
1898 {
1899 name: "Non-updatable apex with non-stable dep",
1900 bp: `
1901 apex {
1902 name: "myapex",
1903 java_libs: ["myjar"],
1904 key: "myapex.key",
1905 }
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911 java_library {
1912 name: "myjar",
1913 srcs: ["foo/bar/MyClass.java"],
1914 sdk_version: "core_platform",
1915 apex_available: ["myapex"],
1916 }
1917 `,
1918 },
1919 {
1920 name: "Updatable apex with stable dep",
1921 bp: `
1922 apex {
1923 name: "myapex",
1924 java_libs: ["myjar"],
1925 key: "myapex.key",
1926 updatable: true,
1927 min_sdk_version: "29",
1928 }
1929 apex_key {
1930 name: "myapex.key",
1931 public_key: "testkey.avbpubkey",
1932 private_key: "testkey.pem",
1933 }
1934 java_library {
1935 name: "myjar",
1936 srcs: ["foo/bar/MyClass.java"],
1937 sdk_version: "current",
1938 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001939 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001940 }
1941 `,
1942 },
1943 {
1944 name: "Updatable apex with non-stable dep",
1945 expectedError: "cannot depend on \"myjar\"",
1946 bp: `
1947 apex {
1948 name: "myapex",
1949 java_libs: ["myjar"],
1950 key: "myapex.key",
1951 updatable: true,
1952 }
1953 apex_key {
1954 name: "myapex.key",
1955 public_key: "testkey.avbpubkey",
1956 private_key: "testkey.pem",
1957 }
1958 java_library {
1959 name: "myjar",
1960 srcs: ["foo/bar/MyClass.java"],
1961 sdk_version: "core_platform",
1962 apex_available: ["myapex"],
1963 }
1964 `,
1965 },
1966 {
1967 name: "Updatable apex with non-stable transitive dep",
1968 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1969 bp: `
1970 apex {
1971 name: "myapex",
1972 java_libs: ["myjar"],
1973 key: "myapex.key",
1974 updatable: true,
1975 }
1976 apex_key {
1977 name: "myapex.key",
1978 public_key: "testkey.avbpubkey",
1979 private_key: "testkey.pem",
1980 }
1981 java_library {
1982 name: "myjar",
1983 srcs: ["foo/bar/MyClass.java"],
1984 sdk_version: "current",
1985 apex_available: ["myapex"],
1986 static_libs: ["transitive-jar"],
1987 }
1988 java_library {
1989 name: "transitive-jar",
1990 srcs: ["foo/bar/MyClass.java"],
1991 sdk_version: "core_platform",
1992 apex_available: ["myapex"],
1993 }
1994 `,
1995 },
1996 }
1997
1998 for _, test := range testCases {
1999 t.Run(test.name, func(t *testing.T) {
2000 if test.expectedError == "" {
2001 testApex(t, test.bp)
2002 } else {
2003 testApexError(t, test.expectedError, test.bp)
2004 }
2005 })
2006 }
2007}
2008
Jooyung Han749dc692020-04-15 11:03:39 +09002009func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2010 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2011 apex {
2012 name: "myapex",
2013 key: "myapex.key",
2014 native_shared_libs: ["mylib"],
2015 min_sdk_version: "29",
2016 }
2017
2018 apex_key {
2019 name: "myapex.key",
2020 public_key: "testkey.avbpubkey",
2021 private_key: "testkey.pem",
2022 }
2023
2024 cc_library {
2025 name: "mylib",
2026 srcs: ["mylib.cpp"],
2027 shared_libs: ["mylib2"],
2028 system_shared_libs: [],
2029 stl: "none",
2030 apex_available: [
2031 "myapex",
2032 ],
2033 min_sdk_version: "29",
2034 }
2035
2036 // indirect part of the apex
2037 cc_library {
2038 name: "mylib2",
2039 srcs: ["mylib.cpp"],
2040 system_shared_libs: [],
2041 stl: "none",
2042 apex_available: [
2043 "myapex",
2044 ],
2045 min_sdk_version: "30",
2046 }
2047 `)
2048}
2049
2050func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2051 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2052 apex {
2053 name: "myapex",
2054 key: "myapex.key",
2055 apps: ["AppFoo"],
2056 min_sdk_version: "29",
2057 }
2058
2059 apex_key {
2060 name: "myapex.key",
2061 public_key: "testkey.avbpubkey",
2062 private_key: "testkey.pem",
2063 }
2064
2065 android_app {
2066 name: "AppFoo",
2067 srcs: ["foo/bar/MyClass.java"],
2068 sdk_version: "current",
2069 min_sdk_version: "29",
2070 system_modules: "none",
2071 stl: "none",
2072 static_libs: ["bar"],
2073 apex_available: [ "myapex" ],
2074 }
2075
2076 java_library {
2077 name: "bar",
2078 sdk_version: "current",
2079 srcs: ["a.java"],
2080 apex_available: [ "myapex" ],
2081 }
2082 `)
2083}
2084
2085func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2086 ctx, _ := testApex(t, `
2087 apex {
2088 name: "myapex",
2089 key: "myapex.key",
2090 native_shared_libs: ["mylib"],
2091 min_sdk_version: "29",
2092 }
2093
2094 apex_key {
2095 name: "myapex.key",
2096 public_key: "testkey.avbpubkey",
2097 private_key: "testkey.pem",
2098 }
2099
2100 // mylib in myapex will link to mylib2#29
2101 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2102 cc_library {
2103 name: "mylib",
2104 srcs: ["mylib.cpp"],
2105 shared_libs: ["mylib2"],
2106 system_shared_libs: [],
2107 stl: "none",
2108 apex_available: ["myapex", "otherapex"],
2109 min_sdk_version: "29",
2110 }
2111
2112 cc_library {
2113 name: "mylib2",
2114 srcs: ["mylib.cpp"],
2115 system_shared_libs: [],
2116 stl: "none",
2117 apex_available: ["otherapex"],
2118 stubs: { versions: ["29", "30"] },
2119 min_sdk_version: "30",
2120 }
2121
2122 apex {
2123 name: "otherapex",
2124 key: "myapex.key",
2125 native_shared_libs: ["mylib", "mylib2"],
2126 min_sdk_version: "30",
2127 }
2128 `)
2129 expectLink := func(from, from_variant, to, to_variant string) {
2130 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2131 libFlags := ld.Args["libFlags"]
2132 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2133 }
Colin Crossaede88c2020-08-11 12:17:01 -07002134 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2135 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002136}
2137
Jiyong Park7c2ee712018-12-07 00:42:25 +09002138func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002139 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002140 apex {
2141 name: "myapex",
2142 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002143 native_shared_libs: ["mylib"],
2144 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002145 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002146 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002147 }
2148
2149 apex_key {
2150 name: "myapex.key",
2151 public_key: "testkey.avbpubkey",
2152 private_key: "testkey.pem",
2153 }
2154
2155 prebuilt_etc {
2156 name: "myetc",
2157 src: "myprebuilt",
2158 sub_dir: "foo/bar",
2159 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002160
2161 cc_library {
2162 name: "mylib",
2163 srcs: ["mylib.cpp"],
2164 relative_install_path: "foo/bar",
2165 system_shared_libs: [],
2166 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002167 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002168 }
2169
2170 cc_binary {
2171 name: "mybin",
2172 srcs: ["mylib.cpp"],
2173 relative_install_path: "foo/bar",
2174 system_shared_libs: [],
2175 static_executable: true,
2176 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002177 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002178 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002179 `)
2180
Sundong Ahnabb64432019-10-22 13:58:29 +09002181 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002182 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2183
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002184 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002185 ensureListContains(t, dirs, "etc")
2186 ensureListContains(t, dirs, "etc/foo")
2187 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002188 ensureListContains(t, dirs, "lib64")
2189 ensureListContains(t, dirs, "lib64/foo")
2190 ensureListContains(t, dirs, "lib64/foo/bar")
2191 ensureListContains(t, dirs, "lib")
2192 ensureListContains(t, dirs, "lib/foo")
2193 ensureListContains(t, dirs, "lib/foo/bar")
2194
Jiyong Parkbd13e442019-03-15 18:10:35 +09002195 ensureListContains(t, dirs, "bin")
2196 ensureListContains(t, dirs, "bin/foo")
2197 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002198}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002199
Jooyung Han35155c42020-02-06 17:33:20 +09002200func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2201 ctx, _ := testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 multilib: {
2206 both: {
2207 native_shared_libs: ["mylib"],
2208 binaries: ["mybin"],
2209 },
2210 },
2211 compile_multilib: "both",
2212 native_bridge_supported: true,
2213 }
2214
2215 apex_key {
2216 name: "myapex.key",
2217 public_key: "testkey.avbpubkey",
2218 private_key: "testkey.pem",
2219 }
2220
2221 cc_library {
2222 name: "mylib",
2223 relative_install_path: "foo/bar",
2224 system_shared_libs: [],
2225 stl: "none",
2226 apex_available: [ "myapex" ],
2227 native_bridge_supported: true,
2228 }
2229
2230 cc_binary {
2231 name: "mybin",
2232 relative_install_path: "foo/bar",
2233 system_shared_libs: [],
2234 static_executable: true,
2235 stl: "none",
2236 apex_available: [ "myapex" ],
2237 native_bridge_supported: true,
2238 compile_multilib: "both", // default is "first" for binary
2239 multilib: {
2240 lib64: {
2241 suffix: "64",
2242 },
2243 },
2244 }
2245 `, withNativeBridgeEnabled)
2246 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2247 "bin/foo/bar/mybin",
2248 "bin/foo/bar/mybin64",
2249 "bin/arm/foo/bar/mybin",
2250 "bin/arm64/foo/bar/mybin64",
2251 "lib/foo/bar/mylib.so",
2252 "lib/arm/foo/bar/mylib.so",
2253 "lib64/foo/bar/mylib.so",
2254 "lib64/arm64/foo/bar/mylib.so",
2255 })
2256}
2257
Jiyong Parkda6eb592018-12-19 17:12:36 +09002258func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002259 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002260 apex {
2261 name: "myapex",
2262 key: "myapex.key",
2263 native_shared_libs: ["mylib"],
2264 use_vendor: true,
2265 }
2266
2267 apex_key {
2268 name: "myapex.key",
2269 public_key: "testkey.avbpubkey",
2270 private_key: "testkey.pem",
2271 }
2272
2273 cc_library {
2274 name: "mylib",
2275 srcs: ["mylib.cpp"],
2276 shared_libs: ["mylib2"],
2277 system_shared_libs: [],
2278 vendor_available: true,
2279 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002280 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002281 }
2282
2283 cc_library {
2284 name: "mylib2",
2285 srcs: ["mylib.cpp"],
2286 system_shared_libs: [],
2287 vendor_available: true,
2288 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002289 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002290 }
Jooyung Handc782442019-11-01 03:14:38 +09002291 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002292 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002293 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002294
2295 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002296 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002297 for _, implicit := range i.Implicits {
2298 inputsList = append(inputsList, implicit.String())
2299 }
2300 }
2301 inputsString := strings.Join(inputsList, " ")
2302
2303 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002304 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2305 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002306
2307 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002308 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2309 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002310}
Jiyong Park16e91a02018-12-20 18:18:08 +09002311
Jooyung Han85d61762020-06-24 23:50:26 +09002312func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002313 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2314 apex {
2315 name: "myapex",
2316 key: "myapex.key",
2317 use_vendor: true,
2318 }
2319 apex_key {
2320 name: "myapex.key",
2321 public_key: "testkey.avbpubkey",
2322 private_key: "testkey.pem",
2323 }
2324 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002325 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002326 })
Colin Cross440e0d02020-06-11 11:32:11 -07002327 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002328 testApex(t, `
2329 apex {
2330 name: "myapex",
2331 key: "myapex.key",
2332 use_vendor: true,
2333 }
2334 apex_key {
2335 name: "myapex.key",
2336 public_key: "testkey.avbpubkey",
2337 private_key: "testkey.pem",
2338 }
2339 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002340 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002341 })
2342}
2343
Jooyung Han5c998b92019-06-27 11:30:33 +09002344func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2345 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2346 apex {
2347 name: "myapex",
2348 key: "myapex.key",
2349 native_shared_libs: ["mylib"],
2350 use_vendor: true,
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "mylib",
2361 srcs: ["mylib.cpp"],
2362 system_shared_libs: [],
2363 stl: "none",
2364 }
2365 `)
2366}
2367
Jooyung Han85d61762020-06-24 23:50:26 +09002368func TestVendorApex(t *testing.T) {
2369 ctx, config := testApex(t, `
2370 apex {
2371 name: "myapex",
2372 key: "myapex.key",
2373 binaries: ["mybin"],
2374 vendor: true,
2375 }
2376 apex_key {
2377 name: "myapex.key",
2378 public_key: "testkey.avbpubkey",
2379 private_key: "testkey.pem",
2380 }
2381 cc_binary {
2382 name: "mybin",
2383 vendor: true,
2384 shared_libs: ["libfoo"],
2385 }
2386 cc_library {
2387 name: "libfoo",
2388 proprietary: true,
2389 }
2390 `)
2391
2392 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2393 "bin/mybin",
2394 "lib64/libfoo.so",
2395 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2396 "lib64/libc++.so",
2397 })
2398
2399 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2400 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2401 name := apexBundle.BaseModuleName()
2402 prefix := "TARGET_"
2403 var builder strings.Builder
2404 data.Custom(&builder, name, prefix, "", data)
2405 androidMk := builder.String()
2406 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002407
2408 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2409 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2410 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002411}
2412
Jooyung Handf78e212020-07-22 15:54:47 +09002413func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2414 ctx, _ := testApex(t, `
2415 apex {
2416 name: "myapex",
2417 key: "myapex.key",
2418 binaries: ["mybin"],
2419 vendor: true,
2420 use_vndk_as_stable: true,
2421 }
2422 apex_key {
2423 name: "myapex.key",
2424 public_key: "testkey.avbpubkey",
2425 private_key: "testkey.pem",
2426 }
2427 cc_binary {
2428 name: "mybin",
2429 vendor: true,
2430 shared_libs: ["libvndk", "libvendor"],
2431 }
2432 cc_library {
2433 name: "libvndk",
2434 vndk: {
2435 enabled: true,
2436 },
2437 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002438 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002439 }
2440 cc_library {
2441 name: "libvendor",
2442 vendor: true,
2443 }
2444 `)
2445
2446 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2447
Colin Crossaede88c2020-08-11 12:17:01 -07002448 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002449 libs := names(ldRule.Args["libFlags"])
2450 // VNDK libs(libvndk/libc++) as they are
2451 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2452 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2453 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002454 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002455
2456 // VNDK libs are not included when use_vndk_as_stable: true
2457 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2458 "bin/mybin",
2459 "lib64/libvendor.so",
2460 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002461
2462 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2463 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2464 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002465}
2466
Jooyung Han8e5685d2020-09-21 11:02:57 +09002467func TestApex_withPrebuiltFirmware(t *testing.T) {
2468 testCases := []struct {
2469 name string
2470 additionalProp string
2471 }{
2472 {"system apex with prebuilt_firmware", ""},
2473 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2474 }
2475 for _, tc := range testCases {
2476 t.Run(tc.name, func(t *testing.T) {
2477 ctx, _ := testApex(t, `
2478 apex {
2479 name: "myapex",
2480 key: "myapex.key",
2481 prebuilts: ["myfirmware"],
2482 `+tc.additionalProp+`
2483 }
2484 apex_key {
2485 name: "myapex.key",
2486 public_key: "testkey.avbpubkey",
2487 private_key: "testkey.pem",
2488 }
2489 prebuilt_firmware {
2490 name: "myfirmware",
2491 src: "myfirmware.bin",
2492 filename_from_src: true,
2493 `+tc.additionalProp+`
2494 }
2495 `)
2496 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2497 "etc/firmware/myfirmware.bin",
2498 })
2499 })
2500 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002501}
2502
Jooyung Hanefb184e2020-06-25 17:14:25 +09002503func TestAndroidMk_UseVendorRequired(t *testing.T) {
2504 ctx, config := testApex(t, `
2505 apex {
2506 name: "myapex",
2507 key: "myapex.key",
2508 use_vendor: true,
2509 native_shared_libs: ["mylib"],
2510 }
2511
2512 apex_key {
2513 name: "myapex.key",
2514 public_key: "testkey.avbpubkey",
2515 private_key: "testkey.pem",
2516 }
2517
2518 cc_library {
2519 name: "mylib",
2520 vendor_available: true,
2521 apex_available: ["myapex"],
2522 }
2523 `, func(fs map[string][]byte, config android.Config) {
2524 setUseVendorAllowListForTest(config, []string{"myapex"})
2525 })
2526
2527 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2528 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2529 name := apexBundle.BaseModuleName()
2530 prefix := "TARGET_"
2531 var builder strings.Builder
2532 data.Custom(&builder, name, prefix, "", data)
2533 androidMk := builder.String()
2534 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2535}
2536
2537func TestAndroidMk_VendorApexRequired(t *testing.T) {
2538 ctx, config := testApex(t, `
2539 apex {
2540 name: "myapex",
2541 key: "myapex.key",
2542 vendor: true,
2543 native_shared_libs: ["mylib"],
2544 }
2545
2546 apex_key {
2547 name: "myapex.key",
2548 public_key: "testkey.avbpubkey",
2549 private_key: "testkey.pem",
2550 }
2551
2552 cc_library {
2553 name: "mylib",
2554 vendor_available: true,
2555 }
2556 `)
2557
2558 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2559 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2560 name := apexBundle.BaseModuleName()
2561 prefix := "TARGET_"
2562 var builder strings.Builder
2563 data.Custom(&builder, name, prefix, "", data)
2564 androidMk := builder.String()
2565 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2566}
2567
Jooyung Han2ed99d02020-06-24 23:26:26 +09002568func TestAndroidMkWritesCommonProperties(t *testing.T) {
2569 ctx, config := testApex(t, `
2570 apex {
2571 name: "myapex",
2572 key: "myapex.key",
2573 vintf_fragments: ["fragment.xml"],
2574 init_rc: ["init.rc"],
2575 }
2576 apex_key {
2577 name: "myapex.key",
2578 public_key: "testkey.avbpubkey",
2579 private_key: "testkey.pem",
2580 }
2581 cc_binary {
2582 name: "mybin",
2583 }
2584 `)
2585
2586 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2587 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2588 name := apexBundle.BaseModuleName()
2589 prefix := "TARGET_"
2590 var builder strings.Builder
2591 data.Custom(&builder, name, prefix, "", data)
2592 androidMk := builder.String()
2593 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2594 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2595}
2596
Jiyong Park16e91a02018-12-20 18:18:08 +09002597func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002598 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002599 apex {
2600 name: "myapex",
2601 key: "myapex.key",
2602 native_shared_libs: ["mylib"],
2603 }
2604
2605 apex_key {
2606 name: "myapex.key",
2607 public_key: "testkey.avbpubkey",
2608 private_key: "testkey.pem",
2609 }
2610
2611 cc_library {
2612 name: "mylib",
2613 srcs: ["mylib.cpp"],
2614 system_shared_libs: [],
2615 stl: "none",
2616 stubs: {
2617 versions: ["1", "2", "3"],
2618 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002619 apex_available: [
2620 "//apex_available:platform",
2621 "myapex",
2622 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002623 }
2624
2625 cc_binary {
2626 name: "not_in_apex",
2627 srcs: ["mylib.cpp"],
2628 static_libs: ["mylib"],
2629 static_executable: true,
2630 system_shared_libs: [],
2631 stl: "none",
2632 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002633 `)
2634
Colin Cross7113d202019-11-20 16:39:12 -08002635 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002636
2637 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002638 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002639}
Jiyong Park9335a262018-12-24 11:31:58 +09002640
2641func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002642 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002643 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002644 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002645 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002646 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002647 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002648 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002649 }
2650
2651 cc_library {
2652 name: "mylib",
2653 srcs: ["mylib.cpp"],
2654 system_shared_libs: [],
2655 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002656 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002657 }
2658
2659 apex_key {
2660 name: "myapex.key",
2661 public_key: "testkey.avbpubkey",
2662 private_key: "testkey.pem",
2663 }
2664
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002665 android_app_certificate {
2666 name: "myapex.certificate",
2667 certificate: "testkey",
2668 }
2669
2670 android_app_certificate {
2671 name: "myapex.certificate.override",
2672 certificate: "testkey.override",
2673 }
2674
Jiyong Park9335a262018-12-24 11:31:58 +09002675 `)
2676
2677 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002678 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002679
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002680 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2681 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002682 "vendor/foo/devkeys/testkey.avbpubkey")
2683 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002684 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2685 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002686 "vendor/foo/devkeys/testkey.pem")
2687 }
2688
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002689 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002690 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002691 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002692 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002693 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002694 }
2695}
Jiyong Park58e364a2019-01-19 19:24:06 +09002696
Jooyung Hanf121a652019-12-17 14:30:11 +09002697func TestCertificate(t *testing.T) {
2698 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2699 ctx, _ := testApex(t, `
2700 apex {
2701 name: "myapex",
2702 key: "myapex.key",
2703 }
2704 apex_key {
2705 name: "myapex.key",
2706 public_key: "testkey.avbpubkey",
2707 private_key: "testkey.pem",
2708 }`)
2709 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2710 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2711 if actual := rule.Args["certificates"]; actual != expected {
2712 t.Errorf("certificates should be %q, not %q", expected, actual)
2713 }
2714 })
2715 t.Run("override when unspecified", func(t *testing.T) {
2716 ctx, _ := testApex(t, `
2717 apex {
2718 name: "myapex_keytest",
2719 key: "myapex.key",
2720 file_contexts: ":myapex-file_contexts",
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 android_app_certificate {
2728 name: "myapex.certificate.override",
2729 certificate: "testkey.override",
2730 }`)
2731 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2732 expected := "testkey.override.x509.pem testkey.override.pk8"
2733 if actual := rule.Args["certificates"]; actual != expected {
2734 t.Errorf("certificates should be %q, not %q", expected, actual)
2735 }
2736 })
2737 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2738 ctx, _ := testApex(t, `
2739 apex {
2740 name: "myapex",
2741 key: "myapex.key",
2742 certificate: ":myapex.certificate",
2743 }
2744 apex_key {
2745 name: "myapex.key",
2746 public_key: "testkey.avbpubkey",
2747 private_key: "testkey.pem",
2748 }
2749 android_app_certificate {
2750 name: "myapex.certificate",
2751 certificate: "testkey",
2752 }`)
2753 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2754 expected := "testkey.x509.pem testkey.pk8"
2755 if actual := rule.Args["certificates"]; actual != expected {
2756 t.Errorf("certificates should be %q, not %q", expected, actual)
2757 }
2758 })
2759 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2760 ctx, _ := testApex(t, `
2761 apex {
2762 name: "myapex_keytest",
2763 key: "myapex.key",
2764 file_contexts: ":myapex-file_contexts",
2765 certificate: ":myapex.certificate",
2766 }
2767 apex_key {
2768 name: "myapex.key",
2769 public_key: "testkey.avbpubkey",
2770 private_key: "testkey.pem",
2771 }
2772 android_app_certificate {
2773 name: "myapex.certificate.override",
2774 certificate: "testkey.override",
2775 }`)
2776 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2777 expected := "testkey.override.x509.pem testkey.override.pk8"
2778 if actual := rule.Args["certificates"]; actual != expected {
2779 t.Errorf("certificates should be %q, not %q", expected, actual)
2780 }
2781 })
2782 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2783 ctx, _ := testApex(t, `
2784 apex {
2785 name: "myapex",
2786 key: "myapex.key",
2787 certificate: "testkey",
2788 }
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }`)
2794 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2795 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2796 if actual := rule.Args["certificates"]; actual != expected {
2797 t.Errorf("certificates should be %q, not %q", expected, actual)
2798 }
2799 })
2800 t.Run("override when specified as <name>", func(t *testing.T) {
2801 ctx, _ := testApex(t, `
2802 apex {
2803 name: "myapex_keytest",
2804 key: "myapex.key",
2805 file_contexts: ":myapex-file_contexts",
2806 certificate: "testkey",
2807 }
2808 apex_key {
2809 name: "myapex.key",
2810 public_key: "testkey.avbpubkey",
2811 private_key: "testkey.pem",
2812 }
2813 android_app_certificate {
2814 name: "myapex.certificate.override",
2815 certificate: "testkey.override",
2816 }`)
2817 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2818 expected := "testkey.override.x509.pem testkey.override.pk8"
2819 if actual := rule.Args["certificates"]; actual != expected {
2820 t.Errorf("certificates should be %q, not %q", expected, actual)
2821 }
2822 })
2823}
2824
Jiyong Park58e364a2019-01-19 19:24:06 +09002825func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002826 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002827 apex {
2828 name: "myapex",
2829 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002830 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002831 }
2832
2833 apex {
2834 name: "otherapex",
2835 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002836 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002837 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002838 }
2839
2840 apex_key {
2841 name: "myapex.key",
2842 public_key: "testkey.avbpubkey",
2843 private_key: "testkey.pem",
2844 }
2845
2846 cc_library {
2847 name: "mylib",
2848 srcs: ["mylib.cpp"],
2849 system_shared_libs: [],
2850 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002851 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002852 "myapex",
2853 "otherapex",
2854 ],
Jooyung Han24282772020-03-21 23:20:55 +09002855 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002856 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002857 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002858 cc_library {
2859 name: "mylib2",
2860 srcs: ["mylib.cpp"],
2861 system_shared_libs: [],
2862 stl: "none",
2863 apex_available: [
2864 "myapex",
2865 "otherapex",
2866 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002867 static_libs: ["mylib3"],
2868 recovery_available: true,
2869 min_sdk_version: "29",
2870 }
2871 cc_library {
2872 name: "mylib3",
2873 srcs: ["mylib.cpp"],
2874 system_shared_libs: [],
2875 stl: "none",
2876 apex_available: [
2877 "myapex",
2878 "otherapex",
2879 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002880 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002881 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002882 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002883 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002884 `)
2885
Jooyung Hanc87a0592020-03-02 17:44:33 +09002886 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002887 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002888 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002889 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002890
Jooyung Hanccce2f22020-03-07 03:45:53 +09002891 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002892 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002893 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002894 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002895 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002896
Jooyung Hanccce2f22020-03-07 03:45:53 +09002897 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002898 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002899 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002900 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002901 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002902
Colin Crossaede88c2020-08-11 12:17:01 -07002903 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2904 // each variant defines additional macros to distinguish which apex variant it is built for
2905
2906 // non-APEX variant does not have __ANDROID_APEX__ defined
2907 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2908 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2909
2910 // APEX variant has __ANDROID_APEX__ defined
2911 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2912 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2913 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2914 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2915
2916 // APEX variant has __ANDROID_APEX__ defined
2917 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2918 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2919 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2920 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2921
Dan Albertb19953d2020-11-17 15:29:36 -08002922 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002923 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2924 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002925 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002926
2927 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2928 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002929
2930 // non-APEX variant does not have __ANDROID_APEX__ defined
2931 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2932 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2933
2934 // APEX variant has __ANDROID_APEX__ defined
2935 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002936 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002937 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002938 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002939
Jooyung Hanc87a0592020-03-02 17:44:33 +09002940 // APEX variant has __ANDROID_APEX__ defined
2941 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002942 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002943 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002944 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002945
Dan Albertb19953d2020-11-17 15:29:36 -08002946 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002947 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002948 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002949 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002950}
Jiyong Park7e636d02019-01-28 16:16:54 +09002951
2952func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002953 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002954 apex {
2955 name: "myapex",
2956 key: "myapex.key",
2957 native_shared_libs: ["mylib"],
2958 }
2959
2960 apex_key {
2961 name: "myapex.key",
2962 public_key: "testkey.avbpubkey",
2963 private_key: "testkey.pem",
2964 }
2965
2966 cc_library_headers {
2967 name: "mylib_headers",
2968 export_include_dirs: ["my_include"],
2969 system_shared_libs: [],
2970 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002971 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002972 }
2973
2974 cc_library {
2975 name: "mylib",
2976 srcs: ["mylib.cpp"],
2977 system_shared_libs: [],
2978 stl: "none",
2979 header_libs: ["mylib_headers"],
2980 export_header_lib_headers: ["mylib_headers"],
2981 stubs: {
2982 versions: ["1", "2", "3"],
2983 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002984 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002985 }
2986
2987 cc_library {
2988 name: "otherlib",
2989 srcs: ["mylib.cpp"],
2990 system_shared_libs: [],
2991 stl: "none",
2992 shared_libs: ["mylib"],
2993 }
2994 `)
2995
Colin Cross7113d202019-11-20 16:39:12 -08002996 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002997
2998 // Ensure that the include path of the header lib is exported to 'otherlib'
2999 ensureContains(t, cFlags, "-Imy_include")
3000}
Alex Light9670d332019-01-29 18:07:33 -08003001
Jiyong Park7cd10e32020-01-14 09:22:18 +09003002type fileInApex struct {
3003 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003004 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003005 isLink bool
3006}
3007
Jooyung Hana57af4a2020-01-23 05:36:59 +00003008func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003009 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003010 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003011 copyCmds := apexRule.Args["copy_commands"]
3012 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003013 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003014 for _, cmd := range strings.Split(copyCmds, "&&") {
3015 cmd = strings.TrimSpace(cmd)
3016 if cmd == "" {
3017 continue
3018 }
3019 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003020 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003021 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003022 switch terms[0] {
3023 case "mkdir":
3024 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003025 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003026 t.Fatal("copyCmds contains invalid cp command", cmd)
3027 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003028 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003029 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003030 isLink = false
3031 case "ln":
3032 if len(terms) != 3 && len(terms) != 4 {
3033 // ln LINK TARGET or ln -s LINK TARGET
3034 t.Fatal("copyCmds contains invalid ln command", cmd)
3035 }
3036 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003037 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003038 isLink = true
3039 default:
3040 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3041 }
3042 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003043 index := strings.Index(dst, imageApexDir)
3044 if index == -1 {
3045 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3046 }
3047 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003048 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003049 }
3050 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003051 return ret
3052}
3053
Jooyung Hana57af4a2020-01-23 05:36:59 +00003054func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3055 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003056 var failed bool
3057 var surplus []string
3058 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003059 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003060 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003061 for _, expected := range files {
3062 if matched, _ := path.Match(expected, file.path); matched {
3063 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003064 mactchFound = true
3065 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003066 }
3067 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003068 if !mactchFound {
3069 surplus = append(surplus, file.path)
3070 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003071 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003072
Jooyung Han31c470b2019-10-18 16:26:59 +09003073 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003074 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003075 t.Log("surplus files", surplus)
3076 failed = true
3077 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003078
3079 if len(files) > len(filesMatched) {
3080 var missing []string
3081 for _, expected := range files {
3082 if !filesMatched[expected] {
3083 missing = append(missing, expected)
3084 }
3085 }
3086 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003087 t.Log("missing files", missing)
3088 failed = true
3089 }
3090 if failed {
3091 t.Fail()
3092 }
3093}
3094
Jooyung Han344d5432019-08-23 11:17:39 +09003095func TestVndkApexCurrent(t *testing.T) {
3096 ctx, _ := testApex(t, `
3097 apex_vndk {
3098 name: "myapex",
3099 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003100 }
3101
3102 apex_key {
3103 name: "myapex.key",
3104 public_key: "testkey.avbpubkey",
3105 private_key: "testkey.pem",
3106 }
3107
3108 cc_library {
3109 name: "libvndk",
3110 srcs: ["mylib.cpp"],
3111 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003112 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003113 vndk: {
3114 enabled: true,
3115 },
3116 system_shared_libs: [],
3117 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003118 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003119 }
3120
3121 cc_library {
3122 name: "libvndksp",
3123 srcs: ["mylib.cpp"],
3124 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003125 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003126 vndk: {
3127 enabled: true,
3128 support_system_process: true,
3129 },
3130 system_shared_libs: [],
3131 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003132 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003133 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003134 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003135
Jooyung Hana57af4a2020-01-23 05:36:59 +00003136 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003137 "lib/libvndk.so",
3138 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003139 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003140 "lib64/libvndk.so",
3141 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003142 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003143 "etc/llndk.libraries.VER.txt",
3144 "etc/vndkcore.libraries.VER.txt",
3145 "etc/vndksp.libraries.VER.txt",
3146 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003147 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003148 })
Jooyung Han344d5432019-08-23 11:17:39 +09003149}
3150
3151func TestVndkApexWithPrebuilt(t *testing.T) {
3152 ctx, _ := testApex(t, `
3153 apex_vndk {
3154 name: "myapex",
3155 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003156 }
3157
3158 apex_key {
3159 name: "myapex.key",
3160 public_key: "testkey.avbpubkey",
3161 private_key: "testkey.pem",
3162 }
3163
3164 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003165 name: "libvndk",
3166 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003167 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003168 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003169 vndk: {
3170 enabled: true,
3171 },
3172 system_shared_libs: [],
3173 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003174 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003175 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003176
3177 cc_prebuilt_library_shared {
3178 name: "libvndk.arm",
3179 srcs: ["libvndk.arm.so"],
3180 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003181 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003182 vndk: {
3183 enabled: true,
3184 },
3185 enabled: false,
3186 arch: {
3187 arm: {
3188 enabled: true,
3189 },
3190 },
3191 system_shared_libs: [],
3192 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003193 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003194 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003195 `+vndkLibrariesTxtFiles("current"),
3196 withFiles(map[string][]byte{
3197 "libvndk.so": nil,
3198 "libvndk.arm.so": nil,
3199 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003200
Jooyung Hana57af4a2020-01-23 05:36:59 +00003201 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003202 "lib/libvndk.so",
3203 "lib/libvndk.arm.so",
3204 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003205 "lib/libc++.so",
3206 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003207 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003208 })
Jooyung Han344d5432019-08-23 11:17:39 +09003209}
3210
Jooyung Han39edb6c2019-11-06 16:53:07 +09003211func vndkLibrariesTxtFiles(vers ...string) (result string) {
3212 for _, v := range vers {
3213 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003214 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003215 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003216 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003217 name: "` + txt + `.libraries.txt",
3218 }
3219 `
3220 }
3221 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003222 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003223 result += `
3224 prebuilt_etc {
3225 name: "` + txt + `.libraries.` + v + `.txt",
3226 src: "dummy.txt",
3227 }
3228 `
3229 }
3230 }
3231 }
3232 return
3233}
3234
Jooyung Han344d5432019-08-23 11:17:39 +09003235func TestVndkApexVersion(t *testing.T) {
3236 ctx, _ := testApex(t, `
3237 apex_vndk {
3238 name: "myapex_v27",
3239 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003240 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003241 vndk_version: "27",
3242 }
3243
3244 apex_key {
3245 name: "myapex.key",
3246 public_key: "testkey.avbpubkey",
3247 private_key: "testkey.pem",
3248 }
3249
Jooyung Han31c470b2019-10-18 16:26:59 +09003250 vndk_prebuilt_shared {
3251 name: "libvndk27",
3252 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003253 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003254 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003255 vndk: {
3256 enabled: true,
3257 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003258 target_arch: "arm64",
3259 arch: {
3260 arm: {
3261 srcs: ["libvndk27_arm.so"],
3262 },
3263 arm64: {
3264 srcs: ["libvndk27_arm64.so"],
3265 },
3266 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003267 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003268 }
3269
3270 vndk_prebuilt_shared {
3271 name: "libvndk27",
3272 version: "27",
3273 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003274 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003275 vndk: {
3276 enabled: true,
3277 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003278 target_arch: "x86_64",
3279 arch: {
3280 x86: {
3281 srcs: ["libvndk27_x86.so"],
3282 },
3283 x86_64: {
3284 srcs: ["libvndk27_x86_64.so"],
3285 },
3286 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003287 }
3288 `+vndkLibrariesTxtFiles("27"),
3289 withFiles(map[string][]byte{
3290 "libvndk27_arm.so": nil,
3291 "libvndk27_arm64.so": nil,
3292 "libvndk27_x86.so": nil,
3293 "libvndk27_x86_64.so": nil,
3294 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003295
Jooyung Hana57af4a2020-01-23 05:36:59 +00003296 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003297 "lib/libvndk27_arm.so",
3298 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003299 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003300 })
Jooyung Han344d5432019-08-23 11:17:39 +09003301}
3302
3303func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3304 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3305 apex_vndk {
3306 name: "myapex_v27",
3307 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003308 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003309 vndk_version: "27",
3310 }
3311 apex_vndk {
3312 name: "myapex_v27_other",
3313 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003314 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003315 vndk_version: "27",
3316 }
3317
3318 apex_key {
3319 name: "myapex.key",
3320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
3323
3324 cc_library {
3325 name: "libvndk",
3326 srcs: ["mylib.cpp"],
3327 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003328 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003329 vndk: {
3330 enabled: true,
3331 },
3332 system_shared_libs: [],
3333 stl: "none",
3334 }
3335
3336 vndk_prebuilt_shared {
3337 name: "libvndk",
3338 version: "27",
3339 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003340 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003341 vndk: {
3342 enabled: true,
3343 },
3344 srcs: ["libvndk.so"],
3345 }
3346 `, withFiles(map[string][]byte{
3347 "libvndk.so": nil,
3348 }))
3349}
3350
Jooyung Han90eee022019-10-01 20:02:42 +09003351func TestVndkApexNameRule(t *testing.T) {
3352 ctx, _ := testApex(t, `
3353 apex_vndk {
3354 name: "myapex",
3355 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003356 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003357 }
3358 apex_vndk {
3359 name: "myapex_v28",
3360 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003361 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003362 vndk_version: "28",
3363 }
3364 apex_key {
3365 name: "myapex.key",
3366 public_key: "testkey.avbpubkey",
3367 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003368 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003369
3370 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003371 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003372 actual := proptools.String(bundle.properties.Apex_name)
3373 if !reflect.DeepEqual(actual, expected) {
3374 t.Errorf("Got '%v', expected '%v'", actual, expected)
3375 }
3376 }
3377
3378 assertApexName("com.android.vndk.vVER", "myapex")
3379 assertApexName("com.android.vndk.v28", "myapex_v28")
3380}
3381
Jooyung Han344d5432019-08-23 11:17:39 +09003382func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3383 ctx, _ := testApex(t, `
3384 apex_vndk {
3385 name: "myapex",
3386 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003387 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "libvndk",
3398 srcs: ["mylib.cpp"],
3399 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003400 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003401 native_bridge_supported: true,
3402 host_supported: true,
3403 vndk: {
3404 enabled: true,
3405 },
3406 system_shared_libs: [],
3407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003408 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003409 }
Jooyung Han35155c42020-02-06 17:33:20 +09003410 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003411
Jooyung Hana57af4a2020-01-23 05:36:59 +00003412 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003413 "lib/libvndk.so",
3414 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003415 "lib/libc++.so",
3416 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003417 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003418 })
Jooyung Han344d5432019-08-23 11:17:39 +09003419}
3420
3421func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3422 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3423 apex_vndk {
3424 name: "myapex",
3425 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003426 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003427 native_bridge_supported: true,
3428 }
3429
3430 apex_key {
3431 name: "myapex.key",
3432 public_key: "testkey.avbpubkey",
3433 private_key: "testkey.pem",
3434 }
3435
3436 cc_library {
3437 name: "libvndk",
3438 srcs: ["mylib.cpp"],
3439 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003440 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003441 native_bridge_supported: true,
3442 host_supported: true,
3443 vndk: {
3444 enabled: true,
3445 },
3446 system_shared_libs: [],
3447 stl: "none",
3448 }
3449 `)
3450}
3451
Jooyung Han31c470b2019-10-18 16:26:59 +09003452func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003453 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003454 apex_vndk {
3455 name: "myapex_v27",
3456 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003457 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 vndk_version: "27",
3459 }
3460
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466
3467 vndk_prebuilt_shared {
3468 name: "libvndk27",
3469 version: "27",
3470 target_arch: "arm",
3471 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003472 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003473 vndk: {
3474 enabled: true,
3475 },
3476 arch: {
3477 arm: {
3478 srcs: ["libvndk27.so"],
3479 }
3480 },
3481 }
3482
3483 vndk_prebuilt_shared {
3484 name: "libvndk27",
3485 version: "27",
3486 target_arch: "arm",
3487 binder32bit: true,
3488 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003489 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003490 vndk: {
3491 enabled: true,
3492 },
3493 arch: {
3494 arm: {
3495 srcs: ["libvndk27binder32.so"],
3496 }
3497 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003498 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003499 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003500 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003501 withFiles(map[string][]byte{
3502 "libvndk27.so": nil,
3503 "libvndk27binder32.so": nil,
3504 }),
3505 withBinder32bit,
3506 withTargets(map[android.OsType][]android.Target{
3507 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003508 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3509 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003510 },
3511 }),
3512 )
3513
Jooyung Hana57af4a2020-01-23 05:36:59 +00003514 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003515 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003516 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003517 })
3518}
3519
Jooyung Han45a96772020-06-15 14:59:42 +09003520func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3521 ctx, _ := testApex(t, `
3522 apex_vndk {
3523 name: "myapex",
3524 key: "myapex.key",
3525 file_contexts: ":myapex-file_contexts",
3526 }
3527
3528 apex_key {
3529 name: "myapex.key",
3530 public_key: "testkey.avbpubkey",
3531 private_key: "testkey.pem",
3532 }
3533
3534 cc_library {
3535 name: "libz",
3536 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003537 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003538 vndk: {
3539 enabled: true,
3540 },
3541 stubs: {
3542 symbol_file: "libz.map.txt",
3543 versions: ["30"],
3544 }
3545 }
3546 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3547 "libz.map.txt": nil,
3548 }))
3549
3550 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3551 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3552 ensureListEmpty(t, provideNativeLibs)
3553}
3554
Jooyung Hane1633032019-08-01 17:41:43 +09003555func TestDependenciesInApexManifest(t *testing.T) {
3556 ctx, _ := testApex(t, `
3557 apex {
3558 name: "myapex_nodep",
3559 key: "myapex.key",
3560 native_shared_libs: ["lib_nodep"],
3561 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003562 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003563 }
3564
3565 apex {
3566 name: "myapex_dep",
3567 key: "myapex.key",
3568 native_shared_libs: ["lib_dep"],
3569 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003570 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003571 }
3572
3573 apex {
3574 name: "myapex_provider",
3575 key: "myapex.key",
3576 native_shared_libs: ["libfoo"],
3577 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003578 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003579 }
3580
3581 apex {
3582 name: "myapex_selfcontained",
3583 key: "myapex.key",
3584 native_shared_libs: ["lib_dep", "libfoo"],
3585 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003586 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003587 }
3588
3589 apex_key {
3590 name: "myapex.key",
3591 public_key: "testkey.avbpubkey",
3592 private_key: "testkey.pem",
3593 }
3594
3595 cc_library {
3596 name: "lib_nodep",
3597 srcs: ["mylib.cpp"],
3598 system_shared_libs: [],
3599 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003600 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003601 }
3602
3603 cc_library {
3604 name: "lib_dep",
3605 srcs: ["mylib.cpp"],
3606 shared_libs: ["libfoo"],
3607 system_shared_libs: [],
3608 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003609 apex_available: [
3610 "myapex_dep",
3611 "myapex_provider",
3612 "myapex_selfcontained",
3613 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003614 }
3615
3616 cc_library {
3617 name: "libfoo",
3618 srcs: ["mytest.cpp"],
3619 stubs: {
3620 versions: ["1"],
3621 },
3622 system_shared_libs: [],
3623 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003624 apex_available: [
3625 "myapex_provider",
3626 "myapex_selfcontained",
3627 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003628 }
3629 `)
3630
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003631 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003632 var provideNativeLibs, requireNativeLibs []string
3633
Sundong Ahnabb64432019-10-22 13:58:29 +09003634 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003635 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3636 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003637 ensureListEmpty(t, provideNativeLibs)
3638 ensureListEmpty(t, requireNativeLibs)
3639
Sundong Ahnabb64432019-10-22 13:58:29 +09003640 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003641 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3642 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003643 ensureListEmpty(t, provideNativeLibs)
3644 ensureListContains(t, requireNativeLibs, "libfoo.so")
3645
Sundong Ahnabb64432019-10-22 13:58:29 +09003646 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003647 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3648 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003649 ensureListContains(t, provideNativeLibs, "libfoo.so")
3650 ensureListEmpty(t, requireNativeLibs)
3651
Sundong Ahnabb64432019-10-22 13:58:29 +09003652 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003653 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3654 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003655 ensureListContains(t, provideNativeLibs, "libfoo.so")
3656 ensureListEmpty(t, requireNativeLibs)
3657}
3658
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003659func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003660 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003661 apex {
3662 name: "myapex",
3663 key: "myapex.key",
3664 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003665 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003666 }
3667
3668 apex_key {
3669 name: "myapex.key",
3670 public_key: "testkey.avbpubkey",
3671 private_key: "testkey.pem",
3672 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003673
3674 cc_library {
3675 name: "mylib",
3676 srcs: ["mylib.cpp"],
3677 system_shared_libs: [],
3678 stl: "none",
3679 apex_available: [
3680 "//apex_available:platform",
3681 "myapex",
3682 ],
3683 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003684 `)
3685
Sundong Ahnabb64432019-10-22 13:58:29 +09003686 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003687 apexManifestRule := module.Rule("apexManifestRule")
3688 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3689 apexRule := module.Rule("apexRule")
3690 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003691
3692 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3693 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3694 name := apexBundle.BaseModuleName()
3695 prefix := "TARGET_"
3696 var builder strings.Builder
3697 data.Custom(&builder, name, prefix, "", data)
3698 androidMk := builder.String()
3699 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3700 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003701}
3702
Alex Light0851b882019-02-07 13:20:53 -08003703func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003704 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003705 apex {
3706 name: "myapex",
3707 key: "myapex.key",
3708 native_shared_libs: ["mylib_common"],
3709 }
3710
3711 apex_key {
3712 name: "myapex.key",
3713 public_key: "testkey.avbpubkey",
3714 private_key: "testkey.pem",
3715 }
3716
3717 cc_library {
3718 name: "mylib_common",
3719 srcs: ["mylib.cpp"],
3720 system_shared_libs: [],
3721 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003722 apex_available: [
3723 "//apex_available:platform",
3724 "myapex",
3725 ],
Alex Light0851b882019-02-07 13:20:53 -08003726 }
3727 `)
3728
Sundong Ahnabb64432019-10-22 13:58:29 +09003729 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003730 apexRule := module.Rule("apexRule")
3731 copyCmds := apexRule.Args["copy_commands"]
3732
3733 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3734 t.Log("Apex was a test apex!")
3735 t.Fail()
3736 }
3737 // Ensure that main rule creates an output
3738 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3739
3740 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003741 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003742
3743 // Ensure that both direct and indirect deps are copied into apex
3744 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3745
Colin Cross7113d202019-11-20 16:39:12 -08003746 // Ensure that the platform variant ends with _shared
3747 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003748
Colin Cross56a83212020-09-15 18:30:11 -07003749 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003750 t.Log("Found mylib_common not in any apex!")
3751 t.Fail()
3752 }
3753}
3754
3755func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003756 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003757 apex_test {
3758 name: "myapex",
3759 key: "myapex.key",
3760 native_shared_libs: ["mylib_common_test"],
3761 }
3762
3763 apex_key {
3764 name: "myapex.key",
3765 public_key: "testkey.avbpubkey",
3766 private_key: "testkey.pem",
3767 }
3768
3769 cc_library {
3770 name: "mylib_common_test",
3771 srcs: ["mylib.cpp"],
3772 system_shared_libs: [],
3773 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003774 // TODO: remove //apex_available:platform
3775 apex_available: [
3776 "//apex_available:platform",
3777 "myapex",
3778 ],
Alex Light0851b882019-02-07 13:20:53 -08003779 }
3780 `)
3781
Sundong Ahnabb64432019-10-22 13:58:29 +09003782 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003783 apexRule := module.Rule("apexRule")
3784 copyCmds := apexRule.Args["copy_commands"]
3785
3786 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3787 t.Log("Apex was not a test apex!")
3788 t.Fail()
3789 }
3790 // Ensure that main rule creates an output
3791 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3792
3793 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003794 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003795
3796 // Ensure that both direct and indirect deps are copied into apex
3797 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3798
Colin Cross7113d202019-11-20 16:39:12 -08003799 // Ensure that the platform variant ends with _shared
3800 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003801}
3802
Alex Light9670d332019-01-29 18:07:33 -08003803func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003804 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003805 apex {
3806 name: "myapex",
3807 key: "myapex.key",
3808 multilib: {
3809 first: {
3810 native_shared_libs: ["mylib_common"],
3811 }
3812 },
3813 target: {
3814 android: {
3815 multilib: {
3816 first: {
3817 native_shared_libs: ["mylib"],
3818 }
3819 }
3820 },
3821 host: {
3822 multilib: {
3823 first: {
3824 native_shared_libs: ["mylib2"],
3825 }
3826 }
3827 }
3828 }
3829 }
3830
3831 apex_key {
3832 name: "myapex.key",
3833 public_key: "testkey.avbpubkey",
3834 private_key: "testkey.pem",
3835 }
3836
3837 cc_library {
3838 name: "mylib",
3839 srcs: ["mylib.cpp"],
3840 system_shared_libs: [],
3841 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003842 // TODO: remove //apex_available:platform
3843 apex_available: [
3844 "//apex_available:platform",
3845 "myapex",
3846 ],
Alex Light9670d332019-01-29 18:07:33 -08003847 }
3848
3849 cc_library {
3850 name: "mylib_common",
3851 srcs: ["mylib.cpp"],
3852 system_shared_libs: [],
3853 stl: "none",
3854 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003855 // TODO: remove //apex_available:platform
3856 apex_available: [
3857 "//apex_available:platform",
3858 "myapex",
3859 ],
Alex Light9670d332019-01-29 18:07:33 -08003860 }
3861
3862 cc_library {
3863 name: "mylib2",
3864 srcs: ["mylib.cpp"],
3865 system_shared_libs: [],
3866 stl: "none",
3867 compile_multilib: "first",
3868 }
3869 `)
3870
Sundong Ahnabb64432019-10-22 13:58:29 +09003871 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003872 copyCmds := apexRule.Args["copy_commands"]
3873
3874 // Ensure that main rule creates an output
3875 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3876
3877 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003878 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3879 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3880 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003881
3882 // Ensure that both direct and indirect deps are copied into apex
3883 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3884 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3885 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3886
Colin Cross7113d202019-11-20 16:39:12 -08003887 // Ensure that the platform variant ends with _shared
3888 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3889 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3890 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003891}
Jiyong Park04480cf2019-02-06 00:16:29 +09003892
Jiyong Park59140302020-12-14 18:44:04 +09003893func TestApexWithArch(t *testing.T) {
3894 ctx, _ := testApex(t, `
3895 apex {
3896 name: "myapex",
3897 key: "myapex.key",
3898 arch: {
3899 arm64: {
3900 native_shared_libs: ["mylib.arm64"],
3901 },
3902 x86_64: {
3903 native_shared_libs: ["mylib.x64"],
3904 },
3905 }
3906 }
3907
3908 apex_key {
3909 name: "myapex.key",
3910 public_key: "testkey.avbpubkey",
3911 private_key: "testkey.pem",
3912 }
3913
3914 cc_library {
3915 name: "mylib.arm64",
3916 srcs: ["mylib.cpp"],
3917 system_shared_libs: [],
3918 stl: "none",
3919 // TODO: remove //apex_available:platform
3920 apex_available: [
3921 "//apex_available:platform",
3922 "myapex",
3923 ],
3924 }
3925
3926 cc_library {
3927 name: "mylib.x64",
3928 srcs: ["mylib.cpp"],
3929 system_shared_libs: [],
3930 stl: "none",
3931 // TODO: remove //apex_available:platform
3932 apex_available: [
3933 "//apex_available:platform",
3934 "myapex",
3935 ],
3936 }
3937 `)
3938
3939 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
3940 copyCmds := apexRule.Args["copy_commands"]
3941
3942 // Ensure that apex variant is created for the direct dep
3943 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
3944 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
3945
3946 // Ensure that both direct and indirect deps are copied into apex
3947 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
3948 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
3949}
3950
Jiyong Park04480cf2019-02-06 00:16:29 +09003951func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003952 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003953 apex {
3954 name: "myapex",
3955 key: "myapex.key",
3956 binaries: ["myscript"],
3957 }
3958
3959 apex_key {
3960 name: "myapex.key",
3961 public_key: "testkey.avbpubkey",
3962 private_key: "testkey.pem",
3963 }
3964
3965 sh_binary {
3966 name: "myscript",
3967 src: "mylib.cpp",
3968 filename: "myscript.sh",
3969 sub_dir: "script",
3970 }
3971 `)
3972
Sundong Ahnabb64432019-10-22 13:58:29 +09003973 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003974 copyCmds := apexRule.Args["copy_commands"]
3975
3976 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3977}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003978
Jooyung Han91df2082019-11-20 01:49:42 +09003979func TestApexInVariousPartition(t *testing.T) {
3980 testcases := []struct {
3981 propName, parition, flattenedPartition string
3982 }{
3983 {"", "system", "system_ext"},
3984 {"product_specific: true", "product", "product"},
3985 {"soc_specific: true", "vendor", "vendor"},
3986 {"proprietary: true", "vendor", "vendor"},
3987 {"vendor: true", "vendor", "vendor"},
3988 {"system_ext_specific: true", "system_ext", "system_ext"},
3989 }
3990 for _, tc := range testcases {
3991 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3992 ctx, _ := testApex(t, `
3993 apex {
3994 name: "myapex",
3995 key: "myapex.key",
3996 `+tc.propName+`
3997 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003998
Jooyung Han91df2082019-11-20 01:49:42 +09003999 apex_key {
4000 name: "myapex.key",
4001 public_key: "testkey.avbpubkey",
4002 private_key: "testkey.pem",
4003 }
4004 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004005
Jooyung Han91df2082019-11-20 01:49:42 +09004006 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4007 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4008 actual := apex.installDir.String()
4009 if actual != expected {
4010 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4011 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004012
Jooyung Han91df2082019-11-20 01:49:42 +09004013 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4014 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4015 actual = flattened.installDir.String()
4016 if actual != expected {
4017 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4018 }
4019 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004020 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004021}
Jiyong Park67882562019-03-21 01:11:21 +09004022
Jooyung Han580eb4f2020-06-24 19:33:06 +09004023func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004024 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004025 apex {
4026 name: "myapex",
4027 key: "myapex.key",
4028 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029
Jooyung Han580eb4f2020-06-24 19:33:06 +09004030 apex_key {
4031 name: "myapex.key",
4032 public_key: "testkey.avbpubkey",
4033 private_key: "testkey.pem",
4034 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004035 `)
4036 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004037 rule := module.Output("file_contexts")
4038 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4039}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004040
Jooyung Han580eb4f2020-06-24 19:33:06 +09004041func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004042 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004043 apex {
4044 name: "myapex",
4045 key: "myapex.key",
4046 file_contexts: "my_own_file_contexts",
4047 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004048
Jooyung Han580eb4f2020-06-24 19:33:06 +09004049 apex_key {
4050 name: "myapex.key",
4051 public_key: "testkey.avbpubkey",
4052 private_key: "testkey.pem",
4053 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004054 `, withFiles(map[string][]byte{
4055 "my_own_file_contexts": nil,
4056 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004057}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004058
Jooyung Han580eb4f2020-06-24 19:33:06 +09004059func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004061 apex {
4062 name: "myapex",
4063 key: "myapex.key",
4064 product_specific: true,
4065 file_contexts: "product_specific_file_contexts",
4066 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004067
Jooyung Han580eb4f2020-06-24 19:33:06 +09004068 apex_key {
4069 name: "myapex.key",
4070 public_key: "testkey.avbpubkey",
4071 private_key: "testkey.pem",
4072 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004073 `)
4074
Jooyung Han580eb4f2020-06-24 19:33:06 +09004075 ctx, _ := testApex(t, `
4076 apex {
4077 name: "myapex",
4078 key: "myapex.key",
4079 product_specific: true,
4080 file_contexts: "product_specific_file_contexts",
4081 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004082
Jooyung Han580eb4f2020-06-24 19:33:06 +09004083 apex_key {
4084 name: "myapex.key",
4085 public_key: "testkey.avbpubkey",
4086 private_key: "testkey.pem",
4087 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004088 `, withFiles(map[string][]byte{
4089 "product_specific_file_contexts": nil,
4090 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004091 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4092 rule := module.Output("file_contexts")
4093 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4094}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004095
Jooyung Han580eb4f2020-06-24 19:33:06 +09004096func TestFileContexts_SetViaFileGroup(t *testing.T) {
4097 ctx, _ := testApex(t, `
4098 apex {
4099 name: "myapex",
4100 key: "myapex.key",
4101 product_specific: true,
4102 file_contexts: ":my-file-contexts",
4103 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004104
Jooyung Han580eb4f2020-06-24 19:33:06 +09004105 apex_key {
4106 name: "myapex.key",
4107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
4109 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110
Jooyung Han580eb4f2020-06-24 19:33:06 +09004111 filegroup {
4112 name: "my-file-contexts",
4113 srcs: ["product_specific_file_contexts"],
4114 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004115 `, withFiles(map[string][]byte{
4116 "product_specific_file_contexts": nil,
4117 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004118 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4119 rule := module.Output("file_contexts")
4120 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004121}
4122
Jiyong Park67882562019-03-21 01:11:21 +09004123func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004124 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004125 apex_key {
4126 name: "myapex.key",
4127 public_key: ":my.avbpubkey",
4128 private_key: ":my.pem",
4129 product_specific: true,
4130 }
4131
4132 filegroup {
4133 name: "my.avbpubkey",
4134 srcs: ["testkey2.avbpubkey"],
4135 }
4136
4137 filegroup {
4138 name: "my.pem",
4139 srcs: ["testkey2.pem"],
4140 }
4141 `)
4142
4143 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4144 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004145 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004146 if actual_pubkey != expected_pubkey {
4147 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4148 }
4149 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004150 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004151 if actual_privkey != expected_privkey {
4152 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4153 }
4154}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004155
4156func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004157 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004158 prebuilt_apex {
4159 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004160 arch: {
4161 arm64: {
4162 src: "myapex-arm64.apex",
4163 },
4164 arm: {
4165 src: "myapex-arm.apex",
4166 },
4167 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004168 }
4169 `)
4170
4171 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4172
Jiyong Parkc95714e2019-03-29 14:23:10 +09004173 expectedInput := "myapex-arm64.apex"
4174 if prebuilt.inputApex.String() != expectedInput {
4175 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4176 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004177}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004178
4179func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004180 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004181 prebuilt_apex {
4182 name: "myapex",
4183 src: "myapex-arm.apex",
4184 filename: "notmyapex.apex",
4185 }
4186 `)
4187
4188 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4189
4190 expected := "notmyapex.apex"
4191 if p.installFilename != expected {
4192 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4193 }
4194}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004195
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004196func TestPrebuiltOverrides(t *testing.T) {
4197 ctx, config := testApex(t, `
4198 prebuilt_apex {
4199 name: "myapex.prebuilt",
4200 src: "myapex-arm.apex",
4201 overrides: [
4202 "myapex",
4203 ],
4204 }
4205 `)
4206
4207 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4208
4209 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004210 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004211 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004212 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004213 }
4214}
4215
Paul Duffin064b70c2020-11-02 17:32:38 +00004216func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4217 transform := func(config *dexpreopt.GlobalConfig) {
4218 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
4219 }
4220
4221 checkDexJarBuildPath := func(ctx *android.TestContext, name string) {
4222 // Make sure the import has been given the correct path to the dex jar.
4223 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.Dependency)
4224 dexJarBuildPath := p.DexJarBuildPath()
4225 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
4226 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4227 }
4228 }
4229
4230 ensureNoSourceVariant := func(ctx *android.TestContext) {
4231 // Make sure that an apex variant is not created for the source module.
4232 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests("libfoo"); !reflect.DeepEqual(expected, actual) {
4233 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4234 }
4235 }
4236
4237 t.Run("prebuilt only", func(t *testing.T) {
4238 bp := `
4239 prebuilt_apex {
4240 name: "myapex",
4241 arch: {
4242 arm64: {
4243 src: "myapex-arm64.apex",
4244 },
4245 arm: {
4246 src: "myapex-arm.apex",
4247 },
4248 },
4249 exported_java_libs: ["libfoo"],
4250 }
4251
4252 java_import {
4253 name: "libfoo",
4254 jars: ["libfoo.jar"],
4255 }
4256 `
4257
4258 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4259 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4260
4261 checkDexJarBuildPath(ctx, "libfoo")
4262 })
4263
4264 t.Run("prebuilt with source preferred", func(t *testing.T) {
4265
4266 bp := `
4267 prebuilt_apex {
4268 name: "myapex",
4269 arch: {
4270 arm64: {
4271 src: "myapex-arm64.apex",
4272 },
4273 arm: {
4274 src: "myapex-arm.apex",
4275 },
4276 },
4277 exported_java_libs: ["libfoo"],
4278 }
4279
4280 java_import {
4281 name: "libfoo",
4282 jars: ["libfoo.jar"],
4283 }
4284
4285 java_library {
4286 name: "libfoo",
4287 }
4288 `
4289
4290 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4291 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4292
4293 checkDexJarBuildPath(ctx, "prebuilt_libfoo")
4294 ensureNoSourceVariant(ctx)
4295 })
4296
4297 t.Run("prebuilt preferred with source", func(t *testing.T) {
4298 bp := `
4299 prebuilt_apex {
4300 name: "myapex",
4301 prefer: true,
4302 arch: {
4303 arm64: {
4304 src: "myapex-arm64.apex",
4305 },
4306 arm: {
4307 src: "myapex-arm.apex",
4308 },
4309 },
4310 exported_java_libs: ["libfoo"],
4311 }
4312
4313 java_import {
4314 name: "libfoo",
4315 jars: ["libfoo.jar"],
4316 }
4317
4318 java_library {
4319 name: "libfoo",
4320 }
4321 `
4322
4323 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4324 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4325
4326 checkDexJarBuildPath(ctx, "prebuilt_libfoo")
4327 ensureNoSourceVariant(ctx)
4328 })
4329}
4330
Roland Levillain630846d2019-06-26 12:48:34 +01004331func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004332 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004333 apex_test {
4334 name: "myapex",
4335 key: "myapex.key",
4336 tests: [
4337 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004338 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004339 ],
4340 }
4341
4342 apex_key {
4343 name: "myapex.key",
4344 public_key: "testkey.avbpubkey",
4345 private_key: "testkey.pem",
4346 }
4347
Liz Kammer1c14a212020-05-12 15:26:55 -07004348 filegroup {
4349 name: "fg",
4350 srcs: [
4351 "baz",
4352 "bar/baz"
4353 ],
4354 }
4355
Roland Levillain630846d2019-06-26 12:48:34 +01004356 cc_test {
4357 name: "mytest",
4358 gtest: false,
4359 srcs: ["mytest.cpp"],
4360 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004361 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004362 system_shared_libs: [],
4363 static_executable: true,
4364 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004365 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004366 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004367
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004368 cc_library {
4369 name: "mylib",
4370 srcs: ["mylib.cpp"],
4371 system_shared_libs: [],
4372 stl: "none",
4373 }
4374
Liz Kammer5bd365f2020-05-27 15:15:11 -07004375 filegroup {
4376 name: "fg2",
4377 srcs: [
4378 "testdata/baz"
4379 ],
4380 }
4381
Roland Levillain9b5fde92019-06-28 15:41:19 +01004382 cc_test {
4383 name: "mytests",
4384 gtest: false,
4385 srcs: [
4386 "mytest1.cpp",
4387 "mytest2.cpp",
4388 "mytest3.cpp",
4389 ],
4390 test_per_src: true,
4391 relative_install_path: "test",
4392 system_shared_libs: [],
4393 static_executable: true,
4394 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004395 data: [
4396 ":fg",
4397 ":fg2",
4398 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004399 }
Roland Levillain630846d2019-06-26 12:48:34 +01004400 `)
4401
Sundong Ahnabb64432019-10-22 13:58:29 +09004402 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004403 copyCmds := apexRule.Args["copy_commands"]
4404
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004405 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004406 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004407 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004408
Liz Kammer1c14a212020-05-12 15:26:55 -07004409 //Ensure that test data are copied into apex.
4410 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4411 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4412
Roland Levillain9b5fde92019-06-28 15:41:19 +01004413 // Ensure that test deps built with `test_per_src` are copied into apex.
4414 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4415 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4416 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004417
4418 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004419 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4420 data := android.AndroidMkDataForTest(t, config, "", bundle)
4421 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004422 prefix := "TARGET_"
4423 var builder strings.Builder
4424 data.Custom(&builder, name, prefix, "", data)
4425 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004426 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4427 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4428 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4429 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004430 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004431 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004432 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004433
4434 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4435 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4436 data.Custom(&builder, name, prefix, "", data)
4437 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004438 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4439 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004440}
4441
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004442func TestInstallExtraFlattenedApexes(t *testing.T) {
4443 ctx, config := testApex(t, `
4444 apex {
4445 name: "myapex",
4446 key: "myapex.key",
4447 }
4448 apex_key {
4449 name: "myapex.key",
4450 public_key: "testkey.avbpubkey",
4451 private_key: "testkey.pem",
4452 }
4453 `, func(fs map[string][]byte, config android.Config) {
4454 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4455 })
4456 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004457 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004458 mk := android.AndroidMkDataForTest(t, config, "", ab)
4459 var builder strings.Builder
4460 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4461 androidMk := builder.String()
4462 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4463}
4464
Jooyung Hand48f3c32019-08-23 11:18:57 +09004465func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4466 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4467 apex {
4468 name: "myapex",
4469 key: "myapex.key",
4470 native_shared_libs: ["libfoo"],
4471 }
4472
4473 apex_key {
4474 name: "myapex.key",
4475 public_key: "testkey.avbpubkey",
4476 private_key: "testkey.pem",
4477 }
4478
4479 cc_library {
4480 name: "libfoo",
4481 stl: "none",
4482 system_shared_libs: [],
4483 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004484 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004485 }
4486 `)
4487 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4488 apex {
4489 name: "myapex",
4490 key: "myapex.key",
4491 java_libs: ["myjar"],
4492 }
4493
4494 apex_key {
4495 name: "myapex.key",
4496 public_key: "testkey.avbpubkey",
4497 private_key: "testkey.pem",
4498 }
4499
4500 java_library {
4501 name: "myjar",
4502 srcs: ["foo/bar/MyClass.java"],
4503 sdk_version: "none",
4504 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004505 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004506 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004507 }
4508 `)
4509}
4510
Bill Peckhama41a6962021-01-11 10:58:54 -08004511func TestApexWithJavaImport(t *testing.T) {
4512 ctx, _ := testApex(t, `
4513 apex {
4514 name: "myapex",
4515 key: "myapex.key",
4516 java_libs: ["myjavaimport"],
4517 }
4518
4519 apex_key {
4520 name: "myapex.key",
4521 public_key: "testkey.avbpubkey",
4522 private_key: "testkey.pem",
4523 }
4524
4525 java_import {
4526 name: "myjavaimport",
4527 apex_available: ["myapex"],
4528 jars: ["my.jar"],
4529 compile_dex: true,
4530 }
4531 `)
4532
4533 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4534 apexRule := module.Rule("apexRule")
4535 copyCmds := apexRule.Args["copy_commands"]
4536 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
4537}
4538
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004539func TestApexWithApps(t *testing.T) {
4540 ctx, _ := testApex(t, `
4541 apex {
4542 name: "myapex",
4543 key: "myapex.key",
4544 apps: [
4545 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004546 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004547 ],
4548 }
4549
4550 apex_key {
4551 name: "myapex.key",
4552 public_key: "testkey.avbpubkey",
4553 private_key: "testkey.pem",
4554 }
4555
4556 android_app {
4557 name: "AppFoo",
4558 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004559 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004560 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004561 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004562 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004563 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004564 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004565
4566 android_app {
4567 name: "AppFooPriv",
4568 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004569 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004570 system_modules: "none",
4571 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004572 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004573 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004574 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004575
4576 cc_library_shared {
4577 name: "libjni",
4578 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004579 shared_libs: ["libfoo"],
4580 stl: "none",
4581 system_shared_libs: [],
4582 apex_available: [ "myapex" ],
4583 sdk_version: "current",
4584 }
4585
4586 cc_library_shared {
4587 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004588 stl: "none",
4589 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004590 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004591 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004592 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004593 `)
4594
Sundong Ahnabb64432019-10-22 13:58:29 +09004595 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004596 apexRule := module.Rule("apexRule")
4597 copyCmds := apexRule.Args["copy_commands"]
4598
4599 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004600 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004601
Colin Crossaede88c2020-08-11 12:17:01 -07004602 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004603 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004604 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004605 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004606 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004607 // JNI libraries including transitive deps are
4608 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004609 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004610 // ... embedded inside APK (jnilibs.zip)
4611 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4612 // ... and not directly inside the APEX
4613 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4614 }
Dario Frenicde2a032019-10-27 00:29:22 +01004615}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004616
Dario Frenicde2a032019-10-27 00:29:22 +01004617func TestApexWithAppImports(t *testing.T) {
4618 ctx, _ := testApex(t, `
4619 apex {
4620 name: "myapex",
4621 key: "myapex.key",
4622 apps: [
4623 "AppFooPrebuilt",
4624 "AppFooPrivPrebuilt",
4625 ],
4626 }
4627
4628 apex_key {
4629 name: "myapex.key",
4630 public_key: "testkey.avbpubkey",
4631 private_key: "testkey.pem",
4632 }
4633
4634 android_app_import {
4635 name: "AppFooPrebuilt",
4636 apk: "PrebuiltAppFoo.apk",
4637 presigned: true,
4638 dex_preopt: {
4639 enabled: false,
4640 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004641 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004642 }
4643
4644 android_app_import {
4645 name: "AppFooPrivPrebuilt",
4646 apk: "PrebuiltAppFooPriv.apk",
4647 privileged: true,
4648 presigned: true,
4649 dex_preopt: {
4650 enabled: false,
4651 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004652 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004653 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004654 }
4655 `)
4656
Sundong Ahnabb64432019-10-22 13:58:29 +09004657 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004658 apexRule := module.Rule("apexRule")
4659 copyCmds := apexRule.Args["copy_commands"]
4660
4661 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004662 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4663}
4664
4665func TestApexWithAppImportsPrefer(t *testing.T) {
4666 ctx, _ := testApex(t, `
4667 apex {
4668 name: "myapex",
4669 key: "myapex.key",
4670 apps: [
4671 "AppFoo",
4672 ],
4673 }
4674
4675 apex_key {
4676 name: "myapex.key",
4677 public_key: "testkey.avbpubkey",
4678 private_key: "testkey.pem",
4679 }
4680
4681 android_app {
4682 name: "AppFoo",
4683 srcs: ["foo/bar/MyClass.java"],
4684 sdk_version: "none",
4685 system_modules: "none",
4686 apex_available: [ "myapex" ],
4687 }
4688
4689 android_app_import {
4690 name: "AppFoo",
4691 apk: "AppFooPrebuilt.apk",
4692 filename: "AppFooPrebuilt.apk",
4693 presigned: true,
4694 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004695 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004696 }
4697 `, withFiles(map[string][]byte{
4698 "AppFooPrebuilt.apk": nil,
4699 }))
4700
4701 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4702 "app/AppFoo/AppFooPrebuilt.apk",
4703 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004704}
4705
Dario Freni6f3937c2019-12-20 22:58:03 +00004706func TestApexWithTestHelperApp(t *testing.T) {
4707 ctx, _ := testApex(t, `
4708 apex {
4709 name: "myapex",
4710 key: "myapex.key",
4711 apps: [
4712 "TesterHelpAppFoo",
4713 ],
4714 }
4715
4716 apex_key {
4717 name: "myapex.key",
4718 public_key: "testkey.avbpubkey",
4719 private_key: "testkey.pem",
4720 }
4721
4722 android_test_helper_app {
4723 name: "TesterHelpAppFoo",
4724 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004725 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004726 }
4727
4728 `)
4729
4730 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4731 apexRule := module.Rule("apexRule")
4732 copyCmds := apexRule.Args["copy_commands"]
4733
4734 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4735}
4736
Jooyung Han18020ea2019-11-13 10:50:48 +09004737func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4738 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004739 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004740 apex {
4741 name: "myapex",
4742 key: "myapex.key",
4743 native_shared_libs: ["libfoo"],
4744 }
4745
4746 apex_key {
4747 name: "myapex.key",
4748 public_key: "testkey.avbpubkey",
4749 private_key: "testkey.pem",
4750 }
4751
4752 apex {
4753 name: "otherapex",
4754 key: "myapex.key",
4755 native_shared_libs: ["libfoo"],
4756 }
4757
4758 cc_defaults {
4759 name: "libfoo-defaults",
4760 apex_available: ["otherapex"],
4761 }
4762
4763 cc_library {
4764 name: "libfoo",
4765 defaults: ["libfoo-defaults"],
4766 stl: "none",
4767 system_shared_libs: [],
4768 }`)
4769}
4770
Paul Duffine52e66f2020-03-30 17:54:29 +01004771func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004772 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004773 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004774 apex {
4775 name: "myapex",
4776 key: "myapex.key",
4777 native_shared_libs: ["libfoo"],
4778 }
4779
4780 apex_key {
4781 name: "myapex.key",
4782 public_key: "testkey.avbpubkey",
4783 private_key: "testkey.pem",
4784 }
4785
4786 apex {
4787 name: "otherapex",
4788 key: "otherapex.key",
4789 native_shared_libs: ["libfoo"],
4790 }
4791
4792 apex_key {
4793 name: "otherapex.key",
4794 public_key: "testkey.avbpubkey",
4795 private_key: "testkey.pem",
4796 }
4797
4798 cc_library {
4799 name: "libfoo",
4800 stl: "none",
4801 system_shared_libs: [],
4802 apex_available: ["otherapex"],
4803 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004804}
Jiyong Park127b40b2019-09-30 16:04:35 +09004805
Paul Duffine52e66f2020-03-30 17:54:29 +01004806func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004807 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004808 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004809.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004810.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004811.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004812.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004813.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004814.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004815 apex {
4816 name: "myapex",
4817 key: "myapex.key",
4818 native_shared_libs: ["libfoo"],
4819 }
4820
4821 apex_key {
4822 name: "myapex.key",
4823 public_key: "testkey.avbpubkey",
4824 private_key: "testkey.pem",
4825 }
4826
Jiyong Park127b40b2019-09-30 16:04:35 +09004827 cc_library {
4828 name: "libfoo",
4829 stl: "none",
4830 shared_libs: ["libbar"],
4831 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004832 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004833 }
4834
4835 cc_library {
4836 name: "libbar",
4837 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004838 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004839 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004840 apex_available: ["myapex"],
4841 }
4842
4843 cc_library {
4844 name: "libbaz",
4845 stl: "none",
4846 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004847 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004848}
Jiyong Park127b40b2019-09-30 16:04:35 +09004849
Paul Duffine52e66f2020-03-30 17:54:29 +01004850func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004851 testApexError(t, "\"otherapex\" is not a valid module name", `
4852 apex {
4853 name: "myapex",
4854 key: "myapex.key",
4855 native_shared_libs: ["libfoo"],
4856 }
4857
4858 apex_key {
4859 name: "myapex.key",
4860 public_key: "testkey.avbpubkey",
4861 private_key: "testkey.pem",
4862 }
4863
4864 cc_library {
4865 name: "libfoo",
4866 stl: "none",
4867 system_shared_libs: [],
4868 apex_available: ["otherapex"],
4869 }`)
4870
Paul Duffine52e66f2020-03-30 17:54:29 +01004871 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004872 apex {
4873 name: "myapex",
4874 key: "myapex.key",
4875 native_shared_libs: ["libfoo", "libbar"],
4876 }
4877
4878 apex_key {
4879 name: "myapex.key",
4880 public_key: "testkey.avbpubkey",
4881 private_key: "testkey.pem",
4882 }
4883
4884 cc_library {
4885 name: "libfoo",
4886 stl: "none",
4887 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004888 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004889 apex_available: ["myapex"],
4890 }
4891
4892 cc_library {
4893 name: "libbar",
4894 stl: "none",
4895 system_shared_libs: [],
4896 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004897 }
4898
4899 cc_library {
4900 name: "libbaz",
4901 stl: "none",
4902 system_shared_libs: [],
4903 stubs: {
4904 versions: ["10", "20", "30"],
4905 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004906 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004907}
Jiyong Park127b40b2019-09-30 16:04:35 +09004908
Jiyong Park89e850a2020-04-07 16:37:39 +09004909func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004910 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004911 apex {
4912 name: "myapex",
4913 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004914 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004915 }
4916
4917 apex_key {
4918 name: "myapex.key",
4919 public_key: "testkey.avbpubkey",
4920 private_key: "testkey.pem",
4921 }
4922
4923 cc_library {
4924 name: "libfoo",
4925 stl: "none",
4926 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004927 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004928 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004929 }
4930
4931 cc_library {
4932 name: "libfoo2",
4933 stl: "none",
4934 system_shared_libs: [],
4935 shared_libs: ["libbaz"],
4936 apex_available: ["//apex_available:platform"],
4937 }
4938
4939 cc_library {
4940 name: "libbar",
4941 stl: "none",
4942 system_shared_libs: [],
4943 apex_available: ["myapex"],
4944 }
4945
4946 cc_library {
4947 name: "libbaz",
4948 stl: "none",
4949 system_shared_libs: [],
4950 apex_available: ["myapex"],
4951 stubs: {
4952 versions: ["1"],
4953 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004954 }`)
4955
Jiyong Park89e850a2020-04-07 16:37:39 +09004956 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4957 // because it depends on libbar which isn't available to platform
4958 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4959 if libfoo.NotAvailableForPlatform() != true {
4960 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4961 }
4962
4963 // libfoo2 however can be available to platform because it depends on libbaz which provides
4964 // stubs
4965 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4966 if libfoo2.NotAvailableForPlatform() == true {
4967 t.Errorf("%q should be available to platform", libfoo2.String())
4968 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004969}
Jiyong Parka90ca002019-10-07 15:47:24 +09004970
Paul Duffine52e66f2020-03-30 17:54:29 +01004971func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004972 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004973 apex {
4974 name: "myapex",
4975 key: "myapex.key",
4976 native_shared_libs: ["libfoo"],
4977 }
4978
4979 apex_key {
4980 name: "myapex.key",
4981 public_key: "testkey.avbpubkey",
4982 private_key: "testkey.pem",
4983 }
4984
4985 cc_library {
4986 name: "libfoo",
4987 stl: "none",
4988 system_shared_libs: [],
4989 apex_available: ["myapex"],
4990 static: {
4991 apex_available: ["//apex_available:platform"],
4992 },
4993 }`)
4994
Jiyong Park89e850a2020-04-07 16:37:39 +09004995 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4996 if libfooShared.NotAvailableForPlatform() != true {
4997 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4998 }
4999 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5000 if libfooStatic.NotAvailableForPlatform() != false {
5001 t.Errorf("%q should be available to platform", libfooStatic.String())
5002 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005003}
5004
Jiyong Park5d790c32019-11-15 18:40:32 +09005005func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005006 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005007 apex {
5008 name: "myapex",
5009 key: "myapex.key",
5010 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005011 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09005012 }
5013
5014 override_apex {
5015 name: "override_myapex",
5016 base: "myapex",
5017 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005018 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005019 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005020 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005021 }
5022
5023 apex_key {
5024 name: "myapex.key",
5025 public_key: "testkey.avbpubkey",
5026 private_key: "testkey.pem",
5027 }
5028
5029 android_app {
5030 name: "app",
5031 srcs: ["foo/bar/MyClass.java"],
5032 package_name: "foo",
5033 sdk_version: "none",
5034 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005035 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005036 }
5037
5038 override_android_app {
5039 name: "override_app",
5040 base: "app",
5041 package_name: "bar",
5042 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005043 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005044
Jiyong Park317645e2019-12-05 13:20:58 +09005045 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5046 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5047 if originalVariant.GetOverriddenBy() != "" {
5048 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5049 }
5050 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5051 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5052 }
5053
Jiyong Park5d790c32019-11-15 18:40:32 +09005054 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5055 apexRule := module.Rule("apexRule")
5056 copyCmds := apexRule.Args["copy_commands"]
5057
5058 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005059 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005060
5061 apexBundle := module.Module().(*apexBundle)
5062 name := apexBundle.Name()
5063 if name != "override_myapex" {
5064 t.Errorf("name should be \"override_myapex\", but was %q", name)
5065 }
5066
Baligh Uddin004d7172020-02-19 21:29:28 -08005067 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5068 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5069 }
5070
Jiyong Park20bacab2020-03-03 11:45:41 +09005071 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005072 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005073
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005074 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5075 var builder strings.Builder
5076 data.Custom(&builder, name, "TARGET_", "", data)
5077 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005078 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005079 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5080 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005081 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005082 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005083 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005084 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5085 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005086}
5087
Jooyung Han214bf372019-11-12 13:03:50 +09005088func TestLegacyAndroid10Support(t *testing.T) {
5089 ctx, _ := testApex(t, `
5090 apex {
5091 name: "myapex",
5092 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005093 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005094 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005095 }
5096
5097 apex_key {
5098 name: "myapex.key",
5099 public_key: "testkey.avbpubkey",
5100 private_key: "testkey.pem",
5101 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005102
5103 cc_library {
5104 name: "mylib",
5105 srcs: ["mylib.cpp"],
5106 stl: "libc++",
5107 system_shared_libs: [],
5108 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005109 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005110 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005111 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005112
5113 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5114 args := module.Rule("apexRule").Args
5115 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005116 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005117
5118 // The copies of the libraries in the apex should have one more dependency than
5119 // the ones outside the apex, namely the unwinder. Ideally we should check
5120 // the dependency names directly here but for some reason the names are blank in
5121 // this test.
5122 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005123 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005124 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5125 if len(apexImplicits) != len(nonApexImplicits)+1 {
5126 t.Errorf("%q missing unwinder dep", lib)
5127 }
5128 }
Jooyung Han214bf372019-11-12 13:03:50 +09005129}
5130
Paul Duffin9b879592020-05-26 13:21:35 +01005131var filesForSdkLibrary = map[string][]byte{
5132 "api/current.txt": nil,
5133 "api/removed.txt": nil,
5134 "api/system-current.txt": nil,
5135 "api/system-removed.txt": nil,
5136 "api/test-current.txt": nil,
5137 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005138
Anton Hanssondff2c782020-12-21 17:10:01 +00005139 "100/public/api/foo.txt": nil,
5140 "100/public/api/foo-removed.txt": nil,
5141 "100/system/api/foo.txt": nil,
5142 "100/system/api/foo-removed.txt": nil,
5143
Paul Duffineedc5d52020-06-12 17:46:39 +01005144 // For java_sdk_library_import
5145 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005146}
5147
Jooyung Han58f26ab2019-12-18 15:34:32 +09005148func TestJavaSDKLibrary(t *testing.T) {
5149 ctx, _ := testApex(t, `
5150 apex {
5151 name: "myapex",
5152 key: "myapex.key",
5153 java_libs: ["foo"],
5154 }
5155
5156 apex_key {
5157 name: "myapex.key",
5158 public_key: "testkey.avbpubkey",
5159 private_key: "testkey.pem",
5160 }
5161
5162 java_sdk_library {
5163 name: "foo",
5164 srcs: ["a.java"],
5165 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005166 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005167 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005168
5169 prebuilt_apis {
5170 name: "sdk",
5171 api_dirs: ["100"],
5172 }
Paul Duffin9b879592020-05-26 13:21:35 +01005173 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005174
5175 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005176 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005177 "javalib/foo.jar",
5178 "etc/permissions/foo.xml",
5179 })
5180 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005181 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5182 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005183}
5184
Paul Duffin9b879592020-05-26 13:21:35 +01005185func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5186 ctx, _ := testApex(t, `
5187 apex {
5188 name: "myapex",
5189 key: "myapex.key",
5190 java_libs: ["foo", "bar"],
5191 }
5192
5193 apex_key {
5194 name: "myapex.key",
5195 public_key: "testkey.avbpubkey",
5196 private_key: "testkey.pem",
5197 }
5198
5199 java_sdk_library {
5200 name: "foo",
5201 srcs: ["a.java"],
5202 api_packages: ["foo"],
5203 apex_available: ["myapex"],
5204 sdk_version: "none",
5205 system_modules: "none",
5206 }
5207
5208 java_library {
5209 name: "bar",
5210 srcs: ["a.java"],
5211 libs: ["foo"],
5212 apex_available: ["myapex"],
5213 sdk_version: "none",
5214 system_modules: "none",
5215 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005216
5217 prebuilt_apis {
5218 name: "sdk",
5219 api_dirs: ["100"],
5220 }
Paul Duffin9b879592020-05-26 13:21:35 +01005221 `, withFiles(filesForSdkLibrary))
5222
5223 // java_sdk_library installs both impl jar and permission XML
5224 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5225 "javalib/bar.jar",
5226 "javalib/foo.jar",
5227 "etc/permissions/foo.xml",
5228 })
5229
5230 // The bar library should depend on the implementation jar.
5231 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5232 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5233 t.Errorf("expected %q, found %#q", expected, actual)
5234 }
5235}
5236
5237func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5238 ctx, _ := testApex(t, `
5239 apex {
5240 name: "myapex",
5241 key: "myapex.key",
5242 java_libs: ["foo"],
5243 }
5244
5245 apex_key {
5246 name: "myapex.key",
5247 public_key: "testkey.avbpubkey",
5248 private_key: "testkey.pem",
5249 }
5250
5251 java_sdk_library {
5252 name: "foo",
5253 srcs: ["a.java"],
5254 api_packages: ["foo"],
5255 apex_available: ["myapex"],
5256 sdk_version: "none",
5257 system_modules: "none",
5258 }
5259
5260 java_library {
5261 name: "bar",
5262 srcs: ["a.java"],
5263 libs: ["foo"],
5264 sdk_version: "none",
5265 system_modules: "none",
5266 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005267
5268 prebuilt_apis {
5269 name: "sdk",
5270 api_dirs: ["100"],
5271 }
Paul Duffin9b879592020-05-26 13:21:35 +01005272 `, withFiles(filesForSdkLibrary))
5273
5274 // java_sdk_library installs both impl jar and permission XML
5275 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5276 "javalib/foo.jar",
5277 "etc/permissions/foo.xml",
5278 })
5279
5280 // The bar library should depend on the stubs jar.
5281 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5282 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5283 t.Errorf("expected %q, found %#q", expected, actual)
5284 }
5285}
5286
Paul Duffineedc5d52020-06-12 17:46:39 +01005287func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005288 ctx, _ := testApex(t, `
5289 prebuilt_apis {
5290 name: "sdk",
5291 api_dirs: ["100"],
5292 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005293 withFiles(map[string][]byte{
5294 "apex/a.java": nil,
5295 "apex/apex_manifest.json": nil,
5296 "apex/Android.bp": []byte(`
5297 package {
5298 default_visibility: ["//visibility:private"],
5299 }
5300
5301 apex {
5302 name: "myapex",
5303 key: "myapex.key",
5304 java_libs: ["foo", "bar"],
5305 }
5306
5307 apex_key {
5308 name: "myapex.key",
5309 public_key: "testkey.avbpubkey",
5310 private_key: "testkey.pem",
5311 }
5312
5313 java_library {
5314 name: "bar",
5315 srcs: ["a.java"],
5316 libs: ["foo"],
5317 apex_available: ["myapex"],
5318 sdk_version: "none",
5319 system_modules: "none",
5320 }
5321`),
5322 "source/a.java": nil,
5323 "source/api/current.txt": nil,
5324 "source/api/removed.txt": nil,
5325 "source/Android.bp": []byte(`
5326 package {
5327 default_visibility: ["//visibility:private"],
5328 }
5329
5330 java_sdk_library {
5331 name: "foo",
5332 visibility: ["//apex"],
5333 srcs: ["a.java"],
5334 api_packages: ["foo"],
5335 apex_available: ["myapex"],
5336 sdk_version: "none",
5337 system_modules: "none",
5338 public: {
5339 enabled: true,
5340 },
5341 }
5342`),
5343 "prebuilt/a.jar": nil,
5344 "prebuilt/Android.bp": []byte(`
5345 package {
5346 default_visibility: ["//visibility:private"],
5347 }
5348
5349 java_sdk_library_import {
5350 name: "foo",
5351 visibility: ["//apex", "//source"],
5352 apex_available: ["myapex"],
5353 prefer: true,
5354 public: {
5355 jars: ["a.jar"],
5356 },
5357 }
5358`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005359 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005360 )
5361
5362 // java_sdk_library installs both impl jar and permission XML
5363 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5364 "javalib/bar.jar",
5365 "javalib/foo.jar",
5366 "etc/permissions/foo.xml",
5367 })
5368
5369 // The bar library should depend on the implementation jar.
5370 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5371 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5372 t.Errorf("expected %q, found %#q", expected, actual)
5373 }
5374}
5375
5376func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5377 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5378 apex {
5379 name: "myapex",
5380 key: "myapex.key",
5381 java_libs: ["foo"],
5382 }
5383
5384 apex_key {
5385 name: "myapex.key",
5386 public_key: "testkey.avbpubkey",
5387 private_key: "testkey.pem",
5388 }
5389
5390 java_sdk_library_import {
5391 name: "foo",
5392 apex_available: ["myapex"],
5393 prefer: true,
5394 public: {
5395 jars: ["a.jar"],
5396 },
5397 }
5398
5399 `, withFiles(filesForSdkLibrary))
5400}
5401
atrost6e126252020-01-27 17:01:16 +00005402func TestCompatConfig(t *testing.T) {
5403 ctx, _ := testApex(t, `
5404 apex {
5405 name: "myapex",
5406 key: "myapex.key",
5407 prebuilts: ["myjar-platform-compat-config"],
5408 java_libs: ["myjar"],
5409 }
5410
5411 apex_key {
5412 name: "myapex.key",
5413 public_key: "testkey.avbpubkey",
5414 private_key: "testkey.pem",
5415 }
5416
5417 platform_compat_config {
5418 name: "myjar-platform-compat-config",
5419 src: ":myjar",
5420 }
5421
5422 java_library {
5423 name: "myjar",
5424 srcs: ["foo/bar/MyClass.java"],
5425 sdk_version: "none",
5426 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005427 apex_available: [ "myapex" ],
5428 }
5429 `)
5430 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5431 "etc/compatconfig/myjar-platform-compat-config.xml",
5432 "javalib/myjar.jar",
5433 })
5434}
5435
Jiyong Park479321d2019-12-16 11:47:12 +09005436func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5437 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5438 apex {
5439 name: "myapex",
5440 key: "myapex.key",
5441 java_libs: ["myjar"],
5442 }
5443
5444 apex_key {
5445 name: "myapex.key",
5446 public_key: "testkey.avbpubkey",
5447 private_key: "testkey.pem",
5448 }
5449
5450 java_library {
5451 name: "myjar",
5452 srcs: ["foo/bar/MyClass.java"],
5453 sdk_version: "none",
5454 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005455 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005456 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005457 }
5458 `)
5459}
5460
Jiyong Park7afd1072019-12-30 16:56:33 +09005461func TestCarryRequiredModuleNames(t *testing.T) {
5462 ctx, config := testApex(t, `
5463 apex {
5464 name: "myapex",
5465 key: "myapex.key",
5466 native_shared_libs: ["mylib"],
5467 }
5468
5469 apex_key {
5470 name: "myapex.key",
5471 public_key: "testkey.avbpubkey",
5472 private_key: "testkey.pem",
5473 }
5474
5475 cc_library {
5476 name: "mylib",
5477 srcs: ["mylib.cpp"],
5478 system_shared_libs: [],
5479 stl: "none",
5480 required: ["a", "b"],
5481 host_required: ["c", "d"],
5482 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005483 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005484 }
5485 `)
5486
5487 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5488 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5489 name := apexBundle.BaseModuleName()
5490 prefix := "TARGET_"
5491 var builder strings.Builder
5492 data.Custom(&builder, name, prefix, "", data)
5493 androidMk := builder.String()
5494 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5495 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5496 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5497}
5498
Jiyong Park7cd10e32020-01-14 09:22:18 +09005499func TestSymlinksFromApexToSystem(t *testing.T) {
5500 bp := `
5501 apex {
5502 name: "myapex",
5503 key: "myapex.key",
5504 native_shared_libs: ["mylib"],
5505 java_libs: ["myjar"],
5506 }
5507
Jiyong Park9d677202020-02-19 16:29:35 +09005508 apex {
5509 name: "myapex.updatable",
5510 key: "myapex.key",
5511 native_shared_libs: ["mylib"],
5512 java_libs: ["myjar"],
5513 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005514 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005515 }
5516
Jiyong Park7cd10e32020-01-14 09:22:18 +09005517 apex_key {
5518 name: "myapex.key",
5519 public_key: "testkey.avbpubkey",
5520 private_key: "testkey.pem",
5521 }
5522
5523 cc_library {
5524 name: "mylib",
5525 srcs: ["mylib.cpp"],
5526 shared_libs: ["myotherlib"],
5527 system_shared_libs: [],
5528 stl: "none",
5529 apex_available: [
5530 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005531 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005532 "//apex_available:platform",
5533 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005534 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005535 }
5536
5537 cc_library {
5538 name: "myotherlib",
5539 srcs: ["mylib.cpp"],
5540 system_shared_libs: [],
5541 stl: "none",
5542 apex_available: [
5543 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005544 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005545 "//apex_available:platform",
5546 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005547 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005548 }
5549
5550 java_library {
5551 name: "myjar",
5552 srcs: ["foo/bar/MyClass.java"],
5553 sdk_version: "none",
5554 system_modules: "none",
5555 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005556 apex_available: [
5557 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005558 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005559 "//apex_available:platform",
5560 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005561 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005562 }
5563
5564 java_library {
5565 name: "myotherjar",
5566 srcs: ["foo/bar/MyClass.java"],
5567 sdk_version: "none",
5568 system_modules: "none",
5569 apex_available: [
5570 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005571 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005572 "//apex_available:platform",
5573 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005574 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005575 }
5576 `
5577
5578 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5579 for _, f := range files {
5580 if f.path == file {
5581 if f.isLink {
5582 t.Errorf("%q is not a real file", file)
5583 }
5584 return
5585 }
5586 }
5587 t.Errorf("%q is not found", file)
5588 }
5589
5590 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5591 for _, f := range files {
5592 if f.path == file {
5593 if !f.isLink {
5594 t.Errorf("%q is not a symlink", file)
5595 }
5596 return
5597 }
5598 }
5599 t.Errorf("%q is not found", file)
5600 }
5601
Jiyong Park9d677202020-02-19 16:29:35 +09005602 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5603 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005604 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005605 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005606 ensureRealfileExists(t, files, "javalib/myjar.jar")
5607 ensureRealfileExists(t, files, "lib64/mylib.so")
5608 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5609
Jiyong Park9d677202020-02-19 16:29:35 +09005610 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5611 ensureRealfileExists(t, files, "javalib/myjar.jar")
5612 ensureRealfileExists(t, files, "lib64/mylib.so")
5613 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5614
5615 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005616 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005617 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005618 ensureRealfileExists(t, files, "javalib/myjar.jar")
5619 ensureRealfileExists(t, files, "lib64/mylib.so")
5620 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005621
5622 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5623 ensureRealfileExists(t, files, "javalib/myjar.jar")
5624 ensureRealfileExists(t, files, "lib64/mylib.so")
5625 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005626}
5627
Yo Chiange8128052020-07-23 20:09:18 +08005628func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5629 ctx, config := testApex(t, `
5630 apex {
5631 name: "myapex",
5632 key: "myapex.key",
5633 native_shared_libs: ["mylib"],
5634 }
5635
5636 apex_key {
5637 name: "myapex.key",
5638 public_key: "testkey.avbpubkey",
5639 private_key: "testkey.pem",
5640 }
5641
5642 cc_library_shared {
5643 name: "mylib",
5644 srcs: ["mylib.cpp"],
5645 shared_libs: ["myotherlib"],
5646 system_shared_libs: [],
5647 stl: "none",
5648 apex_available: [
5649 "myapex",
5650 "//apex_available:platform",
5651 ],
5652 }
5653
5654 cc_prebuilt_library_shared {
5655 name: "myotherlib",
5656 srcs: ["prebuilt.so"],
5657 system_shared_libs: [],
5658 stl: "none",
5659 apex_available: [
5660 "myapex",
5661 "//apex_available:platform",
5662 ],
5663 }
5664 `)
5665
5666 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5667 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5668 var builder strings.Builder
5669 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5670 androidMk := builder.String()
5671 // `myotherlib` is added to `myapex` as symlink
5672 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5673 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5674 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5675 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5676 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5677}
5678
Jooyung Han643adc42020-02-27 13:50:06 +09005679func TestApexWithJniLibs(t *testing.T) {
5680 ctx, _ := testApex(t, `
5681 apex {
5682 name: "myapex",
5683 key: "myapex.key",
5684 jni_libs: ["mylib"],
5685 }
5686
5687 apex_key {
5688 name: "myapex.key",
5689 public_key: "testkey.avbpubkey",
5690 private_key: "testkey.pem",
5691 }
5692
5693 cc_library {
5694 name: "mylib",
5695 srcs: ["mylib.cpp"],
5696 shared_libs: ["mylib2"],
5697 system_shared_libs: [],
5698 stl: "none",
5699 apex_available: [ "myapex" ],
5700 }
5701
5702 cc_library {
5703 name: "mylib2",
5704 srcs: ["mylib.cpp"],
5705 system_shared_libs: [],
5706 stl: "none",
5707 apex_available: [ "myapex" ],
5708 }
5709 `)
5710
5711 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5712 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5713 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5714 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5715 "lib64/mylib.so",
5716 "lib64/mylib2.so",
5717 })
5718}
5719
Jooyung Han49f67012020-04-17 13:43:10 +09005720func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5721 ctx, _ := testApex(t, `
5722 apex {
5723 name: "myapex",
5724 key: "myapex.key",
5725 }
5726 apex_key {
5727 name: "myapex.key",
5728 public_key: "testkey.avbpubkey",
5729 private_key: "testkey.pem",
5730 }
5731 `, func(fs map[string][]byte, config android.Config) {
5732 delete(config.Targets, android.Android)
5733 config.AndroidCommonTarget = android.Target{}
5734 })
5735
5736 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5737 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5738 }
5739}
5740
Jiyong Parkbd159612020-02-28 15:22:21 +09005741func TestAppBundle(t *testing.T) {
5742 ctx, _ := testApex(t, `
5743 apex {
5744 name: "myapex",
5745 key: "myapex.key",
5746 apps: ["AppFoo"],
5747 }
5748
5749 apex_key {
5750 name: "myapex.key",
5751 public_key: "testkey.avbpubkey",
5752 private_key: "testkey.pem",
5753 }
5754
5755 android_app {
5756 name: "AppFoo",
5757 srcs: ["foo/bar/MyClass.java"],
5758 sdk_version: "none",
5759 system_modules: "none",
5760 apex_available: [ "myapex" ],
5761 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005762 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005763
Colin Crosscf371cc2020-11-13 11:48:42 -08005764 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005765 content := bundleConfigRule.Args["content"]
5766
5767 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005768 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 +09005769}
5770
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005771func TestAppSetBundle(t *testing.T) {
5772 ctx, _ := testApex(t, `
5773 apex {
5774 name: "myapex",
5775 key: "myapex.key",
5776 apps: ["AppSet"],
5777 }
5778
5779 apex_key {
5780 name: "myapex.key",
5781 public_key: "testkey.avbpubkey",
5782 private_key: "testkey.pem",
5783 }
5784
5785 android_app_set {
5786 name: "AppSet",
5787 set: "AppSet.apks",
5788 }`)
5789 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005790 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005791 content := bundleConfigRule.Args["content"]
5792 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5793 s := mod.Rule("apexRule").Args["copy_commands"]
5794 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5795 if len(copyCmds) != 3 {
5796 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5797 }
5798 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5799 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5800 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5801}
5802
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005803func TestAppSetBundlePrebuilt(t *testing.T) {
5804 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5805 bp := `
5806 apex_set {
5807 name: "myapex",
5808 filename: "foo_v2.apex",
5809 sanitized: {
5810 none: { set: "myapex.apks", },
5811 hwaddress: { set: "myapex.hwasan.apks", },
5812 },
5813 }`
5814 fs["Android.bp"] = []byte(bp)
5815
5816 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5817 })
5818
5819 m := ctx.ModuleForTests("myapex", "android_common")
5820 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5821
5822 actual := extractedApex.Inputs
5823 if len(actual) != 1 {
5824 t.Errorf("expected a single input")
5825 }
5826
5827 expected := "myapex.hwasan.apks"
5828 if actual[0].String() != expected {
5829 t.Errorf("expected %s, got %s", expected, actual[0].String())
5830 }
5831}
5832
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005833func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005834 t.Helper()
5835
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005836 bp := `
5837 java_library {
5838 name: "some-updatable-apex-lib",
5839 srcs: ["a.java"],
5840 sdk_version: "current",
5841 apex_available: [
5842 "some-updatable-apex",
5843 ],
5844 }
5845
5846 java_library {
5847 name: "some-non-updatable-apex-lib",
5848 srcs: ["a.java"],
5849 apex_available: [
5850 "some-non-updatable-apex",
5851 ],
5852 }
5853
5854 java_library {
5855 name: "some-platform-lib",
5856 srcs: ["a.java"],
5857 sdk_version: "current",
5858 installable: true,
5859 }
5860
5861 java_library {
5862 name: "some-art-lib",
5863 srcs: ["a.java"],
5864 sdk_version: "current",
5865 apex_available: [
5866 "com.android.art.something",
5867 ],
5868 hostdex: true,
5869 }
5870
5871 apex {
5872 name: "some-updatable-apex",
5873 key: "some-updatable-apex.key",
5874 java_libs: ["some-updatable-apex-lib"],
5875 updatable: true,
5876 min_sdk_version: "current",
5877 }
5878
5879 apex {
5880 name: "some-non-updatable-apex",
5881 key: "some-non-updatable-apex.key",
5882 java_libs: ["some-non-updatable-apex-lib"],
5883 }
5884
5885 apex_key {
5886 name: "some-updatable-apex.key",
5887 }
5888
5889 apex_key {
5890 name: "some-non-updatable-apex.key",
5891 }
5892
5893 apex {
5894 name: "com.android.art.something",
5895 key: "com.android.art.something.key",
5896 java_libs: ["some-art-lib"],
5897 updatable: true,
5898 min_sdk_version: "current",
5899 }
5900
5901 apex_key {
5902 name: "com.android.art.something.key",
5903 }
5904
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005905 filegroup {
5906 name: "some-updatable-apex-file_contexts",
5907 srcs: [
5908 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5909 ],
5910 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005911
5912 filegroup {
5913 name: "some-non-updatable-apex-file_contexts",
5914 srcs: [
5915 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5916 ],
5917 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005918 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005919
5920 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5921}
5922
Paul Duffin064b70c2020-11-02 17:32:38 +00005923func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00005924 t.Helper()
5925
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005926 bp += cc.GatherRequiredDepsForTest(android.Android)
5927 bp += java.GatherRequiredDepsForTest()
5928 bp += dexpreopt.BpToolModulesForTest()
5929
5930 fs := map[string][]byte{
5931 "a.java": nil,
5932 "a.jar": nil,
5933 "build/make/target/product/security": nil,
5934 "apex_manifest.json": nil,
5935 "AndroidManifest.xml": nil,
5936 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005937 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005938 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5939 "framework/aidl/a.aidl": nil,
5940 }
5941 cc.GatherRequiredFilesForTest(fs)
5942
Colin Crossae8600b2020-10-29 17:09:13 -07005943 config := android.TestArchConfig(buildDir, nil, bp, fs)
5944
5945 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005946 ctx.RegisterModuleType("apex", BundleFactory)
5947 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00005948 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005949 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005950 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005951 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005952 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00005953 java.RegisterRequiredBuildComponentsForTest(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005954 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5955 ctx.PreDepsMutators(RegisterPreDepsMutators)
5956 ctx.PostDepsMutators(RegisterPostDepsMutators)
5957
Colin Crossae8600b2020-10-29 17:09:13 -07005958 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005959
5960 _ = dexpreopt.GlobalSoongConfigForTests(config)
5961 dexpreopt.RegisterToolModulesForTest(ctx)
5962 pathCtx := android.PathContextForTesting(config)
5963 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5964 transformDexpreoptConfig(dexpreoptConfig)
5965 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5966
5967 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5968 android.FailIfErrored(t, errs)
5969
5970 _, errs = ctx.PrepareBuildActions(config)
5971 if errmsg == "" {
5972 android.FailIfErrored(t, errs)
5973 } else if len(errs) > 0 {
5974 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005975 } else {
5976 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5977 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005978
5979 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005980}
5981
Jooyung Han548640b2020-04-27 12:10:30 +09005982func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5983 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5984 apex {
5985 name: "myapex",
5986 key: "myapex.key",
5987 updatable: true,
5988 }
5989
5990 apex_key {
5991 name: "myapex.key",
5992 public_key: "testkey.avbpubkey",
5993 private_key: "testkey.pem",
5994 }
5995 `)
5996}
5997
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005998func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005999 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006000 var transform func(*dexpreopt.GlobalConfig)
6001
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006002 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6003 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006004 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006005 }
6006 testNoUpdatableJarsInBootImage(t, "", transform)
6007 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006008
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006009 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006010 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 +01006011 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006012 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006013 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006014 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006015 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006016
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006017 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 -07006018 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 +01006019 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006020 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006021 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006022 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006023 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006024
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006025 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 -07006026 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006027 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006028 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006029 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006030 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006031 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006032
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006033 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 -07006034 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 +01006035 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006036 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006037 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006038 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006039 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006040
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006041 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6042 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006043 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006044 }
6045 testNoUpdatableJarsInBootImage(t, "", transform)
6046 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006047
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006048 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006049 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006050 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006051 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006052 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006053 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006054 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006055
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006056 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006057 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006058 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006059 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006060 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006061 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006062 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006063
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006064 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006065 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006066 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006067 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006068 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006069 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006070 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006071
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006072 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6073 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006074 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006075 }
6076 testNoUpdatableJarsInBootImage(t, "", transform)
6077 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006078
6079}
6080
6081func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6082 transform := func(config *dexpreopt.GlobalConfig) {
6083 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6084 }
6085 t.Run("prebuilt no source", func(t *testing.T) {
6086 testDexpreoptWithApexes(t, `
6087 prebuilt_apex {
6088 name: "myapex" ,
6089 arch: {
6090 arm64: {
6091 src: "myapex-arm64.apex",
6092 },
6093 arm: {
6094 src: "myapex-arm.apex",
6095 },
6096 },
6097 exported_java_libs: ["libfoo"],
6098 }
6099
6100 java_import {
6101 name: "libfoo",
6102 jars: ["libfoo.jar"],
6103 }
6104`, "", transform)
6105 })
6106
6107 t.Run("prebuilt no source", func(t *testing.T) {
6108 testDexpreoptWithApexes(t, `
6109 prebuilt_apex {
6110 name: "myapex" ,
6111 arch: {
6112 arm64: {
6113 src: "myapex-arm64.apex",
6114 },
6115 arm: {
6116 src: "myapex-arm.apex",
6117 },
6118 },
6119 exported_java_libs: ["libfoo"],
6120 }
6121
6122 java_import {
6123 name: "libfoo",
6124 jars: ["libfoo.jar"],
6125 }
6126`, "", transform)
6127 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006128}
6129
Andrei Onea115e7e72020-06-05 21:14:03 +01006130func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6131 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006132 bp += `
6133 apex_key {
6134 name: "myapex.key",
6135 public_key: "testkey.avbpubkey",
6136 private_key: "testkey.pem",
6137 }`
6138 fs := map[string][]byte{
6139 "lib1/src/A.java": nil,
6140 "lib2/src/B.java": nil,
6141 "system/sepolicy/apex/myapex-file_contexts": nil,
6142 }
6143
Colin Crossae8600b2020-10-29 17:09:13 -07006144 config := android.TestArchConfig(buildDir, nil, bp, fs)
6145 android.SetTestNeverallowRules(config, rules)
6146 updatableBootJars := make([]string, 0, len(apexBootJars))
6147 for _, apexBootJar := range apexBootJars {
6148 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6149 }
6150 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6151
6152 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006153 ctx.RegisterModuleType("apex", BundleFactory)
6154 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6155 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6156 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006157 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006158 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6159 ctx.PreDepsMutators(RegisterPreDepsMutators)
6160 ctx.PostDepsMutators(RegisterPostDepsMutators)
6161 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6162
Colin Crossae8600b2020-10-29 17:09:13 -07006163 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006164
6165 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6166 android.FailIfErrored(t, errs)
6167
6168 _, errs = ctx.PrepareBuildActions(config)
6169 if errmsg == "" {
6170 android.FailIfErrored(t, errs)
6171 } else if len(errs) > 0 {
6172 android.FailIfNoMatchingErrors(t, errmsg, errs)
6173 return
6174 } else {
6175 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6176 }
6177}
6178
6179func TestApexPermittedPackagesRules(t *testing.T) {
6180 testcases := []struct {
6181 name string
6182 expectedError string
6183 bp string
6184 bootJars []string
6185 modulesPackages map[string][]string
6186 }{
6187
6188 {
6189 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6190 expectedError: "",
6191 bp: `
6192 java_library {
6193 name: "bcp_lib1",
6194 srcs: ["lib1/src/*.java"],
6195 permitted_packages: ["foo.bar"],
6196 apex_available: ["myapex"],
6197 sdk_version: "none",
6198 system_modules: "none",
6199 }
6200 java_library {
6201 name: "nonbcp_lib2",
6202 srcs: ["lib2/src/*.java"],
6203 apex_available: ["myapex"],
6204 permitted_packages: ["a.b"],
6205 sdk_version: "none",
6206 system_modules: "none",
6207 }
6208 apex {
6209 name: "myapex",
6210 key: "myapex.key",
6211 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6212 }`,
6213 bootJars: []string{"bcp_lib1"},
6214 modulesPackages: map[string][]string{
6215 "myapex": []string{
6216 "foo.bar",
6217 },
6218 },
6219 },
6220 {
6221 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6222 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.`,
6223 bp: `
6224 java_library {
6225 name: "bcp_lib1",
6226 srcs: ["lib1/src/*.java"],
6227 apex_available: ["myapex"],
6228 permitted_packages: ["foo.bar"],
6229 sdk_version: "none",
6230 system_modules: "none",
6231 }
6232 java_library {
6233 name: "bcp_lib2",
6234 srcs: ["lib2/src/*.java"],
6235 apex_available: ["myapex"],
6236 permitted_packages: ["foo.bar", "bar.baz"],
6237 sdk_version: "none",
6238 system_modules: "none",
6239 }
6240 apex {
6241 name: "myapex",
6242 key: "myapex.key",
6243 java_libs: ["bcp_lib1", "bcp_lib2"],
6244 }
6245 `,
6246 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6247 modulesPackages: map[string][]string{
6248 "myapex": []string{
6249 "foo.bar",
6250 },
6251 },
6252 },
6253 }
6254 for _, tc := range testcases {
6255 t.Run(tc.name, func(t *testing.T) {
6256 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6257 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6258 })
6259 }
6260}
6261
Jiyong Park62304bb2020-04-13 16:19:48 +09006262func TestTestFor(t *testing.T) {
6263 ctx, _ := testApex(t, `
6264 apex {
6265 name: "myapex",
6266 key: "myapex.key",
6267 native_shared_libs: ["mylib", "myprivlib"],
6268 }
6269
6270 apex_key {
6271 name: "myapex.key",
6272 public_key: "testkey.avbpubkey",
6273 private_key: "testkey.pem",
6274 }
6275
6276 cc_library {
6277 name: "mylib",
6278 srcs: ["mylib.cpp"],
6279 system_shared_libs: [],
6280 stl: "none",
6281 stubs: {
6282 versions: ["1"],
6283 },
6284 apex_available: ["myapex"],
6285 }
6286
6287 cc_library {
6288 name: "myprivlib",
6289 srcs: ["mylib.cpp"],
6290 system_shared_libs: [],
6291 stl: "none",
6292 apex_available: ["myapex"],
6293 }
6294
6295
6296 cc_test {
6297 name: "mytest",
6298 gtest: false,
6299 srcs: ["mylib.cpp"],
6300 system_shared_libs: [],
6301 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006302 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006303 test_for: ["myapex"]
6304 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006305
6306 cc_library {
6307 name: "mytestlib",
6308 srcs: ["mylib.cpp"],
6309 system_shared_libs: [],
6310 shared_libs: ["mylib", "myprivlib"],
6311 stl: "none",
6312 test_for: ["myapex"],
6313 }
6314
6315 cc_benchmark {
6316 name: "mybench",
6317 srcs: ["mylib.cpp"],
6318 system_shared_libs: [],
6319 shared_libs: ["mylib", "myprivlib"],
6320 stl: "none",
6321 test_for: ["myapex"],
6322 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006323 `)
6324
6325 // the test 'mytest' is a test for the apex, therefore is linked to the
6326 // actual implementation of mylib instead of its stub.
6327 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6328 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6329 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006330
6331 // The same should be true for cc_library
6332 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6333 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6334 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6335
6336 // ... and for cc_benchmark
6337 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6338 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6339 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006340}
6341
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006342// TODO(jungjw): Move this to proptools
6343func intPtr(i int) *int {
6344 return &i
6345}
6346
6347func TestApexSet(t *testing.T) {
6348 ctx, config := testApex(t, `
6349 apex_set {
6350 name: "myapex",
6351 set: "myapex.apks",
6352 filename: "foo_v2.apex",
6353 overrides: ["foo"],
6354 }
6355 `, func(fs map[string][]byte, config android.Config) {
6356 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006357 config.Targets[android.Android] = []android.Target{
6358 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6359 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6360 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006361 })
6362
6363 m := ctx.ModuleForTests("myapex", "android_common")
6364
6365 // Check extract_apks tool parameters.
6366 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6367 actual := extractedApex.Args["abis"]
6368 expected := "ARMEABI_V7A,ARM64_V8A"
6369 if actual != expected {
6370 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6371 }
6372 actual = extractedApex.Args["sdk-version"]
6373 expected = "30"
6374 if actual != expected {
6375 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6376 }
6377
6378 a := m.Module().(*ApexSet)
6379 expectedOverrides := []string{"foo"}
6380 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6381 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6382 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6383 }
6384}
6385
Jiyong Park7d95a512020-05-10 15:16:24 +09006386func TestNoStaticLinkingToStubsLib(t *testing.T) {
6387 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6388 apex {
6389 name: "myapex",
6390 key: "myapex.key",
6391 native_shared_libs: ["mylib"],
6392 }
6393
6394 apex_key {
6395 name: "myapex.key",
6396 public_key: "testkey.avbpubkey",
6397 private_key: "testkey.pem",
6398 }
6399
6400 cc_library {
6401 name: "mylib",
6402 srcs: ["mylib.cpp"],
6403 static_libs: ["otherlib"],
6404 system_shared_libs: [],
6405 stl: "none",
6406 apex_available: [ "myapex" ],
6407 }
6408
6409 cc_library {
6410 name: "otherlib",
6411 srcs: ["mylib.cpp"],
6412 system_shared_libs: [],
6413 stl: "none",
6414 stubs: {
6415 versions: ["1", "2", "3"],
6416 },
6417 apex_available: [ "myapex" ],
6418 }
6419 `)
6420}
6421
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006422func TestApexKeysTxt(t *testing.T) {
6423 ctx, _ := testApex(t, `
6424 apex {
6425 name: "myapex",
6426 key: "myapex.key",
6427 }
6428
6429 apex_key {
6430 name: "myapex.key",
6431 public_key: "testkey.avbpubkey",
6432 private_key: "testkey.pem",
6433 }
6434
6435 prebuilt_apex {
6436 name: "myapex",
6437 prefer: true,
6438 arch: {
6439 arm64: {
6440 src: "myapex-arm64.apex",
6441 },
6442 arm: {
6443 src: "myapex-arm.apex",
6444 },
6445 },
6446 }
6447
6448 apex_set {
6449 name: "myapex_set",
6450 set: "myapex.apks",
6451 filename: "myapex_set.apex",
6452 overrides: ["myapex"],
6453 }
6454 `)
6455
6456 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6457 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6458 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 +09006459 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 +09006460}
6461
Jooyung Han938b5932020-06-20 12:47:47 +09006462func TestAllowedFiles(t *testing.T) {
6463 ctx, _ := testApex(t, `
6464 apex {
6465 name: "myapex",
6466 key: "myapex.key",
6467 apps: ["app"],
6468 allowed_files: "allowed.txt",
6469 }
6470
6471 apex_key {
6472 name: "myapex.key",
6473 public_key: "testkey.avbpubkey",
6474 private_key: "testkey.pem",
6475 }
6476
6477 android_app {
6478 name: "app",
6479 srcs: ["foo/bar/MyClass.java"],
6480 package_name: "foo",
6481 sdk_version: "none",
6482 system_modules: "none",
6483 apex_available: [ "myapex" ],
6484 }
6485 `, withFiles(map[string][]byte{
6486 "sub/Android.bp": []byte(`
6487 override_apex {
6488 name: "override_myapex",
6489 base: "myapex",
6490 apps: ["override_app"],
6491 allowed_files: ":allowed",
6492 }
6493 // Overridable "path" property should be referenced indirectly
6494 filegroup {
6495 name: "allowed",
6496 srcs: ["allowed.txt"],
6497 }
6498 override_android_app {
6499 name: "override_app",
6500 base: "app",
6501 package_name: "bar",
6502 }
6503 `),
6504 }))
6505
6506 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6507 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6508 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6509 }
6510
6511 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6512 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6513 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6514 }
6515}
6516
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006517func TestNonPreferredPrebuiltDependency(t *testing.T) {
6518 _, _ = testApex(t, `
6519 apex {
6520 name: "myapex",
6521 key: "myapex.key",
6522 native_shared_libs: ["mylib"],
6523 }
6524
6525 apex_key {
6526 name: "myapex.key",
6527 public_key: "testkey.avbpubkey",
6528 private_key: "testkey.pem",
6529 }
6530
6531 cc_library {
6532 name: "mylib",
6533 srcs: ["mylib.cpp"],
6534 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006535 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006536 },
6537 apex_available: ["myapex"],
6538 }
6539
6540 cc_prebuilt_library_shared {
6541 name: "mylib",
6542 prefer: false,
6543 srcs: ["prebuilt.so"],
6544 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006545 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006546 },
6547 apex_available: ["myapex"],
6548 }
6549 `)
6550}
6551
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006552func TestCompressedApex(t *testing.T) {
6553 ctx, config := testApex(t, `
6554 apex {
6555 name: "myapex",
6556 key: "myapex.key",
6557 compressible: true,
6558 }
6559 apex_key {
6560 name: "myapex.key",
6561 public_key: "testkey.avbpubkey",
6562 private_key: "testkey.pem",
6563 }
6564 `, func(fs map[string][]byte, config android.Config) {
6565 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6566 })
6567
6568 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6569 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6570
6571 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6572 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6573
6574 // Make sure output of bundle is .capex
6575 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6576 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6577
6578 // Verify android.mk rules
6579 data := android.AndroidMkDataForTest(t, config, "", ab)
6580 var builder strings.Builder
6581 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6582 androidMk := builder.String()
6583 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6584}
6585
Martin Stjernholm2856c662020-12-02 15:03:42 +00006586func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6587 ctx, config := testApex(t, `
6588 apex {
6589 name: "myapex",
6590 key: "myapex.key",
6591 native_shared_libs: ["mylib"],
6592 }
6593
6594 apex_key {
6595 name: "myapex.key",
6596 public_key: "testkey.avbpubkey",
6597 private_key: "testkey.pem",
6598 }
6599
6600 cc_library {
6601 name: "mylib",
6602 srcs: ["mylib.cpp"],
6603 apex_available: ["myapex"],
6604 shared_libs: ["otherlib"],
6605 system_shared_libs: [],
6606 }
6607
6608 cc_library {
6609 name: "otherlib",
6610 srcs: ["mylib.cpp"],
6611 stubs: {
6612 versions: ["current"],
6613 },
6614 }
6615
6616 cc_prebuilt_library_shared {
6617 name: "otherlib",
6618 prefer: true,
6619 srcs: ["prebuilt.so"],
6620 stubs: {
6621 versions: ["current"],
6622 },
6623 }
6624 `)
6625
6626 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6627 data := android.AndroidMkDataForTest(t, config, "", ab)
6628 var builder strings.Builder
6629 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6630 androidMk := builder.String()
6631
6632 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6633 // a thing there.
6634 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6635}
6636
Jiyong Parke3867542020-12-03 17:28:25 +09006637func TestExcludeDependency(t *testing.T) {
6638 ctx, _ := testApex(t, `
6639 apex {
6640 name: "myapex",
6641 key: "myapex.key",
6642 native_shared_libs: ["mylib"],
6643 }
6644
6645 apex_key {
6646 name: "myapex.key",
6647 public_key: "testkey.avbpubkey",
6648 private_key: "testkey.pem",
6649 }
6650
6651 cc_library {
6652 name: "mylib",
6653 srcs: ["mylib.cpp"],
6654 system_shared_libs: [],
6655 stl: "none",
6656 apex_available: ["myapex"],
6657 shared_libs: ["mylib2"],
6658 target: {
6659 apex: {
6660 exclude_shared_libs: ["mylib2"],
6661 },
6662 },
6663 }
6664
6665 cc_library {
6666 name: "mylib2",
6667 srcs: ["mylib.cpp"],
6668 system_shared_libs: [],
6669 stl: "none",
6670 }
6671 `)
6672
6673 // Check if mylib is linked to mylib2 for the non-apex target
6674 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6675 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6676
6677 // Make sure that the link doesn't occur for the apex target
6678 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6679 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6680
6681 // It shouldn't appear in the copy cmd as well.
6682 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6683 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6684}
6685
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006686func TestPrebuiltStubLibDep(t *testing.T) {
6687 bpBase := `
6688 apex {
6689 name: "myapex",
6690 key: "myapex.key",
6691 native_shared_libs: ["mylib"],
6692 }
6693 apex_key {
6694 name: "myapex.key",
6695 public_key: "testkey.avbpubkey",
6696 private_key: "testkey.pem",
6697 }
6698 cc_library {
6699 name: "mylib",
6700 srcs: ["mylib.cpp"],
6701 apex_available: ["myapex"],
6702 shared_libs: ["stublib"],
6703 system_shared_libs: [],
6704 }
6705 apex {
6706 name: "otherapex",
6707 enabled: %s,
6708 key: "myapex.key",
6709 native_shared_libs: ["stublib"],
6710 }
6711 `
6712
6713 stublibSourceBp := `
6714 cc_library {
6715 name: "stublib",
6716 srcs: ["mylib.cpp"],
6717 apex_available: ["otherapex"],
6718 system_shared_libs: [],
6719 stl: "none",
6720 stubs: {
6721 versions: ["1"],
6722 },
6723 }
6724 `
6725
6726 stublibPrebuiltBp := `
6727 cc_prebuilt_library_shared {
6728 name: "stublib",
6729 srcs: ["prebuilt.so"],
6730 apex_available: ["otherapex"],
6731 stubs: {
6732 versions: ["1"],
6733 },
6734 %s
6735 }
6736 `
6737
6738 tests := []struct {
6739 name string
6740 stublibBp string
6741 usePrebuilt bool
6742 modNames []string // Modules to collect AndroidMkEntries for
6743 otherApexEnabled []string
6744 }{
6745 {
6746 name: "only_source",
6747 stublibBp: stublibSourceBp,
6748 usePrebuilt: false,
6749 modNames: []string{"stublib"},
6750 otherApexEnabled: []string{"true", "false"},
6751 },
6752 {
6753 name: "source_preferred",
6754 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
6755 usePrebuilt: false,
6756 modNames: []string{"stublib", "prebuilt_stublib"},
6757 otherApexEnabled: []string{"true", "false"},
6758 },
6759 {
6760 name: "prebuilt_preferred",
6761 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
6762 usePrebuilt: true,
6763 modNames: []string{"stublib", "prebuilt_stublib"},
6764 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6765 },
6766 {
6767 name: "only_prebuilt",
6768 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
6769 usePrebuilt: true,
6770 modNames: []string{"stublib"},
6771 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6772 },
6773 }
6774
6775 for _, test := range tests {
6776 t.Run(test.name, func(t *testing.T) {
6777 for _, otherApexEnabled := range test.otherApexEnabled {
6778 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
6779 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
6780
6781 type modAndMkEntries struct {
6782 mod *cc.Module
6783 mkEntries android.AndroidMkEntries
6784 }
6785 entries := []*modAndMkEntries{}
6786
6787 // Gather shared lib modules that are installable
6788 for _, modName := range test.modNames {
6789 for _, variant := range ctx.ModuleVariantsForTests(modName) {
6790 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
6791 continue
6792 }
6793 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08006794 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006795 continue
6796 }
6797 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
6798 if ent.Disabled {
6799 continue
6800 }
6801 entries = append(entries, &modAndMkEntries{
6802 mod: mod,
6803 mkEntries: ent,
6804 })
6805 }
6806 }
6807 }
6808
6809 var entry *modAndMkEntries = nil
6810 for _, ent := range entries {
6811 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
6812 if entry != nil {
6813 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
6814 } else {
6815 entry = ent
6816 }
6817 }
6818 }
6819
6820 if entry == nil {
6821 t.Errorf("AndroidMk entry for \"stublib\" missing")
6822 } else {
6823 isPrebuilt := entry.mod.Prebuilt() != nil
6824 if isPrebuilt != test.usePrebuilt {
6825 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
6826 }
6827 if !entry.mod.IsStubs() {
6828 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
6829 }
6830 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
6831 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
6832 }
Jiyong Park892a98f2020-12-14 09:20:00 +09006833 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
6834 expected := "-D__STUBLIB_API__=1"
6835 if !android.InList(expected, cflags) {
6836 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
6837 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006838 }
6839 })
6840 }
6841 })
6842 }
6843}
6844
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006845func TestMain(m *testing.M) {
6846 run := func() int {
6847 setUp()
6848 defer tearDown()
6849
6850 return m.Run()
6851 }
6852
6853 os.Exit(run())
6854}