blob: ae0cbe9691325e0f5e8313ad5f4e5e07e6e099e6 [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 Duffin092153d2021-01-26 11:42:39 +00004216// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4217// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004218func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4219 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004220 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004221 }
4222
4223 checkDexJarBuildPath := func(ctx *android.TestContext, name string) {
4224 // Make sure the import has been given the correct path to the dex jar.
4225 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.Dependency)
4226 dexJarBuildPath := p.DexJarBuildPath()
4227 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
4228 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4229 }
4230 }
4231
4232 ensureNoSourceVariant := func(ctx *android.TestContext) {
4233 // Make sure that an apex variant is not created for the source module.
4234 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests("libfoo"); !reflect.DeepEqual(expected, actual) {
4235 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4236 }
4237 }
4238
4239 t.Run("prebuilt only", func(t *testing.T) {
4240 bp := `
4241 prebuilt_apex {
4242 name: "myapex",
4243 arch: {
4244 arm64: {
4245 src: "myapex-arm64.apex",
4246 },
4247 arm: {
4248 src: "myapex-arm.apex",
4249 },
4250 },
4251 exported_java_libs: ["libfoo"],
4252 }
4253
4254 java_import {
4255 name: "libfoo",
4256 jars: ["libfoo.jar"],
4257 }
4258 `
4259
4260 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4261 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4262
4263 checkDexJarBuildPath(ctx, "libfoo")
4264 })
4265
4266 t.Run("prebuilt with source preferred", func(t *testing.T) {
4267
4268 bp := `
4269 prebuilt_apex {
4270 name: "myapex",
4271 arch: {
4272 arm64: {
4273 src: "myapex-arm64.apex",
4274 },
4275 arm: {
4276 src: "myapex-arm.apex",
4277 },
4278 },
4279 exported_java_libs: ["libfoo"],
4280 }
4281
4282 java_import {
4283 name: "libfoo",
4284 jars: ["libfoo.jar"],
4285 }
4286
4287 java_library {
4288 name: "libfoo",
4289 }
4290 `
4291
4292 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4293 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4294
4295 checkDexJarBuildPath(ctx, "prebuilt_libfoo")
4296 ensureNoSourceVariant(ctx)
4297 })
4298
4299 t.Run("prebuilt preferred with source", func(t *testing.T) {
4300 bp := `
4301 prebuilt_apex {
4302 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004303 arch: {
4304 arm64: {
4305 src: "myapex-arm64.apex",
4306 },
4307 arm: {
4308 src: "myapex-arm.apex",
4309 },
4310 },
4311 exported_java_libs: ["libfoo"],
4312 }
4313
4314 java_import {
4315 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004316 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004317 jars: ["libfoo.jar"],
4318 }
4319
4320 java_library {
4321 name: "libfoo",
4322 }
4323 `
4324
4325 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4326 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4327
4328 checkDexJarBuildPath(ctx, "prebuilt_libfoo")
4329 ensureNoSourceVariant(ctx)
4330 })
4331}
4332
Roland Levillain630846d2019-06-26 12:48:34 +01004333func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004334 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004335 apex_test {
4336 name: "myapex",
4337 key: "myapex.key",
4338 tests: [
4339 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004340 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004341 ],
4342 }
4343
4344 apex_key {
4345 name: "myapex.key",
4346 public_key: "testkey.avbpubkey",
4347 private_key: "testkey.pem",
4348 }
4349
Liz Kammer1c14a212020-05-12 15:26:55 -07004350 filegroup {
4351 name: "fg",
4352 srcs: [
4353 "baz",
4354 "bar/baz"
4355 ],
4356 }
4357
Roland Levillain630846d2019-06-26 12:48:34 +01004358 cc_test {
4359 name: "mytest",
4360 gtest: false,
4361 srcs: ["mytest.cpp"],
4362 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004363 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004364 system_shared_libs: [],
4365 static_executable: true,
4366 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004367 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004368 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004369
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004370 cc_library {
4371 name: "mylib",
4372 srcs: ["mylib.cpp"],
4373 system_shared_libs: [],
4374 stl: "none",
4375 }
4376
Liz Kammer5bd365f2020-05-27 15:15:11 -07004377 filegroup {
4378 name: "fg2",
4379 srcs: [
4380 "testdata/baz"
4381 ],
4382 }
4383
Roland Levillain9b5fde92019-06-28 15:41:19 +01004384 cc_test {
4385 name: "mytests",
4386 gtest: false,
4387 srcs: [
4388 "mytest1.cpp",
4389 "mytest2.cpp",
4390 "mytest3.cpp",
4391 ],
4392 test_per_src: true,
4393 relative_install_path: "test",
4394 system_shared_libs: [],
4395 static_executable: true,
4396 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004397 data: [
4398 ":fg",
4399 ":fg2",
4400 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004401 }
Roland Levillain630846d2019-06-26 12:48:34 +01004402 `)
4403
Sundong Ahnabb64432019-10-22 13:58:29 +09004404 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004405 copyCmds := apexRule.Args["copy_commands"]
4406
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004407 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004408 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004409 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004410
Liz Kammer1c14a212020-05-12 15:26:55 -07004411 //Ensure that test data are copied into apex.
4412 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4413 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4414
Roland Levillain9b5fde92019-06-28 15:41:19 +01004415 // Ensure that test deps built with `test_per_src` are copied into apex.
4416 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4417 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4418 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004419
4420 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004421 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4422 data := android.AndroidMkDataForTest(t, config, "", bundle)
4423 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004424 prefix := "TARGET_"
4425 var builder strings.Builder
4426 data.Custom(&builder, name, prefix, "", data)
4427 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004428 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4429 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4430 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4431 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004432 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004433 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004434 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004435
4436 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4437 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4438 data.Custom(&builder, name, prefix, "", data)
4439 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004440 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4441 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004442}
4443
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004444func TestInstallExtraFlattenedApexes(t *testing.T) {
4445 ctx, config := testApex(t, `
4446 apex {
4447 name: "myapex",
4448 key: "myapex.key",
4449 }
4450 apex_key {
4451 name: "myapex.key",
4452 public_key: "testkey.avbpubkey",
4453 private_key: "testkey.pem",
4454 }
4455 `, func(fs map[string][]byte, config android.Config) {
4456 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4457 })
4458 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004459 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004460 mk := android.AndroidMkDataForTest(t, config, "", ab)
4461 var builder strings.Builder
4462 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4463 androidMk := builder.String()
4464 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4465}
4466
Jooyung Hand48f3c32019-08-23 11:18:57 +09004467func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4468 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4469 apex {
4470 name: "myapex",
4471 key: "myapex.key",
4472 native_shared_libs: ["libfoo"],
4473 }
4474
4475 apex_key {
4476 name: "myapex.key",
4477 public_key: "testkey.avbpubkey",
4478 private_key: "testkey.pem",
4479 }
4480
4481 cc_library {
4482 name: "libfoo",
4483 stl: "none",
4484 system_shared_libs: [],
4485 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004486 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004487 }
4488 `)
4489 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4490 apex {
4491 name: "myapex",
4492 key: "myapex.key",
4493 java_libs: ["myjar"],
4494 }
4495
4496 apex_key {
4497 name: "myapex.key",
4498 public_key: "testkey.avbpubkey",
4499 private_key: "testkey.pem",
4500 }
4501
4502 java_library {
4503 name: "myjar",
4504 srcs: ["foo/bar/MyClass.java"],
4505 sdk_version: "none",
4506 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004507 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004508 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004509 }
4510 `)
4511}
4512
Bill Peckhama41a6962021-01-11 10:58:54 -08004513func TestApexWithJavaImport(t *testing.T) {
4514 ctx, _ := testApex(t, `
4515 apex {
4516 name: "myapex",
4517 key: "myapex.key",
4518 java_libs: ["myjavaimport"],
4519 }
4520
4521 apex_key {
4522 name: "myapex.key",
4523 public_key: "testkey.avbpubkey",
4524 private_key: "testkey.pem",
4525 }
4526
4527 java_import {
4528 name: "myjavaimport",
4529 apex_available: ["myapex"],
4530 jars: ["my.jar"],
4531 compile_dex: true,
4532 }
4533 `)
4534
4535 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4536 apexRule := module.Rule("apexRule")
4537 copyCmds := apexRule.Args["copy_commands"]
4538 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
4539}
4540
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004541func TestApexWithApps(t *testing.T) {
4542 ctx, _ := testApex(t, `
4543 apex {
4544 name: "myapex",
4545 key: "myapex.key",
4546 apps: [
4547 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004548 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004549 ],
4550 }
4551
4552 apex_key {
4553 name: "myapex.key",
4554 public_key: "testkey.avbpubkey",
4555 private_key: "testkey.pem",
4556 }
4557
4558 android_app {
4559 name: "AppFoo",
4560 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004561 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004562 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004563 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004564 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004565 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004566 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004567
4568 android_app {
4569 name: "AppFooPriv",
4570 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004571 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004572 system_modules: "none",
4573 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004574 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004575 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004576 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004577
4578 cc_library_shared {
4579 name: "libjni",
4580 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004581 shared_libs: ["libfoo"],
4582 stl: "none",
4583 system_shared_libs: [],
4584 apex_available: [ "myapex" ],
4585 sdk_version: "current",
4586 }
4587
4588 cc_library_shared {
4589 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004590 stl: "none",
4591 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004592 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004593 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004594 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004595 `)
4596
Sundong Ahnabb64432019-10-22 13:58:29 +09004597 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004598 apexRule := module.Rule("apexRule")
4599 copyCmds := apexRule.Args["copy_commands"]
4600
4601 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004602 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004603
Colin Crossaede88c2020-08-11 12:17:01 -07004604 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004605 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004606 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004607 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004608 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004609 // JNI libraries including transitive deps are
4610 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004611 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004612 // ... embedded inside APK (jnilibs.zip)
4613 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4614 // ... and not directly inside the APEX
4615 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4616 }
Dario Frenicde2a032019-10-27 00:29:22 +01004617}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004618
Dario Frenicde2a032019-10-27 00:29:22 +01004619func TestApexWithAppImports(t *testing.T) {
4620 ctx, _ := testApex(t, `
4621 apex {
4622 name: "myapex",
4623 key: "myapex.key",
4624 apps: [
4625 "AppFooPrebuilt",
4626 "AppFooPrivPrebuilt",
4627 ],
4628 }
4629
4630 apex_key {
4631 name: "myapex.key",
4632 public_key: "testkey.avbpubkey",
4633 private_key: "testkey.pem",
4634 }
4635
4636 android_app_import {
4637 name: "AppFooPrebuilt",
4638 apk: "PrebuiltAppFoo.apk",
4639 presigned: true,
4640 dex_preopt: {
4641 enabled: false,
4642 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004643 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004644 }
4645
4646 android_app_import {
4647 name: "AppFooPrivPrebuilt",
4648 apk: "PrebuiltAppFooPriv.apk",
4649 privileged: true,
4650 presigned: true,
4651 dex_preopt: {
4652 enabled: false,
4653 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004654 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004655 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004656 }
4657 `)
4658
Sundong Ahnabb64432019-10-22 13:58:29 +09004659 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004660 apexRule := module.Rule("apexRule")
4661 copyCmds := apexRule.Args["copy_commands"]
4662
4663 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004664 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4665}
4666
4667func TestApexWithAppImportsPrefer(t *testing.T) {
4668 ctx, _ := testApex(t, `
4669 apex {
4670 name: "myapex",
4671 key: "myapex.key",
4672 apps: [
4673 "AppFoo",
4674 ],
4675 }
4676
4677 apex_key {
4678 name: "myapex.key",
4679 public_key: "testkey.avbpubkey",
4680 private_key: "testkey.pem",
4681 }
4682
4683 android_app {
4684 name: "AppFoo",
4685 srcs: ["foo/bar/MyClass.java"],
4686 sdk_version: "none",
4687 system_modules: "none",
4688 apex_available: [ "myapex" ],
4689 }
4690
4691 android_app_import {
4692 name: "AppFoo",
4693 apk: "AppFooPrebuilt.apk",
4694 filename: "AppFooPrebuilt.apk",
4695 presigned: true,
4696 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004697 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004698 }
4699 `, withFiles(map[string][]byte{
4700 "AppFooPrebuilt.apk": nil,
4701 }))
4702
4703 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4704 "app/AppFoo/AppFooPrebuilt.apk",
4705 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004706}
4707
Dario Freni6f3937c2019-12-20 22:58:03 +00004708func TestApexWithTestHelperApp(t *testing.T) {
4709 ctx, _ := testApex(t, `
4710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
4713 apps: [
4714 "TesterHelpAppFoo",
4715 ],
4716 }
4717
4718 apex_key {
4719 name: "myapex.key",
4720 public_key: "testkey.avbpubkey",
4721 private_key: "testkey.pem",
4722 }
4723
4724 android_test_helper_app {
4725 name: "TesterHelpAppFoo",
4726 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004727 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004728 }
4729
4730 `)
4731
4732 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4733 apexRule := module.Rule("apexRule")
4734 copyCmds := apexRule.Args["copy_commands"]
4735
4736 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4737}
4738
Jooyung Han18020ea2019-11-13 10:50:48 +09004739func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4740 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004741 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004742 apex {
4743 name: "myapex",
4744 key: "myapex.key",
4745 native_shared_libs: ["libfoo"],
4746 }
4747
4748 apex_key {
4749 name: "myapex.key",
4750 public_key: "testkey.avbpubkey",
4751 private_key: "testkey.pem",
4752 }
4753
4754 apex {
4755 name: "otherapex",
4756 key: "myapex.key",
4757 native_shared_libs: ["libfoo"],
4758 }
4759
4760 cc_defaults {
4761 name: "libfoo-defaults",
4762 apex_available: ["otherapex"],
4763 }
4764
4765 cc_library {
4766 name: "libfoo",
4767 defaults: ["libfoo-defaults"],
4768 stl: "none",
4769 system_shared_libs: [],
4770 }`)
4771}
4772
Paul Duffine52e66f2020-03-30 17:54:29 +01004773func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004774 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004775 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004776 apex {
4777 name: "myapex",
4778 key: "myapex.key",
4779 native_shared_libs: ["libfoo"],
4780 }
4781
4782 apex_key {
4783 name: "myapex.key",
4784 public_key: "testkey.avbpubkey",
4785 private_key: "testkey.pem",
4786 }
4787
4788 apex {
4789 name: "otherapex",
4790 key: "otherapex.key",
4791 native_shared_libs: ["libfoo"],
4792 }
4793
4794 apex_key {
4795 name: "otherapex.key",
4796 public_key: "testkey.avbpubkey",
4797 private_key: "testkey.pem",
4798 }
4799
4800 cc_library {
4801 name: "libfoo",
4802 stl: "none",
4803 system_shared_libs: [],
4804 apex_available: ["otherapex"],
4805 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004806}
Jiyong Park127b40b2019-09-30 16:04:35 +09004807
Paul Duffine52e66f2020-03-30 17:54:29 +01004808func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004809 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004810 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004811.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004812.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004813.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004814.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004815.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004816.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004817 apex {
4818 name: "myapex",
4819 key: "myapex.key",
4820 native_shared_libs: ["libfoo"],
4821 }
4822
4823 apex_key {
4824 name: "myapex.key",
4825 public_key: "testkey.avbpubkey",
4826 private_key: "testkey.pem",
4827 }
4828
Jiyong Park127b40b2019-09-30 16:04:35 +09004829 cc_library {
4830 name: "libfoo",
4831 stl: "none",
4832 shared_libs: ["libbar"],
4833 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004834 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004835 }
4836
4837 cc_library {
4838 name: "libbar",
4839 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004840 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004841 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004842 apex_available: ["myapex"],
4843 }
4844
4845 cc_library {
4846 name: "libbaz",
4847 stl: "none",
4848 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004849 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004850}
Jiyong Park127b40b2019-09-30 16:04:35 +09004851
Paul Duffine52e66f2020-03-30 17:54:29 +01004852func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004853 testApexError(t, "\"otherapex\" is not a valid module name", `
4854 apex {
4855 name: "myapex",
4856 key: "myapex.key",
4857 native_shared_libs: ["libfoo"],
4858 }
4859
4860 apex_key {
4861 name: "myapex.key",
4862 public_key: "testkey.avbpubkey",
4863 private_key: "testkey.pem",
4864 }
4865
4866 cc_library {
4867 name: "libfoo",
4868 stl: "none",
4869 system_shared_libs: [],
4870 apex_available: ["otherapex"],
4871 }`)
4872
Paul Duffine52e66f2020-03-30 17:54:29 +01004873 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004874 apex {
4875 name: "myapex",
4876 key: "myapex.key",
4877 native_shared_libs: ["libfoo", "libbar"],
4878 }
4879
4880 apex_key {
4881 name: "myapex.key",
4882 public_key: "testkey.avbpubkey",
4883 private_key: "testkey.pem",
4884 }
4885
4886 cc_library {
4887 name: "libfoo",
4888 stl: "none",
4889 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004890 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004891 apex_available: ["myapex"],
4892 }
4893
4894 cc_library {
4895 name: "libbar",
4896 stl: "none",
4897 system_shared_libs: [],
4898 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004899 }
4900
4901 cc_library {
4902 name: "libbaz",
4903 stl: "none",
4904 system_shared_libs: [],
4905 stubs: {
4906 versions: ["10", "20", "30"],
4907 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004908 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004909}
Jiyong Park127b40b2019-09-30 16:04:35 +09004910
Jiyong Park89e850a2020-04-07 16:37:39 +09004911func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004912 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004913 apex {
4914 name: "myapex",
4915 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004916 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004917 }
4918
4919 apex_key {
4920 name: "myapex.key",
4921 public_key: "testkey.avbpubkey",
4922 private_key: "testkey.pem",
4923 }
4924
4925 cc_library {
4926 name: "libfoo",
4927 stl: "none",
4928 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004929 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004930 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004931 }
4932
4933 cc_library {
4934 name: "libfoo2",
4935 stl: "none",
4936 system_shared_libs: [],
4937 shared_libs: ["libbaz"],
4938 apex_available: ["//apex_available:platform"],
4939 }
4940
4941 cc_library {
4942 name: "libbar",
4943 stl: "none",
4944 system_shared_libs: [],
4945 apex_available: ["myapex"],
4946 }
4947
4948 cc_library {
4949 name: "libbaz",
4950 stl: "none",
4951 system_shared_libs: [],
4952 apex_available: ["myapex"],
4953 stubs: {
4954 versions: ["1"],
4955 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004956 }`)
4957
Jiyong Park89e850a2020-04-07 16:37:39 +09004958 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4959 // because it depends on libbar which isn't available to platform
4960 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4961 if libfoo.NotAvailableForPlatform() != true {
4962 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4963 }
4964
4965 // libfoo2 however can be available to platform because it depends on libbaz which provides
4966 // stubs
4967 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4968 if libfoo2.NotAvailableForPlatform() == true {
4969 t.Errorf("%q should be available to platform", libfoo2.String())
4970 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004971}
Jiyong Parka90ca002019-10-07 15:47:24 +09004972
Paul Duffine52e66f2020-03-30 17:54:29 +01004973func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004974 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004975 apex {
4976 name: "myapex",
4977 key: "myapex.key",
4978 native_shared_libs: ["libfoo"],
4979 }
4980
4981 apex_key {
4982 name: "myapex.key",
4983 public_key: "testkey.avbpubkey",
4984 private_key: "testkey.pem",
4985 }
4986
4987 cc_library {
4988 name: "libfoo",
4989 stl: "none",
4990 system_shared_libs: [],
4991 apex_available: ["myapex"],
4992 static: {
4993 apex_available: ["//apex_available:platform"],
4994 },
4995 }`)
4996
Jiyong Park89e850a2020-04-07 16:37:39 +09004997 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4998 if libfooShared.NotAvailableForPlatform() != true {
4999 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5000 }
5001 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5002 if libfooStatic.NotAvailableForPlatform() != false {
5003 t.Errorf("%q should be available to platform", libfooStatic.String())
5004 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005005}
5006
Jiyong Park5d790c32019-11-15 18:40:32 +09005007func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005008 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005009 apex {
5010 name: "myapex",
5011 key: "myapex.key",
5012 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005013 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09005014 }
5015
5016 override_apex {
5017 name: "override_myapex",
5018 base: "myapex",
5019 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005020 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005021 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005022 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005023 }
5024
5025 apex_key {
5026 name: "myapex.key",
5027 public_key: "testkey.avbpubkey",
5028 private_key: "testkey.pem",
5029 }
5030
5031 android_app {
5032 name: "app",
5033 srcs: ["foo/bar/MyClass.java"],
5034 package_name: "foo",
5035 sdk_version: "none",
5036 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005037 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005038 }
5039
5040 override_android_app {
5041 name: "override_app",
5042 base: "app",
5043 package_name: "bar",
5044 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005045 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005046
Jiyong Park317645e2019-12-05 13:20:58 +09005047 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5048 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5049 if originalVariant.GetOverriddenBy() != "" {
5050 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5051 }
5052 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5053 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5054 }
5055
Jiyong Park5d790c32019-11-15 18:40:32 +09005056 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5057 apexRule := module.Rule("apexRule")
5058 copyCmds := apexRule.Args["copy_commands"]
5059
5060 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005061 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005062
5063 apexBundle := module.Module().(*apexBundle)
5064 name := apexBundle.Name()
5065 if name != "override_myapex" {
5066 t.Errorf("name should be \"override_myapex\", but was %q", name)
5067 }
5068
Baligh Uddin004d7172020-02-19 21:29:28 -08005069 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5070 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5071 }
5072
Jiyong Park20bacab2020-03-03 11:45:41 +09005073 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005074 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005075
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005076 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5077 var builder strings.Builder
5078 data.Custom(&builder, name, "TARGET_", "", data)
5079 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005080 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005081 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5082 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005083 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005084 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005085 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005086 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5087 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005088}
5089
Jooyung Han214bf372019-11-12 13:03:50 +09005090func TestLegacyAndroid10Support(t *testing.T) {
5091 ctx, _ := testApex(t, `
5092 apex {
5093 name: "myapex",
5094 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005095 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005096 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005097 }
5098
5099 apex_key {
5100 name: "myapex.key",
5101 public_key: "testkey.avbpubkey",
5102 private_key: "testkey.pem",
5103 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005104
5105 cc_library {
5106 name: "mylib",
5107 srcs: ["mylib.cpp"],
5108 stl: "libc++",
5109 system_shared_libs: [],
5110 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005111 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005112 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005113 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005114
5115 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5116 args := module.Rule("apexRule").Args
5117 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005118 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005119
5120 // The copies of the libraries in the apex should have one more dependency than
5121 // the ones outside the apex, namely the unwinder. Ideally we should check
5122 // the dependency names directly here but for some reason the names are blank in
5123 // this test.
5124 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005125 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005126 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5127 if len(apexImplicits) != len(nonApexImplicits)+1 {
5128 t.Errorf("%q missing unwinder dep", lib)
5129 }
5130 }
Jooyung Han214bf372019-11-12 13:03:50 +09005131}
5132
Paul Duffin9b879592020-05-26 13:21:35 +01005133var filesForSdkLibrary = map[string][]byte{
5134 "api/current.txt": nil,
5135 "api/removed.txt": nil,
5136 "api/system-current.txt": nil,
5137 "api/system-removed.txt": nil,
5138 "api/test-current.txt": nil,
5139 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005140
Anton Hanssondff2c782020-12-21 17:10:01 +00005141 "100/public/api/foo.txt": nil,
5142 "100/public/api/foo-removed.txt": nil,
5143 "100/system/api/foo.txt": nil,
5144 "100/system/api/foo-removed.txt": nil,
5145
Paul Duffineedc5d52020-06-12 17:46:39 +01005146 // For java_sdk_library_import
5147 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005148}
5149
Jooyung Han58f26ab2019-12-18 15:34:32 +09005150func TestJavaSDKLibrary(t *testing.T) {
5151 ctx, _ := testApex(t, `
5152 apex {
5153 name: "myapex",
5154 key: "myapex.key",
5155 java_libs: ["foo"],
5156 }
5157
5158 apex_key {
5159 name: "myapex.key",
5160 public_key: "testkey.avbpubkey",
5161 private_key: "testkey.pem",
5162 }
5163
5164 java_sdk_library {
5165 name: "foo",
5166 srcs: ["a.java"],
5167 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005168 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005169 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005170
5171 prebuilt_apis {
5172 name: "sdk",
5173 api_dirs: ["100"],
5174 }
Paul Duffin9b879592020-05-26 13:21:35 +01005175 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005176
5177 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005178 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005179 "javalib/foo.jar",
5180 "etc/permissions/foo.xml",
5181 })
5182 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005183 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5184 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005185}
5186
Paul Duffin9b879592020-05-26 13:21:35 +01005187func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5188 ctx, _ := testApex(t, `
5189 apex {
5190 name: "myapex",
5191 key: "myapex.key",
5192 java_libs: ["foo", "bar"],
5193 }
5194
5195 apex_key {
5196 name: "myapex.key",
5197 public_key: "testkey.avbpubkey",
5198 private_key: "testkey.pem",
5199 }
5200
5201 java_sdk_library {
5202 name: "foo",
5203 srcs: ["a.java"],
5204 api_packages: ["foo"],
5205 apex_available: ["myapex"],
5206 sdk_version: "none",
5207 system_modules: "none",
5208 }
5209
5210 java_library {
5211 name: "bar",
5212 srcs: ["a.java"],
5213 libs: ["foo"],
5214 apex_available: ["myapex"],
5215 sdk_version: "none",
5216 system_modules: "none",
5217 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005218
5219 prebuilt_apis {
5220 name: "sdk",
5221 api_dirs: ["100"],
5222 }
Paul Duffin9b879592020-05-26 13:21:35 +01005223 `, withFiles(filesForSdkLibrary))
5224
5225 // java_sdk_library installs both impl jar and permission XML
5226 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5227 "javalib/bar.jar",
5228 "javalib/foo.jar",
5229 "etc/permissions/foo.xml",
5230 })
5231
5232 // The bar library should depend on the implementation jar.
5233 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5234 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5235 t.Errorf("expected %q, found %#q", expected, actual)
5236 }
5237}
5238
5239func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5240 ctx, _ := testApex(t, `
5241 apex {
5242 name: "myapex",
5243 key: "myapex.key",
5244 java_libs: ["foo"],
5245 }
5246
5247 apex_key {
5248 name: "myapex.key",
5249 public_key: "testkey.avbpubkey",
5250 private_key: "testkey.pem",
5251 }
5252
5253 java_sdk_library {
5254 name: "foo",
5255 srcs: ["a.java"],
5256 api_packages: ["foo"],
5257 apex_available: ["myapex"],
5258 sdk_version: "none",
5259 system_modules: "none",
5260 }
5261
5262 java_library {
5263 name: "bar",
5264 srcs: ["a.java"],
5265 libs: ["foo"],
5266 sdk_version: "none",
5267 system_modules: "none",
5268 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005269
5270 prebuilt_apis {
5271 name: "sdk",
5272 api_dirs: ["100"],
5273 }
Paul Duffin9b879592020-05-26 13:21:35 +01005274 `, withFiles(filesForSdkLibrary))
5275
5276 // java_sdk_library installs both impl jar and permission XML
5277 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5278 "javalib/foo.jar",
5279 "etc/permissions/foo.xml",
5280 })
5281
5282 // The bar library should depend on the stubs jar.
5283 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5284 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5285 t.Errorf("expected %q, found %#q", expected, actual)
5286 }
5287}
5288
Paul Duffineedc5d52020-06-12 17:46:39 +01005289func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005290 ctx, _ := testApex(t, `
5291 prebuilt_apis {
5292 name: "sdk",
5293 api_dirs: ["100"],
5294 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005295 withFiles(map[string][]byte{
5296 "apex/a.java": nil,
5297 "apex/apex_manifest.json": nil,
5298 "apex/Android.bp": []byte(`
5299 package {
5300 default_visibility: ["//visibility:private"],
5301 }
5302
5303 apex {
5304 name: "myapex",
5305 key: "myapex.key",
5306 java_libs: ["foo", "bar"],
5307 }
5308
5309 apex_key {
5310 name: "myapex.key",
5311 public_key: "testkey.avbpubkey",
5312 private_key: "testkey.pem",
5313 }
5314
5315 java_library {
5316 name: "bar",
5317 srcs: ["a.java"],
5318 libs: ["foo"],
5319 apex_available: ["myapex"],
5320 sdk_version: "none",
5321 system_modules: "none",
5322 }
5323`),
5324 "source/a.java": nil,
5325 "source/api/current.txt": nil,
5326 "source/api/removed.txt": nil,
5327 "source/Android.bp": []byte(`
5328 package {
5329 default_visibility: ["//visibility:private"],
5330 }
5331
5332 java_sdk_library {
5333 name: "foo",
5334 visibility: ["//apex"],
5335 srcs: ["a.java"],
5336 api_packages: ["foo"],
5337 apex_available: ["myapex"],
5338 sdk_version: "none",
5339 system_modules: "none",
5340 public: {
5341 enabled: true,
5342 },
5343 }
5344`),
5345 "prebuilt/a.jar": nil,
5346 "prebuilt/Android.bp": []byte(`
5347 package {
5348 default_visibility: ["//visibility:private"],
5349 }
5350
5351 java_sdk_library_import {
5352 name: "foo",
5353 visibility: ["//apex", "//source"],
5354 apex_available: ["myapex"],
5355 prefer: true,
5356 public: {
5357 jars: ["a.jar"],
5358 },
5359 }
5360`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005361 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005362 )
5363
5364 // java_sdk_library installs both impl jar and permission XML
5365 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5366 "javalib/bar.jar",
5367 "javalib/foo.jar",
5368 "etc/permissions/foo.xml",
5369 })
5370
5371 // The bar library should depend on the implementation jar.
5372 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5373 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5374 t.Errorf("expected %q, found %#q", expected, actual)
5375 }
5376}
5377
5378func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5379 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5380 apex {
5381 name: "myapex",
5382 key: "myapex.key",
5383 java_libs: ["foo"],
5384 }
5385
5386 apex_key {
5387 name: "myapex.key",
5388 public_key: "testkey.avbpubkey",
5389 private_key: "testkey.pem",
5390 }
5391
5392 java_sdk_library_import {
5393 name: "foo",
5394 apex_available: ["myapex"],
5395 prefer: true,
5396 public: {
5397 jars: ["a.jar"],
5398 },
5399 }
5400
5401 `, withFiles(filesForSdkLibrary))
5402}
5403
atrost6e126252020-01-27 17:01:16 +00005404func TestCompatConfig(t *testing.T) {
5405 ctx, _ := testApex(t, `
5406 apex {
5407 name: "myapex",
5408 key: "myapex.key",
5409 prebuilts: ["myjar-platform-compat-config"],
5410 java_libs: ["myjar"],
5411 }
5412
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
5418
5419 platform_compat_config {
5420 name: "myjar-platform-compat-config",
5421 src: ":myjar",
5422 }
5423
5424 java_library {
5425 name: "myjar",
5426 srcs: ["foo/bar/MyClass.java"],
5427 sdk_version: "none",
5428 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005429 apex_available: [ "myapex" ],
5430 }
5431 `)
5432 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5433 "etc/compatconfig/myjar-platform-compat-config.xml",
5434 "javalib/myjar.jar",
5435 })
5436}
5437
Jiyong Park479321d2019-12-16 11:47:12 +09005438func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5439 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5440 apex {
5441 name: "myapex",
5442 key: "myapex.key",
5443 java_libs: ["myjar"],
5444 }
5445
5446 apex_key {
5447 name: "myapex.key",
5448 public_key: "testkey.avbpubkey",
5449 private_key: "testkey.pem",
5450 }
5451
5452 java_library {
5453 name: "myjar",
5454 srcs: ["foo/bar/MyClass.java"],
5455 sdk_version: "none",
5456 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005457 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005458 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005459 }
5460 `)
5461}
5462
Jiyong Park7afd1072019-12-30 16:56:33 +09005463func TestCarryRequiredModuleNames(t *testing.T) {
5464 ctx, config := testApex(t, `
5465 apex {
5466 name: "myapex",
5467 key: "myapex.key",
5468 native_shared_libs: ["mylib"],
5469 }
5470
5471 apex_key {
5472 name: "myapex.key",
5473 public_key: "testkey.avbpubkey",
5474 private_key: "testkey.pem",
5475 }
5476
5477 cc_library {
5478 name: "mylib",
5479 srcs: ["mylib.cpp"],
5480 system_shared_libs: [],
5481 stl: "none",
5482 required: ["a", "b"],
5483 host_required: ["c", "d"],
5484 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005485 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005486 }
5487 `)
5488
5489 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5490 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5491 name := apexBundle.BaseModuleName()
5492 prefix := "TARGET_"
5493 var builder strings.Builder
5494 data.Custom(&builder, name, prefix, "", data)
5495 androidMk := builder.String()
5496 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5497 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5498 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5499}
5500
Jiyong Park7cd10e32020-01-14 09:22:18 +09005501func TestSymlinksFromApexToSystem(t *testing.T) {
5502 bp := `
5503 apex {
5504 name: "myapex",
5505 key: "myapex.key",
5506 native_shared_libs: ["mylib"],
5507 java_libs: ["myjar"],
5508 }
5509
Jiyong Park9d677202020-02-19 16:29:35 +09005510 apex {
5511 name: "myapex.updatable",
5512 key: "myapex.key",
5513 native_shared_libs: ["mylib"],
5514 java_libs: ["myjar"],
5515 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005516 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005517 }
5518
Jiyong Park7cd10e32020-01-14 09:22:18 +09005519 apex_key {
5520 name: "myapex.key",
5521 public_key: "testkey.avbpubkey",
5522 private_key: "testkey.pem",
5523 }
5524
5525 cc_library {
5526 name: "mylib",
5527 srcs: ["mylib.cpp"],
5528 shared_libs: ["myotherlib"],
5529 system_shared_libs: [],
5530 stl: "none",
5531 apex_available: [
5532 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005533 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005534 "//apex_available:platform",
5535 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005536 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005537 }
5538
5539 cc_library {
5540 name: "myotherlib",
5541 srcs: ["mylib.cpp"],
5542 system_shared_libs: [],
5543 stl: "none",
5544 apex_available: [
5545 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005546 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005547 "//apex_available:platform",
5548 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005549 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005550 }
5551
5552 java_library {
5553 name: "myjar",
5554 srcs: ["foo/bar/MyClass.java"],
5555 sdk_version: "none",
5556 system_modules: "none",
5557 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005558 apex_available: [
5559 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005560 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005561 "//apex_available:platform",
5562 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005563 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005564 }
5565
5566 java_library {
5567 name: "myotherjar",
5568 srcs: ["foo/bar/MyClass.java"],
5569 sdk_version: "none",
5570 system_modules: "none",
5571 apex_available: [
5572 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005573 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005574 "//apex_available:platform",
5575 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005576 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005577 }
5578 `
5579
5580 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5581 for _, f := range files {
5582 if f.path == file {
5583 if f.isLink {
5584 t.Errorf("%q is not a real file", file)
5585 }
5586 return
5587 }
5588 }
5589 t.Errorf("%q is not found", file)
5590 }
5591
5592 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5593 for _, f := range files {
5594 if f.path == file {
5595 if !f.isLink {
5596 t.Errorf("%q is not a symlink", file)
5597 }
5598 return
5599 }
5600 }
5601 t.Errorf("%q is not found", file)
5602 }
5603
Jiyong Park9d677202020-02-19 16:29:35 +09005604 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5605 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005606 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005607 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005608 ensureRealfileExists(t, files, "javalib/myjar.jar")
5609 ensureRealfileExists(t, files, "lib64/mylib.so")
5610 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5611
Jiyong Park9d677202020-02-19 16:29:35 +09005612 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5613 ensureRealfileExists(t, files, "javalib/myjar.jar")
5614 ensureRealfileExists(t, files, "lib64/mylib.so")
5615 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5616
5617 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005618 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005619 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005620 ensureRealfileExists(t, files, "javalib/myjar.jar")
5621 ensureRealfileExists(t, files, "lib64/mylib.so")
5622 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005623
5624 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5625 ensureRealfileExists(t, files, "javalib/myjar.jar")
5626 ensureRealfileExists(t, files, "lib64/mylib.so")
5627 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005628}
5629
Yo Chiange8128052020-07-23 20:09:18 +08005630func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5631 ctx, config := testApex(t, `
5632 apex {
5633 name: "myapex",
5634 key: "myapex.key",
5635 native_shared_libs: ["mylib"],
5636 }
5637
5638 apex_key {
5639 name: "myapex.key",
5640 public_key: "testkey.avbpubkey",
5641 private_key: "testkey.pem",
5642 }
5643
5644 cc_library_shared {
5645 name: "mylib",
5646 srcs: ["mylib.cpp"],
5647 shared_libs: ["myotherlib"],
5648 system_shared_libs: [],
5649 stl: "none",
5650 apex_available: [
5651 "myapex",
5652 "//apex_available:platform",
5653 ],
5654 }
5655
5656 cc_prebuilt_library_shared {
5657 name: "myotherlib",
5658 srcs: ["prebuilt.so"],
5659 system_shared_libs: [],
5660 stl: "none",
5661 apex_available: [
5662 "myapex",
5663 "//apex_available:platform",
5664 ],
5665 }
5666 `)
5667
5668 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5669 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5670 var builder strings.Builder
5671 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5672 androidMk := builder.String()
5673 // `myotherlib` is added to `myapex` as symlink
5674 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5675 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5676 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5677 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09005678 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08005679}
5680
Jooyung Han643adc42020-02-27 13:50:06 +09005681func TestApexWithJniLibs(t *testing.T) {
5682 ctx, _ := testApex(t, `
5683 apex {
5684 name: "myapex",
5685 key: "myapex.key",
5686 jni_libs: ["mylib"],
5687 }
5688
5689 apex_key {
5690 name: "myapex.key",
5691 public_key: "testkey.avbpubkey",
5692 private_key: "testkey.pem",
5693 }
5694
5695 cc_library {
5696 name: "mylib",
5697 srcs: ["mylib.cpp"],
5698 shared_libs: ["mylib2"],
5699 system_shared_libs: [],
5700 stl: "none",
5701 apex_available: [ "myapex" ],
5702 }
5703
5704 cc_library {
5705 name: "mylib2",
5706 srcs: ["mylib.cpp"],
5707 system_shared_libs: [],
5708 stl: "none",
5709 apex_available: [ "myapex" ],
5710 }
5711 `)
5712
5713 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5714 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5715 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5716 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5717 "lib64/mylib.so",
5718 "lib64/mylib2.so",
5719 })
5720}
5721
Jooyung Han49f67012020-04-17 13:43:10 +09005722func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5723 ctx, _ := testApex(t, `
5724 apex {
5725 name: "myapex",
5726 key: "myapex.key",
5727 }
5728 apex_key {
5729 name: "myapex.key",
5730 public_key: "testkey.avbpubkey",
5731 private_key: "testkey.pem",
5732 }
5733 `, func(fs map[string][]byte, config android.Config) {
5734 delete(config.Targets, android.Android)
5735 config.AndroidCommonTarget = android.Target{}
5736 })
5737
5738 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5739 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5740 }
5741}
5742
Jiyong Parkbd159612020-02-28 15:22:21 +09005743func TestAppBundle(t *testing.T) {
5744 ctx, _ := testApex(t, `
5745 apex {
5746 name: "myapex",
5747 key: "myapex.key",
5748 apps: ["AppFoo"],
5749 }
5750
5751 apex_key {
5752 name: "myapex.key",
5753 public_key: "testkey.avbpubkey",
5754 private_key: "testkey.pem",
5755 }
5756
5757 android_app {
5758 name: "AppFoo",
5759 srcs: ["foo/bar/MyClass.java"],
5760 sdk_version: "none",
5761 system_modules: "none",
5762 apex_available: [ "myapex" ],
5763 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005764 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005765
Colin Crosscf371cc2020-11-13 11:48:42 -08005766 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005767 content := bundleConfigRule.Args["content"]
5768
5769 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005770 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 +09005771}
5772
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005773func TestAppSetBundle(t *testing.T) {
5774 ctx, _ := testApex(t, `
5775 apex {
5776 name: "myapex",
5777 key: "myapex.key",
5778 apps: ["AppSet"],
5779 }
5780
5781 apex_key {
5782 name: "myapex.key",
5783 public_key: "testkey.avbpubkey",
5784 private_key: "testkey.pem",
5785 }
5786
5787 android_app_set {
5788 name: "AppSet",
5789 set: "AppSet.apks",
5790 }`)
5791 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005792 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005793 content := bundleConfigRule.Args["content"]
5794 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5795 s := mod.Rule("apexRule").Args["copy_commands"]
5796 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5797 if len(copyCmds) != 3 {
5798 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5799 }
5800 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5801 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5802 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5803}
5804
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005805func TestAppSetBundlePrebuilt(t *testing.T) {
5806 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5807 bp := `
5808 apex_set {
5809 name: "myapex",
5810 filename: "foo_v2.apex",
5811 sanitized: {
5812 none: { set: "myapex.apks", },
5813 hwaddress: { set: "myapex.hwasan.apks", },
5814 },
5815 }`
5816 fs["Android.bp"] = []byte(bp)
5817
5818 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5819 })
5820
5821 m := ctx.ModuleForTests("myapex", "android_common")
5822 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5823
5824 actual := extractedApex.Inputs
5825 if len(actual) != 1 {
5826 t.Errorf("expected a single input")
5827 }
5828
5829 expected := "myapex.hwasan.apks"
5830 if actual[0].String() != expected {
5831 t.Errorf("expected %s, got %s", expected, actual[0].String())
5832 }
5833}
5834
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005835func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005836 t.Helper()
5837
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005838 bp := `
5839 java_library {
5840 name: "some-updatable-apex-lib",
5841 srcs: ["a.java"],
5842 sdk_version: "current",
5843 apex_available: [
5844 "some-updatable-apex",
5845 ],
5846 }
5847
5848 java_library {
5849 name: "some-non-updatable-apex-lib",
5850 srcs: ["a.java"],
5851 apex_available: [
5852 "some-non-updatable-apex",
5853 ],
5854 }
5855
5856 java_library {
5857 name: "some-platform-lib",
5858 srcs: ["a.java"],
5859 sdk_version: "current",
5860 installable: true,
5861 }
5862
5863 java_library {
5864 name: "some-art-lib",
5865 srcs: ["a.java"],
5866 sdk_version: "current",
5867 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00005868 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005869 ],
5870 hostdex: true,
5871 }
5872
5873 apex {
5874 name: "some-updatable-apex",
5875 key: "some-updatable-apex.key",
5876 java_libs: ["some-updatable-apex-lib"],
5877 updatable: true,
5878 min_sdk_version: "current",
5879 }
5880
5881 apex {
5882 name: "some-non-updatable-apex",
5883 key: "some-non-updatable-apex.key",
5884 java_libs: ["some-non-updatable-apex-lib"],
5885 }
5886
5887 apex_key {
5888 name: "some-updatable-apex.key",
5889 }
5890
5891 apex_key {
5892 name: "some-non-updatable-apex.key",
5893 }
5894
5895 apex {
Paul Duffind376f792021-01-26 11:59:35 +00005896 name: "com.android.art.debug",
5897 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005898 java_libs: ["some-art-lib"],
5899 updatable: true,
5900 min_sdk_version: "current",
5901 }
5902
5903 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00005904 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005905 }
5906
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005907 filegroup {
5908 name: "some-updatable-apex-file_contexts",
5909 srcs: [
5910 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5911 ],
5912 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005913
5914 filegroup {
5915 name: "some-non-updatable-apex-file_contexts",
5916 srcs: [
5917 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5918 ],
5919 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005920 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005921
5922 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5923}
5924
Paul Duffin064b70c2020-11-02 17:32:38 +00005925func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00005926 t.Helper()
5927
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005928 bp += cc.GatherRequiredDepsForTest(android.Android)
5929 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005930
5931 fs := map[string][]byte{
5932 "a.java": nil,
5933 "a.jar": nil,
5934 "build/make/target/product/security": nil,
5935 "apex_manifest.json": nil,
5936 "AndroidManifest.xml": nil,
Paul Duffind376f792021-01-26 11:59:35 +00005937 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
5938 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
5939 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005940 "framework/aidl/a.aidl": nil,
5941 }
5942 cc.GatherRequiredFilesForTest(fs)
5943
Colin Crossae8600b2020-10-29 17:09:13 -07005944 config := android.TestArchConfig(buildDir, nil, bp, fs)
5945
5946 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005947 ctx.RegisterModuleType("apex", BundleFactory)
5948 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00005949 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005950 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005951 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005952 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005953 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00005954 java.RegisterRequiredBuildComponentsForTest(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005955 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5956 ctx.PreDepsMutators(RegisterPreDepsMutators)
5957 ctx.PostDepsMutators(RegisterPostDepsMutators)
5958
Colin Crossae8600b2020-10-29 17:09:13 -07005959 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005960
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005961 pathCtx := android.PathContextForTesting(config)
5962 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5963 transformDexpreoptConfig(dexpreoptConfig)
5964 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5965
5966 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5967 android.FailIfErrored(t, errs)
5968
5969 _, errs = ctx.PrepareBuildActions(config)
5970 if errmsg == "" {
5971 android.FailIfErrored(t, errs)
5972 } else if len(errs) > 0 {
5973 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005974 } else {
5975 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5976 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005977
5978 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005979}
5980
Jooyung Han548640b2020-04-27 12:10:30 +09005981func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5982 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5983 apex {
5984 name: "myapex",
5985 key: "myapex.key",
5986 updatable: true,
5987 }
5988
5989 apex_key {
5990 name: "myapex.key",
5991 public_key: "testkey.avbpubkey",
5992 private_key: "testkey.pem",
5993 }
5994 `)
5995}
5996
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005997func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005998 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005999 var transform func(*dexpreopt.GlobalConfig)
6000
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006001 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6002 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006003 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006004 }
6005 testNoUpdatableJarsInBootImage(t, "", transform)
6006 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006007
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006008 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006009 err = `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006010 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006011 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006012 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006013 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006014 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006015
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006016 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 -07006017 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 +01006018 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006019 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006020 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006021 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006022 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006023
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006024 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 -07006025 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006026 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006027 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006028 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006029 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006030 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006031
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006032 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 -07006033 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 +01006034 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006035 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006036 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006037 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006038 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006039
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006040 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6041 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006042 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006043 }
6044 testNoUpdatableJarsInBootImage(t, "", transform)
6045 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006046
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006047 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006048 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006049 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006050 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006051 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006052 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006053 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006054
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006055 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006056 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006057 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006058 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006059 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006060 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006061 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006062
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006063 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006064 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006065 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006066 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006067 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006068 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006069 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006070
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006071 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6072 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006073 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006074 }
6075 testNoUpdatableJarsInBootImage(t, "", transform)
6076 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006077
6078}
6079
6080func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6081 transform := func(config *dexpreopt.GlobalConfig) {
6082 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6083 }
6084 t.Run("prebuilt no source", func(t *testing.T) {
6085 testDexpreoptWithApexes(t, `
6086 prebuilt_apex {
6087 name: "myapex" ,
6088 arch: {
6089 arm64: {
6090 src: "myapex-arm64.apex",
6091 },
6092 arm: {
6093 src: "myapex-arm.apex",
6094 },
6095 },
6096 exported_java_libs: ["libfoo"],
6097 }
6098
6099 java_import {
6100 name: "libfoo",
6101 jars: ["libfoo.jar"],
6102 }
6103`, "", transform)
6104 })
6105
6106 t.Run("prebuilt no source", func(t *testing.T) {
6107 testDexpreoptWithApexes(t, `
6108 prebuilt_apex {
6109 name: "myapex" ,
6110 arch: {
6111 arm64: {
6112 src: "myapex-arm64.apex",
6113 },
6114 arm: {
6115 src: "myapex-arm.apex",
6116 },
6117 },
6118 exported_java_libs: ["libfoo"],
6119 }
6120
6121 java_import {
6122 name: "libfoo",
6123 jars: ["libfoo.jar"],
6124 }
6125`, "", transform)
6126 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006127}
6128
Andrei Onea115e7e72020-06-05 21:14:03 +01006129func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6130 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006131 bp += `
6132 apex_key {
6133 name: "myapex.key",
6134 public_key: "testkey.avbpubkey",
6135 private_key: "testkey.pem",
6136 }`
6137 fs := map[string][]byte{
6138 "lib1/src/A.java": nil,
6139 "lib2/src/B.java": nil,
6140 "system/sepolicy/apex/myapex-file_contexts": nil,
6141 }
6142
Colin Crossae8600b2020-10-29 17:09:13 -07006143 config := android.TestArchConfig(buildDir, nil, bp, fs)
6144 android.SetTestNeverallowRules(config, rules)
6145 updatableBootJars := make([]string, 0, len(apexBootJars))
6146 for _, apexBootJar := range apexBootJars {
6147 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6148 }
6149 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6150
6151 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006152 ctx.RegisterModuleType("apex", BundleFactory)
6153 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6154 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6155 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006156 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006157 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6158 ctx.PreDepsMutators(RegisterPreDepsMutators)
6159 ctx.PostDepsMutators(RegisterPostDepsMutators)
6160 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6161
Colin Crossae8600b2020-10-29 17:09:13 -07006162 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006163
6164 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6165 android.FailIfErrored(t, errs)
6166
6167 _, errs = ctx.PrepareBuildActions(config)
6168 if errmsg == "" {
6169 android.FailIfErrored(t, errs)
6170 } else if len(errs) > 0 {
6171 android.FailIfNoMatchingErrors(t, errmsg, errs)
6172 return
6173 } else {
6174 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6175 }
6176}
6177
6178func TestApexPermittedPackagesRules(t *testing.T) {
6179 testcases := []struct {
6180 name string
6181 expectedError string
6182 bp string
6183 bootJars []string
6184 modulesPackages map[string][]string
6185 }{
6186
6187 {
6188 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6189 expectedError: "",
6190 bp: `
6191 java_library {
6192 name: "bcp_lib1",
6193 srcs: ["lib1/src/*.java"],
6194 permitted_packages: ["foo.bar"],
6195 apex_available: ["myapex"],
6196 sdk_version: "none",
6197 system_modules: "none",
6198 }
6199 java_library {
6200 name: "nonbcp_lib2",
6201 srcs: ["lib2/src/*.java"],
6202 apex_available: ["myapex"],
6203 permitted_packages: ["a.b"],
6204 sdk_version: "none",
6205 system_modules: "none",
6206 }
6207 apex {
6208 name: "myapex",
6209 key: "myapex.key",
6210 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6211 }`,
6212 bootJars: []string{"bcp_lib1"},
6213 modulesPackages: map[string][]string{
6214 "myapex": []string{
6215 "foo.bar",
6216 },
6217 },
6218 },
6219 {
6220 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6221 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.`,
6222 bp: `
6223 java_library {
6224 name: "bcp_lib1",
6225 srcs: ["lib1/src/*.java"],
6226 apex_available: ["myapex"],
6227 permitted_packages: ["foo.bar"],
6228 sdk_version: "none",
6229 system_modules: "none",
6230 }
6231 java_library {
6232 name: "bcp_lib2",
6233 srcs: ["lib2/src/*.java"],
6234 apex_available: ["myapex"],
6235 permitted_packages: ["foo.bar", "bar.baz"],
6236 sdk_version: "none",
6237 system_modules: "none",
6238 }
6239 apex {
6240 name: "myapex",
6241 key: "myapex.key",
6242 java_libs: ["bcp_lib1", "bcp_lib2"],
6243 }
6244 `,
6245 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6246 modulesPackages: map[string][]string{
6247 "myapex": []string{
6248 "foo.bar",
6249 },
6250 },
6251 },
6252 }
6253 for _, tc := range testcases {
6254 t.Run(tc.name, func(t *testing.T) {
6255 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6256 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6257 })
6258 }
6259}
6260
Jiyong Park62304bb2020-04-13 16:19:48 +09006261func TestTestFor(t *testing.T) {
6262 ctx, _ := testApex(t, `
6263 apex {
6264 name: "myapex",
6265 key: "myapex.key",
6266 native_shared_libs: ["mylib", "myprivlib"],
6267 }
6268
6269 apex_key {
6270 name: "myapex.key",
6271 public_key: "testkey.avbpubkey",
6272 private_key: "testkey.pem",
6273 }
6274
6275 cc_library {
6276 name: "mylib",
6277 srcs: ["mylib.cpp"],
6278 system_shared_libs: [],
6279 stl: "none",
6280 stubs: {
6281 versions: ["1"],
6282 },
6283 apex_available: ["myapex"],
6284 }
6285
6286 cc_library {
6287 name: "myprivlib",
6288 srcs: ["mylib.cpp"],
6289 system_shared_libs: [],
6290 stl: "none",
6291 apex_available: ["myapex"],
6292 }
6293
6294
6295 cc_test {
6296 name: "mytest",
6297 gtest: false,
6298 srcs: ["mylib.cpp"],
6299 system_shared_libs: [],
6300 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006301 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006302 test_for: ["myapex"]
6303 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006304
6305 cc_library {
6306 name: "mytestlib",
6307 srcs: ["mylib.cpp"],
6308 system_shared_libs: [],
6309 shared_libs: ["mylib", "myprivlib"],
6310 stl: "none",
6311 test_for: ["myapex"],
6312 }
6313
6314 cc_benchmark {
6315 name: "mybench",
6316 srcs: ["mylib.cpp"],
6317 system_shared_libs: [],
6318 shared_libs: ["mylib", "myprivlib"],
6319 stl: "none",
6320 test_for: ["myapex"],
6321 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006322 `)
6323
6324 // the test 'mytest' is a test for the apex, therefore is linked to the
6325 // actual implementation of mylib instead of its stub.
6326 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6327 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6328 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006329
6330 // The same should be true for cc_library
6331 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6332 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6333 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6334
6335 // ... and for cc_benchmark
6336 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6337 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6338 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006339}
6340
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006341// TODO(jungjw): Move this to proptools
6342func intPtr(i int) *int {
6343 return &i
6344}
6345
6346func TestApexSet(t *testing.T) {
6347 ctx, config := testApex(t, `
6348 apex_set {
6349 name: "myapex",
6350 set: "myapex.apks",
6351 filename: "foo_v2.apex",
6352 overrides: ["foo"],
6353 }
6354 `, func(fs map[string][]byte, config android.Config) {
6355 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006356 config.Targets[android.Android] = []android.Target{
6357 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6358 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6359 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006360 })
6361
6362 m := ctx.ModuleForTests("myapex", "android_common")
6363
6364 // Check extract_apks tool parameters.
6365 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6366 actual := extractedApex.Args["abis"]
6367 expected := "ARMEABI_V7A,ARM64_V8A"
6368 if actual != expected {
6369 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6370 }
6371 actual = extractedApex.Args["sdk-version"]
6372 expected = "30"
6373 if actual != expected {
6374 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6375 }
6376
6377 a := m.Module().(*ApexSet)
6378 expectedOverrides := []string{"foo"}
6379 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6380 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6381 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6382 }
6383}
6384
Jiyong Park7d95a512020-05-10 15:16:24 +09006385func TestNoStaticLinkingToStubsLib(t *testing.T) {
6386 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6387 apex {
6388 name: "myapex",
6389 key: "myapex.key",
6390 native_shared_libs: ["mylib"],
6391 }
6392
6393 apex_key {
6394 name: "myapex.key",
6395 public_key: "testkey.avbpubkey",
6396 private_key: "testkey.pem",
6397 }
6398
6399 cc_library {
6400 name: "mylib",
6401 srcs: ["mylib.cpp"],
6402 static_libs: ["otherlib"],
6403 system_shared_libs: [],
6404 stl: "none",
6405 apex_available: [ "myapex" ],
6406 }
6407
6408 cc_library {
6409 name: "otherlib",
6410 srcs: ["mylib.cpp"],
6411 system_shared_libs: [],
6412 stl: "none",
6413 stubs: {
6414 versions: ["1", "2", "3"],
6415 },
6416 apex_available: [ "myapex" ],
6417 }
6418 `)
6419}
6420
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006421func TestApexKeysTxt(t *testing.T) {
6422 ctx, _ := testApex(t, `
6423 apex {
6424 name: "myapex",
6425 key: "myapex.key",
6426 }
6427
6428 apex_key {
6429 name: "myapex.key",
6430 public_key: "testkey.avbpubkey",
6431 private_key: "testkey.pem",
6432 }
6433
6434 prebuilt_apex {
6435 name: "myapex",
6436 prefer: true,
6437 arch: {
6438 arm64: {
6439 src: "myapex-arm64.apex",
6440 },
6441 arm: {
6442 src: "myapex-arm.apex",
6443 },
6444 },
6445 }
6446
6447 apex_set {
6448 name: "myapex_set",
6449 set: "myapex.apks",
6450 filename: "myapex_set.apex",
6451 overrides: ["myapex"],
6452 }
6453 `)
6454
6455 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6456 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6457 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 +09006458 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 +09006459}
6460
Jooyung Han938b5932020-06-20 12:47:47 +09006461func TestAllowedFiles(t *testing.T) {
6462 ctx, _ := testApex(t, `
6463 apex {
6464 name: "myapex",
6465 key: "myapex.key",
6466 apps: ["app"],
6467 allowed_files: "allowed.txt",
6468 }
6469
6470 apex_key {
6471 name: "myapex.key",
6472 public_key: "testkey.avbpubkey",
6473 private_key: "testkey.pem",
6474 }
6475
6476 android_app {
6477 name: "app",
6478 srcs: ["foo/bar/MyClass.java"],
6479 package_name: "foo",
6480 sdk_version: "none",
6481 system_modules: "none",
6482 apex_available: [ "myapex" ],
6483 }
6484 `, withFiles(map[string][]byte{
6485 "sub/Android.bp": []byte(`
6486 override_apex {
6487 name: "override_myapex",
6488 base: "myapex",
6489 apps: ["override_app"],
6490 allowed_files: ":allowed",
6491 }
6492 // Overridable "path" property should be referenced indirectly
6493 filegroup {
6494 name: "allowed",
6495 srcs: ["allowed.txt"],
6496 }
6497 override_android_app {
6498 name: "override_app",
6499 base: "app",
6500 package_name: "bar",
6501 }
6502 `),
6503 }))
6504
6505 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6506 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6507 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6508 }
6509
6510 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6511 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6512 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6513 }
6514}
6515
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006516func TestNonPreferredPrebuiltDependency(t *testing.T) {
6517 _, _ = testApex(t, `
6518 apex {
6519 name: "myapex",
6520 key: "myapex.key",
6521 native_shared_libs: ["mylib"],
6522 }
6523
6524 apex_key {
6525 name: "myapex.key",
6526 public_key: "testkey.avbpubkey",
6527 private_key: "testkey.pem",
6528 }
6529
6530 cc_library {
6531 name: "mylib",
6532 srcs: ["mylib.cpp"],
6533 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006534 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006535 },
6536 apex_available: ["myapex"],
6537 }
6538
6539 cc_prebuilt_library_shared {
6540 name: "mylib",
6541 prefer: false,
6542 srcs: ["prebuilt.so"],
6543 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006544 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006545 },
6546 apex_available: ["myapex"],
6547 }
6548 `)
6549}
6550
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006551func TestCompressedApex(t *testing.T) {
6552 ctx, config := testApex(t, `
6553 apex {
6554 name: "myapex",
6555 key: "myapex.key",
6556 compressible: true,
6557 }
6558 apex_key {
6559 name: "myapex.key",
6560 public_key: "testkey.avbpubkey",
6561 private_key: "testkey.pem",
6562 }
6563 `, func(fs map[string][]byte, config android.Config) {
6564 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6565 })
6566
6567 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6568 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6569
6570 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6571 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6572
6573 // Make sure output of bundle is .capex
6574 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6575 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6576
6577 // Verify android.mk rules
6578 data := android.AndroidMkDataForTest(t, config, "", ab)
6579 var builder strings.Builder
6580 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6581 androidMk := builder.String()
6582 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6583}
6584
Martin Stjernholm2856c662020-12-02 15:03:42 +00006585func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6586 ctx, config := testApex(t, `
6587 apex {
6588 name: "myapex",
6589 key: "myapex.key",
6590 native_shared_libs: ["mylib"],
6591 }
6592
6593 apex_key {
6594 name: "myapex.key",
6595 public_key: "testkey.avbpubkey",
6596 private_key: "testkey.pem",
6597 }
6598
6599 cc_library {
6600 name: "mylib",
6601 srcs: ["mylib.cpp"],
6602 apex_available: ["myapex"],
6603 shared_libs: ["otherlib"],
6604 system_shared_libs: [],
6605 }
6606
6607 cc_library {
6608 name: "otherlib",
6609 srcs: ["mylib.cpp"],
6610 stubs: {
6611 versions: ["current"],
6612 },
6613 }
6614
6615 cc_prebuilt_library_shared {
6616 name: "otherlib",
6617 prefer: true,
6618 srcs: ["prebuilt.so"],
6619 stubs: {
6620 versions: ["current"],
6621 },
6622 }
6623 `)
6624
6625 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6626 data := android.AndroidMkDataForTest(t, config, "", ab)
6627 var builder strings.Builder
6628 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6629 androidMk := builder.String()
6630
6631 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6632 // a thing there.
6633 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6634}
6635
Jiyong Parke3867542020-12-03 17:28:25 +09006636func TestExcludeDependency(t *testing.T) {
6637 ctx, _ := testApex(t, `
6638 apex {
6639 name: "myapex",
6640 key: "myapex.key",
6641 native_shared_libs: ["mylib"],
6642 }
6643
6644 apex_key {
6645 name: "myapex.key",
6646 public_key: "testkey.avbpubkey",
6647 private_key: "testkey.pem",
6648 }
6649
6650 cc_library {
6651 name: "mylib",
6652 srcs: ["mylib.cpp"],
6653 system_shared_libs: [],
6654 stl: "none",
6655 apex_available: ["myapex"],
6656 shared_libs: ["mylib2"],
6657 target: {
6658 apex: {
6659 exclude_shared_libs: ["mylib2"],
6660 },
6661 },
6662 }
6663
6664 cc_library {
6665 name: "mylib2",
6666 srcs: ["mylib.cpp"],
6667 system_shared_libs: [],
6668 stl: "none",
6669 }
6670 `)
6671
6672 // Check if mylib is linked to mylib2 for the non-apex target
6673 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6674 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6675
6676 // Make sure that the link doesn't occur for the apex target
6677 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6678 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6679
6680 // It shouldn't appear in the copy cmd as well.
6681 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6682 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6683}
6684
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006685func TestPrebuiltStubLibDep(t *testing.T) {
6686 bpBase := `
6687 apex {
6688 name: "myapex",
6689 key: "myapex.key",
6690 native_shared_libs: ["mylib"],
6691 }
6692 apex_key {
6693 name: "myapex.key",
6694 public_key: "testkey.avbpubkey",
6695 private_key: "testkey.pem",
6696 }
6697 cc_library {
6698 name: "mylib",
6699 srcs: ["mylib.cpp"],
6700 apex_available: ["myapex"],
6701 shared_libs: ["stublib"],
6702 system_shared_libs: [],
6703 }
6704 apex {
6705 name: "otherapex",
6706 enabled: %s,
6707 key: "myapex.key",
6708 native_shared_libs: ["stublib"],
6709 }
6710 `
6711
6712 stublibSourceBp := `
6713 cc_library {
6714 name: "stublib",
6715 srcs: ["mylib.cpp"],
6716 apex_available: ["otherapex"],
6717 system_shared_libs: [],
6718 stl: "none",
6719 stubs: {
6720 versions: ["1"],
6721 },
6722 }
6723 `
6724
6725 stublibPrebuiltBp := `
6726 cc_prebuilt_library_shared {
6727 name: "stublib",
6728 srcs: ["prebuilt.so"],
6729 apex_available: ["otherapex"],
6730 stubs: {
6731 versions: ["1"],
6732 },
6733 %s
6734 }
6735 `
6736
6737 tests := []struct {
6738 name string
6739 stublibBp string
6740 usePrebuilt bool
6741 modNames []string // Modules to collect AndroidMkEntries for
6742 otherApexEnabled []string
6743 }{
6744 {
6745 name: "only_source",
6746 stublibBp: stublibSourceBp,
6747 usePrebuilt: false,
6748 modNames: []string{"stublib"},
6749 otherApexEnabled: []string{"true", "false"},
6750 },
6751 {
6752 name: "source_preferred",
6753 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
6754 usePrebuilt: false,
6755 modNames: []string{"stublib", "prebuilt_stublib"},
6756 otherApexEnabled: []string{"true", "false"},
6757 },
6758 {
6759 name: "prebuilt_preferred",
6760 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
6761 usePrebuilt: true,
6762 modNames: []string{"stublib", "prebuilt_stublib"},
6763 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6764 },
6765 {
6766 name: "only_prebuilt",
6767 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
6768 usePrebuilt: true,
6769 modNames: []string{"stublib"},
6770 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6771 },
6772 }
6773
6774 for _, test := range tests {
6775 t.Run(test.name, func(t *testing.T) {
6776 for _, otherApexEnabled := range test.otherApexEnabled {
6777 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
6778 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
6779
6780 type modAndMkEntries struct {
6781 mod *cc.Module
6782 mkEntries android.AndroidMkEntries
6783 }
6784 entries := []*modAndMkEntries{}
6785
6786 // Gather shared lib modules that are installable
6787 for _, modName := range test.modNames {
6788 for _, variant := range ctx.ModuleVariantsForTests(modName) {
6789 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
6790 continue
6791 }
6792 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08006793 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006794 continue
6795 }
6796 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
6797 if ent.Disabled {
6798 continue
6799 }
6800 entries = append(entries, &modAndMkEntries{
6801 mod: mod,
6802 mkEntries: ent,
6803 })
6804 }
6805 }
6806 }
6807
6808 var entry *modAndMkEntries = nil
6809 for _, ent := range entries {
6810 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
6811 if entry != nil {
6812 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
6813 } else {
6814 entry = ent
6815 }
6816 }
6817 }
6818
6819 if entry == nil {
6820 t.Errorf("AndroidMk entry for \"stublib\" missing")
6821 } else {
6822 isPrebuilt := entry.mod.Prebuilt() != nil
6823 if isPrebuilt != test.usePrebuilt {
6824 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
6825 }
6826 if !entry.mod.IsStubs() {
6827 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
6828 }
6829 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
6830 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
6831 }
Jiyong Park892a98f2020-12-14 09:20:00 +09006832 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
6833 expected := "-D__STUBLIB_API__=1"
6834 if !android.InList(expected, cflags) {
6835 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
6836 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006837 }
6838 })
6839 }
6840 })
6841 }
6842}
6843
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006844func TestMain(m *testing.M) {
6845 run := func() int {
6846 setUp()
6847 defer tearDown()
6848
6849 return m.Run()
6850 }
6851
6852 os.Exit(run())
6853}