blob: 7f5be7ec5208e3327e85da475c5ff388434aa8b5 [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
Jooyung Haned124c32021-01-26 11:43:46 +09002138func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2139 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2140 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2141 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2142 }
2143 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2144 apex {
2145 name: "myapex",
2146 key: "myapex.key",
2147 native_shared_libs: ["libfoo"],
2148 min_sdk_version: "S",
2149 }
2150 apex_key {
2151 name: "myapex.key",
2152 public_key: "testkey.avbpubkey",
2153 private_key: "testkey.pem",
2154 }
2155 cc_library {
2156 name: "libfoo",
2157 shared_libs: ["libbar"],
2158 apex_available: ["myapex"],
2159 min_sdk_version: "29",
2160 }
2161 cc_library {
2162 name: "libbar",
2163 apex_available: ["myapex"],
2164 }
2165 `, withSAsActiveCodeNames)
2166}
2167
2168func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2169 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2170 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2171 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2172 }
2173 ctx, _ := testApex(t, `
2174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["libfoo"],
2178 min_sdk_version: "S",
2179 }
2180 apex_key {
2181 name: "myapex.key",
2182 public_key: "testkey.avbpubkey",
2183 private_key: "testkey.pem",
2184 }
2185 cc_library {
2186 name: "libfoo",
2187 shared_libs: ["libbar"],
2188 apex_available: ["myapex"],
2189 min_sdk_version: "S",
2190 }
2191 cc_library {
2192 name: "libbar",
2193 stubs: {
2194 symbol_file: "libbar.map.txt",
2195 versions: ["30", "S", "T"],
2196 },
2197 }
2198 `, withSAsActiveCodeNames)
2199
2200 // ensure libfoo is linked with "S" version of libbar stub
2201 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2202 libFlags := libfoo.Rule("ld").Args["libFlags"]
2203 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_S/libbar.so")
2204}
2205
Jiyong Park7c2ee712018-12-07 00:42:25 +09002206func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002207 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002208 apex {
2209 name: "myapex",
2210 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002211 native_shared_libs: ["mylib"],
2212 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002213 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002214 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002215 }
2216
2217 apex_key {
2218 name: "myapex.key",
2219 public_key: "testkey.avbpubkey",
2220 private_key: "testkey.pem",
2221 }
2222
2223 prebuilt_etc {
2224 name: "myetc",
2225 src: "myprebuilt",
2226 sub_dir: "foo/bar",
2227 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002228
2229 cc_library {
2230 name: "mylib",
2231 srcs: ["mylib.cpp"],
2232 relative_install_path: "foo/bar",
2233 system_shared_libs: [],
2234 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002235 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002236 }
2237
2238 cc_binary {
2239 name: "mybin",
2240 srcs: ["mylib.cpp"],
2241 relative_install_path: "foo/bar",
2242 system_shared_libs: [],
2243 static_executable: true,
2244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002245 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002246 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002247 `)
2248
Sundong Ahnabb64432019-10-22 13:58:29 +09002249 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002250 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2251
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002252 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002253 ensureListContains(t, dirs, "etc")
2254 ensureListContains(t, dirs, "etc/foo")
2255 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002256 ensureListContains(t, dirs, "lib64")
2257 ensureListContains(t, dirs, "lib64/foo")
2258 ensureListContains(t, dirs, "lib64/foo/bar")
2259 ensureListContains(t, dirs, "lib")
2260 ensureListContains(t, dirs, "lib/foo")
2261 ensureListContains(t, dirs, "lib/foo/bar")
2262
Jiyong Parkbd13e442019-03-15 18:10:35 +09002263 ensureListContains(t, dirs, "bin")
2264 ensureListContains(t, dirs, "bin/foo")
2265 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002266}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002267
Jooyung Han35155c42020-02-06 17:33:20 +09002268func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2269 ctx, _ := testApex(t, `
2270 apex {
2271 name: "myapex",
2272 key: "myapex.key",
2273 multilib: {
2274 both: {
2275 native_shared_libs: ["mylib"],
2276 binaries: ["mybin"],
2277 },
2278 },
2279 compile_multilib: "both",
2280 native_bridge_supported: true,
2281 }
2282
2283 apex_key {
2284 name: "myapex.key",
2285 public_key: "testkey.avbpubkey",
2286 private_key: "testkey.pem",
2287 }
2288
2289 cc_library {
2290 name: "mylib",
2291 relative_install_path: "foo/bar",
2292 system_shared_libs: [],
2293 stl: "none",
2294 apex_available: [ "myapex" ],
2295 native_bridge_supported: true,
2296 }
2297
2298 cc_binary {
2299 name: "mybin",
2300 relative_install_path: "foo/bar",
2301 system_shared_libs: [],
2302 static_executable: true,
2303 stl: "none",
2304 apex_available: [ "myapex" ],
2305 native_bridge_supported: true,
2306 compile_multilib: "both", // default is "first" for binary
2307 multilib: {
2308 lib64: {
2309 suffix: "64",
2310 },
2311 },
2312 }
2313 `, withNativeBridgeEnabled)
2314 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2315 "bin/foo/bar/mybin",
2316 "bin/foo/bar/mybin64",
2317 "bin/arm/foo/bar/mybin",
2318 "bin/arm64/foo/bar/mybin64",
2319 "lib/foo/bar/mylib.so",
2320 "lib/arm/foo/bar/mylib.so",
2321 "lib64/foo/bar/mylib.so",
2322 "lib64/arm64/foo/bar/mylib.so",
2323 })
2324}
2325
Jiyong Parkda6eb592018-12-19 17:12:36 +09002326func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002327 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002328 apex {
2329 name: "myapex",
2330 key: "myapex.key",
2331 native_shared_libs: ["mylib"],
2332 use_vendor: true,
2333 }
2334
2335 apex_key {
2336 name: "myapex.key",
2337 public_key: "testkey.avbpubkey",
2338 private_key: "testkey.pem",
2339 }
2340
2341 cc_library {
2342 name: "mylib",
2343 srcs: ["mylib.cpp"],
2344 shared_libs: ["mylib2"],
2345 system_shared_libs: [],
2346 vendor_available: true,
2347 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002348 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002349 }
2350
2351 cc_library {
2352 name: "mylib2",
2353 srcs: ["mylib.cpp"],
2354 system_shared_libs: [],
2355 vendor_available: true,
2356 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002357 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002358 }
Jooyung Handc782442019-11-01 03:14:38 +09002359 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002360 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002361 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002362
2363 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002364 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002365 for _, implicit := range i.Implicits {
2366 inputsList = append(inputsList, implicit.String())
2367 }
2368 }
2369 inputsString := strings.Join(inputsList, " ")
2370
2371 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002372 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2373 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002374
2375 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002376 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2377 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002378}
Jiyong Park16e91a02018-12-20 18:18:08 +09002379
Jooyung Han85d61762020-06-24 23:50:26 +09002380func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002381 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2382 apex {
2383 name: "myapex",
2384 key: "myapex.key",
2385 use_vendor: true,
2386 }
2387 apex_key {
2388 name: "myapex.key",
2389 public_key: "testkey.avbpubkey",
2390 private_key: "testkey.pem",
2391 }
2392 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002393 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002394 })
Colin Cross440e0d02020-06-11 11:32:11 -07002395 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002396 testApex(t, `
2397 apex {
2398 name: "myapex",
2399 key: "myapex.key",
2400 use_vendor: true,
2401 }
2402 apex_key {
2403 name: "myapex.key",
2404 public_key: "testkey.avbpubkey",
2405 private_key: "testkey.pem",
2406 }
2407 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002408 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002409 })
2410}
2411
Jooyung Han5c998b92019-06-27 11:30:33 +09002412func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2413 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2414 apex {
2415 name: "myapex",
2416 key: "myapex.key",
2417 native_shared_libs: ["mylib"],
2418 use_vendor: true,
2419 }
2420
2421 apex_key {
2422 name: "myapex.key",
2423 public_key: "testkey.avbpubkey",
2424 private_key: "testkey.pem",
2425 }
2426
2427 cc_library {
2428 name: "mylib",
2429 srcs: ["mylib.cpp"],
2430 system_shared_libs: [],
2431 stl: "none",
2432 }
2433 `)
2434}
2435
Jooyung Han85d61762020-06-24 23:50:26 +09002436func TestVendorApex(t *testing.T) {
2437 ctx, config := testApex(t, `
2438 apex {
2439 name: "myapex",
2440 key: "myapex.key",
2441 binaries: ["mybin"],
2442 vendor: true,
2443 }
2444 apex_key {
2445 name: "myapex.key",
2446 public_key: "testkey.avbpubkey",
2447 private_key: "testkey.pem",
2448 }
2449 cc_binary {
2450 name: "mybin",
2451 vendor: true,
2452 shared_libs: ["libfoo"],
2453 }
2454 cc_library {
2455 name: "libfoo",
2456 proprietary: true,
2457 }
2458 `)
2459
2460 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2461 "bin/mybin",
2462 "lib64/libfoo.so",
2463 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2464 "lib64/libc++.so",
2465 })
2466
2467 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2468 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2469 name := apexBundle.BaseModuleName()
2470 prefix := "TARGET_"
2471 var builder strings.Builder
2472 data.Custom(&builder, name, prefix, "", data)
2473 androidMk := builder.String()
2474 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002475
2476 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2477 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2478 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002479}
2480
Jooyung Handf78e212020-07-22 15:54:47 +09002481func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2482 ctx, _ := testApex(t, `
2483 apex {
2484 name: "myapex",
2485 key: "myapex.key",
2486 binaries: ["mybin"],
2487 vendor: true,
2488 use_vndk_as_stable: true,
2489 }
2490 apex_key {
2491 name: "myapex.key",
2492 public_key: "testkey.avbpubkey",
2493 private_key: "testkey.pem",
2494 }
2495 cc_binary {
2496 name: "mybin",
2497 vendor: true,
2498 shared_libs: ["libvndk", "libvendor"],
2499 }
2500 cc_library {
2501 name: "libvndk",
2502 vndk: {
2503 enabled: true,
2504 },
2505 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002506 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002507 }
2508 cc_library {
2509 name: "libvendor",
2510 vendor: true,
2511 }
2512 `)
2513
2514 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2515
Colin Crossaede88c2020-08-11 12:17:01 -07002516 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002517 libs := names(ldRule.Args["libFlags"])
2518 // VNDK libs(libvndk/libc++) as they are
2519 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2520 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2521 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002522 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002523
2524 // VNDK libs are not included when use_vndk_as_stable: true
2525 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2526 "bin/mybin",
2527 "lib64/libvendor.so",
2528 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002529
2530 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2531 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2532 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002533}
2534
Jooyung Han8e5685d2020-09-21 11:02:57 +09002535func TestApex_withPrebuiltFirmware(t *testing.T) {
2536 testCases := []struct {
2537 name string
2538 additionalProp string
2539 }{
2540 {"system apex with prebuilt_firmware", ""},
2541 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2542 }
2543 for _, tc := range testCases {
2544 t.Run(tc.name, func(t *testing.T) {
2545 ctx, _ := testApex(t, `
2546 apex {
2547 name: "myapex",
2548 key: "myapex.key",
2549 prebuilts: ["myfirmware"],
2550 `+tc.additionalProp+`
2551 }
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557 prebuilt_firmware {
2558 name: "myfirmware",
2559 src: "myfirmware.bin",
2560 filename_from_src: true,
2561 `+tc.additionalProp+`
2562 }
2563 `)
2564 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2565 "etc/firmware/myfirmware.bin",
2566 })
2567 })
2568 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002569}
2570
Jooyung Hanefb184e2020-06-25 17:14:25 +09002571func TestAndroidMk_UseVendorRequired(t *testing.T) {
2572 ctx, config := testApex(t, `
2573 apex {
2574 name: "myapex",
2575 key: "myapex.key",
2576 use_vendor: true,
2577 native_shared_libs: ["mylib"],
2578 }
2579
2580 apex_key {
2581 name: "myapex.key",
2582 public_key: "testkey.avbpubkey",
2583 private_key: "testkey.pem",
2584 }
2585
2586 cc_library {
2587 name: "mylib",
2588 vendor_available: true,
2589 apex_available: ["myapex"],
2590 }
2591 `, func(fs map[string][]byte, config android.Config) {
2592 setUseVendorAllowListForTest(config, []string{"myapex"})
2593 })
2594
2595 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2596 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2597 name := apexBundle.BaseModuleName()
2598 prefix := "TARGET_"
2599 var builder strings.Builder
2600 data.Custom(&builder, name, prefix, "", data)
2601 androidMk := builder.String()
2602 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2603}
2604
2605func TestAndroidMk_VendorApexRequired(t *testing.T) {
2606 ctx, config := testApex(t, `
2607 apex {
2608 name: "myapex",
2609 key: "myapex.key",
2610 vendor: true,
2611 native_shared_libs: ["mylib"],
2612 }
2613
2614 apex_key {
2615 name: "myapex.key",
2616 public_key: "testkey.avbpubkey",
2617 private_key: "testkey.pem",
2618 }
2619
2620 cc_library {
2621 name: "mylib",
2622 vendor_available: true,
2623 }
2624 `)
2625
2626 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2627 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2628 name := apexBundle.BaseModuleName()
2629 prefix := "TARGET_"
2630 var builder strings.Builder
2631 data.Custom(&builder, name, prefix, "", data)
2632 androidMk := builder.String()
2633 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2634}
2635
Jooyung Han2ed99d02020-06-24 23:26:26 +09002636func TestAndroidMkWritesCommonProperties(t *testing.T) {
2637 ctx, config := testApex(t, `
2638 apex {
2639 name: "myapex",
2640 key: "myapex.key",
2641 vintf_fragments: ["fragment.xml"],
2642 init_rc: ["init.rc"],
2643 }
2644 apex_key {
2645 name: "myapex.key",
2646 public_key: "testkey.avbpubkey",
2647 private_key: "testkey.pem",
2648 }
2649 cc_binary {
2650 name: "mybin",
2651 }
2652 `)
2653
2654 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2655 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2656 name := apexBundle.BaseModuleName()
2657 prefix := "TARGET_"
2658 var builder strings.Builder
2659 data.Custom(&builder, name, prefix, "", data)
2660 androidMk := builder.String()
2661 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2662 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2663}
2664
Jiyong Park16e91a02018-12-20 18:18:08 +09002665func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002666 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002667 apex {
2668 name: "myapex",
2669 key: "myapex.key",
2670 native_shared_libs: ["mylib"],
2671 }
2672
2673 apex_key {
2674 name: "myapex.key",
2675 public_key: "testkey.avbpubkey",
2676 private_key: "testkey.pem",
2677 }
2678
2679 cc_library {
2680 name: "mylib",
2681 srcs: ["mylib.cpp"],
2682 system_shared_libs: [],
2683 stl: "none",
2684 stubs: {
2685 versions: ["1", "2", "3"],
2686 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002687 apex_available: [
2688 "//apex_available:platform",
2689 "myapex",
2690 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002691 }
2692
2693 cc_binary {
2694 name: "not_in_apex",
2695 srcs: ["mylib.cpp"],
2696 static_libs: ["mylib"],
2697 static_executable: true,
2698 system_shared_libs: [],
2699 stl: "none",
2700 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002701 `)
2702
Colin Cross7113d202019-11-20 16:39:12 -08002703 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002704
2705 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002706 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002707}
Jiyong Park9335a262018-12-24 11:31:58 +09002708
2709func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002710 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002711 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002712 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002713 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002714 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002715 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002716 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002717 }
2718
2719 cc_library {
2720 name: "mylib",
2721 srcs: ["mylib.cpp"],
2722 system_shared_libs: [],
2723 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002724 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002725 }
2726
2727 apex_key {
2728 name: "myapex.key",
2729 public_key: "testkey.avbpubkey",
2730 private_key: "testkey.pem",
2731 }
2732
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002733 android_app_certificate {
2734 name: "myapex.certificate",
2735 certificate: "testkey",
2736 }
2737
2738 android_app_certificate {
2739 name: "myapex.certificate.override",
2740 certificate: "testkey.override",
2741 }
2742
Jiyong Park9335a262018-12-24 11:31:58 +09002743 `)
2744
2745 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002746 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002747
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002748 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2749 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002750 "vendor/foo/devkeys/testkey.avbpubkey")
2751 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002752 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2753 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002754 "vendor/foo/devkeys/testkey.pem")
2755 }
2756
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002757 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002758 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002759 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002760 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002761 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002762 }
2763}
Jiyong Park58e364a2019-01-19 19:24:06 +09002764
Jooyung Hanf121a652019-12-17 14:30:11 +09002765func TestCertificate(t *testing.T) {
2766 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2767 ctx, _ := testApex(t, `
2768 apex {
2769 name: "myapex",
2770 key: "myapex.key",
2771 }
2772 apex_key {
2773 name: "myapex.key",
2774 public_key: "testkey.avbpubkey",
2775 private_key: "testkey.pem",
2776 }`)
2777 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2778 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2779 if actual := rule.Args["certificates"]; actual != expected {
2780 t.Errorf("certificates should be %q, not %q", expected, actual)
2781 }
2782 })
2783 t.Run("override when unspecified", func(t *testing.T) {
2784 ctx, _ := testApex(t, `
2785 apex {
2786 name: "myapex_keytest",
2787 key: "myapex.key",
2788 file_contexts: ":myapex-file_contexts",
2789 }
2790 apex_key {
2791 name: "myapex.key",
2792 public_key: "testkey.avbpubkey",
2793 private_key: "testkey.pem",
2794 }
2795 android_app_certificate {
2796 name: "myapex.certificate.override",
2797 certificate: "testkey.override",
2798 }`)
2799 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2800 expected := "testkey.override.x509.pem testkey.override.pk8"
2801 if actual := rule.Args["certificates"]; actual != expected {
2802 t.Errorf("certificates should be %q, not %q", expected, actual)
2803 }
2804 })
2805 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2806 ctx, _ := testApex(t, `
2807 apex {
2808 name: "myapex",
2809 key: "myapex.key",
2810 certificate: ":myapex.certificate",
2811 }
2812 apex_key {
2813 name: "myapex.key",
2814 public_key: "testkey.avbpubkey",
2815 private_key: "testkey.pem",
2816 }
2817 android_app_certificate {
2818 name: "myapex.certificate",
2819 certificate: "testkey",
2820 }`)
2821 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2822 expected := "testkey.x509.pem testkey.pk8"
2823 if actual := rule.Args["certificates"]; actual != expected {
2824 t.Errorf("certificates should be %q, not %q", expected, actual)
2825 }
2826 })
2827 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2828 ctx, _ := testApex(t, `
2829 apex {
2830 name: "myapex_keytest",
2831 key: "myapex.key",
2832 file_contexts: ":myapex-file_contexts",
2833 certificate: ":myapex.certificate",
2834 }
2835 apex_key {
2836 name: "myapex.key",
2837 public_key: "testkey.avbpubkey",
2838 private_key: "testkey.pem",
2839 }
2840 android_app_certificate {
2841 name: "myapex.certificate.override",
2842 certificate: "testkey.override",
2843 }`)
2844 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2845 expected := "testkey.override.x509.pem testkey.override.pk8"
2846 if actual := rule.Args["certificates"]; actual != expected {
2847 t.Errorf("certificates should be %q, not %q", expected, actual)
2848 }
2849 })
2850 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2851 ctx, _ := testApex(t, `
2852 apex {
2853 name: "myapex",
2854 key: "myapex.key",
2855 certificate: "testkey",
2856 }
2857 apex_key {
2858 name: "myapex.key",
2859 public_key: "testkey.avbpubkey",
2860 private_key: "testkey.pem",
2861 }`)
2862 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2863 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2864 if actual := rule.Args["certificates"]; actual != expected {
2865 t.Errorf("certificates should be %q, not %q", expected, actual)
2866 }
2867 })
2868 t.Run("override when specified as <name>", func(t *testing.T) {
2869 ctx, _ := testApex(t, `
2870 apex {
2871 name: "myapex_keytest",
2872 key: "myapex.key",
2873 file_contexts: ":myapex-file_contexts",
2874 certificate: "testkey",
2875 }
2876 apex_key {
2877 name: "myapex.key",
2878 public_key: "testkey.avbpubkey",
2879 private_key: "testkey.pem",
2880 }
2881 android_app_certificate {
2882 name: "myapex.certificate.override",
2883 certificate: "testkey.override",
2884 }`)
2885 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2886 expected := "testkey.override.x509.pem testkey.override.pk8"
2887 if actual := rule.Args["certificates"]; actual != expected {
2888 t.Errorf("certificates should be %q, not %q", expected, actual)
2889 }
2890 })
2891}
2892
Jiyong Park58e364a2019-01-19 19:24:06 +09002893func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002894 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002895 apex {
2896 name: "myapex",
2897 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002898 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002899 }
2900
2901 apex {
2902 name: "otherapex",
2903 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002904 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002905 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_library {
2915 name: "mylib",
2916 srcs: ["mylib.cpp"],
2917 system_shared_libs: [],
2918 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002919 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002920 "myapex",
2921 "otherapex",
2922 ],
Jooyung Han24282772020-03-21 23:20:55 +09002923 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002924 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002925 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002926 cc_library {
2927 name: "mylib2",
2928 srcs: ["mylib.cpp"],
2929 system_shared_libs: [],
2930 stl: "none",
2931 apex_available: [
2932 "myapex",
2933 "otherapex",
2934 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002935 static_libs: ["mylib3"],
2936 recovery_available: true,
2937 min_sdk_version: "29",
2938 }
2939 cc_library {
2940 name: "mylib3",
2941 srcs: ["mylib.cpp"],
2942 system_shared_libs: [],
2943 stl: "none",
2944 apex_available: [
2945 "myapex",
2946 "otherapex",
2947 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002948 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002949 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002950 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002951 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002952 `)
2953
Jooyung Hanc87a0592020-03-02 17:44:33 +09002954 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002955 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002956 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002957 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002958
Jooyung Hanccce2f22020-03-07 03:45:53 +09002959 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002960 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002961 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002962 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002963 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002964
Jooyung Hanccce2f22020-03-07 03:45:53 +09002965 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002966 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002967 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002968 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002969 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002970
Colin Crossaede88c2020-08-11 12:17:01 -07002971 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2972 // each variant defines additional macros to distinguish which apex variant it is built for
2973
2974 // non-APEX variant does not have __ANDROID_APEX__ defined
2975 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2976 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2977
2978 // APEX variant has __ANDROID_APEX__ defined
2979 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2980 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2981 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2982 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2983
2984 // APEX variant has __ANDROID_APEX__ defined
2985 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2986 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2987 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2988 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2989
Dan Albertb19953d2020-11-17 15:29:36 -08002990 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002991 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2992 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002993 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002994
2995 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2996 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002997
2998 // non-APEX variant does not have __ANDROID_APEX__ defined
2999 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3000 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3001
3002 // APEX variant has __ANDROID_APEX__ defined
3003 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003004 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003005 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003006 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003007
Jooyung Hanc87a0592020-03-02 17:44:33 +09003008 // APEX variant has __ANDROID_APEX__ defined
3009 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003010 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003011 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003012 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003013
Dan Albertb19953d2020-11-17 15:29:36 -08003014 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003015 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003016 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003017 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003018}
Jiyong Park7e636d02019-01-28 16:16:54 +09003019
3020func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003021 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003022 apex {
3023 name: "myapex",
3024 key: "myapex.key",
3025 native_shared_libs: ["mylib"],
3026 }
3027
3028 apex_key {
3029 name: "myapex.key",
3030 public_key: "testkey.avbpubkey",
3031 private_key: "testkey.pem",
3032 }
3033
3034 cc_library_headers {
3035 name: "mylib_headers",
3036 export_include_dirs: ["my_include"],
3037 system_shared_libs: [],
3038 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003039 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003040 }
3041
3042 cc_library {
3043 name: "mylib",
3044 srcs: ["mylib.cpp"],
3045 system_shared_libs: [],
3046 stl: "none",
3047 header_libs: ["mylib_headers"],
3048 export_header_lib_headers: ["mylib_headers"],
3049 stubs: {
3050 versions: ["1", "2", "3"],
3051 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003052 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003053 }
3054
3055 cc_library {
3056 name: "otherlib",
3057 srcs: ["mylib.cpp"],
3058 system_shared_libs: [],
3059 stl: "none",
3060 shared_libs: ["mylib"],
3061 }
3062 `)
3063
Colin Cross7113d202019-11-20 16:39:12 -08003064 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003065
3066 // Ensure that the include path of the header lib is exported to 'otherlib'
3067 ensureContains(t, cFlags, "-Imy_include")
3068}
Alex Light9670d332019-01-29 18:07:33 -08003069
Jiyong Park7cd10e32020-01-14 09:22:18 +09003070type fileInApex struct {
3071 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003072 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003073 isLink bool
3074}
3075
Jooyung Hana57af4a2020-01-23 05:36:59 +00003076func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003077 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003078 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003079 copyCmds := apexRule.Args["copy_commands"]
3080 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003081 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003082 for _, cmd := range strings.Split(copyCmds, "&&") {
3083 cmd = strings.TrimSpace(cmd)
3084 if cmd == "" {
3085 continue
3086 }
3087 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003088 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003089 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003090 switch terms[0] {
3091 case "mkdir":
3092 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003093 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003094 t.Fatal("copyCmds contains invalid cp command", cmd)
3095 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003096 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003097 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003098 isLink = false
3099 case "ln":
3100 if len(terms) != 3 && len(terms) != 4 {
3101 // ln LINK TARGET or ln -s LINK TARGET
3102 t.Fatal("copyCmds contains invalid ln command", cmd)
3103 }
3104 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003105 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003106 isLink = true
3107 default:
3108 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3109 }
3110 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003111 index := strings.Index(dst, imageApexDir)
3112 if index == -1 {
3113 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3114 }
3115 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003116 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003117 }
3118 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003119 return ret
3120}
3121
Jooyung Hana57af4a2020-01-23 05:36:59 +00003122func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3123 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003124 var failed bool
3125 var surplus []string
3126 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003127 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003128 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003129 for _, expected := range files {
3130 if matched, _ := path.Match(expected, file.path); matched {
3131 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003132 mactchFound = true
3133 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003134 }
3135 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003136 if !mactchFound {
3137 surplus = append(surplus, file.path)
3138 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003139 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003140
Jooyung Han31c470b2019-10-18 16:26:59 +09003141 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003142 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003143 t.Log("surplus files", surplus)
3144 failed = true
3145 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003146
3147 if len(files) > len(filesMatched) {
3148 var missing []string
3149 for _, expected := range files {
3150 if !filesMatched[expected] {
3151 missing = append(missing, expected)
3152 }
3153 }
3154 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003155 t.Log("missing files", missing)
3156 failed = true
3157 }
3158 if failed {
3159 t.Fail()
3160 }
3161}
3162
Jooyung Han344d5432019-08-23 11:17:39 +09003163func TestVndkApexCurrent(t *testing.T) {
3164 ctx, _ := testApex(t, `
3165 apex_vndk {
3166 name: "myapex",
3167 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003168 }
3169
3170 apex_key {
3171 name: "myapex.key",
3172 public_key: "testkey.avbpubkey",
3173 private_key: "testkey.pem",
3174 }
3175
3176 cc_library {
3177 name: "libvndk",
3178 srcs: ["mylib.cpp"],
3179 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003180 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003181 vndk: {
3182 enabled: true,
3183 },
3184 system_shared_libs: [],
3185 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003186 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003187 }
3188
3189 cc_library {
3190 name: "libvndksp",
3191 srcs: ["mylib.cpp"],
3192 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003193 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003194 vndk: {
3195 enabled: true,
3196 support_system_process: true,
3197 },
3198 system_shared_libs: [],
3199 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003200 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003201 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003202 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003203
Jooyung Hana57af4a2020-01-23 05:36:59 +00003204 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003205 "lib/libvndk.so",
3206 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003207 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003208 "lib64/libvndk.so",
3209 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003210 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003211 "etc/llndk.libraries.VER.txt",
3212 "etc/vndkcore.libraries.VER.txt",
3213 "etc/vndksp.libraries.VER.txt",
3214 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003215 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003216 })
Jooyung Han344d5432019-08-23 11:17:39 +09003217}
3218
3219func TestVndkApexWithPrebuilt(t *testing.T) {
3220 ctx, _ := testApex(t, `
3221 apex_vndk {
3222 name: "myapex",
3223 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003224 }
3225
3226 apex_key {
3227 name: "myapex.key",
3228 public_key: "testkey.avbpubkey",
3229 private_key: "testkey.pem",
3230 }
3231
3232 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003233 name: "libvndk",
3234 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003235 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003236 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003237 vndk: {
3238 enabled: true,
3239 },
3240 system_shared_libs: [],
3241 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003242 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003243 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003244
3245 cc_prebuilt_library_shared {
3246 name: "libvndk.arm",
3247 srcs: ["libvndk.arm.so"],
3248 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003249 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003250 vndk: {
3251 enabled: true,
3252 },
3253 enabled: false,
3254 arch: {
3255 arm: {
3256 enabled: true,
3257 },
3258 },
3259 system_shared_libs: [],
3260 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003261 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003262 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003263 `+vndkLibrariesTxtFiles("current"),
3264 withFiles(map[string][]byte{
3265 "libvndk.so": nil,
3266 "libvndk.arm.so": nil,
3267 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003268
Jooyung Hana57af4a2020-01-23 05:36:59 +00003269 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003270 "lib/libvndk.so",
3271 "lib/libvndk.arm.so",
3272 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003273 "lib/libc++.so",
3274 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003275 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003276 })
Jooyung Han344d5432019-08-23 11:17:39 +09003277}
3278
Jooyung Han39edb6c2019-11-06 16:53:07 +09003279func vndkLibrariesTxtFiles(vers ...string) (result string) {
3280 for _, v := range vers {
3281 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003282 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003283 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003284 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003285 name: "` + txt + `.libraries.txt",
3286 }
3287 `
3288 }
3289 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003290 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003291 result += `
3292 prebuilt_etc {
3293 name: "` + txt + `.libraries.` + v + `.txt",
3294 src: "dummy.txt",
3295 }
3296 `
3297 }
3298 }
3299 }
3300 return
3301}
3302
Jooyung Han344d5432019-08-23 11:17:39 +09003303func TestVndkApexVersion(t *testing.T) {
3304 ctx, _ := testApex(t, `
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
3312 apex_key {
3313 name: "myapex.key",
3314 public_key: "testkey.avbpubkey",
3315 private_key: "testkey.pem",
3316 }
3317
Jooyung Han31c470b2019-10-18 16:26:59 +09003318 vndk_prebuilt_shared {
3319 name: "libvndk27",
3320 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003321 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003322 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003323 vndk: {
3324 enabled: true,
3325 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003326 target_arch: "arm64",
3327 arch: {
3328 arm: {
3329 srcs: ["libvndk27_arm.so"],
3330 },
3331 arm64: {
3332 srcs: ["libvndk27_arm64.so"],
3333 },
3334 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003335 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003336 }
3337
3338 vndk_prebuilt_shared {
3339 name: "libvndk27",
3340 version: "27",
3341 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003342 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003343 vndk: {
3344 enabled: true,
3345 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003346 target_arch: "x86_64",
3347 arch: {
3348 x86: {
3349 srcs: ["libvndk27_x86.so"],
3350 },
3351 x86_64: {
3352 srcs: ["libvndk27_x86_64.so"],
3353 },
3354 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003355 }
3356 `+vndkLibrariesTxtFiles("27"),
3357 withFiles(map[string][]byte{
3358 "libvndk27_arm.so": nil,
3359 "libvndk27_arm64.so": nil,
3360 "libvndk27_x86.so": nil,
3361 "libvndk27_x86_64.so": nil,
3362 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003363
Jooyung Hana57af4a2020-01-23 05:36:59 +00003364 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003365 "lib/libvndk27_arm.so",
3366 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003367 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003368 })
Jooyung Han344d5432019-08-23 11:17:39 +09003369}
3370
3371func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3372 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3373 apex_vndk {
3374 name: "myapex_v27",
3375 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003376 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003377 vndk_version: "27",
3378 }
3379 apex_vndk {
3380 name: "myapex_v27_other",
3381 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003382 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003383 vndk_version: "27",
3384 }
3385
3386 apex_key {
3387 name: "myapex.key",
3388 public_key: "testkey.avbpubkey",
3389 private_key: "testkey.pem",
3390 }
3391
3392 cc_library {
3393 name: "libvndk",
3394 srcs: ["mylib.cpp"],
3395 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003396 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003397 vndk: {
3398 enabled: true,
3399 },
3400 system_shared_libs: [],
3401 stl: "none",
3402 }
3403
3404 vndk_prebuilt_shared {
3405 name: "libvndk",
3406 version: "27",
3407 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003408 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003409 vndk: {
3410 enabled: true,
3411 },
3412 srcs: ["libvndk.so"],
3413 }
3414 `, withFiles(map[string][]byte{
3415 "libvndk.so": nil,
3416 }))
3417}
3418
Jooyung Han90eee022019-10-01 20:02:42 +09003419func TestVndkApexNameRule(t *testing.T) {
3420 ctx, _ := testApex(t, `
3421 apex_vndk {
3422 name: "myapex",
3423 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003424 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003425 }
3426 apex_vndk {
3427 name: "myapex_v28",
3428 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003429 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003430 vndk_version: "28",
3431 }
3432 apex_key {
3433 name: "myapex.key",
3434 public_key: "testkey.avbpubkey",
3435 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003436 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003437
3438 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003439 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003440 actual := proptools.String(bundle.properties.Apex_name)
3441 if !reflect.DeepEqual(actual, expected) {
3442 t.Errorf("Got '%v', expected '%v'", actual, expected)
3443 }
3444 }
3445
3446 assertApexName("com.android.vndk.vVER", "myapex")
3447 assertApexName("com.android.vndk.v28", "myapex_v28")
3448}
3449
Jooyung Han344d5432019-08-23 11:17:39 +09003450func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3451 ctx, _ := testApex(t, `
3452 apex_vndk {
3453 name: "myapex",
3454 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003455 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003456 }
3457
3458 apex_key {
3459 name: "myapex.key",
3460 public_key: "testkey.avbpubkey",
3461 private_key: "testkey.pem",
3462 }
3463
3464 cc_library {
3465 name: "libvndk",
3466 srcs: ["mylib.cpp"],
3467 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003468 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003469 native_bridge_supported: true,
3470 host_supported: true,
3471 vndk: {
3472 enabled: true,
3473 },
3474 system_shared_libs: [],
3475 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003476 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003477 }
Jooyung Han35155c42020-02-06 17:33:20 +09003478 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003479
Jooyung Hana57af4a2020-01-23 05:36:59 +00003480 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003481 "lib/libvndk.so",
3482 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 "lib/libc++.so",
3484 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003485 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003486 })
Jooyung Han344d5432019-08-23 11:17:39 +09003487}
3488
3489func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3490 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3491 apex_vndk {
3492 name: "myapex",
3493 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003494 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003495 native_bridge_supported: true,
3496 }
3497
3498 apex_key {
3499 name: "myapex.key",
3500 public_key: "testkey.avbpubkey",
3501 private_key: "testkey.pem",
3502 }
3503
3504 cc_library {
3505 name: "libvndk",
3506 srcs: ["mylib.cpp"],
3507 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003508 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003509 native_bridge_supported: true,
3510 host_supported: true,
3511 vndk: {
3512 enabled: true,
3513 },
3514 system_shared_libs: [],
3515 stl: "none",
3516 }
3517 `)
3518}
3519
Jooyung Han31c470b2019-10-18 16:26:59 +09003520func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003521 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003522 apex_vndk {
3523 name: "myapex_v27",
3524 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003525 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003526 vndk_version: "27",
3527 }
3528
3529 apex_key {
3530 name: "myapex.key",
3531 public_key: "testkey.avbpubkey",
3532 private_key: "testkey.pem",
3533 }
3534
3535 vndk_prebuilt_shared {
3536 name: "libvndk27",
3537 version: "27",
3538 target_arch: "arm",
3539 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003540 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003541 vndk: {
3542 enabled: true,
3543 },
3544 arch: {
3545 arm: {
3546 srcs: ["libvndk27.so"],
3547 }
3548 },
3549 }
3550
3551 vndk_prebuilt_shared {
3552 name: "libvndk27",
3553 version: "27",
3554 target_arch: "arm",
3555 binder32bit: true,
3556 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003557 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003558 vndk: {
3559 enabled: true,
3560 },
3561 arch: {
3562 arm: {
3563 srcs: ["libvndk27binder32.so"],
3564 }
3565 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003566 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003567 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003568 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003569 withFiles(map[string][]byte{
3570 "libvndk27.so": nil,
3571 "libvndk27binder32.so": nil,
3572 }),
3573 withBinder32bit,
3574 withTargets(map[android.OsType][]android.Target{
3575 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003576 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3577 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003578 },
3579 }),
3580 )
3581
Jooyung Hana57af4a2020-01-23 05:36:59 +00003582 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003583 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003584 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003585 })
3586}
3587
Jooyung Han45a96772020-06-15 14:59:42 +09003588func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3589 ctx, _ := testApex(t, `
3590 apex_vndk {
3591 name: "myapex",
3592 key: "myapex.key",
3593 file_contexts: ":myapex-file_contexts",
3594 }
3595
3596 apex_key {
3597 name: "myapex.key",
3598 public_key: "testkey.avbpubkey",
3599 private_key: "testkey.pem",
3600 }
3601
3602 cc_library {
3603 name: "libz",
3604 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003605 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003606 vndk: {
3607 enabled: true,
3608 },
3609 stubs: {
3610 symbol_file: "libz.map.txt",
3611 versions: ["30"],
3612 }
3613 }
3614 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3615 "libz.map.txt": nil,
3616 }))
3617
3618 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3619 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3620 ensureListEmpty(t, provideNativeLibs)
3621}
3622
Jooyung Hane1633032019-08-01 17:41:43 +09003623func TestDependenciesInApexManifest(t *testing.T) {
3624 ctx, _ := testApex(t, `
3625 apex {
3626 name: "myapex_nodep",
3627 key: "myapex.key",
3628 native_shared_libs: ["lib_nodep"],
3629 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003630 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003631 }
3632
3633 apex {
3634 name: "myapex_dep",
3635 key: "myapex.key",
3636 native_shared_libs: ["lib_dep"],
3637 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003638 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003639 }
3640
3641 apex {
3642 name: "myapex_provider",
3643 key: "myapex.key",
3644 native_shared_libs: ["libfoo"],
3645 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003646 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003647 }
3648
3649 apex {
3650 name: "myapex_selfcontained",
3651 key: "myapex.key",
3652 native_shared_libs: ["lib_dep", "libfoo"],
3653 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003654 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003655 }
3656
3657 apex_key {
3658 name: "myapex.key",
3659 public_key: "testkey.avbpubkey",
3660 private_key: "testkey.pem",
3661 }
3662
3663 cc_library {
3664 name: "lib_nodep",
3665 srcs: ["mylib.cpp"],
3666 system_shared_libs: [],
3667 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003668 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003669 }
3670
3671 cc_library {
3672 name: "lib_dep",
3673 srcs: ["mylib.cpp"],
3674 shared_libs: ["libfoo"],
3675 system_shared_libs: [],
3676 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003677 apex_available: [
3678 "myapex_dep",
3679 "myapex_provider",
3680 "myapex_selfcontained",
3681 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003682 }
3683
3684 cc_library {
3685 name: "libfoo",
3686 srcs: ["mytest.cpp"],
3687 stubs: {
3688 versions: ["1"],
3689 },
3690 system_shared_libs: [],
3691 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003692 apex_available: [
3693 "myapex_provider",
3694 "myapex_selfcontained",
3695 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003696 }
3697 `)
3698
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003699 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003700 var provideNativeLibs, requireNativeLibs []string
3701
Sundong Ahnabb64432019-10-22 13:58:29 +09003702 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003703 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3704 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003705 ensureListEmpty(t, provideNativeLibs)
3706 ensureListEmpty(t, requireNativeLibs)
3707
Sundong Ahnabb64432019-10-22 13:58:29 +09003708 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003709 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3710 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003711 ensureListEmpty(t, provideNativeLibs)
3712 ensureListContains(t, requireNativeLibs, "libfoo.so")
3713
Sundong Ahnabb64432019-10-22 13:58:29 +09003714 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003715 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3716 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003717 ensureListContains(t, provideNativeLibs, "libfoo.so")
3718 ensureListEmpty(t, requireNativeLibs)
3719
Sundong Ahnabb64432019-10-22 13:58:29 +09003720 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003721 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3722 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003723 ensureListContains(t, provideNativeLibs, "libfoo.so")
3724 ensureListEmpty(t, requireNativeLibs)
3725}
3726
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003727func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003728 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003729 apex {
3730 name: "myapex",
3731 key: "myapex.key",
3732 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003733 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003734 }
3735
3736 apex_key {
3737 name: "myapex.key",
3738 public_key: "testkey.avbpubkey",
3739 private_key: "testkey.pem",
3740 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003741
3742 cc_library {
3743 name: "mylib",
3744 srcs: ["mylib.cpp"],
3745 system_shared_libs: [],
3746 stl: "none",
3747 apex_available: [
3748 "//apex_available:platform",
3749 "myapex",
3750 ],
3751 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003752 `)
3753
Sundong Ahnabb64432019-10-22 13:58:29 +09003754 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003755 apexManifestRule := module.Rule("apexManifestRule")
3756 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3757 apexRule := module.Rule("apexRule")
3758 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003759
3760 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3761 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3762 name := apexBundle.BaseModuleName()
3763 prefix := "TARGET_"
3764 var builder strings.Builder
3765 data.Custom(&builder, name, prefix, "", data)
3766 androidMk := builder.String()
3767 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3768 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003769}
3770
Alex Light0851b882019-02-07 13:20:53 -08003771func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003772 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003773 apex {
3774 name: "myapex",
3775 key: "myapex.key",
3776 native_shared_libs: ["mylib_common"],
3777 }
3778
3779 apex_key {
3780 name: "myapex.key",
3781 public_key: "testkey.avbpubkey",
3782 private_key: "testkey.pem",
3783 }
3784
3785 cc_library {
3786 name: "mylib_common",
3787 srcs: ["mylib.cpp"],
3788 system_shared_libs: [],
3789 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003790 apex_available: [
3791 "//apex_available:platform",
3792 "myapex",
3793 ],
Alex Light0851b882019-02-07 13:20:53 -08003794 }
3795 `)
3796
Sundong Ahnabb64432019-10-22 13:58:29 +09003797 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003798 apexRule := module.Rule("apexRule")
3799 copyCmds := apexRule.Args["copy_commands"]
3800
3801 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3802 t.Log("Apex was a test apex!")
3803 t.Fail()
3804 }
3805 // Ensure that main rule creates an output
3806 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3807
3808 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003809 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003810
3811 // Ensure that both direct and indirect deps are copied into apex
3812 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3813
Colin Cross7113d202019-11-20 16:39:12 -08003814 // Ensure that the platform variant ends with _shared
3815 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003816
Colin Cross56a83212020-09-15 18:30:11 -07003817 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003818 t.Log("Found mylib_common not in any apex!")
3819 t.Fail()
3820 }
3821}
3822
3823func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003824 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003825 apex_test {
3826 name: "myapex",
3827 key: "myapex.key",
3828 native_shared_libs: ["mylib_common_test"],
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_common_test",
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 Light0851b882019-02-07 13:20:53 -08003847 }
3848 `)
3849
Sundong Ahnabb64432019-10-22 13:58:29 +09003850 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003851 apexRule := module.Rule("apexRule")
3852 copyCmds := apexRule.Args["copy_commands"]
3853
3854 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3855 t.Log("Apex was not a test apex!")
3856 t.Fail()
3857 }
3858 // Ensure that main rule creates an output
3859 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3860
3861 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003862 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003863
3864 // Ensure that both direct and indirect deps are copied into apex
3865 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3866
Colin Cross7113d202019-11-20 16:39:12 -08003867 // Ensure that the platform variant ends with _shared
3868 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003869}
3870
Alex Light9670d332019-01-29 18:07:33 -08003871func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003872 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003873 apex {
3874 name: "myapex",
3875 key: "myapex.key",
3876 multilib: {
3877 first: {
3878 native_shared_libs: ["mylib_common"],
3879 }
3880 },
3881 target: {
3882 android: {
3883 multilib: {
3884 first: {
3885 native_shared_libs: ["mylib"],
3886 }
3887 }
3888 },
3889 host: {
3890 multilib: {
3891 first: {
3892 native_shared_libs: ["mylib2"],
3893 }
3894 }
3895 }
3896 }
3897 }
3898
3899 apex_key {
3900 name: "myapex.key",
3901 public_key: "testkey.avbpubkey",
3902 private_key: "testkey.pem",
3903 }
3904
3905 cc_library {
3906 name: "mylib",
3907 srcs: ["mylib.cpp"],
3908 system_shared_libs: [],
3909 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003910 // TODO: remove //apex_available:platform
3911 apex_available: [
3912 "//apex_available:platform",
3913 "myapex",
3914 ],
Alex Light9670d332019-01-29 18:07:33 -08003915 }
3916
3917 cc_library {
3918 name: "mylib_common",
3919 srcs: ["mylib.cpp"],
3920 system_shared_libs: [],
3921 stl: "none",
3922 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003923 // TODO: remove //apex_available:platform
3924 apex_available: [
3925 "//apex_available:platform",
3926 "myapex",
3927 ],
Alex Light9670d332019-01-29 18:07:33 -08003928 }
3929
3930 cc_library {
3931 name: "mylib2",
3932 srcs: ["mylib.cpp"],
3933 system_shared_libs: [],
3934 stl: "none",
3935 compile_multilib: "first",
3936 }
3937 `)
3938
Sundong Ahnabb64432019-10-22 13:58:29 +09003939 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003940 copyCmds := apexRule.Args["copy_commands"]
3941
3942 // Ensure that main rule creates an output
3943 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3944
3945 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003946 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3947 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3948 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003949
3950 // Ensure that both direct and indirect deps are copied into apex
3951 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3952 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3953 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3954
Colin Cross7113d202019-11-20 16:39:12 -08003955 // Ensure that the platform variant ends with _shared
3956 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3957 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3958 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003959}
Jiyong Park04480cf2019-02-06 00:16:29 +09003960
Jiyong Park59140302020-12-14 18:44:04 +09003961func TestApexWithArch(t *testing.T) {
3962 ctx, _ := testApex(t, `
3963 apex {
3964 name: "myapex",
3965 key: "myapex.key",
3966 arch: {
3967 arm64: {
3968 native_shared_libs: ["mylib.arm64"],
3969 },
3970 x86_64: {
3971 native_shared_libs: ["mylib.x64"],
3972 },
3973 }
3974 }
3975
3976 apex_key {
3977 name: "myapex.key",
3978 public_key: "testkey.avbpubkey",
3979 private_key: "testkey.pem",
3980 }
3981
3982 cc_library {
3983 name: "mylib.arm64",
3984 srcs: ["mylib.cpp"],
3985 system_shared_libs: [],
3986 stl: "none",
3987 // TODO: remove //apex_available:platform
3988 apex_available: [
3989 "//apex_available:platform",
3990 "myapex",
3991 ],
3992 }
3993
3994 cc_library {
3995 name: "mylib.x64",
3996 srcs: ["mylib.cpp"],
3997 system_shared_libs: [],
3998 stl: "none",
3999 // TODO: remove //apex_available:platform
4000 apex_available: [
4001 "//apex_available:platform",
4002 "myapex",
4003 ],
4004 }
4005 `)
4006
4007 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4008 copyCmds := apexRule.Args["copy_commands"]
4009
4010 // Ensure that apex variant is created for the direct dep
4011 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4012 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4013
4014 // Ensure that both direct and indirect deps are copied into apex
4015 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4016 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4017}
4018
Jiyong Park04480cf2019-02-06 00:16:29 +09004019func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004020 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004021 apex {
4022 name: "myapex",
4023 key: "myapex.key",
4024 binaries: ["myscript"],
4025 }
4026
4027 apex_key {
4028 name: "myapex.key",
4029 public_key: "testkey.avbpubkey",
4030 private_key: "testkey.pem",
4031 }
4032
4033 sh_binary {
4034 name: "myscript",
4035 src: "mylib.cpp",
4036 filename: "myscript.sh",
4037 sub_dir: "script",
4038 }
4039 `)
4040
Sundong Ahnabb64432019-10-22 13:58:29 +09004041 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004042 copyCmds := apexRule.Args["copy_commands"]
4043
4044 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4045}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004046
Jooyung Han91df2082019-11-20 01:49:42 +09004047func TestApexInVariousPartition(t *testing.T) {
4048 testcases := []struct {
4049 propName, parition, flattenedPartition string
4050 }{
4051 {"", "system", "system_ext"},
4052 {"product_specific: true", "product", "product"},
4053 {"soc_specific: true", "vendor", "vendor"},
4054 {"proprietary: true", "vendor", "vendor"},
4055 {"vendor: true", "vendor", "vendor"},
4056 {"system_ext_specific: true", "system_ext", "system_ext"},
4057 }
4058 for _, tc := range testcases {
4059 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
4060 ctx, _ := testApex(t, `
4061 apex {
4062 name: "myapex",
4063 key: "myapex.key",
4064 `+tc.propName+`
4065 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004066
Jooyung Han91df2082019-11-20 01:49:42 +09004067 apex_key {
4068 name: "myapex.key",
4069 public_key: "testkey.avbpubkey",
4070 private_key: "testkey.pem",
4071 }
4072 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004073
Jooyung Han91df2082019-11-20 01:49:42 +09004074 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4075 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4076 actual := apex.installDir.String()
4077 if actual != expected {
4078 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4079 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004080
Jooyung Han91df2082019-11-20 01:49:42 +09004081 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4082 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4083 actual = flattened.installDir.String()
4084 if actual != expected {
4085 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4086 }
4087 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004088 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004089}
Jiyong Park67882562019-03-21 01:11:21 +09004090
Jooyung Han580eb4f2020-06-24 19:33:06 +09004091func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004092 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004093 apex {
4094 name: "myapex",
4095 key: "myapex.key",
4096 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004097
Jooyung Han580eb4f2020-06-24 19:33:06 +09004098 apex_key {
4099 name: "myapex.key",
4100 public_key: "testkey.avbpubkey",
4101 private_key: "testkey.pem",
4102 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004103 `)
4104 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004105 rule := module.Output("file_contexts")
4106 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4107}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004108
Jooyung Han580eb4f2020-06-24 19:33:06 +09004109func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004111 apex {
4112 name: "myapex",
4113 key: "myapex.key",
4114 file_contexts: "my_own_file_contexts",
4115 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004116
Jooyung Han580eb4f2020-06-24 19:33:06 +09004117 apex_key {
4118 name: "myapex.key",
4119 public_key: "testkey.avbpubkey",
4120 private_key: "testkey.pem",
4121 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004122 `, withFiles(map[string][]byte{
4123 "my_own_file_contexts": nil,
4124 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004125}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004126
Jooyung Han580eb4f2020-06-24 19:33:06 +09004127func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004128 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004129 apex {
4130 name: "myapex",
4131 key: "myapex.key",
4132 product_specific: true,
4133 file_contexts: "product_specific_file_contexts",
4134 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004135
Jooyung Han580eb4f2020-06-24 19:33:06 +09004136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004141 `)
4142
Jooyung Han580eb4f2020-06-24 19:33:06 +09004143 ctx, _ := testApex(t, `
4144 apex {
4145 name: "myapex",
4146 key: "myapex.key",
4147 product_specific: true,
4148 file_contexts: "product_specific_file_contexts",
4149 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004150
Jooyung Han580eb4f2020-06-24 19:33:06 +09004151 apex_key {
4152 name: "myapex.key",
4153 public_key: "testkey.avbpubkey",
4154 private_key: "testkey.pem",
4155 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004156 `, withFiles(map[string][]byte{
4157 "product_specific_file_contexts": nil,
4158 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004159 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4160 rule := module.Output("file_contexts")
4161 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4162}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004163
Jooyung Han580eb4f2020-06-24 19:33:06 +09004164func TestFileContexts_SetViaFileGroup(t *testing.T) {
4165 ctx, _ := testApex(t, `
4166 apex {
4167 name: "myapex",
4168 key: "myapex.key",
4169 product_specific: true,
4170 file_contexts: ":my-file-contexts",
4171 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004172
Jooyung Han580eb4f2020-06-24 19:33:06 +09004173 apex_key {
4174 name: "myapex.key",
4175 public_key: "testkey.avbpubkey",
4176 private_key: "testkey.pem",
4177 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004178
Jooyung Han580eb4f2020-06-24 19:33:06 +09004179 filegroup {
4180 name: "my-file-contexts",
4181 srcs: ["product_specific_file_contexts"],
4182 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004183 `, withFiles(map[string][]byte{
4184 "product_specific_file_contexts": nil,
4185 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004186 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4187 rule := module.Output("file_contexts")
4188 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004189}
4190
Jiyong Park67882562019-03-21 01:11:21 +09004191func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004192 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004193 apex_key {
4194 name: "myapex.key",
4195 public_key: ":my.avbpubkey",
4196 private_key: ":my.pem",
4197 product_specific: true,
4198 }
4199
4200 filegroup {
4201 name: "my.avbpubkey",
4202 srcs: ["testkey2.avbpubkey"],
4203 }
4204
4205 filegroup {
4206 name: "my.pem",
4207 srcs: ["testkey2.pem"],
4208 }
4209 `)
4210
4211 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4212 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004213 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004214 if actual_pubkey != expected_pubkey {
4215 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4216 }
4217 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004218 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004219 if actual_privkey != expected_privkey {
4220 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4221 }
4222}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004223
4224func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004225 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004226 prebuilt_apex {
4227 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004228 arch: {
4229 arm64: {
4230 src: "myapex-arm64.apex",
4231 },
4232 arm: {
4233 src: "myapex-arm.apex",
4234 },
4235 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004236 }
4237 `)
4238
4239 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4240
Jiyong Parkc95714e2019-03-29 14:23:10 +09004241 expectedInput := "myapex-arm64.apex"
4242 if prebuilt.inputApex.String() != expectedInput {
4243 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4244 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004245}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004246
4247func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004248 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004249 prebuilt_apex {
4250 name: "myapex",
4251 src: "myapex-arm.apex",
4252 filename: "notmyapex.apex",
4253 }
4254 `)
4255
4256 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4257
4258 expected := "notmyapex.apex"
4259 if p.installFilename != expected {
4260 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4261 }
4262}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004263
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004264func TestPrebuiltOverrides(t *testing.T) {
4265 ctx, config := testApex(t, `
4266 prebuilt_apex {
4267 name: "myapex.prebuilt",
4268 src: "myapex-arm.apex",
4269 overrides: [
4270 "myapex",
4271 ],
4272 }
4273 `)
4274
4275 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4276
4277 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004278 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004279 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004280 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004281 }
4282}
4283
Paul Duffin092153d2021-01-26 11:42:39 +00004284// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4285// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004286func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4287 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004288 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004289 }
4290
4291 checkDexJarBuildPath := func(ctx *android.TestContext, name string) {
4292 // Make sure the import has been given the correct path to the dex jar.
4293 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.Dependency)
4294 dexJarBuildPath := p.DexJarBuildPath()
4295 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
4296 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4297 }
4298 }
4299
4300 ensureNoSourceVariant := func(ctx *android.TestContext) {
4301 // Make sure that an apex variant is not created for the source module.
4302 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests("libfoo"); !reflect.DeepEqual(expected, actual) {
4303 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4304 }
4305 }
4306
4307 t.Run("prebuilt only", func(t *testing.T) {
4308 bp := `
4309 prebuilt_apex {
4310 name: "myapex",
4311 arch: {
4312 arm64: {
4313 src: "myapex-arm64.apex",
4314 },
4315 arm: {
4316 src: "myapex-arm.apex",
4317 },
4318 },
4319 exported_java_libs: ["libfoo"],
4320 }
4321
4322 java_import {
4323 name: "libfoo",
4324 jars: ["libfoo.jar"],
4325 }
4326 `
4327
4328 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4329 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4330
4331 checkDexJarBuildPath(ctx, "libfoo")
4332 })
4333
4334 t.Run("prebuilt with source preferred", func(t *testing.T) {
4335
4336 bp := `
4337 prebuilt_apex {
4338 name: "myapex",
4339 arch: {
4340 arm64: {
4341 src: "myapex-arm64.apex",
4342 },
4343 arm: {
4344 src: "myapex-arm.apex",
4345 },
4346 },
4347 exported_java_libs: ["libfoo"],
4348 }
4349
4350 java_import {
4351 name: "libfoo",
4352 jars: ["libfoo.jar"],
4353 }
4354
4355 java_library {
4356 name: "libfoo",
4357 }
4358 `
4359
4360 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4361 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4362
4363 checkDexJarBuildPath(ctx, "prebuilt_libfoo")
4364 ensureNoSourceVariant(ctx)
4365 })
4366
4367 t.Run("prebuilt preferred with source", func(t *testing.T) {
4368 bp := `
4369 prebuilt_apex {
4370 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004371 arch: {
4372 arm64: {
4373 src: "myapex-arm64.apex",
4374 },
4375 arm: {
4376 src: "myapex-arm.apex",
4377 },
4378 },
4379 exported_java_libs: ["libfoo"],
4380 }
4381
4382 java_import {
4383 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004384 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004385 jars: ["libfoo.jar"],
4386 }
4387
4388 java_library {
4389 name: "libfoo",
4390 }
4391 `
4392
4393 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4394 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4395
4396 checkDexJarBuildPath(ctx, "prebuilt_libfoo")
4397 ensureNoSourceVariant(ctx)
4398 })
4399}
4400
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004401func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4402 transform := func(config *dexpreopt.GlobalConfig) {
4403 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
4404 }
4405
4406 checkBootDexJarPath := func(ctx *android.TestContext, bootDexJarPath string) {
4407 s := ctx.SingletonForTests("dex_bootjars")
4408 foundLibfooJar := false
4409 for _, output := range s.AllOutputs() {
4410 if strings.HasSuffix(output, "/libfoo.jar") {
4411 foundLibfooJar = true
4412 buildRule := s.Output(output)
4413 actual := android.NormalizePathForTesting(buildRule.Input)
4414 if actual != bootDexJarPath {
4415 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4416 }
4417 }
4418 }
4419 if !foundLibfooJar {
4420 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4421 }
4422 }
4423
4424 t.Run("prebuilt only", func(t *testing.T) {
4425 bp := `
4426 prebuilt_apex {
4427 name: "myapex",
4428 arch: {
4429 arm64: {
4430 src: "myapex-arm64.apex",
4431 },
4432 arm: {
4433 src: "myapex-arm.apex",
4434 },
4435 },
4436 exported_java_libs: ["libfoo"],
4437 }
4438
4439 java_import {
4440 name: "libfoo",
4441 jars: ["libfoo.jar"],
4442 apex_available: ["myapex"],
4443 }
4444 `
4445
4446 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4447 checkBootDexJarPath(ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4448 })
4449
4450 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4451 bp := `
4452 prebuilt_apex {
4453 name: "myapex",
4454 arch: {
4455 arm64: {
4456 src: "myapex-arm64.apex",
4457 },
4458 arm: {
4459 src: "myapex-arm.apex",
4460 },
4461 },
4462 exported_java_libs: ["libfoo"],
4463 }
4464
4465 java_import {
4466 name: "libfoo",
4467 jars: ["libfoo.jar"],
4468 apex_available: ["myapex"],
4469 }
4470
4471 java_library {
4472 name: "libfoo",
4473 srcs: ["foo/bar/MyClass.java"],
4474 apex_available: ["myapex"],
4475 }
4476 `
4477
4478 // In this test the source (java_library) libfoo is active since the
4479 // prebuilt (java_import) defaults to prefer:false. However the
4480 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4481 // find the dex boot jar in it. We either need to disable the source libfoo
4482 // or make the prebuilt libfoo preferred.
4483 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4484 })
4485
4486 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4487 bp := `
4488 prebuilt_apex {
4489 name: "myapex",
4490 arch: {
4491 arm64: {
4492 src: "myapex-arm64.apex",
4493 },
4494 arm: {
4495 src: "myapex-arm.apex",
4496 },
4497 },
4498 exported_java_libs: ["libfoo"],
4499 }
4500
4501 java_import {
4502 name: "libfoo",
4503 prefer: true,
4504 jars: ["libfoo.jar"],
4505 apex_available: ["myapex"],
4506 }
4507
4508 java_library {
4509 name: "libfoo",
4510 srcs: ["foo/bar/MyClass.java"],
4511 apex_available: ["myapex"],
4512 }
4513 `
4514
4515 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4516 checkBootDexJarPath(ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4517 })
4518
4519 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4520 bp := `
4521 apex {
4522 name: "myapex",
4523 key: "myapex.key",
4524 java_libs: ["libfoo"],
4525 }
4526
4527 apex_key {
4528 name: "myapex.key",
4529 public_key: "testkey.avbpubkey",
4530 private_key: "testkey.pem",
4531 }
4532
4533 prebuilt_apex {
4534 name: "myapex",
4535 arch: {
4536 arm64: {
4537 src: "myapex-arm64.apex",
4538 },
4539 arm: {
4540 src: "myapex-arm.apex",
4541 },
4542 },
4543 exported_java_libs: ["libfoo"],
4544 }
4545
4546 java_import {
4547 name: "libfoo",
4548 jars: ["libfoo.jar"],
4549 apex_available: ["myapex"],
4550 }
4551
4552 java_library {
4553 name: "libfoo",
4554 srcs: ["foo/bar/MyClass.java"],
4555 apex_available: ["myapex"],
4556 }
4557 `
4558
4559 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4560 checkBootDexJarPath(ctx, ".intermediates/libfoo/android_common_apex10000/aligned/libfoo.jar")
4561 })
4562
4563 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4564 bp := `
4565 apex {
4566 name: "myapex",
4567 enabled: false,
4568 key: "myapex.key",
4569 java_libs: ["libfoo"],
4570 }
4571
4572 apex_key {
4573 name: "myapex.key",
4574 public_key: "testkey.avbpubkey",
4575 private_key: "testkey.pem",
4576 }
4577
4578 prebuilt_apex {
4579 name: "myapex",
4580 arch: {
4581 arm64: {
4582 src: "myapex-arm64.apex",
4583 },
4584 arm: {
4585 src: "myapex-arm.apex",
4586 },
4587 },
4588 exported_java_libs: ["libfoo"],
4589 }
4590
4591 java_import {
4592 name: "libfoo",
4593 prefer: true,
4594 jars: ["libfoo.jar"],
4595 apex_available: ["myapex"],
4596 }
4597
4598 java_library {
4599 name: "libfoo",
4600 srcs: ["foo/bar/MyClass.java"],
4601 apex_available: ["myapex"],
4602 }
4603 `
4604
4605 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4606 checkBootDexJarPath(ctx, ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4607 })
4608}
4609
Roland Levillain630846d2019-06-26 12:48:34 +01004610func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004611 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004612 apex_test {
4613 name: "myapex",
4614 key: "myapex.key",
4615 tests: [
4616 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004617 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004618 ],
4619 }
4620
4621 apex_key {
4622 name: "myapex.key",
4623 public_key: "testkey.avbpubkey",
4624 private_key: "testkey.pem",
4625 }
4626
Liz Kammer1c14a212020-05-12 15:26:55 -07004627 filegroup {
4628 name: "fg",
4629 srcs: [
4630 "baz",
4631 "bar/baz"
4632 ],
4633 }
4634
Roland Levillain630846d2019-06-26 12:48:34 +01004635 cc_test {
4636 name: "mytest",
4637 gtest: false,
4638 srcs: ["mytest.cpp"],
4639 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004640 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004641 system_shared_libs: [],
4642 static_executable: true,
4643 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004644 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004645 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004646
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004647 cc_library {
4648 name: "mylib",
4649 srcs: ["mylib.cpp"],
4650 system_shared_libs: [],
4651 stl: "none",
4652 }
4653
Liz Kammer5bd365f2020-05-27 15:15:11 -07004654 filegroup {
4655 name: "fg2",
4656 srcs: [
4657 "testdata/baz"
4658 ],
4659 }
4660
Roland Levillain9b5fde92019-06-28 15:41:19 +01004661 cc_test {
4662 name: "mytests",
4663 gtest: false,
4664 srcs: [
4665 "mytest1.cpp",
4666 "mytest2.cpp",
4667 "mytest3.cpp",
4668 ],
4669 test_per_src: true,
4670 relative_install_path: "test",
4671 system_shared_libs: [],
4672 static_executable: true,
4673 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004674 data: [
4675 ":fg",
4676 ":fg2",
4677 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004678 }
Roland Levillain630846d2019-06-26 12:48:34 +01004679 `)
4680
Sundong Ahnabb64432019-10-22 13:58:29 +09004681 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004682 copyCmds := apexRule.Args["copy_commands"]
4683
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004684 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004685 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004686 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004687
Liz Kammer1c14a212020-05-12 15:26:55 -07004688 //Ensure that test data are copied into apex.
4689 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4690 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4691
Roland Levillain9b5fde92019-06-28 15:41:19 +01004692 // Ensure that test deps built with `test_per_src` are copied into apex.
4693 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4694 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4695 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004696
4697 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004698 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4699 data := android.AndroidMkDataForTest(t, config, "", bundle)
4700 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004701 prefix := "TARGET_"
4702 var builder strings.Builder
4703 data.Custom(&builder, name, prefix, "", data)
4704 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004705 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4706 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4707 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4708 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004709 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004710 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004711 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004712
4713 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4714 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4715 data.Custom(&builder, name, prefix, "", data)
4716 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004717 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4718 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004719}
4720
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004721func TestInstallExtraFlattenedApexes(t *testing.T) {
4722 ctx, config := testApex(t, `
4723 apex {
4724 name: "myapex",
4725 key: "myapex.key",
4726 }
4727 apex_key {
4728 name: "myapex.key",
4729 public_key: "testkey.avbpubkey",
4730 private_key: "testkey.pem",
4731 }
4732 `, func(fs map[string][]byte, config android.Config) {
4733 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4734 })
4735 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004736 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004737 mk := android.AndroidMkDataForTest(t, config, "", ab)
4738 var builder strings.Builder
4739 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4740 androidMk := builder.String()
4741 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4742}
4743
Jooyung Hand48f3c32019-08-23 11:18:57 +09004744func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4745 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4746 apex {
4747 name: "myapex",
4748 key: "myapex.key",
4749 native_shared_libs: ["libfoo"],
4750 }
4751
4752 apex_key {
4753 name: "myapex.key",
4754 public_key: "testkey.avbpubkey",
4755 private_key: "testkey.pem",
4756 }
4757
4758 cc_library {
4759 name: "libfoo",
4760 stl: "none",
4761 system_shared_libs: [],
4762 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004763 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004764 }
4765 `)
4766 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4767 apex {
4768 name: "myapex",
4769 key: "myapex.key",
4770 java_libs: ["myjar"],
4771 }
4772
4773 apex_key {
4774 name: "myapex.key",
4775 public_key: "testkey.avbpubkey",
4776 private_key: "testkey.pem",
4777 }
4778
4779 java_library {
4780 name: "myjar",
4781 srcs: ["foo/bar/MyClass.java"],
4782 sdk_version: "none",
4783 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004784 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004785 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004786 }
4787 `)
4788}
4789
Bill Peckhama41a6962021-01-11 10:58:54 -08004790func TestApexWithJavaImport(t *testing.T) {
4791 ctx, _ := testApex(t, `
4792 apex {
4793 name: "myapex",
4794 key: "myapex.key",
4795 java_libs: ["myjavaimport"],
4796 }
4797
4798 apex_key {
4799 name: "myapex.key",
4800 public_key: "testkey.avbpubkey",
4801 private_key: "testkey.pem",
4802 }
4803
4804 java_import {
4805 name: "myjavaimport",
4806 apex_available: ["myapex"],
4807 jars: ["my.jar"],
4808 compile_dex: true,
4809 }
4810 `)
4811
4812 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4813 apexRule := module.Rule("apexRule")
4814 copyCmds := apexRule.Args["copy_commands"]
4815 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
4816}
4817
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004818func TestApexWithApps(t *testing.T) {
4819 ctx, _ := testApex(t, `
4820 apex {
4821 name: "myapex",
4822 key: "myapex.key",
4823 apps: [
4824 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004825 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004826 ],
4827 }
4828
4829 apex_key {
4830 name: "myapex.key",
4831 public_key: "testkey.avbpubkey",
4832 private_key: "testkey.pem",
4833 }
4834
4835 android_app {
4836 name: "AppFoo",
4837 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004838 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004839 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004840 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004841 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004842 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004843 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004844
4845 android_app {
4846 name: "AppFooPriv",
4847 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004848 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004849 system_modules: "none",
4850 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004852 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004853 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004854
4855 cc_library_shared {
4856 name: "libjni",
4857 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004858 shared_libs: ["libfoo"],
4859 stl: "none",
4860 system_shared_libs: [],
4861 apex_available: [ "myapex" ],
4862 sdk_version: "current",
4863 }
4864
4865 cc_library_shared {
4866 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004867 stl: "none",
4868 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004869 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004870 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004871 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004872 `)
4873
Sundong Ahnabb64432019-10-22 13:58:29 +09004874 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004875 apexRule := module.Rule("apexRule")
4876 copyCmds := apexRule.Args["copy_commands"]
4877
4878 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004879 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004880
Colin Crossaede88c2020-08-11 12:17:01 -07004881 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004882 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004883 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004884 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004885 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004886 // JNI libraries including transitive deps are
4887 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004888 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004889 // ... embedded inside APK (jnilibs.zip)
4890 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4891 // ... and not directly inside the APEX
4892 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4893 }
Dario Frenicde2a032019-10-27 00:29:22 +01004894}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004895
Dario Frenicde2a032019-10-27 00:29:22 +01004896func TestApexWithAppImports(t *testing.T) {
4897 ctx, _ := testApex(t, `
4898 apex {
4899 name: "myapex",
4900 key: "myapex.key",
4901 apps: [
4902 "AppFooPrebuilt",
4903 "AppFooPrivPrebuilt",
4904 ],
4905 }
4906
4907 apex_key {
4908 name: "myapex.key",
4909 public_key: "testkey.avbpubkey",
4910 private_key: "testkey.pem",
4911 }
4912
4913 android_app_import {
4914 name: "AppFooPrebuilt",
4915 apk: "PrebuiltAppFoo.apk",
4916 presigned: true,
4917 dex_preopt: {
4918 enabled: false,
4919 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004920 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004921 }
4922
4923 android_app_import {
4924 name: "AppFooPrivPrebuilt",
4925 apk: "PrebuiltAppFooPriv.apk",
4926 privileged: true,
4927 presigned: true,
4928 dex_preopt: {
4929 enabled: false,
4930 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004931 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004932 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004933 }
4934 `)
4935
Sundong Ahnabb64432019-10-22 13:58:29 +09004936 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004937 apexRule := module.Rule("apexRule")
4938 copyCmds := apexRule.Args["copy_commands"]
4939
4940 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004941 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4942}
4943
4944func TestApexWithAppImportsPrefer(t *testing.T) {
4945 ctx, _ := testApex(t, `
4946 apex {
4947 name: "myapex",
4948 key: "myapex.key",
4949 apps: [
4950 "AppFoo",
4951 ],
4952 }
4953
4954 apex_key {
4955 name: "myapex.key",
4956 public_key: "testkey.avbpubkey",
4957 private_key: "testkey.pem",
4958 }
4959
4960 android_app {
4961 name: "AppFoo",
4962 srcs: ["foo/bar/MyClass.java"],
4963 sdk_version: "none",
4964 system_modules: "none",
4965 apex_available: [ "myapex" ],
4966 }
4967
4968 android_app_import {
4969 name: "AppFoo",
4970 apk: "AppFooPrebuilt.apk",
4971 filename: "AppFooPrebuilt.apk",
4972 presigned: true,
4973 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004974 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004975 }
4976 `, withFiles(map[string][]byte{
4977 "AppFooPrebuilt.apk": nil,
4978 }))
4979
4980 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4981 "app/AppFoo/AppFooPrebuilt.apk",
4982 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004983}
4984
Dario Freni6f3937c2019-12-20 22:58:03 +00004985func TestApexWithTestHelperApp(t *testing.T) {
4986 ctx, _ := testApex(t, `
4987 apex {
4988 name: "myapex",
4989 key: "myapex.key",
4990 apps: [
4991 "TesterHelpAppFoo",
4992 ],
4993 }
4994
4995 apex_key {
4996 name: "myapex.key",
4997 public_key: "testkey.avbpubkey",
4998 private_key: "testkey.pem",
4999 }
5000
5001 android_test_helper_app {
5002 name: "TesterHelpAppFoo",
5003 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005004 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005005 }
5006
5007 `)
5008
5009 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5010 apexRule := module.Rule("apexRule")
5011 copyCmds := apexRule.Args["copy_commands"]
5012
5013 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5014}
5015
Jooyung Han18020ea2019-11-13 10:50:48 +09005016func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5017 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005018 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005019 apex {
5020 name: "myapex",
5021 key: "myapex.key",
5022 native_shared_libs: ["libfoo"],
5023 }
5024
5025 apex_key {
5026 name: "myapex.key",
5027 public_key: "testkey.avbpubkey",
5028 private_key: "testkey.pem",
5029 }
5030
5031 apex {
5032 name: "otherapex",
5033 key: "myapex.key",
5034 native_shared_libs: ["libfoo"],
5035 }
5036
5037 cc_defaults {
5038 name: "libfoo-defaults",
5039 apex_available: ["otherapex"],
5040 }
5041
5042 cc_library {
5043 name: "libfoo",
5044 defaults: ["libfoo-defaults"],
5045 stl: "none",
5046 system_shared_libs: [],
5047 }`)
5048}
5049
Paul Duffine52e66f2020-03-30 17:54:29 +01005050func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005051 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005052 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005053 apex {
5054 name: "myapex",
5055 key: "myapex.key",
5056 native_shared_libs: ["libfoo"],
5057 }
5058
5059 apex_key {
5060 name: "myapex.key",
5061 public_key: "testkey.avbpubkey",
5062 private_key: "testkey.pem",
5063 }
5064
5065 apex {
5066 name: "otherapex",
5067 key: "otherapex.key",
5068 native_shared_libs: ["libfoo"],
5069 }
5070
5071 apex_key {
5072 name: "otherapex.key",
5073 public_key: "testkey.avbpubkey",
5074 private_key: "testkey.pem",
5075 }
5076
5077 cc_library {
5078 name: "libfoo",
5079 stl: "none",
5080 system_shared_libs: [],
5081 apex_available: ["otherapex"],
5082 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005083}
Jiyong Park127b40b2019-09-30 16:04:35 +09005084
Paul Duffine52e66f2020-03-30 17:54:29 +01005085func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005086 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00005087 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005088.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005089.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005090.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005091.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005092.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005093.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005094 apex {
5095 name: "myapex",
5096 key: "myapex.key",
5097 native_shared_libs: ["libfoo"],
5098 }
5099
5100 apex_key {
5101 name: "myapex.key",
5102 public_key: "testkey.avbpubkey",
5103 private_key: "testkey.pem",
5104 }
5105
Jiyong Park127b40b2019-09-30 16:04:35 +09005106 cc_library {
5107 name: "libfoo",
5108 stl: "none",
5109 shared_libs: ["libbar"],
5110 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005111 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005112 }
5113
5114 cc_library {
5115 name: "libbar",
5116 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005117 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005118 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005119 apex_available: ["myapex"],
5120 }
5121
5122 cc_library {
5123 name: "libbaz",
5124 stl: "none",
5125 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005126 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005127}
Jiyong Park127b40b2019-09-30 16:04:35 +09005128
Paul Duffine52e66f2020-03-30 17:54:29 +01005129func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005130 testApexError(t, "\"otherapex\" is not a valid module name", `
5131 apex {
5132 name: "myapex",
5133 key: "myapex.key",
5134 native_shared_libs: ["libfoo"],
5135 }
5136
5137 apex_key {
5138 name: "myapex.key",
5139 public_key: "testkey.avbpubkey",
5140 private_key: "testkey.pem",
5141 }
5142
5143 cc_library {
5144 name: "libfoo",
5145 stl: "none",
5146 system_shared_libs: [],
5147 apex_available: ["otherapex"],
5148 }`)
5149
Paul Duffine52e66f2020-03-30 17:54:29 +01005150 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005151 apex {
5152 name: "myapex",
5153 key: "myapex.key",
5154 native_shared_libs: ["libfoo", "libbar"],
5155 }
5156
5157 apex_key {
5158 name: "myapex.key",
5159 public_key: "testkey.avbpubkey",
5160 private_key: "testkey.pem",
5161 }
5162
5163 cc_library {
5164 name: "libfoo",
5165 stl: "none",
5166 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005167 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005168 apex_available: ["myapex"],
5169 }
5170
5171 cc_library {
5172 name: "libbar",
5173 stl: "none",
5174 system_shared_libs: [],
5175 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005176 }
5177
5178 cc_library {
5179 name: "libbaz",
5180 stl: "none",
5181 system_shared_libs: [],
5182 stubs: {
5183 versions: ["10", "20", "30"],
5184 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005185 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005186}
Jiyong Park127b40b2019-09-30 16:04:35 +09005187
Jiyong Park89e850a2020-04-07 16:37:39 +09005188func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01005189 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005190 apex {
5191 name: "myapex",
5192 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005193 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005194 }
5195
5196 apex_key {
5197 name: "myapex.key",
5198 public_key: "testkey.avbpubkey",
5199 private_key: "testkey.pem",
5200 }
5201
5202 cc_library {
5203 name: "libfoo",
5204 stl: "none",
5205 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005206 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005207 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005208 }
5209
5210 cc_library {
5211 name: "libfoo2",
5212 stl: "none",
5213 system_shared_libs: [],
5214 shared_libs: ["libbaz"],
5215 apex_available: ["//apex_available:platform"],
5216 }
5217
5218 cc_library {
5219 name: "libbar",
5220 stl: "none",
5221 system_shared_libs: [],
5222 apex_available: ["myapex"],
5223 }
5224
5225 cc_library {
5226 name: "libbaz",
5227 stl: "none",
5228 system_shared_libs: [],
5229 apex_available: ["myapex"],
5230 stubs: {
5231 versions: ["1"],
5232 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005233 }`)
5234
Jiyong Park89e850a2020-04-07 16:37:39 +09005235 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5236 // because it depends on libbar which isn't available to platform
5237 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5238 if libfoo.NotAvailableForPlatform() != true {
5239 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5240 }
5241
5242 // libfoo2 however can be available to platform because it depends on libbaz which provides
5243 // stubs
5244 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5245 if libfoo2.NotAvailableForPlatform() == true {
5246 t.Errorf("%q should be available to platform", libfoo2.String())
5247 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005248}
Jiyong Parka90ca002019-10-07 15:47:24 +09005249
Paul Duffine52e66f2020-03-30 17:54:29 +01005250func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09005251 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005252 apex {
5253 name: "myapex",
5254 key: "myapex.key",
5255 native_shared_libs: ["libfoo"],
5256 }
5257
5258 apex_key {
5259 name: "myapex.key",
5260 public_key: "testkey.avbpubkey",
5261 private_key: "testkey.pem",
5262 }
5263
5264 cc_library {
5265 name: "libfoo",
5266 stl: "none",
5267 system_shared_libs: [],
5268 apex_available: ["myapex"],
5269 static: {
5270 apex_available: ["//apex_available:platform"],
5271 },
5272 }`)
5273
Jiyong Park89e850a2020-04-07 16:37:39 +09005274 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5275 if libfooShared.NotAvailableForPlatform() != true {
5276 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5277 }
5278 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5279 if libfooStatic.NotAvailableForPlatform() != false {
5280 t.Errorf("%q should be available to platform", libfooStatic.String())
5281 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005282}
5283
Jiyong Park5d790c32019-11-15 18:40:32 +09005284func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005285 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005286 apex {
5287 name: "myapex",
5288 key: "myapex.key",
5289 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005290 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09005291 }
5292
5293 override_apex {
5294 name: "override_myapex",
5295 base: "myapex",
5296 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005297 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005298 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005299 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005300 }
5301
5302 apex_key {
5303 name: "myapex.key",
5304 public_key: "testkey.avbpubkey",
5305 private_key: "testkey.pem",
5306 }
5307
5308 android_app {
5309 name: "app",
5310 srcs: ["foo/bar/MyClass.java"],
5311 package_name: "foo",
5312 sdk_version: "none",
5313 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005314 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005315 }
5316
5317 override_android_app {
5318 name: "override_app",
5319 base: "app",
5320 package_name: "bar",
5321 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005322 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005323
Jiyong Park317645e2019-12-05 13:20:58 +09005324 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5325 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5326 if originalVariant.GetOverriddenBy() != "" {
5327 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5328 }
5329 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5330 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5331 }
5332
Jiyong Park5d790c32019-11-15 18:40:32 +09005333 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5334 apexRule := module.Rule("apexRule")
5335 copyCmds := apexRule.Args["copy_commands"]
5336
5337 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005338 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005339
5340 apexBundle := module.Module().(*apexBundle)
5341 name := apexBundle.Name()
5342 if name != "override_myapex" {
5343 t.Errorf("name should be \"override_myapex\", but was %q", name)
5344 }
5345
Baligh Uddin004d7172020-02-19 21:29:28 -08005346 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5347 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5348 }
5349
Jiyong Park20bacab2020-03-03 11:45:41 +09005350 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005351 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005352
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005353 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5354 var builder strings.Builder
5355 data.Custom(&builder, name, "TARGET_", "", data)
5356 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005357 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005358 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5359 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005360 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005361 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005362 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005363 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5364 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005365}
5366
Jooyung Han214bf372019-11-12 13:03:50 +09005367func TestLegacyAndroid10Support(t *testing.T) {
5368 ctx, _ := testApex(t, `
5369 apex {
5370 name: "myapex",
5371 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005372 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005373 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005374 }
5375
5376 apex_key {
5377 name: "myapex.key",
5378 public_key: "testkey.avbpubkey",
5379 private_key: "testkey.pem",
5380 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005381
5382 cc_library {
5383 name: "mylib",
5384 srcs: ["mylib.cpp"],
5385 stl: "libc++",
5386 system_shared_libs: [],
5387 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005388 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005389 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005390 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005391
5392 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5393 args := module.Rule("apexRule").Args
5394 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005395 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005396
5397 // The copies of the libraries in the apex should have one more dependency than
5398 // the ones outside the apex, namely the unwinder. Ideally we should check
5399 // the dependency names directly here but for some reason the names are blank in
5400 // this test.
5401 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005402 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005403 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5404 if len(apexImplicits) != len(nonApexImplicits)+1 {
5405 t.Errorf("%q missing unwinder dep", lib)
5406 }
5407 }
Jooyung Han214bf372019-11-12 13:03:50 +09005408}
5409
Paul Duffin9b879592020-05-26 13:21:35 +01005410var filesForSdkLibrary = map[string][]byte{
5411 "api/current.txt": nil,
5412 "api/removed.txt": nil,
5413 "api/system-current.txt": nil,
5414 "api/system-removed.txt": nil,
5415 "api/test-current.txt": nil,
5416 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005417
Anton Hanssondff2c782020-12-21 17:10:01 +00005418 "100/public/api/foo.txt": nil,
5419 "100/public/api/foo-removed.txt": nil,
5420 "100/system/api/foo.txt": nil,
5421 "100/system/api/foo-removed.txt": nil,
5422
Paul Duffineedc5d52020-06-12 17:46:39 +01005423 // For java_sdk_library_import
5424 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005425}
5426
Jooyung Han58f26ab2019-12-18 15:34:32 +09005427func TestJavaSDKLibrary(t *testing.T) {
5428 ctx, _ := testApex(t, `
5429 apex {
5430 name: "myapex",
5431 key: "myapex.key",
5432 java_libs: ["foo"],
5433 }
5434
5435 apex_key {
5436 name: "myapex.key",
5437 public_key: "testkey.avbpubkey",
5438 private_key: "testkey.pem",
5439 }
5440
5441 java_sdk_library {
5442 name: "foo",
5443 srcs: ["a.java"],
5444 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005445 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005446 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005447
5448 prebuilt_apis {
5449 name: "sdk",
5450 api_dirs: ["100"],
5451 }
Paul Duffin9b879592020-05-26 13:21:35 +01005452 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005453
5454 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005455 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005456 "javalib/foo.jar",
5457 "etc/permissions/foo.xml",
5458 })
5459 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005460 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5461 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005462}
5463
Paul Duffin9b879592020-05-26 13:21:35 +01005464func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5465 ctx, _ := testApex(t, `
5466 apex {
5467 name: "myapex",
5468 key: "myapex.key",
5469 java_libs: ["foo", "bar"],
5470 }
5471
5472 apex_key {
5473 name: "myapex.key",
5474 public_key: "testkey.avbpubkey",
5475 private_key: "testkey.pem",
5476 }
5477
5478 java_sdk_library {
5479 name: "foo",
5480 srcs: ["a.java"],
5481 api_packages: ["foo"],
5482 apex_available: ["myapex"],
5483 sdk_version: "none",
5484 system_modules: "none",
5485 }
5486
5487 java_library {
5488 name: "bar",
5489 srcs: ["a.java"],
5490 libs: ["foo"],
5491 apex_available: ["myapex"],
5492 sdk_version: "none",
5493 system_modules: "none",
5494 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005495
5496 prebuilt_apis {
5497 name: "sdk",
5498 api_dirs: ["100"],
5499 }
Paul Duffin9b879592020-05-26 13:21:35 +01005500 `, withFiles(filesForSdkLibrary))
5501
5502 // java_sdk_library installs both impl jar and permission XML
5503 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5504 "javalib/bar.jar",
5505 "javalib/foo.jar",
5506 "etc/permissions/foo.xml",
5507 })
5508
5509 // The bar library should depend on the implementation jar.
5510 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5511 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5512 t.Errorf("expected %q, found %#q", expected, actual)
5513 }
5514}
5515
5516func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5517 ctx, _ := testApex(t, `
5518 apex {
5519 name: "myapex",
5520 key: "myapex.key",
5521 java_libs: ["foo"],
5522 }
5523
5524 apex_key {
5525 name: "myapex.key",
5526 public_key: "testkey.avbpubkey",
5527 private_key: "testkey.pem",
5528 }
5529
5530 java_sdk_library {
5531 name: "foo",
5532 srcs: ["a.java"],
5533 api_packages: ["foo"],
5534 apex_available: ["myapex"],
5535 sdk_version: "none",
5536 system_modules: "none",
5537 }
5538
5539 java_library {
5540 name: "bar",
5541 srcs: ["a.java"],
5542 libs: ["foo"],
5543 sdk_version: "none",
5544 system_modules: "none",
5545 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005546
5547 prebuilt_apis {
5548 name: "sdk",
5549 api_dirs: ["100"],
5550 }
Paul Duffin9b879592020-05-26 13:21:35 +01005551 `, withFiles(filesForSdkLibrary))
5552
5553 // java_sdk_library installs both impl jar and permission XML
5554 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5555 "javalib/foo.jar",
5556 "etc/permissions/foo.xml",
5557 })
5558
5559 // The bar library should depend on the stubs jar.
5560 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5561 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5562 t.Errorf("expected %q, found %#q", expected, actual)
5563 }
5564}
5565
Paul Duffineedc5d52020-06-12 17:46:39 +01005566func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005567 ctx, _ := testApex(t, `
5568 prebuilt_apis {
5569 name: "sdk",
5570 api_dirs: ["100"],
5571 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005572 withFiles(map[string][]byte{
5573 "apex/a.java": nil,
5574 "apex/apex_manifest.json": nil,
5575 "apex/Android.bp": []byte(`
5576 package {
5577 default_visibility: ["//visibility:private"],
5578 }
5579
5580 apex {
5581 name: "myapex",
5582 key: "myapex.key",
5583 java_libs: ["foo", "bar"],
5584 }
5585
5586 apex_key {
5587 name: "myapex.key",
5588 public_key: "testkey.avbpubkey",
5589 private_key: "testkey.pem",
5590 }
5591
5592 java_library {
5593 name: "bar",
5594 srcs: ["a.java"],
5595 libs: ["foo"],
5596 apex_available: ["myapex"],
5597 sdk_version: "none",
5598 system_modules: "none",
5599 }
5600`),
5601 "source/a.java": nil,
5602 "source/api/current.txt": nil,
5603 "source/api/removed.txt": nil,
5604 "source/Android.bp": []byte(`
5605 package {
5606 default_visibility: ["//visibility:private"],
5607 }
5608
5609 java_sdk_library {
5610 name: "foo",
5611 visibility: ["//apex"],
5612 srcs: ["a.java"],
5613 api_packages: ["foo"],
5614 apex_available: ["myapex"],
5615 sdk_version: "none",
5616 system_modules: "none",
5617 public: {
5618 enabled: true,
5619 },
5620 }
5621`),
5622 "prebuilt/a.jar": nil,
5623 "prebuilt/Android.bp": []byte(`
5624 package {
5625 default_visibility: ["//visibility:private"],
5626 }
5627
5628 java_sdk_library_import {
5629 name: "foo",
5630 visibility: ["//apex", "//source"],
5631 apex_available: ["myapex"],
5632 prefer: true,
5633 public: {
5634 jars: ["a.jar"],
5635 },
5636 }
5637`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005638 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005639 )
5640
5641 // java_sdk_library installs both impl jar and permission XML
5642 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5643 "javalib/bar.jar",
5644 "javalib/foo.jar",
5645 "etc/permissions/foo.xml",
5646 })
5647
5648 // The bar library should depend on the implementation jar.
5649 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5650 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5651 t.Errorf("expected %q, found %#q", expected, actual)
5652 }
5653}
5654
5655func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5656 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5657 apex {
5658 name: "myapex",
5659 key: "myapex.key",
5660 java_libs: ["foo"],
5661 }
5662
5663 apex_key {
5664 name: "myapex.key",
5665 public_key: "testkey.avbpubkey",
5666 private_key: "testkey.pem",
5667 }
5668
5669 java_sdk_library_import {
5670 name: "foo",
5671 apex_available: ["myapex"],
5672 prefer: true,
5673 public: {
5674 jars: ["a.jar"],
5675 },
5676 }
5677
5678 `, withFiles(filesForSdkLibrary))
5679}
5680
atrost6e126252020-01-27 17:01:16 +00005681func TestCompatConfig(t *testing.T) {
5682 ctx, _ := testApex(t, `
5683 apex {
5684 name: "myapex",
5685 key: "myapex.key",
5686 prebuilts: ["myjar-platform-compat-config"],
5687 java_libs: ["myjar"],
5688 }
5689
5690 apex_key {
5691 name: "myapex.key",
5692 public_key: "testkey.avbpubkey",
5693 private_key: "testkey.pem",
5694 }
5695
5696 platform_compat_config {
5697 name: "myjar-platform-compat-config",
5698 src: ":myjar",
5699 }
5700
5701 java_library {
5702 name: "myjar",
5703 srcs: ["foo/bar/MyClass.java"],
5704 sdk_version: "none",
5705 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005706 apex_available: [ "myapex" ],
5707 }
5708 `)
5709 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5710 "etc/compatconfig/myjar-platform-compat-config.xml",
5711 "javalib/myjar.jar",
5712 })
5713}
5714
Jiyong Park479321d2019-12-16 11:47:12 +09005715func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5716 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5717 apex {
5718 name: "myapex",
5719 key: "myapex.key",
5720 java_libs: ["myjar"],
5721 }
5722
5723 apex_key {
5724 name: "myapex.key",
5725 public_key: "testkey.avbpubkey",
5726 private_key: "testkey.pem",
5727 }
5728
5729 java_library {
5730 name: "myjar",
5731 srcs: ["foo/bar/MyClass.java"],
5732 sdk_version: "none",
5733 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005734 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005735 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005736 }
5737 `)
5738}
5739
Jiyong Park7afd1072019-12-30 16:56:33 +09005740func TestCarryRequiredModuleNames(t *testing.T) {
5741 ctx, config := testApex(t, `
5742 apex {
5743 name: "myapex",
5744 key: "myapex.key",
5745 native_shared_libs: ["mylib"],
5746 }
5747
5748 apex_key {
5749 name: "myapex.key",
5750 public_key: "testkey.avbpubkey",
5751 private_key: "testkey.pem",
5752 }
5753
5754 cc_library {
5755 name: "mylib",
5756 srcs: ["mylib.cpp"],
5757 system_shared_libs: [],
5758 stl: "none",
5759 required: ["a", "b"],
5760 host_required: ["c", "d"],
5761 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005762 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005763 }
5764 `)
5765
5766 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5767 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5768 name := apexBundle.BaseModuleName()
5769 prefix := "TARGET_"
5770 var builder strings.Builder
5771 data.Custom(&builder, name, prefix, "", data)
5772 androidMk := builder.String()
5773 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5774 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5775 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5776}
5777
Jiyong Park7cd10e32020-01-14 09:22:18 +09005778func TestSymlinksFromApexToSystem(t *testing.T) {
5779 bp := `
5780 apex {
5781 name: "myapex",
5782 key: "myapex.key",
5783 native_shared_libs: ["mylib"],
5784 java_libs: ["myjar"],
5785 }
5786
Jiyong Park9d677202020-02-19 16:29:35 +09005787 apex {
5788 name: "myapex.updatable",
5789 key: "myapex.key",
5790 native_shared_libs: ["mylib"],
5791 java_libs: ["myjar"],
5792 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005793 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005794 }
5795
Jiyong Park7cd10e32020-01-14 09:22:18 +09005796 apex_key {
5797 name: "myapex.key",
5798 public_key: "testkey.avbpubkey",
5799 private_key: "testkey.pem",
5800 }
5801
5802 cc_library {
5803 name: "mylib",
5804 srcs: ["mylib.cpp"],
5805 shared_libs: ["myotherlib"],
5806 system_shared_libs: [],
5807 stl: "none",
5808 apex_available: [
5809 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005810 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005811 "//apex_available:platform",
5812 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005813 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005814 }
5815
5816 cc_library {
5817 name: "myotherlib",
5818 srcs: ["mylib.cpp"],
5819 system_shared_libs: [],
5820 stl: "none",
5821 apex_available: [
5822 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005823 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005824 "//apex_available:platform",
5825 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005826 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005827 }
5828
5829 java_library {
5830 name: "myjar",
5831 srcs: ["foo/bar/MyClass.java"],
5832 sdk_version: "none",
5833 system_modules: "none",
5834 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005835 apex_available: [
5836 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005837 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005838 "//apex_available:platform",
5839 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005840 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005841 }
5842
5843 java_library {
5844 name: "myotherjar",
5845 srcs: ["foo/bar/MyClass.java"],
5846 sdk_version: "none",
5847 system_modules: "none",
5848 apex_available: [
5849 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005850 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005851 "//apex_available:platform",
5852 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005853 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005854 }
5855 `
5856
5857 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5858 for _, f := range files {
5859 if f.path == file {
5860 if f.isLink {
5861 t.Errorf("%q is not a real file", file)
5862 }
5863 return
5864 }
5865 }
5866 t.Errorf("%q is not found", file)
5867 }
5868
5869 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5870 for _, f := range files {
5871 if f.path == file {
5872 if !f.isLink {
5873 t.Errorf("%q is not a symlink", file)
5874 }
5875 return
5876 }
5877 }
5878 t.Errorf("%q is not found", file)
5879 }
5880
Jiyong Park9d677202020-02-19 16:29:35 +09005881 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5882 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005883 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005884 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005885 ensureRealfileExists(t, files, "javalib/myjar.jar")
5886 ensureRealfileExists(t, files, "lib64/mylib.so")
5887 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5888
Jiyong Park9d677202020-02-19 16:29:35 +09005889 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5890 ensureRealfileExists(t, files, "javalib/myjar.jar")
5891 ensureRealfileExists(t, files, "lib64/mylib.so")
5892 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5893
5894 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005895 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005896 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005897 ensureRealfileExists(t, files, "javalib/myjar.jar")
5898 ensureRealfileExists(t, files, "lib64/mylib.so")
5899 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005900
5901 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5902 ensureRealfileExists(t, files, "javalib/myjar.jar")
5903 ensureRealfileExists(t, files, "lib64/mylib.so")
5904 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005905}
5906
Yo Chiange8128052020-07-23 20:09:18 +08005907func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5908 ctx, config := testApex(t, `
5909 apex {
5910 name: "myapex",
5911 key: "myapex.key",
5912 native_shared_libs: ["mylib"],
5913 }
5914
5915 apex_key {
5916 name: "myapex.key",
5917 public_key: "testkey.avbpubkey",
5918 private_key: "testkey.pem",
5919 }
5920
5921 cc_library_shared {
5922 name: "mylib",
5923 srcs: ["mylib.cpp"],
5924 shared_libs: ["myotherlib"],
5925 system_shared_libs: [],
5926 stl: "none",
5927 apex_available: [
5928 "myapex",
5929 "//apex_available:platform",
5930 ],
5931 }
5932
5933 cc_prebuilt_library_shared {
5934 name: "myotherlib",
5935 srcs: ["prebuilt.so"],
5936 system_shared_libs: [],
5937 stl: "none",
5938 apex_available: [
5939 "myapex",
5940 "//apex_available:platform",
5941 ],
5942 }
5943 `)
5944
5945 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5946 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5947 var builder strings.Builder
5948 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5949 androidMk := builder.String()
5950 // `myotherlib` is added to `myapex` as symlink
5951 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5952 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5953 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5954 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09005955 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 +08005956}
5957
Jooyung Han643adc42020-02-27 13:50:06 +09005958func TestApexWithJniLibs(t *testing.T) {
5959 ctx, _ := testApex(t, `
5960 apex {
5961 name: "myapex",
5962 key: "myapex.key",
5963 jni_libs: ["mylib"],
5964 }
5965
5966 apex_key {
5967 name: "myapex.key",
5968 public_key: "testkey.avbpubkey",
5969 private_key: "testkey.pem",
5970 }
5971
5972 cc_library {
5973 name: "mylib",
5974 srcs: ["mylib.cpp"],
5975 shared_libs: ["mylib2"],
5976 system_shared_libs: [],
5977 stl: "none",
5978 apex_available: [ "myapex" ],
5979 }
5980
5981 cc_library {
5982 name: "mylib2",
5983 srcs: ["mylib.cpp"],
5984 system_shared_libs: [],
5985 stl: "none",
5986 apex_available: [ "myapex" ],
5987 }
5988 `)
5989
5990 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5991 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5992 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5993 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5994 "lib64/mylib.so",
5995 "lib64/mylib2.so",
5996 })
5997}
5998
Jooyung Han49f67012020-04-17 13:43:10 +09005999func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
6000 ctx, _ := testApex(t, `
6001 apex {
6002 name: "myapex",
6003 key: "myapex.key",
6004 }
6005 apex_key {
6006 name: "myapex.key",
6007 public_key: "testkey.avbpubkey",
6008 private_key: "testkey.pem",
6009 }
6010 `, func(fs map[string][]byte, config android.Config) {
6011 delete(config.Targets, android.Android)
6012 config.AndroidCommonTarget = android.Target{}
6013 })
6014
6015 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6016 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6017 }
6018}
6019
Jiyong Parkbd159612020-02-28 15:22:21 +09006020func TestAppBundle(t *testing.T) {
6021 ctx, _ := testApex(t, `
6022 apex {
6023 name: "myapex",
6024 key: "myapex.key",
6025 apps: ["AppFoo"],
6026 }
6027
6028 apex_key {
6029 name: "myapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
6034 android_app {
6035 name: "AppFoo",
6036 srcs: ["foo/bar/MyClass.java"],
6037 sdk_version: "none",
6038 system_modules: "none",
6039 apex_available: [ "myapex" ],
6040 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006041 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006042
Colin Crosscf371cc2020-11-13 11:48:42 -08006043 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006044 content := bundleConfigRule.Args["content"]
6045
6046 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006047 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 +09006048}
6049
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006050func TestAppSetBundle(t *testing.T) {
6051 ctx, _ := testApex(t, `
6052 apex {
6053 name: "myapex",
6054 key: "myapex.key",
6055 apps: ["AppSet"],
6056 }
6057
6058 apex_key {
6059 name: "myapex.key",
6060 public_key: "testkey.avbpubkey",
6061 private_key: "testkey.pem",
6062 }
6063
6064 android_app_set {
6065 name: "AppSet",
6066 set: "AppSet.apks",
6067 }`)
6068 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006069 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006070 content := bundleConfigRule.Args["content"]
6071 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6072 s := mod.Rule("apexRule").Args["copy_commands"]
6073 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6074 if len(copyCmds) != 3 {
6075 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6076 }
6077 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6078 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6079 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6080}
6081
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006082func TestAppSetBundlePrebuilt(t *testing.T) {
6083 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
6084 bp := `
6085 apex_set {
6086 name: "myapex",
6087 filename: "foo_v2.apex",
6088 sanitized: {
6089 none: { set: "myapex.apks", },
6090 hwaddress: { set: "myapex.hwasan.apks", },
6091 },
6092 }`
6093 fs["Android.bp"] = []byte(bp)
6094
6095 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6096 })
6097
6098 m := ctx.ModuleForTests("myapex", "android_common")
6099 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6100
6101 actual := extractedApex.Inputs
6102 if len(actual) != 1 {
6103 t.Errorf("expected a single input")
6104 }
6105
6106 expected := "myapex.hwasan.apks"
6107 if actual[0].String() != expected {
6108 t.Errorf("expected %s, got %s", expected, actual[0].String())
6109 }
6110}
6111
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006112func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006113 t.Helper()
6114
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006115 bp := `
6116 java_library {
6117 name: "some-updatable-apex-lib",
6118 srcs: ["a.java"],
6119 sdk_version: "current",
6120 apex_available: [
6121 "some-updatable-apex",
6122 ],
6123 }
6124
6125 java_library {
6126 name: "some-non-updatable-apex-lib",
6127 srcs: ["a.java"],
6128 apex_available: [
6129 "some-non-updatable-apex",
6130 ],
6131 }
6132
6133 java_library {
6134 name: "some-platform-lib",
6135 srcs: ["a.java"],
6136 sdk_version: "current",
6137 installable: true,
6138 }
6139
6140 java_library {
6141 name: "some-art-lib",
6142 srcs: ["a.java"],
6143 sdk_version: "current",
6144 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006145 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006146 ],
6147 hostdex: true,
6148 }
6149
6150 apex {
6151 name: "some-updatable-apex",
6152 key: "some-updatable-apex.key",
6153 java_libs: ["some-updatable-apex-lib"],
6154 updatable: true,
6155 min_sdk_version: "current",
6156 }
6157
6158 apex {
6159 name: "some-non-updatable-apex",
6160 key: "some-non-updatable-apex.key",
6161 java_libs: ["some-non-updatable-apex-lib"],
6162 }
6163
6164 apex_key {
6165 name: "some-updatable-apex.key",
6166 }
6167
6168 apex_key {
6169 name: "some-non-updatable-apex.key",
6170 }
6171
6172 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006173 name: "com.android.art.debug",
6174 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006175 java_libs: ["some-art-lib"],
6176 updatable: true,
6177 min_sdk_version: "current",
6178 }
6179
6180 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006181 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006182 }
6183
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006184 filegroup {
6185 name: "some-updatable-apex-file_contexts",
6186 srcs: [
6187 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6188 ],
6189 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006190
6191 filegroup {
6192 name: "some-non-updatable-apex-file_contexts",
6193 srcs: [
6194 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6195 ],
6196 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006197 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006198
6199 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6200}
6201
Paul Duffin064b70c2020-11-02 17:32:38 +00006202func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006203 t.Helper()
6204
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006205 bp += cc.GatherRequiredDepsForTest(android.Android)
6206 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006207
6208 fs := map[string][]byte{
6209 "a.java": nil,
6210 "a.jar": nil,
6211 "build/make/target/product/security": nil,
6212 "apex_manifest.json": nil,
6213 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006214 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006215 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6216 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6217 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006218 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006219 }
6220 cc.GatherRequiredFilesForTest(fs)
6221
Colin Crossae8600b2020-10-29 17:09:13 -07006222 config := android.TestArchConfig(buildDir, nil, bp, fs)
6223
6224 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006225 ctx.RegisterModuleType("apex", BundleFactory)
6226 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006227 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006228 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006229 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01006230 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006231 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006232 java.RegisterRequiredBuildComponentsForTest(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006233 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6234 ctx.PreDepsMutators(RegisterPreDepsMutators)
6235 ctx.PostDepsMutators(RegisterPostDepsMutators)
6236
Colin Crossae8600b2020-10-29 17:09:13 -07006237 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006238
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006239 pathCtx := android.PathContextForTesting(config)
6240 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6241 transformDexpreoptConfig(dexpreoptConfig)
6242 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6243
6244 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6245 android.FailIfErrored(t, errs)
6246
6247 _, errs = ctx.PrepareBuildActions(config)
6248 if errmsg == "" {
6249 android.FailIfErrored(t, errs)
6250 } else if len(errs) > 0 {
6251 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006252 } else {
6253 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6254 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006255
6256 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006257}
6258
Jooyung Han548640b2020-04-27 12:10:30 +09006259func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6260 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6261 apex {
6262 name: "myapex",
6263 key: "myapex.key",
6264 updatable: true,
6265 }
6266
6267 apex_key {
6268 name: "myapex.key",
6269 public_key: "testkey.avbpubkey",
6270 private_key: "testkey.pem",
6271 }
6272 `)
6273}
6274
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006275func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006276 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006277 var transform func(*dexpreopt.GlobalConfig)
6278
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006279 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6280 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006281 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006282 }
6283 testNoUpdatableJarsInBootImage(t, "", transform)
6284 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006285
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006286 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006287 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 +01006288 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006289 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006290 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006291 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006292 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006293
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006294 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 -07006295 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 +01006296 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006297 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006298 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006299 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006300 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006301
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006302 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 -07006303 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006304 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006305 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006306 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006307 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006308 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006309
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006310 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 -07006311 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 +01006312 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006313 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006314 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006315 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006316 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006317
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006318 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6319 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006320 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006321 }
6322 testNoUpdatableJarsInBootImage(t, "", transform)
6323 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006324
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006325 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006326 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006327 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006328 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006329 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006330 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006331 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006332
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006333 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006334 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006335 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006336 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006337 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006338 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006339 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006340
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006341 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006342 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006343 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006344 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006345 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006346 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006347 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006348
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006349 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6350 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006351 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006352 }
6353 testNoUpdatableJarsInBootImage(t, "", transform)
6354 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006355
6356}
6357
6358func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6359 transform := func(config *dexpreopt.GlobalConfig) {
6360 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6361 }
6362 t.Run("prebuilt no source", func(t *testing.T) {
6363 testDexpreoptWithApexes(t, `
6364 prebuilt_apex {
6365 name: "myapex" ,
6366 arch: {
6367 arm64: {
6368 src: "myapex-arm64.apex",
6369 },
6370 arm: {
6371 src: "myapex-arm.apex",
6372 },
6373 },
6374 exported_java_libs: ["libfoo"],
6375 }
6376
6377 java_import {
6378 name: "libfoo",
6379 jars: ["libfoo.jar"],
6380 }
6381`, "", transform)
6382 })
6383
6384 t.Run("prebuilt no source", func(t *testing.T) {
6385 testDexpreoptWithApexes(t, `
6386 prebuilt_apex {
6387 name: "myapex" ,
6388 arch: {
6389 arm64: {
6390 src: "myapex-arm64.apex",
6391 },
6392 arm: {
6393 src: "myapex-arm.apex",
6394 },
6395 },
6396 exported_java_libs: ["libfoo"],
6397 }
6398
6399 java_import {
6400 name: "libfoo",
6401 jars: ["libfoo.jar"],
6402 }
6403`, "", transform)
6404 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006405}
6406
Andrei Onea115e7e72020-06-05 21:14:03 +01006407func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6408 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006409 bp += `
6410 apex_key {
6411 name: "myapex.key",
6412 public_key: "testkey.avbpubkey",
6413 private_key: "testkey.pem",
6414 }`
6415 fs := map[string][]byte{
6416 "lib1/src/A.java": nil,
6417 "lib2/src/B.java": nil,
6418 "system/sepolicy/apex/myapex-file_contexts": nil,
6419 }
6420
Colin Crossae8600b2020-10-29 17:09:13 -07006421 config := android.TestArchConfig(buildDir, nil, bp, fs)
6422 android.SetTestNeverallowRules(config, rules)
6423 updatableBootJars := make([]string, 0, len(apexBootJars))
6424 for _, apexBootJar := range apexBootJars {
6425 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6426 }
6427 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6428
6429 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006430 ctx.RegisterModuleType("apex", BundleFactory)
6431 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6432 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6433 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006434 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006435 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6436 ctx.PreDepsMutators(RegisterPreDepsMutators)
6437 ctx.PostDepsMutators(RegisterPostDepsMutators)
6438 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6439
Colin Crossae8600b2020-10-29 17:09:13 -07006440 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006441
6442 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6443 android.FailIfErrored(t, errs)
6444
6445 _, errs = ctx.PrepareBuildActions(config)
6446 if errmsg == "" {
6447 android.FailIfErrored(t, errs)
6448 } else if len(errs) > 0 {
6449 android.FailIfNoMatchingErrors(t, errmsg, errs)
6450 return
6451 } else {
6452 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6453 }
6454}
6455
6456func TestApexPermittedPackagesRules(t *testing.T) {
6457 testcases := []struct {
6458 name string
6459 expectedError string
6460 bp string
6461 bootJars []string
6462 modulesPackages map[string][]string
6463 }{
6464
6465 {
6466 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6467 expectedError: "",
6468 bp: `
6469 java_library {
6470 name: "bcp_lib1",
6471 srcs: ["lib1/src/*.java"],
6472 permitted_packages: ["foo.bar"],
6473 apex_available: ["myapex"],
6474 sdk_version: "none",
6475 system_modules: "none",
6476 }
6477 java_library {
6478 name: "nonbcp_lib2",
6479 srcs: ["lib2/src/*.java"],
6480 apex_available: ["myapex"],
6481 permitted_packages: ["a.b"],
6482 sdk_version: "none",
6483 system_modules: "none",
6484 }
6485 apex {
6486 name: "myapex",
6487 key: "myapex.key",
6488 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6489 }`,
6490 bootJars: []string{"bcp_lib1"},
6491 modulesPackages: map[string][]string{
6492 "myapex": []string{
6493 "foo.bar",
6494 },
6495 },
6496 },
6497 {
6498 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6499 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.`,
6500 bp: `
6501 java_library {
6502 name: "bcp_lib1",
6503 srcs: ["lib1/src/*.java"],
6504 apex_available: ["myapex"],
6505 permitted_packages: ["foo.bar"],
6506 sdk_version: "none",
6507 system_modules: "none",
6508 }
6509 java_library {
6510 name: "bcp_lib2",
6511 srcs: ["lib2/src/*.java"],
6512 apex_available: ["myapex"],
6513 permitted_packages: ["foo.bar", "bar.baz"],
6514 sdk_version: "none",
6515 system_modules: "none",
6516 }
6517 apex {
6518 name: "myapex",
6519 key: "myapex.key",
6520 java_libs: ["bcp_lib1", "bcp_lib2"],
6521 }
6522 `,
6523 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6524 modulesPackages: map[string][]string{
6525 "myapex": []string{
6526 "foo.bar",
6527 },
6528 },
6529 },
6530 }
6531 for _, tc := range testcases {
6532 t.Run(tc.name, func(t *testing.T) {
6533 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6534 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6535 })
6536 }
6537}
6538
Jiyong Park62304bb2020-04-13 16:19:48 +09006539func TestTestFor(t *testing.T) {
6540 ctx, _ := testApex(t, `
6541 apex {
6542 name: "myapex",
6543 key: "myapex.key",
6544 native_shared_libs: ["mylib", "myprivlib"],
6545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552
6553 cc_library {
6554 name: "mylib",
6555 srcs: ["mylib.cpp"],
6556 system_shared_libs: [],
6557 stl: "none",
6558 stubs: {
6559 versions: ["1"],
6560 },
6561 apex_available: ["myapex"],
6562 }
6563
6564 cc_library {
6565 name: "myprivlib",
6566 srcs: ["mylib.cpp"],
6567 system_shared_libs: [],
6568 stl: "none",
6569 apex_available: ["myapex"],
6570 }
6571
6572
6573 cc_test {
6574 name: "mytest",
6575 gtest: false,
6576 srcs: ["mylib.cpp"],
6577 system_shared_libs: [],
6578 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006579 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006580 test_for: ["myapex"]
6581 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006582
6583 cc_library {
6584 name: "mytestlib",
6585 srcs: ["mylib.cpp"],
6586 system_shared_libs: [],
6587 shared_libs: ["mylib", "myprivlib"],
6588 stl: "none",
6589 test_for: ["myapex"],
6590 }
6591
6592 cc_benchmark {
6593 name: "mybench",
6594 srcs: ["mylib.cpp"],
6595 system_shared_libs: [],
6596 shared_libs: ["mylib", "myprivlib"],
6597 stl: "none",
6598 test_for: ["myapex"],
6599 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006600 `)
6601
6602 // the test 'mytest' is a test for the apex, therefore is linked to the
6603 // actual implementation of mylib instead of its stub.
6604 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6605 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6606 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006607
6608 // The same should be true for cc_library
6609 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6610 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6611 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6612
6613 // ... and for cc_benchmark
6614 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6615 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6616 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006617}
6618
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006619// TODO(jungjw): Move this to proptools
6620func intPtr(i int) *int {
6621 return &i
6622}
6623
6624func TestApexSet(t *testing.T) {
6625 ctx, config := testApex(t, `
6626 apex_set {
6627 name: "myapex",
6628 set: "myapex.apks",
6629 filename: "foo_v2.apex",
6630 overrides: ["foo"],
6631 }
6632 `, func(fs map[string][]byte, config android.Config) {
6633 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006634 config.Targets[android.Android] = []android.Target{
6635 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6636 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6637 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006638 })
6639
6640 m := ctx.ModuleForTests("myapex", "android_common")
6641
6642 // Check extract_apks tool parameters.
6643 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6644 actual := extractedApex.Args["abis"]
6645 expected := "ARMEABI_V7A,ARM64_V8A"
6646 if actual != expected {
6647 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6648 }
6649 actual = extractedApex.Args["sdk-version"]
6650 expected = "30"
6651 if actual != expected {
6652 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6653 }
6654
6655 a := m.Module().(*ApexSet)
6656 expectedOverrides := []string{"foo"}
6657 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6658 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6659 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6660 }
6661}
6662
Jiyong Park7d95a512020-05-10 15:16:24 +09006663func TestNoStaticLinkingToStubsLib(t *testing.T) {
6664 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6665 apex {
6666 name: "myapex",
6667 key: "myapex.key",
6668 native_shared_libs: ["mylib"],
6669 }
6670
6671 apex_key {
6672 name: "myapex.key",
6673 public_key: "testkey.avbpubkey",
6674 private_key: "testkey.pem",
6675 }
6676
6677 cc_library {
6678 name: "mylib",
6679 srcs: ["mylib.cpp"],
6680 static_libs: ["otherlib"],
6681 system_shared_libs: [],
6682 stl: "none",
6683 apex_available: [ "myapex" ],
6684 }
6685
6686 cc_library {
6687 name: "otherlib",
6688 srcs: ["mylib.cpp"],
6689 system_shared_libs: [],
6690 stl: "none",
6691 stubs: {
6692 versions: ["1", "2", "3"],
6693 },
6694 apex_available: [ "myapex" ],
6695 }
6696 `)
6697}
6698
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006699func TestApexKeysTxt(t *testing.T) {
6700 ctx, _ := testApex(t, `
6701 apex {
6702 name: "myapex",
6703 key: "myapex.key",
6704 }
6705
6706 apex_key {
6707 name: "myapex.key",
6708 public_key: "testkey.avbpubkey",
6709 private_key: "testkey.pem",
6710 }
6711
6712 prebuilt_apex {
6713 name: "myapex",
6714 prefer: true,
6715 arch: {
6716 arm64: {
6717 src: "myapex-arm64.apex",
6718 },
6719 arm: {
6720 src: "myapex-arm.apex",
6721 },
6722 },
6723 }
6724
6725 apex_set {
6726 name: "myapex_set",
6727 set: "myapex.apks",
6728 filename: "myapex_set.apex",
6729 overrides: ["myapex"],
6730 }
6731 `)
6732
6733 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6734 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6735 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 +09006736 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 +09006737}
6738
Jooyung Han938b5932020-06-20 12:47:47 +09006739func TestAllowedFiles(t *testing.T) {
6740 ctx, _ := testApex(t, `
6741 apex {
6742 name: "myapex",
6743 key: "myapex.key",
6744 apps: ["app"],
6745 allowed_files: "allowed.txt",
6746 }
6747
6748 apex_key {
6749 name: "myapex.key",
6750 public_key: "testkey.avbpubkey",
6751 private_key: "testkey.pem",
6752 }
6753
6754 android_app {
6755 name: "app",
6756 srcs: ["foo/bar/MyClass.java"],
6757 package_name: "foo",
6758 sdk_version: "none",
6759 system_modules: "none",
6760 apex_available: [ "myapex" ],
6761 }
6762 `, withFiles(map[string][]byte{
6763 "sub/Android.bp": []byte(`
6764 override_apex {
6765 name: "override_myapex",
6766 base: "myapex",
6767 apps: ["override_app"],
6768 allowed_files: ":allowed",
6769 }
6770 // Overridable "path" property should be referenced indirectly
6771 filegroup {
6772 name: "allowed",
6773 srcs: ["allowed.txt"],
6774 }
6775 override_android_app {
6776 name: "override_app",
6777 base: "app",
6778 package_name: "bar",
6779 }
6780 `),
6781 }))
6782
6783 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6784 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6785 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6786 }
6787
6788 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6789 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6790 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6791 }
6792}
6793
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006794func TestNonPreferredPrebuiltDependency(t *testing.T) {
6795 _, _ = testApex(t, `
6796 apex {
6797 name: "myapex",
6798 key: "myapex.key",
6799 native_shared_libs: ["mylib"],
6800 }
6801
6802 apex_key {
6803 name: "myapex.key",
6804 public_key: "testkey.avbpubkey",
6805 private_key: "testkey.pem",
6806 }
6807
6808 cc_library {
6809 name: "mylib",
6810 srcs: ["mylib.cpp"],
6811 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006812 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006813 },
6814 apex_available: ["myapex"],
6815 }
6816
6817 cc_prebuilt_library_shared {
6818 name: "mylib",
6819 prefer: false,
6820 srcs: ["prebuilt.so"],
6821 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006822 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006823 },
6824 apex_available: ["myapex"],
6825 }
6826 `)
6827}
6828
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006829func TestCompressedApex(t *testing.T) {
6830 ctx, config := testApex(t, `
6831 apex {
6832 name: "myapex",
6833 key: "myapex.key",
6834 compressible: true,
6835 }
6836 apex_key {
6837 name: "myapex.key",
6838 public_key: "testkey.avbpubkey",
6839 private_key: "testkey.pem",
6840 }
6841 `, func(fs map[string][]byte, config android.Config) {
6842 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6843 })
6844
6845 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6846 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6847
6848 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6849 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6850
6851 // Make sure output of bundle is .capex
6852 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6853 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6854
6855 // Verify android.mk rules
6856 data := android.AndroidMkDataForTest(t, config, "", ab)
6857 var builder strings.Builder
6858 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6859 androidMk := builder.String()
6860 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6861}
6862
Martin Stjernholm2856c662020-12-02 15:03:42 +00006863func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6864 ctx, config := testApex(t, `
6865 apex {
6866 name: "myapex",
6867 key: "myapex.key",
6868 native_shared_libs: ["mylib"],
6869 }
6870
6871 apex_key {
6872 name: "myapex.key",
6873 public_key: "testkey.avbpubkey",
6874 private_key: "testkey.pem",
6875 }
6876
6877 cc_library {
6878 name: "mylib",
6879 srcs: ["mylib.cpp"],
6880 apex_available: ["myapex"],
6881 shared_libs: ["otherlib"],
6882 system_shared_libs: [],
6883 }
6884
6885 cc_library {
6886 name: "otherlib",
6887 srcs: ["mylib.cpp"],
6888 stubs: {
6889 versions: ["current"],
6890 },
6891 }
6892
6893 cc_prebuilt_library_shared {
6894 name: "otherlib",
6895 prefer: true,
6896 srcs: ["prebuilt.so"],
6897 stubs: {
6898 versions: ["current"],
6899 },
6900 }
6901 `)
6902
6903 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6904 data := android.AndroidMkDataForTest(t, config, "", ab)
6905 var builder strings.Builder
6906 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6907 androidMk := builder.String()
6908
6909 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6910 // a thing there.
6911 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6912}
6913
Jiyong Parke3867542020-12-03 17:28:25 +09006914func TestExcludeDependency(t *testing.T) {
6915 ctx, _ := testApex(t, `
6916 apex {
6917 name: "myapex",
6918 key: "myapex.key",
6919 native_shared_libs: ["mylib"],
6920 }
6921
6922 apex_key {
6923 name: "myapex.key",
6924 public_key: "testkey.avbpubkey",
6925 private_key: "testkey.pem",
6926 }
6927
6928 cc_library {
6929 name: "mylib",
6930 srcs: ["mylib.cpp"],
6931 system_shared_libs: [],
6932 stl: "none",
6933 apex_available: ["myapex"],
6934 shared_libs: ["mylib2"],
6935 target: {
6936 apex: {
6937 exclude_shared_libs: ["mylib2"],
6938 },
6939 },
6940 }
6941
6942 cc_library {
6943 name: "mylib2",
6944 srcs: ["mylib.cpp"],
6945 system_shared_libs: [],
6946 stl: "none",
6947 }
6948 `)
6949
6950 // Check if mylib is linked to mylib2 for the non-apex target
6951 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6952 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6953
6954 // Make sure that the link doesn't occur for the apex target
6955 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6956 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6957
6958 // It shouldn't appear in the copy cmd as well.
6959 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6960 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6961}
6962
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006963func TestPrebuiltStubLibDep(t *testing.T) {
6964 bpBase := `
6965 apex {
6966 name: "myapex",
6967 key: "myapex.key",
6968 native_shared_libs: ["mylib"],
6969 }
6970 apex_key {
6971 name: "myapex.key",
6972 public_key: "testkey.avbpubkey",
6973 private_key: "testkey.pem",
6974 }
6975 cc_library {
6976 name: "mylib",
6977 srcs: ["mylib.cpp"],
6978 apex_available: ["myapex"],
6979 shared_libs: ["stublib"],
6980 system_shared_libs: [],
6981 }
6982 apex {
6983 name: "otherapex",
6984 enabled: %s,
6985 key: "myapex.key",
6986 native_shared_libs: ["stublib"],
6987 }
6988 `
6989
6990 stublibSourceBp := `
6991 cc_library {
6992 name: "stublib",
6993 srcs: ["mylib.cpp"],
6994 apex_available: ["otherapex"],
6995 system_shared_libs: [],
6996 stl: "none",
6997 stubs: {
6998 versions: ["1"],
6999 },
7000 }
7001 `
7002
7003 stublibPrebuiltBp := `
7004 cc_prebuilt_library_shared {
7005 name: "stublib",
7006 srcs: ["prebuilt.so"],
7007 apex_available: ["otherapex"],
7008 stubs: {
7009 versions: ["1"],
7010 },
7011 %s
7012 }
7013 `
7014
7015 tests := []struct {
7016 name string
7017 stublibBp string
7018 usePrebuilt bool
7019 modNames []string // Modules to collect AndroidMkEntries for
7020 otherApexEnabled []string
7021 }{
7022 {
7023 name: "only_source",
7024 stublibBp: stublibSourceBp,
7025 usePrebuilt: false,
7026 modNames: []string{"stublib"},
7027 otherApexEnabled: []string{"true", "false"},
7028 },
7029 {
7030 name: "source_preferred",
7031 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7032 usePrebuilt: false,
7033 modNames: []string{"stublib", "prebuilt_stublib"},
7034 otherApexEnabled: []string{"true", "false"},
7035 },
7036 {
7037 name: "prebuilt_preferred",
7038 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7039 usePrebuilt: true,
7040 modNames: []string{"stublib", "prebuilt_stublib"},
7041 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7042 },
7043 {
7044 name: "only_prebuilt",
7045 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7046 usePrebuilt: true,
7047 modNames: []string{"stublib"},
7048 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7049 },
7050 }
7051
7052 for _, test := range tests {
7053 t.Run(test.name, func(t *testing.T) {
7054 for _, otherApexEnabled := range test.otherApexEnabled {
7055 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
7056 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
7057
7058 type modAndMkEntries struct {
7059 mod *cc.Module
7060 mkEntries android.AndroidMkEntries
7061 }
7062 entries := []*modAndMkEntries{}
7063
7064 // Gather shared lib modules that are installable
7065 for _, modName := range test.modNames {
7066 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7067 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7068 continue
7069 }
7070 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007071 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007072 continue
7073 }
7074 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
7075 if ent.Disabled {
7076 continue
7077 }
7078 entries = append(entries, &modAndMkEntries{
7079 mod: mod,
7080 mkEntries: ent,
7081 })
7082 }
7083 }
7084 }
7085
7086 var entry *modAndMkEntries = nil
7087 for _, ent := range entries {
7088 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7089 if entry != nil {
7090 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7091 } else {
7092 entry = ent
7093 }
7094 }
7095 }
7096
7097 if entry == nil {
7098 t.Errorf("AndroidMk entry for \"stublib\" missing")
7099 } else {
7100 isPrebuilt := entry.mod.Prebuilt() != nil
7101 if isPrebuilt != test.usePrebuilt {
7102 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7103 }
7104 if !entry.mod.IsStubs() {
7105 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7106 }
7107 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7108 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7109 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007110 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7111 expected := "-D__STUBLIB_API__=1"
7112 if !android.InList(expected, cflags) {
7113 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7114 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007115 }
7116 })
7117 }
7118 })
7119 }
7120}
7121
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007122func TestMain(m *testing.M) {
7123 run := func() int {
7124 setUp()
7125 defer tearDown()
7126
7127 return m.Run()
7128 }
7129
7130 os.Exit(run())
7131}