blob: 5dbec58ae8b72d9b96f60a02c6201b6054de9aa4 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "io/ioutil"
20 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090021 "path"
Paul Duffin37856732021-02-26 14:24:15 +000022 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070023 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010024 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090025 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070041var buildDir string
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Jooyung Han344d5432019-08-23 11:17:39 +090053func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
54 t.Helper()
55 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090056 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
57 if len(errs) > 0 {
58 android.FailIfNoMatchingErrors(t, pattern, errs)
59 return
60 }
61 _, errs = ctx.PrepareBuildActions(config)
62 if len(errs) > 0 {
63 android.FailIfNoMatchingErrors(t, pattern, errs)
64 return
65 }
66
67 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
68}
69
Colin Cross1c460562021-02-16 17:55:47 -080070func testApex(t *testing.T, bp string, handlers ...testCustomizer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090071 t.Helper()
72 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010073 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090074 android.FailIfErrored(t, errs)
75 _, errs = ctx.PrepareBuildActions(config)
76 android.FailIfErrored(t, errs)
Colin Cross1c460562021-02-16 17:55:47 -080077 return ctx
Jooyung Han5c998b92019-06-27 11:30:33 +090078}
79
Jooyung Han344d5432019-08-23 11:17:39 +090080type testCustomizer func(fs map[string][]byte, config android.Config)
81
82func withFiles(files map[string][]byte) testCustomizer {
83 return func(fs map[string][]byte, config android.Config) {
84 for k, v := range files {
85 fs[k] = v
86 }
87 }
88}
89
90func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
91 return func(fs map[string][]byte, config android.Config) {
92 for k, v := range targets {
93 config.Targets[k] = v
94 }
95 }
96}
97
Jooyung Han35155c42020-02-06 17:33:20 +090098// withNativeBridgeTargets sets configuration with targets including:
99// - X86_64 (primary)
100// - X86 (secondary)
101// - Arm64 on X86_64 (native bridge)
102// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700103func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900104 config.Targets[android.Android] = []android.Target{
105 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
109 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
110 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
111 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
112 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
113 }
114}
115
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900116func withManifestPackageNameOverrides(specs []string) testCustomizer {
117 return func(fs map[string][]byte, config android.Config) {
118 config.TestProductVariables.ManifestPackageNameOverrides = specs
119 }
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900123 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900127 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
128}
129
Paul Duffina02cae32021-03-09 01:44:06 +0000130var emptyFixtureFactory = android.NewFixtureFactory(&buildDir)
131
Paul Duffin37aad602021-03-08 09:47:16 +0000132var apexFixtureFactory = android.NewFixtureFactory(
133 &buildDir,
134 // General preparers in alphabetical order as test infrastructure will enforce correct
135 // registration order.
136 android.PrepareForTestWithAndroidBuildComponents,
137 bpf.PrepareForTestWithBpf,
138 cc.PrepareForTestWithCcBuildComponents,
139 java.PrepareForTestWithJavaDefaultModules,
140 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
141 rust.PrepareForTestWithRustDefaultModules,
142 sh.PrepareForTestWithShBuildComponents,
143
144 PrepareForTestWithApexBuildComponents,
145
146 // Additional apex test specific preparers.
147 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
148 filegroup {
149 name: "myapex-file_contexts",
150 srcs: [
151 "apex/myapex-file_contexts",
152 ],
153 }
154 `),
155 android.FixtureMergeMockFs(android.MockFS{
156 "a.java": nil,
157 "PrebuiltAppFoo.apk": nil,
158 "PrebuiltAppFooPriv.apk": nil,
159 "build/make/target/product/security": nil,
160 "apex_manifest.json": nil,
161 "AndroidManifest.xml": nil,
162 "system/sepolicy/apex/myapex-file_contexts": nil,
163 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
164 "system/sepolicy/apex/myapex2-file_contexts": nil,
165 "system/sepolicy/apex/otherapex-file_contexts": nil,
166 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
167 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
168 "mylib.cpp": nil,
169 "mytest.cpp": nil,
170 "mytest1.cpp": nil,
171 "mytest2.cpp": nil,
172 "mytest3.cpp": nil,
173 "myprebuilt": nil,
174 "my_include": nil,
175 "foo/bar/MyClass.java": nil,
176 "prebuilt.jar": nil,
177 "prebuilt.so": nil,
178 "vendor/foo/devkeys/test.x509.pem": nil,
179 "vendor/foo/devkeys/test.pk8": nil,
180 "testkey.x509.pem": nil,
181 "testkey.pk8": nil,
182 "testkey.override.x509.pem": nil,
183 "testkey.override.pk8": nil,
184 "vendor/foo/devkeys/testkey.avbpubkey": nil,
185 "vendor/foo/devkeys/testkey.pem": nil,
186 "NOTICE": nil,
187 "custom_notice": nil,
188 "custom_notice_for_static_lib": nil,
189 "testkey2.avbpubkey": nil,
190 "testkey2.pem": nil,
191 "myapex-arm64.apex": nil,
192 "myapex-arm.apex": nil,
193 "myapex.apks": nil,
194 "frameworks/base/api/current.txt": nil,
195 "framework/aidl/a.aidl": nil,
196 "build/make/core/proguard.flags": nil,
197 "build/make/core/proguard_basic_keeps.flags": nil,
198 "dummy.txt": nil,
199 "baz": nil,
200 "bar/baz": nil,
201 "testdata/baz": nil,
202 "AppSet.apks": nil,
203 "foo.rs": nil,
204 "libfoo.jar": nil,
205 "libbar.jar": nil,
206 },
207 ),
208
209 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
210 variables.DeviceVndkVersion = proptools.StringPtr("current")
211 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
212 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
213 variables.Platform_sdk_codename = proptools.StringPtr("Q")
214 variables.Platform_sdk_final = proptools.BoolPtr(false)
215 variables.Platform_version_active_codenames = []string{"Q"}
216 variables.Platform_vndk_version = proptools.StringPtr("VER")
217 }),
218)
219
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700220func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900221 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900222 filegroup {
223 name: "myapex-file_contexts",
224 srcs: [
225 "system/sepolicy/apex/myapex-file_contexts",
226 ],
227 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900228 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800229
Colin Crossf9aabd72020-02-15 11:29:50 -0800230 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
231
Jiyong Park99644e92020-11-17 22:21:02 +0900232 bp = bp + rust.GatherRequiredDepsForTest()
233
Dario Frenicde2a032019-10-27 00:29:22 +0100234 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235
Jooyung Han344d5432019-08-23 11:17:39 +0900236 fs := map[string][]byte{
Colin Cross2807f002021-03-02 10:15:29 -0800237 "a.java": nil,
238 "PrebuiltAppFoo.apk": nil,
239 "PrebuiltAppFooPriv.apk": nil,
240 "build/make/target/product/security": nil,
241 "apex_manifest.json": nil,
242 "AndroidManifest.xml": nil,
243 "system/sepolicy/apex/myapex-file_contexts": nil,
244 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
245 "system/sepolicy/apex/myapex2-file_contexts": nil,
246 "system/sepolicy/apex/otherapex-file_contexts": nil,
247 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
248 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800249 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800250 "mytest.cpp": nil,
251 "mytest1.cpp": nil,
252 "mytest2.cpp": nil,
253 "mytest3.cpp": nil,
254 "myprebuilt": nil,
255 "my_include": nil,
256 "foo/bar/MyClass.java": nil,
257 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100258 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 "vendor/foo/devkeys/test.x509.pem": nil,
260 "vendor/foo/devkeys/test.pk8": nil,
261 "testkey.x509.pem": nil,
262 "testkey.pk8": nil,
263 "testkey.override.x509.pem": nil,
264 "testkey.override.pk8": nil,
265 "vendor/foo/devkeys/testkey.avbpubkey": nil,
266 "vendor/foo/devkeys/testkey.pem": nil,
267 "NOTICE": nil,
268 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900269 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800270 "testkey2.avbpubkey": nil,
271 "testkey2.pem": nil,
272 "myapex-arm64.apex": nil,
273 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700274 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800275 "frameworks/base/api/current.txt": nil,
276 "framework/aidl/a.aidl": nil,
277 "build/make/core/proguard.flags": nil,
278 "build/make/core/proguard_basic_keeps.flags": nil,
279 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700280 "baz": nil,
281 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700282 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700283 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900284 "foo.rs": nil,
Paul Duffin064b70c2020-11-02 17:32:38 +0000285 "libfoo.jar": nil,
Paul Duffin39853512021-02-26 11:09:39 +0000286 "libbar.jar": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900287 }
288
Colin Crossf9aabd72020-02-15 11:29:50 -0800289 cc.GatherRequiredFilesForTest(fs)
290
Jooyung Han344d5432019-08-23 11:17:39 +0900291 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800292 // The fs now needs to be populated before creating the config, call handlers twice
293 // for now, once to get any fs changes, and later after the config was created to
294 // set product variables or targets.
295 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
296 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900297 }
298
Colin Cross98be1bb2019-12-13 20:41:13 -0800299 config := android.TestArchConfig(buildDir, nil, bp, fs)
300 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
301 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
302 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
303 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
304 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700305 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800306 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
307
308 for _, handler := range handlers {
309 // The fs now needs to be populated before creating the config, call handlers twice
310 // for now, earlier to get any fs changes, and now after the config was created to
311 // set product variables or targets.
312 tempFS := map[string][]byte{}
313 handler(tempFS, config)
314 }
315
Colin Crossae8600b2020-10-29 17:09:13 -0700316 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100317
318 // from android package
319 android.RegisterPackageBuildComponents(ctx)
320 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
321
Paul Duffin667893c2021-03-09 22:34:13 +0000322 registerApexBuildComponents(ctx)
323 registerApexKeyBuildComponents(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800324
Jooyung Hana57af4a2020-01-23 05:36:59 +0000325 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100326 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000327
Paul Duffin021f4e52020-07-30 16:04:17 +0100328 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100329
Paul Duffin021f4e52020-07-30 16:04:17 +0100330 // Register these after the prebuilt mutators have been registered to match what
331 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100332 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
333 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
334
Paul Duffin6d119b82021-03-05 13:57:33 +0000335 // These must come after prebuilts and visibility rules to match runtime.
336 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
337
338 // These must come after override rules to match the runtime.
Paul Duffin021f4e52020-07-30 16:04:17 +0100339 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900340 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +0000341 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100342
Colin Cross98be1bb2019-12-13 20:41:13 -0800343 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800344 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800345 cc.RegisterVndkLibraryTxtTypes(ctx)
Jooyung Han0703fd82020-08-26 22:11:53 +0900346 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000347 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700348 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800349 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
markchien2f59ec92020-09-02 16:23:38 +0800350 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800351
Colin Crossae8600b2020-10-29 17:09:13 -0700352 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353
Jooyung Han5c998b92019-06-27 11:30:33 +0900354 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355}
356
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700357func setUp() {
358 var err error
359 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700361 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363}
364
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700365func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700366 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367}
368
Jooyung Han643adc42020-02-27 13:50:06 +0900369// ensure that 'result' equals 'expected'
370func ensureEquals(t *testing.T, result string, expected string) {
371 t.Helper()
372 if result != expected {
373 t.Errorf("%q != %q", expected, result)
374 }
375}
376
Jiyong Park25fc6a92018-11-18 18:02:45 +0900377// ensure that 'result' contains 'expected'
378func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900379 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900380 if !strings.Contains(result, expected) {
381 t.Errorf("%q is not found in %q", expected, result)
382 }
383}
384
Liz Kammer5bd365f2020-05-27 15:15:11 -0700385// ensure that 'result' contains 'expected' exactly one time
386func ensureContainsOnce(t *testing.T, result string, expected string) {
387 t.Helper()
388 count := strings.Count(result, expected)
389 if count != 1 {
390 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
391 }
392}
393
Jiyong Park25fc6a92018-11-18 18:02:45 +0900394// ensures that 'result' does not contain 'notExpected'
395func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900396 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900397 if strings.Contains(result, notExpected) {
398 t.Errorf("%q is found in %q", notExpected, result)
399 }
400}
401
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700402func ensureMatches(t *testing.T, result string, expectedRex string) {
403 ok, err := regexp.MatchString(expectedRex, result)
404 if err != nil {
405 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
406 return
407 }
408 if !ok {
409 t.Errorf("%s does not match regular expession %s", result, expectedRex)
410 }
411}
412
Jiyong Park25fc6a92018-11-18 18:02:45 +0900413func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900414 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900415 if !android.InList(expected, result) {
416 t.Errorf("%q is not found in %v", expected, result)
417 }
418}
419
420func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900421 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900422 if android.InList(notExpected, result) {
423 t.Errorf("%q is found in %v", notExpected, result)
424 }
425}
426
Jooyung Hane1633032019-08-01 17:41:43 +0900427func ensureListEmpty(t *testing.T, result []string) {
428 t.Helper()
429 if len(result) > 0 {
430 t.Errorf("%q is expected to be empty", result)
431 }
432}
433
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000434func ensureListNotEmpty(t *testing.T, result []string) {
435 t.Helper()
436 if len(result) == 0 {
437 t.Errorf("%q is expected to be not empty", result)
438 }
439}
440
Jiyong Park25fc6a92018-11-18 18:02:45 +0900441// Minimal test
442func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800443 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900444 apex_defaults {
445 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900446 manifest: ":myapex.manifest",
447 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900448 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900449 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900450 native_shared_libs: [
451 "mylib",
452 "libfoo.ffi",
453 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900454 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800455 multilib: {
456 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900457 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800458 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900459 },
Jiyong Park77acec62020-06-01 21:39:15 +0900460 java_libs: [
461 "myjar",
462 "myjar_dex",
463 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000464 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900465 }
466
Jiyong Park30ca9372019-02-07 16:27:23 +0900467 apex {
468 name: "myapex",
469 defaults: ["myapex-defaults"],
470 }
471
Jiyong Park25fc6a92018-11-18 18:02:45 +0900472 apex_key {
473 name: "myapex.key",
474 public_key: "testkey.avbpubkey",
475 private_key: "testkey.pem",
476 }
477
Jiyong Park809bb722019-02-13 21:33:49 +0900478 filegroup {
479 name: "myapex.manifest",
480 srcs: ["apex_manifest.json"],
481 }
482
483 filegroup {
484 name: "myapex.androidmanifest",
485 srcs: ["AndroidManifest.xml"],
486 }
487
Jiyong Park25fc6a92018-11-18 18:02:45 +0900488 cc_library {
489 name: "mylib",
490 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900491 shared_libs: [
492 "mylib2",
493 "libbar.ffi",
494 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900495 system_shared_libs: [],
496 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000497 // TODO: remove //apex_available:platform
498 apex_available: [
499 "//apex_available:platform",
500 "myapex",
501 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900502 }
503
Alex Light3d673592019-01-18 14:37:31 -0800504 cc_binary {
505 name: "foo",
506 srcs: ["mylib.cpp"],
507 compile_multilib: "both",
508 multilib: {
509 lib32: {
510 suffix: "32",
511 },
512 lib64: {
513 suffix: "64",
514 },
515 },
516 symlinks: ["foo_link_"],
517 symlink_preferred_arch: true,
518 system_shared_libs: [],
519 static_executable: true,
520 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700521 apex_available: [ "myapex", "com.android.gki.*" ],
522 }
523
Jiyong Park99644e92020-11-17 22:21:02 +0900524 rust_binary {
525 name: "foo.rust",
526 srcs: ["foo.rs"],
527 rlibs: ["libfoo.rlib.rust"],
528 dylibs: ["libfoo.dylib.rust"],
529 apex_available: ["myapex"],
530 }
531
532 rust_library_rlib {
533 name: "libfoo.rlib.rust",
534 srcs: ["foo.rs"],
535 crate_name: "foo",
536 apex_available: ["myapex"],
537 }
538
539 rust_library_dylib {
540 name: "libfoo.dylib.rust",
541 srcs: ["foo.rs"],
542 crate_name: "foo",
543 apex_available: ["myapex"],
544 }
545
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900546 rust_ffi_shared {
547 name: "libfoo.ffi",
548 srcs: ["foo.rs"],
549 crate_name: "foo",
550 apex_available: ["myapex"],
551 }
552
553 rust_ffi_shared {
554 name: "libbar.ffi",
555 srcs: ["foo.rs"],
556 crate_name: "bar",
557 apex_available: ["myapex"],
558 }
559
Yifan Hongd22a84a2020-07-28 17:37:46 -0700560 apex {
561 name: "com.android.gki.fake",
562 binaries: ["foo"],
563 key: "myapex.key",
564 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000565 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800566 }
567
Paul Duffindddd5462020-04-07 15:25:44 +0100568 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900569 name: "mylib2",
570 srcs: ["mylib.cpp"],
571 system_shared_libs: [],
572 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900573 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900574 static_libs: ["libstatic"],
575 // TODO: remove //apex_available:platform
576 apex_available: [
577 "//apex_available:platform",
578 "myapex",
579 ],
580 }
581
Paul Duffindddd5462020-04-07 15:25:44 +0100582 cc_prebuilt_library_shared {
583 name: "mylib2",
584 srcs: ["prebuilt.so"],
585 // TODO: remove //apex_available:platform
586 apex_available: [
587 "//apex_available:platform",
588 "myapex",
589 ],
590 }
591
Jiyong Park9918e1a2020-03-17 19:16:40 +0900592 cc_library_static {
593 name: "libstatic",
594 srcs: ["mylib.cpp"],
595 system_shared_libs: [],
596 stl: "none",
597 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000598 // TODO: remove //apex_available:platform
599 apex_available: [
600 "//apex_available:platform",
601 "myapex",
602 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900603 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900604
605 java_library {
606 name: "myjar",
607 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900608 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900609 sdk_version: "none",
610 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900611 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900612 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000613 // TODO: remove //apex_available:platform
614 apex_available: [
615 "//apex_available:platform",
616 "myapex",
617 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900618 }
619
Jiyong Park77acec62020-06-01 21:39:15 +0900620 dex_import {
621 name: "myjar_dex",
622 jars: ["prebuilt.jar"],
623 apex_available: [
624 "//apex_available:platform",
625 "myapex",
626 ],
627 }
628
Jiyong Park7f7766d2019-07-25 22:02:35 +0900629 java_library {
630 name: "myotherjar",
631 srcs: ["foo/bar/MyClass.java"],
632 sdk_version: "none",
633 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900634 // TODO: remove //apex_available:platform
635 apex_available: [
636 "//apex_available:platform",
637 "myapex",
638 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900639 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900640
641 java_library {
642 name: "mysharedjar",
643 srcs: ["foo/bar/MyClass.java"],
644 sdk_version: "none",
645 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900646 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900647 `)
648
Sundong Ahnabb64432019-10-22 13:58:29 +0900649 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900650
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900651 // Make sure that Android.mk is created
652 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700653 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900654 var builder strings.Builder
655 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
656
657 androidMk := builder.String()
658 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
659 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
660
Jiyong Park42cca6c2019-04-01 11:15:50 +0900661 optFlags := apexRule.Args["opt_flags"]
662 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700663 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900664 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900665
Jiyong Park25fc6a92018-11-18 18:02:45 +0900666 copyCmds := apexRule.Args["copy_commands"]
667
668 // Ensure that main rule creates an output
669 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
670
671 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700672 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
673 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
674 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900675 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900676 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900677
678 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700679 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
680 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900681 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
682 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900683 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900684
685 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800686 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
687 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900688 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900689 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900690 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900691 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
692 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900693 // .. but not for java libs
694 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900695 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800696
Colin Cross7113d202019-11-20 16:39:12 -0800697 // Ensure that the platform variant ends with _shared or _common
698 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
699 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900700 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
701 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900702 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
703
704 // Ensure that dynamic dependency to java libs are not included
705 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800706
707 // Ensure that all symlinks are present.
708 found_foo_link_64 := false
709 found_foo := false
710 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900711 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800712 if strings.HasSuffix(cmd, "bin/foo") {
713 found_foo = true
714 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
715 found_foo_link_64 = true
716 }
717 }
718 }
719 good := found_foo && found_foo_link_64
720 if !good {
721 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
722 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900723
Sundong Ahnabb64432019-10-22 13:58:29 +0900724 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700725 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900726 if len(noticeInputs) != 3 {
727 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900728 }
729 ensureListContains(t, noticeInputs, "NOTICE")
730 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900731 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900732
Artur Satayeva8bd1132020-04-27 18:07:06 +0100733 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100734 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
735 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
736 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
737 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
738 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100739
740 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100741 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
742 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
743 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
744 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
745 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800746}
747
Jooyung Hanf21c7972019-12-16 22:32:06 +0900748func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800749 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900750 apex_defaults {
751 name: "myapex-defaults",
752 key: "myapex.key",
753 prebuilts: ["myetc"],
754 native_shared_libs: ["mylib"],
755 java_libs: ["myjar"],
756 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900757 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800758 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000759 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900760 }
761
762 prebuilt_etc {
763 name: "myetc",
764 src: "myprebuilt",
765 }
766
767 apex {
768 name: "myapex",
769 defaults: ["myapex-defaults"],
770 }
771
772 apex_key {
773 name: "myapex.key",
774 public_key: "testkey.avbpubkey",
775 private_key: "testkey.pem",
776 }
777
778 cc_library {
779 name: "mylib",
780 system_shared_libs: [],
781 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000782 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900783 }
784
785 java_library {
786 name: "myjar",
787 srcs: ["foo/bar/MyClass.java"],
788 sdk_version: "none",
789 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000790 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900791 }
792
793 android_app {
794 name: "AppFoo",
795 srcs: ["foo/bar/MyClass.java"],
796 sdk_version: "none",
797 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000798 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900799 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900800
801 runtime_resource_overlay {
802 name: "rro",
803 theme: "blue",
804 }
805
markchien2f59ec92020-09-02 16:23:38 +0800806 bpf {
807 name: "bpf",
808 srcs: ["bpf.c", "bpf2.c"],
809 }
810
Jooyung Hanf21c7972019-12-16 22:32:06 +0900811 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000812 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900813 "etc/myetc",
814 "javalib/myjar.jar",
815 "lib64/mylib.so",
816 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900817 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800818 "etc/bpf/bpf.o",
819 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900820 })
821}
822
Jooyung Han01a3ee22019-11-02 02:52:25 +0900823func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800824 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900825 apex {
826 name: "myapex",
827 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000828 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900829 }
830
831 apex_key {
832 name: "myapex.key",
833 public_key: "testkey.avbpubkey",
834 private_key: "testkey.pem",
835 }
836 `)
837
838 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900839 args := module.Rule("apexRule").Args
840 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
841 t.Error("manifest should be apex_manifest.pb, but " + manifest)
842 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900843}
844
Alex Light5098a612018-11-29 17:12:15 -0800845func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800846 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800847 apex {
848 name: "myapex",
849 key: "myapex.key",
850 payload_type: "zip",
851 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000852 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800853 }
854
855 apex_key {
856 name: "myapex.key",
857 public_key: "testkey.avbpubkey",
858 private_key: "testkey.pem",
859 }
860
861 cc_library {
862 name: "mylib",
863 srcs: ["mylib.cpp"],
864 shared_libs: ["mylib2"],
865 system_shared_libs: [],
866 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000867 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800868 }
869
870 cc_library {
871 name: "mylib2",
872 srcs: ["mylib.cpp"],
873 system_shared_libs: [],
874 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000875 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800876 }
877 `)
878
Sundong Ahnabb64432019-10-22 13:58:29 +0900879 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800880 copyCmds := zipApexRule.Args["copy_commands"]
881
882 // Ensure that main rule creates an output
883 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
884
885 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700886 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800887
888 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700889 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800890
891 // Ensure that both direct and indirect deps are copied into apex
892 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
893 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894}
895
896func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800897 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 apex {
899 name: "myapex",
900 key: "myapex.key",
901 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000902 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 }
904
905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
910
911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
914 shared_libs: ["mylib2", "mylib3"],
915 system_shared_libs: [],
916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000917 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 }
919
920 cc_library {
921 name: "mylib2",
922 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900923 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
926 stubs: {
927 versions: ["1", "2", "3"],
928 },
929 }
930
931 cc_library {
932 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900933 srcs: ["mylib.cpp"],
934 shared_libs: ["mylib4"],
935 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 stl: "none",
937 stubs: {
938 versions: ["10", "11", "12"],
939 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000940 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900942
943 cc_library {
944 name: "mylib4",
945 srcs: ["mylib.cpp"],
946 system_shared_libs: [],
947 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000948 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900949 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 `)
951
Sundong Ahnabb64432019-10-22 13:58:29 +0900952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 copyCmds := apexRule.Args["copy_commands"]
954
955 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
961 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800962 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963
Colin Crossaede88c2020-08-11 12:17:01 -0700964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965
966 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900967 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900969 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970
971 // 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 -0700972 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700974 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900975
976 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900977 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900978 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900979
980 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700981 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900982
Jooyung Hana57af4a2020-01-23 05:36:59 +0000983 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900984 "lib64/mylib.so",
985 "lib64/mylib3.so",
986 "lib64/mylib4.so",
987 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900988}
989
Colin Cross7812fd32020-09-25 12:35:10 -0700990func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800992 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700993 apex {
994 name: "myapex",
995 key: "myapex.key",
996 native_shared_libs: ["mylib", "mylib3"],
997 min_sdk_version: "29",
998 }
999
1000 apex_key {
1001 name: "myapex.key",
1002 public_key: "testkey.avbpubkey",
1003 private_key: "testkey.pem",
1004 }
1005
1006 cc_library {
1007 name: "mylib",
1008 srcs: ["mylib.cpp"],
1009 shared_libs: ["mylib2", "mylib3"],
1010 system_shared_libs: [],
1011 stl: "none",
1012 apex_available: [ "myapex" ],
1013 min_sdk_version: "28",
1014 }
1015
1016 cc_library {
1017 name: "mylib2",
1018 srcs: ["mylib.cpp"],
1019 cflags: ["-include mylib.h"],
1020 system_shared_libs: [],
1021 stl: "none",
1022 stubs: {
1023 versions: ["28", "29", "30", "current"],
1024 },
1025 min_sdk_version: "28",
1026 }
1027
1028 cc_library {
1029 name: "mylib3",
1030 srcs: ["mylib.cpp"],
1031 shared_libs: ["mylib4"],
1032 system_shared_libs: [],
1033 stl: "none",
1034 stubs: {
1035 versions: ["28", "29", "30", "current"],
1036 },
1037 apex_available: [ "myapex" ],
1038 min_sdk_version: "28",
1039 }
1040
1041 cc_library {
1042 name: "mylib4",
1043 srcs: ["mylib.cpp"],
1044 system_shared_libs: [],
1045 stl: "none",
1046 apex_available: [ "myapex" ],
1047 min_sdk_version: "28",
1048 }
1049 `)
1050
1051 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1052 copyCmds := apexRule.Args["copy_commands"]
1053
1054 // Ensure that direct non-stubs dep is always included
1055 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1056
1057 // Ensure that indirect stubs dep is not included
1058 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1059
1060 // Ensure that direct stubs dep is included
1061 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1062
1063 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1064
Jiyong Park55549df2021-02-26 23:57:23 +09001065 // Ensure that mylib is linking with the latest version of stub for mylib2
1066 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001067 // ... and not linking to the non-stub (impl) variant of mylib2
1068 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1069
1070 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1071 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1072 // .. and not linking to the stubs variant of mylib3
1073 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1074
1075 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001076 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001077 ensureNotContains(t, mylib2Cflags, "-include ")
1078
1079 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001080 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001081
1082 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1083 "lib64/mylib.so",
1084 "lib64/mylib3.so",
1085 "lib64/mylib4.so",
1086 })
1087}
1088
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001089func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1090 t.Parallel()
1091 // myapex (Z)
1092 // mylib -----------------.
1093 // |
1094 // otherapex (29) |
1095 // libstub's versions: 29 Z current
1096 // |
1097 // <platform> |
1098 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001099 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001100 apex {
1101 name: "myapex",
1102 key: "myapex.key",
1103 native_shared_libs: ["mylib"],
1104 min_sdk_version: "Z", // non-final
1105 }
1106
1107 cc_library {
1108 name: "mylib",
1109 srcs: ["mylib.cpp"],
1110 shared_libs: ["libstub"],
1111 apex_available: ["myapex"],
1112 min_sdk_version: "Z",
1113 }
1114
1115 apex_key {
1116 name: "myapex.key",
1117 public_key: "testkey.avbpubkey",
1118 private_key: "testkey.pem",
1119 }
1120
1121 apex {
1122 name: "otherapex",
1123 key: "myapex.key",
1124 native_shared_libs: ["libstub"],
1125 min_sdk_version: "29",
1126 }
1127
1128 cc_library {
1129 name: "libstub",
1130 srcs: ["mylib.cpp"],
1131 stubs: {
1132 versions: ["29", "Z", "current"],
1133 },
1134 apex_available: ["otherapex"],
1135 min_sdk_version: "29",
1136 }
1137
1138 // platform module depending on libstub from otherapex should use the latest stub("current")
1139 cc_library {
1140 name: "libplatform",
1141 srcs: ["mylib.cpp"],
1142 shared_libs: ["libstub"],
1143 }
1144 `, func(fs map[string][]byte, config android.Config) {
1145 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1146 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1147 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1148 })
1149
Jiyong Park55549df2021-02-26 23:57:23 +09001150 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001151 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001152 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001153 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001154 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001155
1156 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1157 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1158 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1159 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1160 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1161}
1162
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001163func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001164 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001165 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001166 name: "myapex2",
1167 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001168 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001169 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001170 }
1171
1172 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001173 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001174 public_key: "testkey.avbpubkey",
1175 private_key: "testkey.pem",
1176 }
1177
1178 cc_library {
1179 name: "mylib",
1180 srcs: ["mylib.cpp"],
1181 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001182 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001183 system_shared_libs: [],
1184 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001185 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001186 }
1187
1188 cc_library {
1189 name: "libfoo",
1190 srcs: ["mylib.cpp"],
1191 shared_libs: ["libbar"],
1192 system_shared_libs: [],
1193 stl: "none",
1194 stubs: {
1195 versions: ["10", "20", "30"],
1196 },
1197 }
1198
1199 cc_library {
1200 name: "libbar",
1201 srcs: ["mylib.cpp"],
1202 system_shared_libs: [],
1203 stl: "none",
1204 }
1205
Jiyong Park678c8812020-02-07 17:25:49 +09001206 cc_library_static {
1207 name: "libbaz",
1208 srcs: ["mylib.cpp"],
1209 system_shared_libs: [],
1210 stl: "none",
1211 apex_available: [ "myapex2" ],
1212 }
1213
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 `)
1215
Jiyong Park83dc74b2020-01-14 18:38:44 +09001216 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001217 copyCmds := apexRule.Args["copy_commands"]
1218
1219 // Ensure that direct non-stubs dep is always included
1220 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1221
1222 // Ensure that indirect stubs dep is not included
1223 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1224
1225 // Ensure that dependency of stubs is not included
1226 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1227
Colin Crossaede88c2020-08-11 12:17:01 -07001228 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229
1230 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001231 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001233 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234
Jiyong Park3ff16992019-12-27 14:11:47 +09001235 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001236
1237 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1238 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001239
Artur Satayeva8bd1132020-04-27 18:07:06 +01001240 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001241 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1242 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1243 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001244
Artur Satayeva8bd1132020-04-27 18:07:06 +01001245 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001246 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1247 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1248 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001249}
1250
Jooyung Hand3639552019-08-09 12:57:43 +09001251func TestApexWithRuntimeLibsDependency(t *testing.T) {
1252 /*
1253 myapex
1254 |
1255 v (runtime_libs)
1256 mylib ------+------> libfoo [provides stub]
1257 |
1258 `------> libbar
1259 */
Colin Cross1c460562021-02-16 17:55:47 -08001260 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001261 apex {
1262 name: "myapex",
1263 key: "myapex.key",
1264 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001265 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001266 }
1267
1268 apex_key {
1269 name: "myapex.key",
1270 public_key: "testkey.avbpubkey",
1271 private_key: "testkey.pem",
1272 }
1273
1274 cc_library {
1275 name: "mylib",
1276 srcs: ["mylib.cpp"],
1277 runtime_libs: ["libfoo", "libbar"],
1278 system_shared_libs: [],
1279 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001280 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001281 }
1282
1283 cc_library {
1284 name: "libfoo",
1285 srcs: ["mylib.cpp"],
1286 system_shared_libs: [],
1287 stl: "none",
1288 stubs: {
1289 versions: ["10", "20", "30"],
1290 },
1291 }
1292
1293 cc_library {
1294 name: "libbar",
1295 srcs: ["mylib.cpp"],
1296 system_shared_libs: [],
1297 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001298 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001299 }
1300
1301 `)
1302
Sundong Ahnabb64432019-10-22 13:58:29 +09001303 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001304 copyCmds := apexRule.Args["copy_commands"]
1305
1306 // Ensure that direct non-stubs dep is always included
1307 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1308
1309 // Ensure that indirect stubs dep is not included
1310 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1311
1312 // Ensure that runtime_libs dep in included
1313 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1314
Sundong Ahnabb64432019-10-22 13:58:29 +09001315 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001316 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1317 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001318
1319}
1320
Paul Duffina02cae32021-03-09 01:44:06 +00001321var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1322 cc.PrepareForTestWithCcBuildComponents,
1323 PrepareForTestWithApexBuildComponents,
1324 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001325 apex {
1326 name: "com.android.runtime",
1327 key: "com.android.runtime.key",
1328 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001329 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001330 }
1331
1332 apex_key {
1333 name: "com.android.runtime.key",
1334 public_key: "testkey.avbpubkey",
1335 private_key: "testkey.pem",
1336 }
Paul Duffina02cae32021-03-09 01:44:06 +00001337 `),
1338 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1339)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001340
Paul Duffina02cae32021-03-09 01:44:06 +00001341func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1342 result := emptyFixtureFactory.Extend(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001343 cc_library {
1344 name: "libc",
1345 no_libcrt: true,
1346 nocrt: true,
1347 stl: "none",
1348 system_shared_libs: [],
1349 stubs: { versions: ["1"] },
1350 apex_available: ["com.android.runtime"],
1351
1352 sanitize: {
1353 hwaddress: true,
1354 }
1355 }
1356
1357 cc_prebuilt_library_shared {
1358 name: "libclang_rt.hwasan-aarch64-android",
1359 no_libcrt: true,
1360 nocrt: true,
1361 stl: "none",
1362 system_shared_libs: [],
1363 srcs: [""],
1364 stubs: { versions: ["1"] },
1365
1366 sanitize: {
1367 never: true,
1368 },
Paul Duffina02cae32021-03-09 01:44:06 +00001369 } `)
1370 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001371
1372 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1373 "lib64/bionic/libc.so",
1374 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1375 })
1376
1377 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1378
1379 installed := hwasan.Description("install libclang_rt.hwasan")
1380 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1381
1382 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1383 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1384 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1385}
1386
1387func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffina02cae32021-03-09 01:44:06 +00001388 result := emptyFixtureFactory.Extend(
1389 prepareForTestOfRuntimeApexWithHwasan,
1390 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1391 variables.SanitizeDevice = []string{"hwaddress"}
1392 }),
1393 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001394 cc_library {
1395 name: "libc",
1396 no_libcrt: true,
1397 nocrt: true,
1398 stl: "none",
1399 system_shared_libs: [],
1400 stubs: { versions: ["1"] },
1401 apex_available: ["com.android.runtime"],
1402 }
1403
1404 cc_prebuilt_library_shared {
1405 name: "libclang_rt.hwasan-aarch64-android",
1406 no_libcrt: true,
1407 nocrt: true,
1408 stl: "none",
1409 system_shared_libs: [],
1410 srcs: [""],
1411 stubs: { versions: ["1"] },
1412
1413 sanitize: {
1414 never: true,
1415 },
1416 }
Paul Duffina02cae32021-03-09 01:44:06 +00001417 `)
1418 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001419
1420 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1421 "lib64/bionic/libc.so",
1422 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1423 })
1424
1425 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1426
1427 installed := hwasan.Description("install libclang_rt.hwasan")
1428 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1429
1430 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1431 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1432 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1433}
1434
Jooyung Han61b66e92020-03-21 14:21:46 +00001435func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1436 testcases := []struct {
1437 name string
1438 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001439 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001440 shouldLink string
1441 shouldNotLink []string
1442 }{
1443 {
Jiyong Park55549df2021-02-26 23:57:23 +09001444 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001445 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001446 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001447 shouldLink: "30",
1448 shouldNotLink: []string{"29"},
1449 },
1450 {
Jiyong Park55549df2021-02-26 23:57:23 +09001451 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001452 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001453 apexVariant: "apex29",
Jiyong Park55549df2021-02-26 23:57:23 +09001454 shouldLink: "30",
1455 shouldNotLink: []string{"29"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001456 },
1457 }
1458 for _, tc := range testcases {
1459 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001460 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001461 apex {
1462 name: "myapex",
1463 key: "myapex.key",
1464 use_vendor: true,
1465 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001466 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001467 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001468 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001469
Jooyung Han61b66e92020-03-21 14:21:46 +00001470 apex_key {
1471 name: "myapex.key",
1472 public_key: "testkey.avbpubkey",
1473 private_key: "testkey.pem",
1474 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001475
Jooyung Han61b66e92020-03-21 14:21:46 +00001476 cc_library {
1477 name: "mylib",
1478 srcs: ["mylib.cpp"],
1479 vendor_available: true,
1480 shared_libs: ["libbar"],
1481 system_shared_libs: [],
1482 stl: "none",
1483 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001484 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001485 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001486
Jooyung Han61b66e92020-03-21 14:21:46 +00001487 cc_library {
1488 name: "libbar",
1489 srcs: ["mylib.cpp"],
1490 system_shared_libs: [],
1491 stl: "none",
1492 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001493 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001494 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001495
Jooyung Han61b66e92020-03-21 14:21:46 +00001496 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001497 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 symbol_file: "",
1499 }
1500 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001501 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001502 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001503
Jooyung Han61b66e92020-03-21 14:21:46 +00001504 // Ensure that LLNDK dep is not included
1505 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1506 "lib64/mylib.so",
1507 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001508
Jooyung Han61b66e92020-03-21 14:21:46 +00001509 // Ensure that LLNDK dep is required
1510 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1511 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1512 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001513
Colin Crossaede88c2020-08-11 12:17:01 -07001514 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001515 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001516 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001517 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001518 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001519
Colin Crossaede88c2020-08-11 12:17:01 -07001520 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001521 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1522 })
1523 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001524}
1525
Jiyong Park25fc6a92018-11-18 18:02:45 +09001526func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001527 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001528 apex {
1529 name: "myapex",
1530 key: "myapex.key",
1531 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001532 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001533 }
1534
1535 apex_key {
1536 name: "myapex.key",
1537 public_key: "testkey.avbpubkey",
1538 private_key: "testkey.pem",
1539 }
1540
1541 cc_library {
1542 name: "mylib",
1543 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001544 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001545 shared_libs: ["libdl#27"],
1546 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001547 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001548 }
1549
1550 cc_library_shared {
1551 name: "mylib_shared",
1552 srcs: ["mylib.cpp"],
1553 shared_libs: ["libdl#27"],
1554 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001555 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001556 }
1557
1558 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001559 name: "libBootstrap",
1560 srcs: ["mylib.cpp"],
1561 stl: "none",
1562 bootstrap: true,
1563 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001564 `)
1565
Sundong Ahnabb64432019-10-22 13:58:29 +09001566 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001567 copyCmds := apexRule.Args["copy_commands"]
1568
1569 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001570 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001571 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1572 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001573
1574 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001575 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001576
Colin Crossaede88c2020-08-11 12:17:01 -07001577 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1578 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1579 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001580
1581 // For dependency to libc
1582 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001583 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001585 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 // ... Cflags from stub is correctly exported to mylib
1587 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1588 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1589
1590 // For dependency to libm
1591 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001592 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001593 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001594 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001595 // ... and is not compiling with the stub
1596 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1597 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1598
1599 // For dependency to libdl
1600 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001601 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001602 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001603 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1604 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001605 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001606 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001607 // ... Cflags from stub is correctly exported to mylib
1608 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1609 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001610
1611 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001612 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1613 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1614 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1615 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001617
Jooyung Han749dc692020-04-15 11:03:39 +09001618func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001619 // there are three links between liba --> libz.
1620 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001621 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001622 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001623 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001624 apex {
1625 name: "myapex",
1626 key: "myapex.key",
1627 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001628 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001629 }
1630
1631 apex {
1632 name: "otherapex",
1633 key: "myapex.key",
1634 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001635 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001636 }
1637
1638 apex_key {
1639 name: "myapex.key",
1640 public_key: "testkey.avbpubkey",
1641 private_key: "testkey.pem",
1642 }
1643
1644 cc_library {
1645 name: "libx",
1646 shared_libs: ["liba"],
1647 system_shared_libs: [],
1648 stl: "none",
1649 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001650 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001651 }
1652
1653 cc_library {
1654 name: "liby",
1655 shared_libs: ["liba"],
1656 system_shared_libs: [],
1657 stl: "none",
1658 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001659 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001660 }
1661
1662 cc_library {
1663 name: "liba",
1664 shared_libs: ["libz"],
1665 system_shared_libs: [],
1666 stl: "none",
1667 apex_available: [
1668 "//apex_available:anyapex",
1669 "//apex_available:platform",
1670 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001671 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001672 }
1673
1674 cc_library {
1675 name: "libz",
1676 system_shared_libs: [],
1677 stl: "none",
1678 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001679 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001680 },
1681 }
Jooyung Han749dc692020-04-15 11:03:39 +09001682 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001683
1684 expectLink := func(from, from_variant, to, to_variant string) {
1685 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1686 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1687 }
1688 expectNoLink := func(from, from_variant, to, to_variant string) {
1689 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1690 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1691 }
1692 // platform liba is linked to non-stub version
1693 expectLink("liba", "shared", "libz", "shared")
Jiyong Park55549df2021-02-26 23:57:23 +09001694 // liba in myapex is linked to #30
1695 expectLink("liba", "shared_apex29", "libz", "shared_30")
1696 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001697 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001698 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001699 expectLink("liba", "shared_apex30", "libz", "shared_30")
1700 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1701 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001702}
1703
Jooyung Hanaed150d2020-04-02 01:41:41 +09001704func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001705 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001706 apex {
1707 name: "myapex",
1708 key: "myapex.key",
1709 native_shared_libs: ["libx"],
1710 min_sdk_version: "R",
1711 }
1712
1713 apex_key {
1714 name: "myapex.key",
1715 public_key: "testkey.avbpubkey",
1716 private_key: "testkey.pem",
1717 }
1718
1719 cc_library {
1720 name: "libx",
1721 shared_libs: ["libz"],
1722 system_shared_libs: [],
1723 stl: "none",
1724 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001725 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001726 }
1727
1728 cc_library {
1729 name: "libz",
1730 system_shared_libs: [],
1731 stl: "none",
1732 stubs: {
1733 versions: ["29", "R"],
1734 },
1735 }
1736 `, func(fs map[string][]byte, config android.Config) {
1737 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1738 })
1739
1740 expectLink := func(from, from_variant, to, to_variant string) {
1741 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1742 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1743 }
1744 expectNoLink := func(from, from_variant, to, to_variant string) {
1745 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1746 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1747 }
Dan Albertc8060532020-07-22 22:32:17 -07001748 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001749 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1750 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001751}
1752
Jooyung Han749dc692020-04-15 11:03:39 +09001753func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001754 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001755 apex {
1756 name: "myapex",
1757 key: "myapex.key",
1758 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001759 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001760 }
1761
1762 apex_key {
1763 name: "myapex.key",
1764 public_key: "testkey.avbpubkey",
1765 private_key: "testkey.pem",
1766 }
1767
1768 cc_library {
1769 name: "libx",
1770 shared_libs: ["libz"],
1771 system_shared_libs: [],
1772 stl: "none",
1773 apex_available: [ "myapex" ],
1774 }
1775
1776 cc_library {
1777 name: "libz",
1778 system_shared_libs: [],
1779 stl: "none",
1780 stubs: {
1781 versions: ["1", "2"],
1782 },
1783 }
1784 `)
1785
1786 expectLink := func(from, from_variant, to, to_variant string) {
1787 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1788 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1789 }
1790 expectNoLink := func(from, from_variant, to, to_variant string) {
1791 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1792 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1793 }
Colin Crossaede88c2020-08-11 12:17:01 -07001794 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1795 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1796 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001797}
1798
1799func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001800 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001801 apex {
1802 name: "myapex",
1803 key: "myapex.key",
1804 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001805 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001806 }
1807
1808 apex_key {
1809 name: "myapex.key",
1810 public_key: "testkey.avbpubkey",
1811 private_key: "testkey.pem",
1812 }
1813
1814 cc_library {
1815 name: "libx",
1816 system_shared_libs: [],
1817 stl: "none",
1818 apex_available: [ "myapex" ],
1819 stubs: {
1820 versions: ["1", "2"],
1821 },
1822 }
1823
1824 cc_library {
1825 name: "libz",
1826 shared_libs: ["libx"],
1827 system_shared_libs: [],
1828 stl: "none",
1829 }
1830 `)
1831
1832 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001833 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001834 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1835 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1836 }
1837 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001838 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001839 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1840 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1841 }
1842 expectLink("libz", "shared", "libx", "shared_2")
1843 expectNoLink("libz", "shared", "libz", "shared_1")
1844 expectNoLink("libz", "shared", "libz", "shared")
1845}
1846
Jooyung Han75568392020-03-20 04:29:24 +09001847func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001848 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001849 apex {
1850 name: "myapex",
1851 key: "myapex.key",
1852 native_shared_libs: ["libx"],
1853 min_sdk_version: "29",
1854 }
1855
1856 apex_key {
1857 name: "myapex.key",
1858 public_key: "testkey.avbpubkey",
1859 private_key: "testkey.pem",
1860 }
1861
1862 cc_library {
1863 name: "libx",
1864 shared_libs: ["libbar"],
1865 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001866 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001867 }
1868
1869 cc_library {
1870 name: "libbar",
1871 stubs: {
1872 versions: ["29", "30"],
1873 },
1874 }
Jooyung Han75568392020-03-20 04:29:24 +09001875 `, func(fs map[string][]byte, config android.Config) {
1876 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1877 })
Jooyung Han03b51852020-02-26 22:45:42 +09001878 expectLink := func(from, from_variant, to, to_variant string) {
1879 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1880 libFlags := ld.Args["libFlags"]
1881 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
Colin Crossaede88c2020-08-11 12:17:01 -07001883 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001884}
1885
Jooyung Han75568392020-03-20 04:29:24 +09001886func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001887 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001888 apex {
1889 name: "myapex",
1890 key: "myapex.key",
1891 native_shared_libs: ["libx"],
1892 min_sdk_version: "29",
1893 }
1894
1895 apex_key {
1896 name: "myapex.key",
1897 public_key: "testkey.avbpubkey",
1898 private_key: "testkey.pem",
1899 }
1900
1901 cc_library {
1902 name: "libx",
1903 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001904 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001905 }
Jooyung Han75568392020-03-20 04:29:24 +09001906 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001907
1908 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001909 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001910 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001911 // note that platform variant is not.
1912 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001913 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001914}
1915
Jooyung Han749dc692020-04-15 11:03:39 +09001916func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1917 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001918 apex {
1919 name: "myapex",
1920 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001921 native_shared_libs: ["mylib"],
1922 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001923 }
1924
1925 apex_key {
1926 name: "myapex.key",
1927 public_key: "testkey.avbpubkey",
1928 private_key: "testkey.pem",
1929 }
Jooyung Han749dc692020-04-15 11:03:39 +09001930
1931 cc_library {
1932 name: "mylib",
1933 srcs: ["mylib.cpp"],
1934 system_shared_libs: [],
1935 stl: "none",
1936 apex_available: [
1937 "myapex",
1938 ],
1939 min_sdk_version: "30",
1940 }
1941 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001942
1943 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1944 apex {
1945 name: "myapex",
1946 key: "myapex.key",
1947 native_shared_libs: ["libfoo.ffi"],
1948 min_sdk_version: "29",
1949 }
1950
1951 apex_key {
1952 name: "myapex.key",
1953 public_key: "testkey.avbpubkey",
1954 private_key: "testkey.pem",
1955 }
1956
1957 rust_ffi_shared {
1958 name: "libfoo.ffi",
1959 srcs: ["foo.rs"],
1960 crate_name: "foo",
1961 apex_available: [
1962 "myapex",
1963 ],
1964 min_sdk_version: "30",
1965 }
1966 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001967}
1968
1969func TestApexMinSdkVersion_Okay(t *testing.T) {
1970 testApex(t, `
1971 apex {
1972 name: "myapex",
1973 key: "myapex.key",
1974 native_shared_libs: ["libfoo"],
1975 java_libs: ["libbar"],
1976 min_sdk_version: "29",
1977 }
1978
1979 apex_key {
1980 name: "myapex.key",
1981 public_key: "testkey.avbpubkey",
1982 private_key: "testkey.pem",
1983 }
1984
1985 cc_library {
1986 name: "libfoo",
1987 srcs: ["mylib.cpp"],
1988 shared_libs: ["libfoo_dep"],
1989 apex_available: ["myapex"],
1990 min_sdk_version: "29",
1991 }
1992
1993 cc_library {
1994 name: "libfoo_dep",
1995 srcs: ["mylib.cpp"],
1996 apex_available: ["myapex"],
1997 min_sdk_version: "29",
1998 }
1999
2000 java_library {
2001 name: "libbar",
2002 sdk_version: "current",
2003 srcs: ["a.java"],
2004 static_libs: ["libbar_dep"],
2005 apex_available: ["myapex"],
2006 min_sdk_version: "29",
2007 }
2008
2009 java_library {
2010 name: "libbar_dep",
2011 sdk_version: "current",
2012 srcs: ["a.java"],
2013 apex_available: ["myapex"],
2014 min_sdk_version: "29",
2015 }
Jooyung Han03b51852020-02-26 22:45:42 +09002016 `)
2017}
2018
Artur Satayev8cf899a2020-04-15 17:29:42 +01002019func TestJavaStableSdkVersion(t *testing.T) {
2020 testCases := []struct {
2021 name string
2022 expectedError string
2023 bp string
2024 }{
2025 {
2026 name: "Non-updatable apex with non-stable dep",
2027 bp: `
2028 apex {
2029 name: "myapex",
2030 java_libs: ["myjar"],
2031 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002032 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002033 }
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039 java_library {
2040 name: "myjar",
2041 srcs: ["foo/bar/MyClass.java"],
2042 sdk_version: "core_platform",
2043 apex_available: ["myapex"],
2044 }
2045 `,
2046 },
2047 {
2048 name: "Updatable apex with stable dep",
2049 bp: `
2050 apex {
2051 name: "myapex",
2052 java_libs: ["myjar"],
2053 key: "myapex.key",
2054 updatable: true,
2055 min_sdk_version: "29",
2056 }
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }
2062 java_library {
2063 name: "myjar",
2064 srcs: ["foo/bar/MyClass.java"],
2065 sdk_version: "current",
2066 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002067 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002068 }
2069 `,
2070 },
2071 {
2072 name: "Updatable apex with non-stable dep",
2073 expectedError: "cannot depend on \"myjar\"",
2074 bp: `
2075 apex {
2076 name: "myapex",
2077 java_libs: ["myjar"],
2078 key: "myapex.key",
2079 updatable: true,
2080 }
2081 apex_key {
2082 name: "myapex.key",
2083 public_key: "testkey.avbpubkey",
2084 private_key: "testkey.pem",
2085 }
2086 java_library {
2087 name: "myjar",
2088 srcs: ["foo/bar/MyClass.java"],
2089 sdk_version: "core_platform",
2090 apex_available: ["myapex"],
2091 }
2092 `,
2093 },
2094 {
2095 name: "Updatable apex with non-stable transitive dep",
Jiyong Park670e0f62021-02-18 13:10:18 +09002096 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002097 bp: `
2098 apex {
2099 name: "myapex",
2100 java_libs: ["myjar"],
2101 key: "myapex.key",
2102 updatable: true,
2103 }
2104 apex_key {
2105 name: "myapex.key",
2106 public_key: "testkey.avbpubkey",
2107 private_key: "testkey.pem",
2108 }
2109 java_library {
2110 name: "myjar",
2111 srcs: ["foo/bar/MyClass.java"],
2112 sdk_version: "current",
2113 apex_available: ["myapex"],
2114 static_libs: ["transitive-jar"],
2115 }
2116 java_library {
2117 name: "transitive-jar",
2118 srcs: ["foo/bar/MyClass.java"],
2119 sdk_version: "core_platform",
2120 apex_available: ["myapex"],
2121 }
2122 `,
2123 },
2124 }
2125
2126 for _, test := range testCases {
2127 t.Run(test.name, func(t *testing.T) {
2128 if test.expectedError == "" {
2129 testApex(t, test.bp)
2130 } else {
2131 testApexError(t, test.expectedError, test.bp)
2132 }
2133 })
2134 }
2135}
2136
Jooyung Han749dc692020-04-15 11:03:39 +09002137func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2138 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2139 apex {
2140 name: "myapex",
2141 key: "myapex.key",
2142 native_shared_libs: ["mylib"],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex_key {
2147 name: "myapex.key",
2148 public_key: "testkey.avbpubkey",
2149 private_key: "testkey.pem",
2150 }
2151
2152 cc_library {
2153 name: "mylib",
2154 srcs: ["mylib.cpp"],
2155 shared_libs: ["mylib2"],
2156 system_shared_libs: [],
2157 stl: "none",
2158 apex_available: [
2159 "myapex",
2160 ],
2161 min_sdk_version: "29",
2162 }
2163
2164 // indirect part of the apex
2165 cc_library {
2166 name: "mylib2",
2167 srcs: ["mylib.cpp"],
2168 system_shared_libs: [],
2169 stl: "none",
2170 apex_available: [
2171 "myapex",
2172 ],
2173 min_sdk_version: "30",
2174 }
2175 `)
2176}
2177
2178func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2179 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2180 apex {
2181 name: "myapex",
2182 key: "myapex.key",
2183 apps: ["AppFoo"],
2184 min_sdk_version: "29",
2185 }
2186
2187 apex_key {
2188 name: "myapex.key",
2189 public_key: "testkey.avbpubkey",
2190 private_key: "testkey.pem",
2191 }
2192
2193 android_app {
2194 name: "AppFoo",
2195 srcs: ["foo/bar/MyClass.java"],
2196 sdk_version: "current",
2197 min_sdk_version: "29",
2198 system_modules: "none",
2199 stl: "none",
2200 static_libs: ["bar"],
2201 apex_available: [ "myapex" ],
2202 }
2203
2204 java_library {
2205 name: "bar",
2206 sdk_version: "current",
2207 srcs: ["a.java"],
2208 apex_available: [ "myapex" ],
2209 }
2210 `)
2211}
2212
2213func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002214 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002215 apex {
2216 name: "myapex",
2217 key: "myapex.key",
2218 native_shared_libs: ["mylib"],
2219 min_sdk_version: "29",
2220 }
2221
2222 apex_key {
2223 name: "myapex.key",
2224 public_key: "testkey.avbpubkey",
2225 private_key: "testkey.pem",
2226 }
2227
Jiyong Park55549df2021-02-26 23:57:23 +09002228 // mylib in myapex will link to mylib2#30
Jooyung Han749dc692020-04-15 11:03:39 +09002229 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2230 cc_library {
2231 name: "mylib",
2232 srcs: ["mylib.cpp"],
2233 shared_libs: ["mylib2"],
2234 system_shared_libs: [],
2235 stl: "none",
2236 apex_available: ["myapex", "otherapex"],
2237 min_sdk_version: "29",
2238 }
2239
2240 cc_library {
2241 name: "mylib2",
2242 srcs: ["mylib.cpp"],
2243 system_shared_libs: [],
2244 stl: "none",
2245 apex_available: ["otherapex"],
2246 stubs: { versions: ["29", "30"] },
2247 min_sdk_version: "30",
2248 }
2249
2250 apex {
2251 name: "otherapex",
2252 key: "myapex.key",
2253 native_shared_libs: ["mylib", "mylib2"],
2254 min_sdk_version: "30",
2255 }
2256 `)
2257 expectLink := func(from, from_variant, to, to_variant string) {
2258 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2259 libFlags := ld.Args["libFlags"]
2260 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2261 }
Jiyong Park55549df2021-02-26 23:57:23 +09002262 expectLink("mylib", "shared_apex29", "mylib2", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002263 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002264}
2265
Jooyung Haned124c32021-01-26 11:43:46 +09002266func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2267 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2268 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2269 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2270 }
2271 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2272 apex {
2273 name: "myapex",
2274 key: "myapex.key",
2275 native_shared_libs: ["libfoo"],
2276 min_sdk_version: "S",
2277 }
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283 cc_library {
2284 name: "libfoo",
2285 shared_libs: ["libbar"],
2286 apex_available: ["myapex"],
2287 min_sdk_version: "29",
2288 }
2289 cc_library {
2290 name: "libbar",
2291 apex_available: ["myapex"],
2292 }
2293 `, withSAsActiveCodeNames)
2294}
2295
2296func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2297 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2298 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2299 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2300 }
Colin Cross1c460562021-02-16 17:55:47 -08002301 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002302 apex {
2303 name: "myapex",
2304 key: "myapex.key",
2305 native_shared_libs: ["libfoo"],
2306 min_sdk_version: "S",
2307 }
2308 apex_key {
2309 name: "myapex.key",
2310 public_key: "testkey.avbpubkey",
2311 private_key: "testkey.pem",
2312 }
2313 cc_library {
2314 name: "libfoo",
2315 shared_libs: ["libbar"],
2316 apex_available: ["myapex"],
2317 min_sdk_version: "S",
2318 }
2319 cc_library {
2320 name: "libbar",
2321 stubs: {
2322 symbol_file: "libbar.map.txt",
2323 versions: ["30", "S", "T"],
2324 },
2325 }
2326 `, withSAsActiveCodeNames)
2327
2328 // ensure libfoo is linked with "S" version of libbar stub
2329 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2330 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09002331 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_T/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002332}
2333
Jiyong Park7c2ee712018-12-07 00:42:25 +09002334func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002335 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002336 apex {
2337 name: "myapex",
2338 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002339 native_shared_libs: ["mylib"],
2340 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002341 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002342 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002343 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002344 }
2345
2346 apex_key {
2347 name: "myapex.key",
2348 public_key: "testkey.avbpubkey",
2349 private_key: "testkey.pem",
2350 }
2351
2352 prebuilt_etc {
2353 name: "myetc",
2354 src: "myprebuilt",
2355 sub_dir: "foo/bar",
2356 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002357
2358 cc_library {
2359 name: "mylib",
2360 srcs: ["mylib.cpp"],
2361 relative_install_path: "foo/bar",
2362 system_shared_libs: [],
2363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002364 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002365 }
2366
2367 cc_binary {
2368 name: "mybin",
2369 srcs: ["mylib.cpp"],
2370 relative_install_path: "foo/bar",
2371 system_shared_libs: [],
2372 static_executable: true,
2373 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002374 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002375 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002376 `)
2377
Sundong Ahnabb64432019-10-22 13:58:29 +09002378 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002379 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2380
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002381 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002382 ensureListContains(t, dirs, "etc")
2383 ensureListContains(t, dirs, "etc/foo")
2384 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002385 ensureListContains(t, dirs, "lib64")
2386 ensureListContains(t, dirs, "lib64/foo")
2387 ensureListContains(t, dirs, "lib64/foo/bar")
2388 ensureListContains(t, dirs, "lib")
2389 ensureListContains(t, dirs, "lib/foo")
2390 ensureListContains(t, dirs, "lib/foo/bar")
2391
Jiyong Parkbd13e442019-03-15 18:10:35 +09002392 ensureListContains(t, dirs, "bin")
2393 ensureListContains(t, dirs, "bin/foo")
2394 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002395}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002396
Jooyung Han35155c42020-02-06 17:33:20 +09002397func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002398 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002399 apex {
2400 name: "myapex",
2401 key: "myapex.key",
2402 multilib: {
2403 both: {
2404 native_shared_libs: ["mylib"],
2405 binaries: ["mybin"],
2406 },
2407 },
2408 compile_multilib: "both",
2409 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002410 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002411 }
2412
2413 apex_key {
2414 name: "myapex.key",
2415 public_key: "testkey.avbpubkey",
2416 private_key: "testkey.pem",
2417 }
2418
2419 cc_library {
2420 name: "mylib",
2421 relative_install_path: "foo/bar",
2422 system_shared_libs: [],
2423 stl: "none",
2424 apex_available: [ "myapex" ],
2425 native_bridge_supported: true,
2426 }
2427
2428 cc_binary {
2429 name: "mybin",
2430 relative_install_path: "foo/bar",
2431 system_shared_libs: [],
2432 static_executable: true,
2433 stl: "none",
2434 apex_available: [ "myapex" ],
2435 native_bridge_supported: true,
2436 compile_multilib: "both", // default is "first" for binary
2437 multilib: {
2438 lib64: {
2439 suffix: "64",
2440 },
2441 },
2442 }
2443 `, withNativeBridgeEnabled)
2444 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2445 "bin/foo/bar/mybin",
2446 "bin/foo/bar/mybin64",
2447 "bin/arm/foo/bar/mybin",
2448 "bin/arm64/foo/bar/mybin64",
2449 "lib/foo/bar/mylib.so",
2450 "lib/arm/foo/bar/mylib.so",
2451 "lib64/foo/bar/mylib.so",
2452 "lib64/arm64/foo/bar/mylib.so",
2453 })
2454}
2455
Jiyong Parkda6eb592018-12-19 17:12:36 +09002456func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002457 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002458 apex {
2459 name: "myapex",
2460 key: "myapex.key",
2461 native_shared_libs: ["mylib"],
2462 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002463 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002464 }
2465
2466 apex_key {
2467 name: "myapex.key",
2468 public_key: "testkey.avbpubkey",
2469 private_key: "testkey.pem",
2470 }
2471
2472 cc_library {
2473 name: "mylib",
2474 srcs: ["mylib.cpp"],
2475 shared_libs: ["mylib2"],
2476 system_shared_libs: [],
2477 vendor_available: true,
2478 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002479 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002480 }
2481
2482 cc_library {
2483 name: "mylib2",
2484 srcs: ["mylib.cpp"],
2485 system_shared_libs: [],
2486 vendor_available: true,
2487 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002488 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002489 }
Jooyung Handc782442019-11-01 03:14:38 +09002490 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002491 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002492 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002493
2494 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002495 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002496 for _, implicit := range i.Implicits {
2497 inputsList = append(inputsList, implicit.String())
2498 }
2499 }
2500 inputsString := strings.Join(inputsList, " ")
2501
2502 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002503 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2504 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002505
2506 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002507 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2508 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002509}
Jiyong Park16e91a02018-12-20 18:18:08 +09002510
Jooyung Han85d61762020-06-24 23:50:26 +09002511func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002512 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2513 apex {
2514 name: "myapex",
2515 key: "myapex.key",
2516 use_vendor: true,
2517 }
2518 apex_key {
2519 name: "myapex.key",
2520 public_key: "testkey.avbpubkey",
2521 private_key: "testkey.pem",
2522 }
2523 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002524 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002525 })
Colin Cross440e0d02020-06-11 11:32:11 -07002526 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002527 testApex(t, `
2528 apex {
2529 name: "myapex",
2530 key: "myapex.key",
2531 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002532 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002533 }
2534 apex_key {
2535 name: "myapex.key",
2536 public_key: "testkey.avbpubkey",
2537 private_key: "testkey.pem",
2538 }
2539 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002540 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002541 })
2542}
2543
Jooyung Han5c998b92019-06-27 11:30:33 +09002544func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2545 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2546 apex {
2547 name: "myapex",
2548 key: "myapex.key",
2549 native_shared_libs: ["mylib"],
2550 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002551 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002552 }
2553
2554 apex_key {
2555 name: "myapex.key",
2556 public_key: "testkey.avbpubkey",
2557 private_key: "testkey.pem",
2558 }
2559
2560 cc_library {
2561 name: "mylib",
2562 srcs: ["mylib.cpp"],
2563 system_shared_libs: [],
2564 stl: "none",
2565 }
2566 `)
2567}
2568
Jooyung Han85d61762020-06-24 23:50:26 +09002569func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002570 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002571 apex {
2572 name: "myapex",
2573 key: "myapex.key",
2574 binaries: ["mybin"],
2575 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002576 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002577 }
2578 apex_key {
2579 name: "myapex.key",
2580 public_key: "testkey.avbpubkey",
2581 private_key: "testkey.pem",
2582 }
2583 cc_binary {
2584 name: "mybin",
2585 vendor: true,
2586 shared_libs: ["libfoo"],
2587 }
2588 cc_library {
2589 name: "libfoo",
2590 proprietary: true,
2591 }
2592 `)
2593
2594 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2595 "bin/mybin",
2596 "lib64/libfoo.so",
2597 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2598 "lib64/libc++.so",
2599 })
2600
2601 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002602 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002603 name := apexBundle.BaseModuleName()
2604 prefix := "TARGET_"
2605 var builder strings.Builder
2606 data.Custom(&builder, name, prefix, "", data)
2607 androidMk := builder.String()
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002608 installPath := path.Join(buildDir, "../target/product/test_device/vendor/apex")
2609 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002610
2611 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2612 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2613 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002614}
2615
Jooyung Handf78e212020-07-22 15:54:47 +09002616func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002617 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002618 apex {
2619 name: "myapex",
2620 key: "myapex.key",
2621 binaries: ["mybin"],
2622 vendor: true,
2623 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002624 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002625 }
2626 apex_key {
2627 name: "myapex.key",
2628 public_key: "testkey.avbpubkey",
2629 private_key: "testkey.pem",
2630 }
2631 cc_binary {
2632 name: "mybin",
2633 vendor: true,
2634 shared_libs: ["libvndk", "libvendor"],
2635 }
2636 cc_library {
2637 name: "libvndk",
2638 vndk: {
2639 enabled: true,
2640 },
2641 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002642 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002643 }
2644 cc_library {
2645 name: "libvendor",
2646 vendor: true,
2647 }
2648 `)
2649
2650 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2651
Colin Crossaede88c2020-08-11 12:17:01 -07002652 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002653 libs := names(ldRule.Args["libFlags"])
2654 // VNDK libs(libvndk/libc++) as they are
2655 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2656 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2657 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002658 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002659
2660 // VNDK libs are not included when use_vndk_as_stable: true
2661 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2662 "bin/mybin",
2663 "lib64/libvendor.so",
2664 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002665
2666 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2667 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2668 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002669}
2670
Jooyung Han8e5685d2020-09-21 11:02:57 +09002671func TestApex_withPrebuiltFirmware(t *testing.T) {
2672 testCases := []struct {
2673 name string
2674 additionalProp string
2675 }{
2676 {"system apex with prebuilt_firmware", ""},
2677 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2678 }
2679 for _, tc := range testCases {
2680 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002681 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002682 apex {
2683 name: "myapex",
2684 key: "myapex.key",
2685 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002686 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002687 `+tc.additionalProp+`
2688 }
2689 apex_key {
2690 name: "myapex.key",
2691 public_key: "testkey.avbpubkey",
2692 private_key: "testkey.pem",
2693 }
2694 prebuilt_firmware {
2695 name: "myfirmware",
2696 src: "myfirmware.bin",
2697 filename_from_src: true,
2698 `+tc.additionalProp+`
2699 }
2700 `)
2701 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2702 "etc/firmware/myfirmware.bin",
2703 })
2704 })
2705 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002706}
2707
Jooyung Hanefb184e2020-06-25 17:14:25 +09002708func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002709 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002710 apex {
2711 name: "myapex",
2712 key: "myapex.key",
2713 use_vendor: true,
2714 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002715 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002716 }
2717
2718 apex_key {
2719 name: "myapex.key",
2720 public_key: "testkey.avbpubkey",
2721 private_key: "testkey.pem",
2722 }
2723
2724 cc_library {
2725 name: "mylib",
2726 vendor_available: true,
2727 apex_available: ["myapex"],
2728 }
2729 `, func(fs map[string][]byte, config android.Config) {
2730 setUseVendorAllowListForTest(config, []string{"myapex"})
2731 })
2732
2733 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002734 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002735 name := apexBundle.BaseModuleName()
2736 prefix := "TARGET_"
2737 var builder strings.Builder
2738 data.Custom(&builder, name, prefix, "", data)
2739 androidMk := builder.String()
2740 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2741}
2742
2743func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002744 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002745 apex {
2746 name: "myapex",
2747 key: "myapex.key",
2748 vendor: true,
2749 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002750 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002751 }
2752
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758
2759 cc_library {
2760 name: "mylib",
2761 vendor_available: true,
2762 }
2763 `)
2764
2765 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002766 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002767 name := apexBundle.BaseModuleName()
2768 prefix := "TARGET_"
2769 var builder strings.Builder
2770 data.Custom(&builder, name, prefix, "", data)
2771 androidMk := builder.String()
2772 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2773}
2774
Jooyung Han2ed99d02020-06-24 23:26:26 +09002775func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002776 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002777 apex {
2778 name: "myapex",
2779 key: "myapex.key",
2780 vintf_fragments: ["fragment.xml"],
2781 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002782 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002783 }
2784 apex_key {
2785 name: "myapex.key",
2786 public_key: "testkey.avbpubkey",
2787 private_key: "testkey.pem",
2788 }
2789 cc_binary {
2790 name: "mybin",
2791 }
2792 `)
2793
2794 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002795 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002796 name := apexBundle.BaseModuleName()
2797 prefix := "TARGET_"
2798 var builder strings.Builder
2799 data.Custom(&builder, name, prefix, "", data)
2800 androidMk := builder.String()
2801 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2802 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2803}
2804
Jiyong Park16e91a02018-12-20 18:18:08 +09002805func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002806 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002807 apex {
2808 name: "myapex",
2809 key: "myapex.key",
2810 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002811 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002812 }
2813
2814 apex_key {
2815 name: "myapex.key",
2816 public_key: "testkey.avbpubkey",
2817 private_key: "testkey.pem",
2818 }
2819
2820 cc_library {
2821 name: "mylib",
2822 srcs: ["mylib.cpp"],
2823 system_shared_libs: [],
2824 stl: "none",
2825 stubs: {
2826 versions: ["1", "2", "3"],
2827 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002828 apex_available: [
2829 "//apex_available:platform",
2830 "myapex",
2831 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002832 }
2833
2834 cc_binary {
2835 name: "not_in_apex",
2836 srcs: ["mylib.cpp"],
2837 static_libs: ["mylib"],
2838 static_executable: true,
2839 system_shared_libs: [],
2840 stl: "none",
2841 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002842 `)
2843
Colin Cross7113d202019-11-20 16:39:12 -08002844 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002845
2846 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002847 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002848}
Jiyong Park9335a262018-12-24 11:31:58 +09002849
2850func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002851 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002852 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002853 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002854 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002855 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002856 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002857 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002858 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002859 }
2860
2861 cc_library {
2862 name: "mylib",
2863 srcs: ["mylib.cpp"],
2864 system_shared_libs: [],
2865 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002866 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002867 }
2868
2869 apex_key {
2870 name: "myapex.key",
2871 public_key: "testkey.avbpubkey",
2872 private_key: "testkey.pem",
2873 }
2874
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002875 android_app_certificate {
2876 name: "myapex.certificate",
2877 certificate: "testkey",
2878 }
2879
2880 android_app_certificate {
2881 name: "myapex.certificate.override",
2882 certificate: "testkey.override",
2883 }
2884
Jiyong Park9335a262018-12-24 11:31:58 +09002885 `)
2886
2887 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002888 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002889
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002890 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2891 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002892 "vendor/foo/devkeys/testkey.avbpubkey")
2893 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002894 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2895 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002896 "vendor/foo/devkeys/testkey.pem")
2897 }
2898
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002899 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002900 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002901 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002902 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002903 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002904 }
2905}
Jiyong Park58e364a2019-01-19 19:24:06 +09002906
Jooyung Hanf121a652019-12-17 14:30:11 +09002907func TestCertificate(t *testing.T) {
2908 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002909 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002913 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002914 }
2915 apex_key {
2916 name: "myapex.key",
2917 public_key: "testkey.avbpubkey",
2918 private_key: "testkey.pem",
2919 }`)
2920 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2921 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2922 if actual := rule.Args["certificates"]; actual != expected {
2923 t.Errorf("certificates should be %q, not %q", expected, actual)
2924 }
2925 })
2926 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002927 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002928 apex {
2929 name: "myapex_keytest",
2930 key: "myapex.key",
2931 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002932 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002933 }
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939 android_app_certificate {
2940 name: "myapex.certificate.override",
2941 certificate: "testkey.override",
2942 }`)
2943 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2944 expected := "testkey.override.x509.pem testkey.override.pk8"
2945 if actual := rule.Args["certificates"]; actual != expected {
2946 t.Errorf("certificates should be %q, not %q", expected, actual)
2947 }
2948 })
2949 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002950 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002951 apex {
2952 name: "myapex",
2953 key: "myapex.key",
2954 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002955 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002956 }
2957 apex_key {
2958 name: "myapex.key",
2959 public_key: "testkey.avbpubkey",
2960 private_key: "testkey.pem",
2961 }
2962 android_app_certificate {
2963 name: "myapex.certificate",
2964 certificate: "testkey",
2965 }`)
2966 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2967 expected := "testkey.x509.pem testkey.pk8"
2968 if actual := rule.Args["certificates"]; actual != expected {
2969 t.Errorf("certificates should be %q, not %q", expected, actual)
2970 }
2971 })
2972 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002973 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002974 apex {
2975 name: "myapex_keytest",
2976 key: "myapex.key",
2977 file_contexts: ":myapex-file_contexts",
2978 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002979 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002980 }
2981 apex_key {
2982 name: "myapex.key",
2983 public_key: "testkey.avbpubkey",
2984 private_key: "testkey.pem",
2985 }
2986 android_app_certificate {
2987 name: "myapex.certificate.override",
2988 certificate: "testkey.override",
2989 }`)
2990 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2991 expected := "testkey.override.x509.pem testkey.override.pk8"
2992 if actual := rule.Args["certificates"]; actual != expected {
2993 t.Errorf("certificates should be %q, not %q", expected, actual)
2994 }
2995 })
2996 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002997 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002998 apex {
2999 name: "myapex",
3000 key: "myapex.key",
3001 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003002 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003003 }
3004 apex_key {
3005 name: "myapex.key",
3006 public_key: "testkey.avbpubkey",
3007 private_key: "testkey.pem",
3008 }`)
3009 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3010 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3011 if actual := rule.Args["certificates"]; actual != expected {
3012 t.Errorf("certificates should be %q, not %q", expected, actual)
3013 }
3014 })
3015 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003016 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003017 apex {
3018 name: "myapex_keytest",
3019 key: "myapex.key",
3020 file_contexts: ":myapex-file_contexts",
3021 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003022 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003023 }
3024 apex_key {
3025 name: "myapex.key",
3026 public_key: "testkey.avbpubkey",
3027 private_key: "testkey.pem",
3028 }
3029 android_app_certificate {
3030 name: "myapex.certificate.override",
3031 certificate: "testkey.override",
3032 }`)
3033 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3034 expected := "testkey.override.x509.pem testkey.override.pk8"
3035 if actual := rule.Args["certificates"]; actual != expected {
3036 t.Errorf("certificates should be %q, not %q", expected, actual)
3037 }
3038 })
3039}
3040
Jiyong Park58e364a2019-01-19 19:24:06 +09003041func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003042 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003043 apex {
3044 name: "myapex",
3045 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003046 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003047 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003048 }
3049
3050 apex {
3051 name: "otherapex",
3052 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003053 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003054 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003055 }
3056
3057 apex_key {
3058 name: "myapex.key",
3059 public_key: "testkey.avbpubkey",
3060 private_key: "testkey.pem",
3061 }
3062
3063 cc_library {
3064 name: "mylib",
3065 srcs: ["mylib.cpp"],
3066 system_shared_libs: [],
3067 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003068 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003069 "myapex",
3070 "otherapex",
3071 ],
Jooyung Han24282772020-03-21 23:20:55 +09003072 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003073 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003074 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003075 cc_library {
3076 name: "mylib2",
3077 srcs: ["mylib.cpp"],
3078 system_shared_libs: [],
3079 stl: "none",
3080 apex_available: [
3081 "myapex",
3082 "otherapex",
3083 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003084 static_libs: ["mylib3"],
3085 recovery_available: true,
3086 min_sdk_version: "29",
3087 }
3088 cc_library {
3089 name: "mylib3",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
3093 apex_available: [
3094 "myapex",
3095 "otherapex",
3096 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003097 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003098 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003099 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003100 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003101 `)
3102
Jooyung Hanc87a0592020-03-02 17:44:33 +09003103 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003104 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003105 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003106 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003107
Jooyung Hanccce2f22020-03-07 03:45:53 +09003108 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003109 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003110 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003111 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003112 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003113
Jooyung Hanccce2f22020-03-07 03:45:53 +09003114 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003115 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003116 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003117 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003118 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003119
Colin Crossaede88c2020-08-11 12:17:01 -07003120 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3121 // each variant defines additional macros to distinguish which apex variant it is built for
3122
3123 // non-APEX variant does not have __ANDROID_APEX__ defined
3124 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3125 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3126
3127 // APEX variant has __ANDROID_APEX__ defined
3128 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3129 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3130 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3131 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3132
3133 // APEX variant has __ANDROID_APEX__ defined
3134 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3135 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3136 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3137 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3138
Dan Albertb19953d2020-11-17 15:29:36 -08003139 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003140 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3141 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003142 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003143
3144 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3145 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003146
3147 // non-APEX variant does not have __ANDROID_APEX__ defined
3148 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3149 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3150
3151 // APEX variant has __ANDROID_APEX__ defined
3152 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003153 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003154 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003155 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003156
Jooyung Hanc87a0592020-03-02 17:44:33 +09003157 // APEX variant has __ANDROID_APEX__ defined
3158 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003159 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003160 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003161 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003162
Dan Albertb19953d2020-11-17 15:29:36 -08003163 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003164 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003165 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003166 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003167}
Jiyong Park7e636d02019-01-28 16:16:54 +09003168
3169func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003170 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003171 apex {
3172 name: "myapex",
3173 key: "myapex.key",
3174 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003175 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003176 }
3177
3178 apex_key {
3179 name: "myapex.key",
3180 public_key: "testkey.avbpubkey",
3181 private_key: "testkey.pem",
3182 }
3183
3184 cc_library_headers {
3185 name: "mylib_headers",
3186 export_include_dirs: ["my_include"],
3187 system_shared_libs: [],
3188 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003189 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003190 }
3191
3192 cc_library {
3193 name: "mylib",
3194 srcs: ["mylib.cpp"],
3195 system_shared_libs: [],
3196 stl: "none",
3197 header_libs: ["mylib_headers"],
3198 export_header_lib_headers: ["mylib_headers"],
3199 stubs: {
3200 versions: ["1", "2", "3"],
3201 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003202 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003203 }
3204
3205 cc_library {
3206 name: "otherlib",
3207 srcs: ["mylib.cpp"],
3208 system_shared_libs: [],
3209 stl: "none",
3210 shared_libs: ["mylib"],
3211 }
3212 `)
3213
Colin Cross7113d202019-11-20 16:39:12 -08003214 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003215
3216 // Ensure that the include path of the header lib is exported to 'otherlib'
3217 ensureContains(t, cFlags, "-Imy_include")
3218}
Alex Light9670d332019-01-29 18:07:33 -08003219
Jiyong Park7cd10e32020-01-14 09:22:18 +09003220type fileInApex struct {
3221 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003222 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003223 isLink bool
3224}
3225
Jooyung Hana57af4a2020-01-23 05:36:59 +00003226func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003227 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003228 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003229 copyCmds := apexRule.Args["copy_commands"]
3230 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003231 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003232 for _, cmd := range strings.Split(copyCmds, "&&") {
3233 cmd = strings.TrimSpace(cmd)
3234 if cmd == "" {
3235 continue
3236 }
3237 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003238 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003239 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003240 switch terms[0] {
3241 case "mkdir":
3242 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003243 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003244 t.Fatal("copyCmds contains invalid cp command", cmd)
3245 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003246 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003247 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003248 isLink = false
3249 case "ln":
3250 if len(terms) != 3 && len(terms) != 4 {
3251 // ln LINK TARGET or ln -s LINK TARGET
3252 t.Fatal("copyCmds contains invalid ln command", cmd)
3253 }
3254 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003255 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003256 isLink = true
3257 default:
3258 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3259 }
3260 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003261 index := strings.Index(dst, imageApexDir)
3262 if index == -1 {
3263 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3264 }
3265 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003266 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003267 }
3268 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003269 return ret
3270}
3271
Jooyung Hana57af4a2020-01-23 05:36:59 +00003272func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3273 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003274 var failed bool
3275 var surplus []string
3276 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003277 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003278 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003279 for _, expected := range files {
3280 if matched, _ := path.Match(expected, file.path); matched {
3281 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003282 mactchFound = true
3283 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003284 }
3285 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003286 if !mactchFound {
3287 surplus = append(surplus, file.path)
3288 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003289 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003290
Jooyung Han31c470b2019-10-18 16:26:59 +09003291 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003292 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003293 t.Log("surplus files", surplus)
3294 failed = true
3295 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003296
3297 if len(files) > len(filesMatched) {
3298 var missing []string
3299 for _, expected := range files {
3300 if !filesMatched[expected] {
3301 missing = append(missing, expected)
3302 }
3303 }
3304 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003305 t.Log("missing files", missing)
3306 failed = true
3307 }
3308 if failed {
3309 t.Fail()
3310 }
3311}
3312
Jooyung Han344d5432019-08-23 11:17:39 +09003313func TestVndkApexCurrent(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003314 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003315 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003316 name: "com.android.vndk.current",
3317 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003318 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003319 }
3320
3321 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003322 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003323 public_key: "testkey.avbpubkey",
3324 private_key: "testkey.pem",
3325 }
3326
3327 cc_library {
3328 name: "libvndk",
3329 srcs: ["mylib.cpp"],
3330 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003331 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003332 vndk: {
3333 enabled: true,
3334 },
3335 system_shared_libs: [],
3336 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003337 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003338 }
3339
3340 cc_library {
3341 name: "libvndksp",
3342 srcs: ["mylib.cpp"],
3343 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003344 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003345 vndk: {
3346 enabled: true,
3347 support_system_process: true,
3348 },
3349 system_shared_libs: [],
3350 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003351 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003352 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003353 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003354
Colin Cross2807f002021-03-02 10:15:29 -08003355 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003356 "lib/libvndk.so",
3357 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003358 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003359 "lib64/libvndk.so",
3360 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003361 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003362 "etc/llndk.libraries.VER.txt",
3363 "etc/vndkcore.libraries.VER.txt",
3364 "etc/vndksp.libraries.VER.txt",
3365 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003366 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003367 })
Jooyung Han344d5432019-08-23 11:17:39 +09003368}
3369
3370func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003371 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003372 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003373 name: "com.android.vndk.current",
3374 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003375 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003376 }
3377
3378 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003379 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003380 public_key: "testkey.avbpubkey",
3381 private_key: "testkey.pem",
3382 }
3383
3384 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003385 name: "libvndk",
3386 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003387 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003388 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003389 vndk: {
3390 enabled: true,
3391 },
3392 system_shared_libs: [],
3393 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003394 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003395 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003396
3397 cc_prebuilt_library_shared {
3398 name: "libvndk.arm",
3399 srcs: ["libvndk.arm.so"],
3400 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003401 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003402 vndk: {
3403 enabled: true,
3404 },
3405 enabled: false,
3406 arch: {
3407 arm: {
3408 enabled: true,
3409 },
3410 },
3411 system_shared_libs: [],
3412 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003413 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003414 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003415 `+vndkLibrariesTxtFiles("current"),
3416 withFiles(map[string][]byte{
3417 "libvndk.so": nil,
3418 "libvndk.arm.so": nil,
3419 }))
Colin Cross2807f002021-03-02 10:15:29 -08003420 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003421 "lib/libvndk.so",
3422 "lib/libvndk.arm.so",
3423 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003424 "lib/libc++.so",
3425 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003426 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003427 })
Jooyung Han344d5432019-08-23 11:17:39 +09003428}
3429
Jooyung Han39edb6c2019-11-06 16:53:07 +09003430func vndkLibrariesTxtFiles(vers ...string) (result string) {
3431 for _, v := range vers {
3432 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003433 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003434 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003435 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003436 name: "` + txt + `.libraries.txt",
3437 }
3438 `
3439 }
3440 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003441 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003442 result += `
3443 prebuilt_etc {
3444 name: "` + txt + `.libraries.` + v + `.txt",
3445 src: "dummy.txt",
3446 }
3447 `
3448 }
3449 }
3450 }
3451 return
3452}
3453
Jooyung Han344d5432019-08-23 11:17:39 +09003454func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003455 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003456 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003457 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003458 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003459 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003460 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003461 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003462 }
3463
3464 apex_key {
3465 name: "myapex.key",
3466 public_key: "testkey.avbpubkey",
3467 private_key: "testkey.pem",
3468 }
3469
Jooyung Han31c470b2019-10-18 16:26:59 +09003470 vndk_prebuilt_shared {
3471 name: "libvndk27",
3472 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003473 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003474 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003475 vndk: {
3476 enabled: true,
3477 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003478 target_arch: "arm64",
3479 arch: {
3480 arm: {
3481 srcs: ["libvndk27_arm.so"],
3482 },
3483 arm64: {
3484 srcs: ["libvndk27_arm64.so"],
3485 },
3486 },
Colin Cross2807f002021-03-02 10:15:29 -08003487 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003488 }
3489
3490 vndk_prebuilt_shared {
3491 name: "libvndk27",
3492 version: "27",
3493 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003494 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003495 vndk: {
3496 enabled: true,
3497 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003498 target_arch: "x86_64",
3499 arch: {
3500 x86: {
3501 srcs: ["libvndk27_x86.so"],
3502 },
3503 x86_64: {
3504 srcs: ["libvndk27_x86_64.so"],
3505 },
3506 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003507 }
3508 `+vndkLibrariesTxtFiles("27"),
3509 withFiles(map[string][]byte{
3510 "libvndk27_arm.so": nil,
3511 "libvndk27_arm64.so": nil,
3512 "libvndk27_x86.so": nil,
3513 "libvndk27_x86_64.so": nil,
3514 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003515
Colin Cross2807f002021-03-02 10:15:29 -08003516 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003517 "lib/libvndk27_arm.so",
3518 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003519 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 })
Jooyung Han344d5432019-08-23 11:17:39 +09003521}
3522
Jooyung Han90eee022019-10-01 20:02:42 +09003523func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003524 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003525 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003526 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003527 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003528 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003529 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003530 }
3531 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003532 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003533 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003534 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003535 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003536 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003537 }
3538 apex_key {
3539 name: "myapex.key",
3540 public_key: "testkey.avbpubkey",
3541 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003542 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003543
3544 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003545 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003546 actual := proptools.String(bundle.properties.Apex_name)
3547 if !reflect.DeepEqual(actual, expected) {
3548 t.Errorf("Got '%v', expected '%v'", actual, expected)
3549 }
3550 }
3551
Colin Cross2807f002021-03-02 10:15:29 -08003552 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3553 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003554}
3555
Jooyung Han344d5432019-08-23 11:17:39 +09003556func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003557 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003558 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003559 name: "com.android.vndk.current",
3560 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003561 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003562 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003563 }
3564
3565 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003566 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003567 public_key: "testkey.avbpubkey",
3568 private_key: "testkey.pem",
3569 }
3570
3571 cc_library {
3572 name: "libvndk",
3573 srcs: ["mylib.cpp"],
3574 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003575 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003576 native_bridge_supported: true,
3577 host_supported: true,
3578 vndk: {
3579 enabled: true,
3580 },
3581 system_shared_libs: [],
3582 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003583 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003584 }
Colin Cross2807f002021-03-02 10:15:29 -08003585 `+vndkLibrariesTxtFiles("current"),
3586 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003587
Colin Cross2807f002021-03-02 10:15:29 -08003588 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003589 "lib/libvndk.so",
3590 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003591 "lib/libc++.so",
3592 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003593 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003594 })
Jooyung Han344d5432019-08-23 11:17:39 +09003595}
3596
3597func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003598 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003599 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003600 name: "com.android.vndk.current",
3601 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003602 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003603 native_bridge_supported: true,
3604 }
3605
3606 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003607 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003608 public_key: "testkey.avbpubkey",
3609 private_key: "testkey.pem",
3610 }
3611
3612 cc_library {
3613 name: "libvndk",
3614 srcs: ["mylib.cpp"],
3615 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003616 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003617 native_bridge_supported: true,
3618 host_supported: true,
3619 vndk: {
3620 enabled: true,
3621 },
3622 system_shared_libs: [],
3623 stl: "none",
3624 }
3625 `)
3626}
3627
Jooyung Han31c470b2019-10-18 16:26:59 +09003628func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003629 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003630 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003631 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003632 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003633 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003635 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003636 }
3637
3638 apex_key {
3639 name: "myapex.key",
3640 public_key: "testkey.avbpubkey",
3641 private_key: "testkey.pem",
3642 }
3643
3644 vndk_prebuilt_shared {
3645 name: "libvndk27",
3646 version: "27",
3647 target_arch: "arm",
3648 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003649 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 vndk: {
3651 enabled: true,
3652 },
3653 arch: {
3654 arm: {
3655 srcs: ["libvndk27.so"],
3656 }
3657 },
3658 }
3659
3660 vndk_prebuilt_shared {
3661 name: "libvndk27",
3662 version: "27",
3663 target_arch: "arm",
3664 binder32bit: true,
3665 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003666 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 vndk: {
3668 enabled: true,
3669 },
3670 arch: {
3671 arm: {
3672 srcs: ["libvndk27binder32.so"],
3673 }
3674 },
Colin Cross2807f002021-03-02 10:15:29 -08003675 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003676 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 withFiles(map[string][]byte{
3679 "libvndk27.so": nil,
3680 "libvndk27binder32.so": nil,
3681 }),
3682 withBinder32bit,
3683 withTargets(map[android.OsType][]android.Target{
3684 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003685 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3686 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003687 },
3688 }),
3689 )
3690
Colin Cross2807f002021-03-02 10:15:29 -08003691 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003692 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003693 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003694 })
3695}
3696
Jooyung Han45a96772020-06-15 14:59:42 +09003697func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003698 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003699 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003700 name: "com.android.vndk.current",
3701 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003702 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003703 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003704 }
3705
3706 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003707 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003708 public_key: "testkey.avbpubkey",
3709 private_key: "testkey.pem",
3710 }
3711
3712 cc_library {
3713 name: "libz",
3714 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003715 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003716 vndk: {
3717 enabled: true,
3718 },
3719 stubs: {
3720 symbol_file: "libz.map.txt",
3721 versions: ["30"],
3722 }
3723 }
3724 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3725 "libz.map.txt": nil,
3726 }))
3727
Colin Cross2807f002021-03-02 10:15:29 -08003728 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003729 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3730 ensureListEmpty(t, provideNativeLibs)
3731}
3732
Jooyung Hane1633032019-08-01 17:41:43 +09003733func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003734 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003735 apex {
3736 name: "myapex_nodep",
3737 key: "myapex.key",
3738 native_shared_libs: ["lib_nodep"],
3739 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003740 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003741 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003742 }
3743
3744 apex {
3745 name: "myapex_dep",
3746 key: "myapex.key",
3747 native_shared_libs: ["lib_dep"],
3748 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003749 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003750 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003751 }
3752
3753 apex {
3754 name: "myapex_provider",
3755 key: "myapex.key",
3756 native_shared_libs: ["libfoo"],
3757 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003758 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003759 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003760 }
3761
3762 apex {
3763 name: "myapex_selfcontained",
3764 key: "myapex.key",
3765 native_shared_libs: ["lib_dep", "libfoo"],
3766 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003767 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003768 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003769 }
3770
3771 apex_key {
3772 name: "myapex.key",
3773 public_key: "testkey.avbpubkey",
3774 private_key: "testkey.pem",
3775 }
3776
3777 cc_library {
3778 name: "lib_nodep",
3779 srcs: ["mylib.cpp"],
3780 system_shared_libs: [],
3781 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003782 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003783 }
3784
3785 cc_library {
3786 name: "lib_dep",
3787 srcs: ["mylib.cpp"],
3788 shared_libs: ["libfoo"],
3789 system_shared_libs: [],
3790 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003791 apex_available: [
3792 "myapex_dep",
3793 "myapex_provider",
3794 "myapex_selfcontained",
3795 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003796 }
3797
3798 cc_library {
3799 name: "libfoo",
3800 srcs: ["mytest.cpp"],
3801 stubs: {
3802 versions: ["1"],
3803 },
3804 system_shared_libs: [],
3805 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003806 apex_available: [
3807 "myapex_provider",
3808 "myapex_selfcontained",
3809 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003810 }
3811 `)
3812
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003813 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003814 var provideNativeLibs, requireNativeLibs []string
3815
Sundong Ahnabb64432019-10-22 13:58:29 +09003816 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003817 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3818 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003819 ensureListEmpty(t, provideNativeLibs)
3820 ensureListEmpty(t, requireNativeLibs)
3821
Sundong Ahnabb64432019-10-22 13:58:29 +09003822 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003823 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3824 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003825 ensureListEmpty(t, provideNativeLibs)
3826 ensureListContains(t, requireNativeLibs, "libfoo.so")
3827
Sundong Ahnabb64432019-10-22 13:58:29 +09003828 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003829 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3830 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003831 ensureListContains(t, provideNativeLibs, "libfoo.so")
3832 ensureListEmpty(t, requireNativeLibs)
3833
Sundong Ahnabb64432019-10-22 13:58:29 +09003834 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003835 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3836 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003837 ensureListContains(t, provideNativeLibs, "libfoo.so")
3838 ensureListEmpty(t, requireNativeLibs)
3839}
3840
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003841func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003842 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003843 apex {
3844 name: "myapex",
3845 key: "myapex.key",
3846 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003847 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003848 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003849 }
3850
3851 apex_key {
3852 name: "myapex.key",
3853 public_key: "testkey.avbpubkey",
3854 private_key: "testkey.pem",
3855 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003856
3857 cc_library {
3858 name: "mylib",
3859 srcs: ["mylib.cpp"],
3860 system_shared_libs: [],
3861 stl: "none",
3862 apex_available: [
3863 "//apex_available:platform",
3864 "myapex",
3865 ],
3866 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003867 `)
3868
Sundong Ahnabb64432019-10-22 13:58:29 +09003869 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003870 apexManifestRule := module.Rule("apexManifestRule")
3871 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3872 apexRule := module.Rule("apexRule")
3873 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003874
3875 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003876 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003877 name := apexBundle.BaseModuleName()
3878 prefix := "TARGET_"
3879 var builder strings.Builder
3880 data.Custom(&builder, name, prefix, "", data)
3881 androidMk := builder.String()
3882 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3883 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003884}
3885
Alex Light0851b882019-02-07 13:20:53 -08003886func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003887 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003888 apex {
3889 name: "myapex",
3890 key: "myapex.key",
3891 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003892 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003893 }
3894
3895 apex_key {
3896 name: "myapex.key",
3897 public_key: "testkey.avbpubkey",
3898 private_key: "testkey.pem",
3899 }
3900
3901 cc_library {
3902 name: "mylib_common",
3903 srcs: ["mylib.cpp"],
3904 system_shared_libs: [],
3905 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003906 apex_available: [
3907 "//apex_available:platform",
3908 "myapex",
3909 ],
Alex Light0851b882019-02-07 13:20:53 -08003910 }
3911 `)
3912
Sundong Ahnabb64432019-10-22 13:58:29 +09003913 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003914 apexRule := module.Rule("apexRule")
3915 copyCmds := apexRule.Args["copy_commands"]
3916
3917 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3918 t.Log("Apex was a test apex!")
3919 t.Fail()
3920 }
3921 // Ensure that main rule creates an output
3922 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3923
3924 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003925 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003926
3927 // Ensure that both direct and indirect deps are copied into apex
3928 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3929
Colin Cross7113d202019-11-20 16:39:12 -08003930 // Ensure that the platform variant ends with _shared
3931 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003932
Colin Cross56a83212020-09-15 18:30:11 -07003933 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003934 t.Log("Found mylib_common not in any apex!")
3935 t.Fail()
3936 }
3937}
3938
3939func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003940 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003941 apex_test {
3942 name: "myapex",
3943 key: "myapex.key",
3944 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003945 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003946 }
3947
3948 apex_key {
3949 name: "myapex.key",
3950 public_key: "testkey.avbpubkey",
3951 private_key: "testkey.pem",
3952 }
3953
3954 cc_library {
3955 name: "mylib_common_test",
3956 srcs: ["mylib.cpp"],
3957 system_shared_libs: [],
3958 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003959 // TODO: remove //apex_available:platform
3960 apex_available: [
3961 "//apex_available:platform",
3962 "myapex",
3963 ],
Alex Light0851b882019-02-07 13:20:53 -08003964 }
3965 `)
3966
Sundong Ahnabb64432019-10-22 13:58:29 +09003967 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003968 apexRule := module.Rule("apexRule")
3969 copyCmds := apexRule.Args["copy_commands"]
3970
3971 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3972 t.Log("Apex was not a test apex!")
3973 t.Fail()
3974 }
3975 // Ensure that main rule creates an output
3976 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3977
3978 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003979 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003980
3981 // Ensure that both direct and indirect deps are copied into apex
3982 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3983
Colin Cross7113d202019-11-20 16:39:12 -08003984 // Ensure that the platform variant ends with _shared
3985 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003986}
3987
Alex Light9670d332019-01-29 18:07:33 -08003988func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003989 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003990 apex {
3991 name: "myapex",
3992 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003993 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003994 multilib: {
3995 first: {
3996 native_shared_libs: ["mylib_common"],
3997 }
3998 },
3999 target: {
4000 android: {
4001 multilib: {
4002 first: {
4003 native_shared_libs: ["mylib"],
4004 }
4005 }
4006 },
4007 host: {
4008 multilib: {
4009 first: {
4010 native_shared_libs: ["mylib2"],
4011 }
4012 }
4013 }
4014 }
4015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "mylib",
4025 srcs: ["mylib.cpp"],
4026 system_shared_libs: [],
4027 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004028 // TODO: remove //apex_available:platform
4029 apex_available: [
4030 "//apex_available:platform",
4031 "myapex",
4032 ],
Alex Light9670d332019-01-29 18:07:33 -08004033 }
4034
4035 cc_library {
4036 name: "mylib_common",
4037 srcs: ["mylib.cpp"],
4038 system_shared_libs: [],
4039 stl: "none",
4040 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004041 // TODO: remove //apex_available:platform
4042 apex_available: [
4043 "//apex_available:platform",
4044 "myapex",
4045 ],
Alex Light9670d332019-01-29 18:07:33 -08004046 }
4047
4048 cc_library {
4049 name: "mylib2",
4050 srcs: ["mylib.cpp"],
4051 system_shared_libs: [],
4052 stl: "none",
4053 compile_multilib: "first",
4054 }
4055 `)
4056
Sundong Ahnabb64432019-10-22 13:58:29 +09004057 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004058 copyCmds := apexRule.Args["copy_commands"]
4059
4060 // Ensure that main rule creates an output
4061 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4062
4063 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004064 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4065 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4066 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004067
4068 // Ensure that both direct and indirect deps are copied into apex
4069 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4070 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4071 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4072
Colin Cross7113d202019-11-20 16:39:12 -08004073 // Ensure that the platform variant ends with _shared
4074 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4075 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4076 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004077}
Jiyong Park04480cf2019-02-06 00:16:29 +09004078
Jiyong Park59140302020-12-14 18:44:04 +09004079func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004080 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004081 apex {
4082 name: "myapex",
4083 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004084 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004085 arch: {
4086 arm64: {
4087 native_shared_libs: ["mylib.arm64"],
4088 },
4089 x86_64: {
4090 native_shared_libs: ["mylib.x64"],
4091 },
4092 }
4093 }
4094
4095 apex_key {
4096 name: "myapex.key",
4097 public_key: "testkey.avbpubkey",
4098 private_key: "testkey.pem",
4099 }
4100
4101 cc_library {
4102 name: "mylib.arm64",
4103 srcs: ["mylib.cpp"],
4104 system_shared_libs: [],
4105 stl: "none",
4106 // TODO: remove //apex_available:platform
4107 apex_available: [
4108 "//apex_available:platform",
4109 "myapex",
4110 ],
4111 }
4112
4113 cc_library {
4114 name: "mylib.x64",
4115 srcs: ["mylib.cpp"],
4116 system_shared_libs: [],
4117 stl: "none",
4118 // TODO: remove //apex_available:platform
4119 apex_available: [
4120 "//apex_available:platform",
4121 "myapex",
4122 ],
4123 }
4124 `)
4125
4126 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4127 copyCmds := apexRule.Args["copy_commands"]
4128
4129 // Ensure that apex variant is created for the direct dep
4130 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4131 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4132
4133 // Ensure that both direct and indirect deps are copied into apex
4134 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4135 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4136}
4137
Jiyong Park04480cf2019-02-06 00:16:29 +09004138func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004139 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004140 apex {
4141 name: "myapex",
4142 key: "myapex.key",
4143 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004144 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004145 }
4146
4147 apex_key {
4148 name: "myapex.key",
4149 public_key: "testkey.avbpubkey",
4150 private_key: "testkey.pem",
4151 }
4152
4153 sh_binary {
4154 name: "myscript",
4155 src: "mylib.cpp",
4156 filename: "myscript.sh",
4157 sub_dir: "script",
4158 }
4159 `)
4160
Sundong Ahnabb64432019-10-22 13:58:29 +09004161 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004162 copyCmds := apexRule.Args["copy_commands"]
4163
4164 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4165}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004166
Jooyung Han91df2082019-11-20 01:49:42 +09004167func TestApexInVariousPartition(t *testing.T) {
4168 testcases := []struct {
4169 propName, parition, flattenedPartition string
4170 }{
4171 {"", "system", "system_ext"},
4172 {"product_specific: true", "product", "product"},
4173 {"soc_specific: true", "vendor", "vendor"},
4174 {"proprietary: true", "vendor", "vendor"},
4175 {"vendor: true", "vendor", "vendor"},
4176 {"system_ext_specific: true", "system_ext", "system_ext"},
4177 }
4178 for _, tc := range testcases {
4179 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004180 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004181 apex {
4182 name: "myapex",
4183 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004184 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004185 `+tc.propName+`
4186 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004187
Jooyung Han91df2082019-11-20 01:49:42 +09004188 apex_key {
4189 name: "myapex.key",
4190 public_key: "testkey.avbpubkey",
4191 private_key: "testkey.pem",
4192 }
4193 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004194
Jooyung Han91df2082019-11-20 01:49:42 +09004195 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4196 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4197 actual := apex.installDir.String()
4198 if actual != expected {
4199 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4200 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004201
Jooyung Han91df2082019-11-20 01:49:42 +09004202 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4203 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4204 actual = flattened.installDir.String()
4205 if actual != expected {
4206 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4207 }
4208 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004209 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004210}
Jiyong Park67882562019-03-21 01:11:21 +09004211
Jooyung Han580eb4f2020-06-24 19:33:06 +09004212func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004213 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004214 apex {
4215 name: "myapex",
4216 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004217 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004218 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004219
Jooyung Han580eb4f2020-06-24 19:33:06 +09004220 apex_key {
4221 name: "myapex.key",
4222 public_key: "testkey.avbpubkey",
4223 private_key: "testkey.pem",
4224 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004225 `)
4226 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004227 rule := module.Output("file_contexts")
4228 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4229}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004230
Jooyung Han580eb4f2020-06-24 19:33:06 +09004231func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004232 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004233 apex {
4234 name: "myapex",
4235 key: "myapex.key",
4236 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004237 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004238 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004239
Jooyung Han580eb4f2020-06-24 19:33:06 +09004240 apex_key {
4241 name: "myapex.key",
4242 public_key: "testkey.avbpubkey",
4243 private_key: "testkey.pem",
4244 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004245 `, withFiles(map[string][]byte{
4246 "my_own_file_contexts": nil,
4247 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004248}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004249
Jooyung Han580eb4f2020-06-24 19:33:06 +09004250func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004251 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004252 apex {
4253 name: "myapex",
4254 key: "myapex.key",
4255 product_specific: true,
4256 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004257 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004258 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004259
Jooyung Han580eb4f2020-06-24 19:33:06 +09004260 apex_key {
4261 name: "myapex.key",
4262 public_key: "testkey.avbpubkey",
4263 private_key: "testkey.pem",
4264 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004265 `)
4266
Colin Cross1c460562021-02-16 17:55:47 -08004267 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004268 apex {
4269 name: "myapex",
4270 key: "myapex.key",
4271 product_specific: true,
4272 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004273 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004274 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004275
Jooyung Han580eb4f2020-06-24 19:33:06 +09004276 apex_key {
4277 name: "myapex.key",
4278 public_key: "testkey.avbpubkey",
4279 private_key: "testkey.pem",
4280 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004281 `, withFiles(map[string][]byte{
4282 "product_specific_file_contexts": nil,
4283 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004284 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4285 rule := module.Output("file_contexts")
4286 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4287}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004288
Jooyung Han580eb4f2020-06-24 19:33:06 +09004289func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004290 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004291 apex {
4292 name: "myapex",
4293 key: "myapex.key",
4294 product_specific: true,
4295 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004296 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004297 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004298
Jooyung Han580eb4f2020-06-24 19:33:06 +09004299 apex_key {
4300 name: "myapex.key",
4301 public_key: "testkey.avbpubkey",
4302 private_key: "testkey.pem",
4303 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004304
Jooyung Han580eb4f2020-06-24 19:33:06 +09004305 filegroup {
4306 name: "my-file-contexts",
4307 srcs: ["product_specific_file_contexts"],
4308 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004309 `, withFiles(map[string][]byte{
4310 "product_specific_file_contexts": nil,
4311 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004312 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4313 rule := module.Output("file_contexts")
4314 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004315}
4316
Jiyong Park67882562019-03-21 01:11:21 +09004317func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004318 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004319 apex_key {
4320 name: "myapex.key",
4321 public_key: ":my.avbpubkey",
4322 private_key: ":my.pem",
4323 product_specific: true,
4324 }
4325
4326 filegroup {
4327 name: "my.avbpubkey",
4328 srcs: ["testkey2.avbpubkey"],
4329 }
4330
4331 filegroup {
4332 name: "my.pem",
4333 srcs: ["testkey2.pem"],
4334 }
4335 `)
4336
4337 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4338 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004339 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004340 if actual_pubkey != expected_pubkey {
4341 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4342 }
4343 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004344 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004345 if actual_privkey != expected_privkey {
4346 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4347 }
4348}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004349
4350func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004351 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004352 prebuilt_apex {
4353 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004354 arch: {
4355 arm64: {
4356 src: "myapex-arm64.apex",
4357 },
4358 arm: {
4359 src: "myapex-arm.apex",
4360 },
4361 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004362 }
4363 `)
4364
4365 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4366
Jiyong Parkc95714e2019-03-29 14:23:10 +09004367 expectedInput := "myapex-arm64.apex"
4368 if prebuilt.inputApex.String() != expectedInput {
4369 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4370 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004371}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004372
4373func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004374 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004375 prebuilt_apex {
4376 name: "myapex",
4377 src: "myapex-arm.apex",
4378 filename: "notmyapex.apex",
4379 }
4380 `)
4381
4382 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4383
4384 expected := "notmyapex.apex"
4385 if p.installFilename != expected {
4386 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4387 }
4388}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004389
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004390func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004391 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004392 prebuilt_apex {
4393 name: "myapex.prebuilt",
4394 src: "myapex-arm.apex",
4395 overrides: [
4396 "myapex",
4397 ],
4398 }
4399 `)
4400
4401 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4402
4403 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004404 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004405 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004406 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004407 }
4408}
4409
Paul Duffin092153d2021-01-26 11:42:39 +00004410// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4411// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004412func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4413 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004414 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004415 }
4416
Paul Duffin89886cb2021-02-05 16:44:03 +00004417 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004418 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004419 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004420 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004421 stem := android.RemoveOptionalPrebuiltPrefix(name)
4422 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004423 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4424 }
4425 }
4426
Paul Duffin39853512021-02-26 11:09:39 +00004427 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004428 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004429 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004430 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4431 }
4432 }
4433
4434 t.Run("prebuilt only", func(t *testing.T) {
4435 bp := `
4436 prebuilt_apex {
4437 name: "myapex",
4438 arch: {
4439 arm64: {
4440 src: "myapex-arm64.apex",
4441 },
4442 arm: {
4443 src: "myapex-arm.apex",
4444 },
4445 },
Paul Duffin39853512021-02-26 11:09:39 +00004446 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004447 }
4448
4449 java_import {
4450 name: "libfoo",
4451 jars: ["libfoo.jar"],
4452 }
Paul Duffin39853512021-02-26 11:09:39 +00004453
4454 java_sdk_library_import {
4455 name: "libbar",
4456 public: {
4457 jars: ["libbar.jar"],
4458 },
4459 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004460 `
4461
4462 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4463 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4464
Paul Duffinf6932af2021-02-26 18:21:56 +00004465 // Make sure that the deapexer has the correct input APEX.
4466 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4467 rule := deapexer.Rule("deapexer")
4468 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4469 t.Errorf("expected: %q, found: %q", expected, actual)
4470 }
4471
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004472 // Make sure that the prebuilt_apex has the correct input APEX.
4473 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4474 rule = prebuiltApex.Rule("android/soong/android.Cp")
4475 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4476 t.Errorf("expected: %q, found: %q", expected, actual)
4477 }
4478
Paul Duffin89886cb2021-02-05 16:44:03 +00004479 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004480
4481 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004482 })
4483
4484 t.Run("prebuilt with source preferred", func(t *testing.T) {
4485
4486 bp := `
4487 prebuilt_apex {
4488 name: "myapex",
4489 arch: {
4490 arm64: {
4491 src: "myapex-arm64.apex",
4492 },
4493 arm: {
4494 src: "myapex-arm.apex",
4495 },
4496 },
Paul Duffin39853512021-02-26 11:09:39 +00004497 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004498 }
4499
4500 java_import {
4501 name: "libfoo",
4502 jars: ["libfoo.jar"],
4503 }
4504
4505 java_library {
4506 name: "libfoo",
4507 }
Paul Duffin39853512021-02-26 11:09:39 +00004508
4509 java_sdk_library_import {
4510 name: "libbar",
4511 public: {
4512 jars: ["libbar.jar"],
4513 },
4514 }
4515
4516 java_sdk_library {
4517 name: "libbar",
4518 srcs: ["foo/bar/MyClass.java"],
4519 unsafe_ignore_missing_latest_api: true,
4520 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004521 `
4522
4523 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4524 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4525
Paul Duffin89886cb2021-02-05 16:44:03 +00004526 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004527 ensureNoSourceVariant(t, ctx, "libfoo")
4528
4529 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4530 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004531 })
4532
4533 t.Run("prebuilt preferred with source", func(t *testing.T) {
4534 bp := `
4535 prebuilt_apex {
4536 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004537 arch: {
4538 arm64: {
4539 src: "myapex-arm64.apex",
4540 },
4541 arm: {
4542 src: "myapex-arm.apex",
4543 },
4544 },
Paul Duffin39853512021-02-26 11:09:39 +00004545 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004546 }
4547
4548 java_import {
4549 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004550 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004551 jars: ["libfoo.jar"],
4552 }
4553
4554 java_library {
4555 name: "libfoo",
4556 }
Paul Duffin39853512021-02-26 11:09:39 +00004557
4558 java_sdk_library_import {
4559 name: "libbar",
4560 prefer: true,
4561 public: {
4562 jars: ["libbar.jar"],
4563 },
4564 }
4565
4566 java_sdk_library {
4567 name: "libbar",
4568 srcs: ["foo/bar/MyClass.java"],
4569 unsafe_ignore_missing_latest_api: true,
4570 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004571 `
4572
4573 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4574 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4575
Paul Duffin89886cb2021-02-05 16:44:03 +00004576 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004577 ensureNoSourceVariant(t, ctx, "libfoo")
4578
4579 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4580 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004581 })
4582}
4583
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004584func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4585 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004586 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004587 }
4588
Paul Duffin37856732021-02-26 14:24:15 +00004589 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4590 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004591 s := ctx.SingletonForTests("dex_bootjars")
4592 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004593 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004594 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004595 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004596 foundLibfooJar = true
4597 buildRule := s.Output(output)
4598 actual := android.NormalizePathForTesting(buildRule.Input)
4599 if actual != bootDexJarPath {
4600 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4601 }
4602 }
4603 }
4604 if !foundLibfooJar {
4605 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4606 }
4607 }
4608
Paul Duffin4fd997b2021-02-03 20:06:33 +00004609 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004610 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004611 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4612 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4613 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4614 }
4615
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004616 t.Run("prebuilt only", func(t *testing.T) {
4617 bp := `
4618 prebuilt_apex {
4619 name: "myapex",
4620 arch: {
4621 arm64: {
4622 src: "myapex-arm64.apex",
4623 },
4624 arm: {
4625 src: "myapex-arm.apex",
4626 },
4627 },
Paul Duffin37856732021-02-26 14:24:15 +00004628 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004629 }
4630
4631 java_import {
4632 name: "libfoo",
4633 jars: ["libfoo.jar"],
4634 apex_available: ["myapex"],
4635 }
Paul Duffin37856732021-02-26 14:24:15 +00004636
4637 java_sdk_library_import {
4638 name: "libbar",
4639 public: {
4640 jars: ["libbar.jar"],
4641 },
4642 apex_available: ["myapex"],
4643 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004644 `
4645
4646 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004647 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4648 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004649
Paul Duffin9d67ca62021-02-03 20:06:33 +00004650 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4651 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004652.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004653.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4654`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004655 })
4656
4657 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4658 bp := `
4659 prebuilt_apex {
4660 name: "myapex",
4661 arch: {
4662 arm64: {
4663 src: "myapex-arm64.apex",
4664 },
4665 arm: {
4666 src: "myapex-arm.apex",
4667 },
4668 },
Paul Duffin37856732021-02-26 14:24:15 +00004669 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004670 }
4671
4672 java_import {
4673 name: "libfoo",
4674 jars: ["libfoo.jar"],
4675 apex_available: ["myapex"],
4676 }
4677
4678 java_library {
4679 name: "libfoo",
4680 srcs: ["foo/bar/MyClass.java"],
4681 apex_available: ["myapex"],
4682 }
Paul Duffin37856732021-02-26 14:24:15 +00004683
4684 java_sdk_library_import {
4685 name: "libbar",
4686 public: {
4687 jars: ["libbar.jar"],
4688 },
4689 apex_available: ["myapex"],
4690 }
4691
4692 java_sdk_library {
4693 name: "libbar",
4694 srcs: ["foo/bar/MyClass.java"],
4695 unsafe_ignore_missing_latest_api: true,
4696 apex_available: ["myapex"],
4697 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004698 `
4699
4700 // In this test the source (java_library) libfoo is active since the
4701 // prebuilt (java_import) defaults to prefer:false. However the
4702 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4703 // find the dex boot jar in it. We either need to disable the source libfoo
4704 // or make the prebuilt libfoo preferred.
4705 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4706 })
4707
4708 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4709 bp := `
4710 prebuilt_apex {
4711 name: "myapex",
4712 arch: {
4713 arm64: {
4714 src: "myapex-arm64.apex",
4715 },
4716 arm: {
4717 src: "myapex-arm.apex",
4718 },
4719 },
Paul Duffin37856732021-02-26 14:24:15 +00004720 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004721 }
4722
4723 java_import {
4724 name: "libfoo",
4725 prefer: true,
4726 jars: ["libfoo.jar"],
4727 apex_available: ["myapex"],
4728 }
4729
4730 java_library {
4731 name: "libfoo",
4732 srcs: ["foo/bar/MyClass.java"],
4733 apex_available: ["myapex"],
4734 }
Paul Duffin37856732021-02-26 14:24:15 +00004735
4736 java_sdk_library_import {
4737 name: "libbar",
4738 prefer: true,
4739 public: {
4740 jars: ["libbar.jar"],
4741 },
4742 apex_available: ["myapex"],
4743 }
4744
4745 java_sdk_library {
4746 name: "libbar",
4747 srcs: ["foo/bar/MyClass.java"],
4748 unsafe_ignore_missing_latest_api: true,
4749 apex_available: ["myapex"],
4750 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004751 `
4752
4753 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004754 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4755 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004756
Paul Duffin9d67ca62021-02-03 20:06:33 +00004757 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4758 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004759.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004760.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4761`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004762 })
4763
4764 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4765 bp := `
4766 apex {
4767 name: "myapex",
4768 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004769 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004770 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004771 }
4772
4773 apex_key {
4774 name: "myapex.key",
4775 public_key: "testkey.avbpubkey",
4776 private_key: "testkey.pem",
4777 }
4778
4779 prebuilt_apex {
4780 name: "myapex",
4781 arch: {
4782 arm64: {
4783 src: "myapex-arm64.apex",
4784 },
4785 arm: {
4786 src: "myapex-arm.apex",
4787 },
4788 },
Paul Duffin37856732021-02-26 14:24:15 +00004789 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004790 }
4791
4792 java_import {
4793 name: "libfoo",
4794 jars: ["libfoo.jar"],
4795 apex_available: ["myapex"],
4796 }
4797
4798 java_library {
4799 name: "libfoo",
4800 srcs: ["foo/bar/MyClass.java"],
4801 apex_available: ["myapex"],
4802 }
Paul Duffin37856732021-02-26 14:24:15 +00004803
4804 java_sdk_library_import {
4805 name: "libbar",
4806 public: {
4807 jars: ["libbar.jar"],
4808 },
4809 apex_available: ["myapex"],
4810 }
4811
4812 java_sdk_library {
4813 name: "libbar",
4814 srcs: ["foo/bar/MyClass.java"],
4815 unsafe_ignore_missing_latest_api: true,
4816 apex_available: ["myapex"],
4817 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004818 `
4819
4820 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004821 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4822 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004823
4824 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4825 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004826.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004827.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4828`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004829 })
4830
4831 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4832 bp := `
4833 apex {
4834 name: "myapex",
4835 enabled: false,
4836 key: "myapex.key",
4837 java_libs: ["libfoo"],
4838 }
4839
4840 apex_key {
4841 name: "myapex.key",
4842 public_key: "testkey.avbpubkey",
4843 private_key: "testkey.pem",
4844 }
4845
4846 prebuilt_apex {
4847 name: "myapex",
4848 arch: {
4849 arm64: {
4850 src: "myapex-arm64.apex",
4851 },
4852 arm: {
4853 src: "myapex-arm.apex",
4854 },
4855 },
Paul Duffin37856732021-02-26 14:24:15 +00004856 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004857 }
4858
4859 java_import {
4860 name: "libfoo",
4861 prefer: true,
4862 jars: ["libfoo.jar"],
4863 apex_available: ["myapex"],
4864 }
4865
4866 java_library {
4867 name: "libfoo",
4868 srcs: ["foo/bar/MyClass.java"],
4869 apex_available: ["myapex"],
4870 }
Paul Duffin37856732021-02-26 14:24:15 +00004871
4872 java_sdk_library_import {
4873 name: "libbar",
4874 prefer: true,
4875 public: {
4876 jars: ["libbar.jar"],
4877 },
4878 apex_available: ["myapex"],
4879 }
4880
4881 java_sdk_library {
4882 name: "libbar",
4883 srcs: ["foo/bar/MyClass.java"],
4884 unsafe_ignore_missing_latest_api: true,
4885 apex_available: ["myapex"],
4886 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004887 `
4888
4889 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004890 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4891 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004892
Paul Duffin9d67ca62021-02-03 20:06:33 +00004893 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4894 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004895.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004896.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4897`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004898 })
4899}
4900
Roland Levillain630846d2019-06-26 12:48:34 +01004901func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004902 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004903 apex_test {
4904 name: "myapex",
4905 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004906 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004907 tests: [
4908 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004909 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004910 ],
4911 }
4912
4913 apex_key {
4914 name: "myapex.key",
4915 public_key: "testkey.avbpubkey",
4916 private_key: "testkey.pem",
4917 }
4918
Liz Kammer1c14a212020-05-12 15:26:55 -07004919 filegroup {
4920 name: "fg",
4921 srcs: [
4922 "baz",
4923 "bar/baz"
4924 ],
4925 }
4926
Roland Levillain630846d2019-06-26 12:48:34 +01004927 cc_test {
4928 name: "mytest",
4929 gtest: false,
4930 srcs: ["mytest.cpp"],
4931 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004932 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004933 system_shared_libs: [],
4934 static_executable: true,
4935 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004936 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004937 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004938
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004939 cc_library {
4940 name: "mylib",
4941 srcs: ["mylib.cpp"],
4942 system_shared_libs: [],
4943 stl: "none",
4944 }
4945
Liz Kammer5bd365f2020-05-27 15:15:11 -07004946 filegroup {
4947 name: "fg2",
4948 srcs: [
4949 "testdata/baz"
4950 ],
4951 }
4952
Roland Levillain9b5fde92019-06-28 15:41:19 +01004953 cc_test {
4954 name: "mytests",
4955 gtest: false,
4956 srcs: [
4957 "mytest1.cpp",
4958 "mytest2.cpp",
4959 "mytest3.cpp",
4960 ],
4961 test_per_src: true,
4962 relative_install_path: "test",
4963 system_shared_libs: [],
4964 static_executable: true,
4965 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004966 data: [
4967 ":fg",
4968 ":fg2",
4969 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004970 }
Roland Levillain630846d2019-06-26 12:48:34 +01004971 `)
4972
Sundong Ahnabb64432019-10-22 13:58:29 +09004973 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004974 copyCmds := apexRule.Args["copy_commands"]
4975
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004976 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004977 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004978 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004979
Liz Kammer1c14a212020-05-12 15:26:55 -07004980 //Ensure that test data are copied into apex.
4981 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4982 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4983
Roland Levillain9b5fde92019-06-28 15:41:19 +01004984 // Ensure that test deps built with `test_per_src` are copied into apex.
4985 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4986 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4987 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004988
4989 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004990 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004991 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004992 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004993 prefix := "TARGET_"
4994 var builder strings.Builder
4995 data.Custom(&builder, name, prefix, "", data)
4996 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004997 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4998 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4999 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5000 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005001 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005002 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005003 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005004
5005 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005006 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005007 data.Custom(&builder, name, prefix, "", data)
5008 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005009 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5010 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005011}
5012
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005013func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005014 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005018 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005019 }
5020 apex_key {
5021 name: "myapex.key",
5022 public_key: "testkey.avbpubkey",
5023 private_key: "testkey.pem",
5024 }
5025 `, func(fs map[string][]byte, config android.Config) {
5026 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5027 })
5028 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005029 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005030 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005031 var builder strings.Builder
5032 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5033 androidMk := builder.String()
5034 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5035}
5036
Jooyung Hand48f3c32019-08-23 11:18:57 +09005037func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5038 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
5042 native_shared_libs: ["libfoo"],
5043 }
5044
5045 apex_key {
5046 name: "myapex.key",
5047 public_key: "testkey.avbpubkey",
5048 private_key: "testkey.pem",
5049 }
5050
5051 cc_library {
5052 name: "libfoo",
5053 stl: "none",
5054 system_shared_libs: [],
5055 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005056 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005057 }
5058 `)
5059 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5060 apex {
5061 name: "myapex",
5062 key: "myapex.key",
5063 java_libs: ["myjar"],
5064 }
5065
5066 apex_key {
5067 name: "myapex.key",
5068 public_key: "testkey.avbpubkey",
5069 private_key: "testkey.pem",
5070 }
5071
5072 java_library {
5073 name: "myjar",
5074 srcs: ["foo/bar/MyClass.java"],
5075 sdk_version: "none",
5076 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005077 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005078 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005079 }
5080 `)
5081}
5082
Bill Peckhama41a6962021-01-11 10:58:54 -08005083func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005084 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005085 apex {
5086 name: "myapex",
5087 key: "myapex.key",
5088 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005089 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005090 }
5091
5092 apex_key {
5093 name: "myapex.key",
5094 public_key: "testkey.avbpubkey",
5095 private_key: "testkey.pem",
5096 }
5097
5098 java_import {
5099 name: "myjavaimport",
5100 apex_available: ["myapex"],
5101 jars: ["my.jar"],
5102 compile_dex: true,
5103 }
5104 `)
5105
5106 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5107 apexRule := module.Rule("apexRule")
5108 copyCmds := apexRule.Args["copy_commands"]
5109 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5110}
5111
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005112func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005113 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005114 apex {
5115 name: "myapex",
5116 key: "myapex.key",
5117 apps: [
5118 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005119 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005120 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005121 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005122 }
5123
5124 apex_key {
5125 name: "myapex.key",
5126 public_key: "testkey.avbpubkey",
5127 private_key: "testkey.pem",
5128 }
5129
5130 android_app {
5131 name: "AppFoo",
5132 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005133 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005134 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005135 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005136 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005137 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005138 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005139
5140 android_app {
5141 name: "AppFooPriv",
5142 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005143 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005144 system_modules: "none",
5145 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005146 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005147 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005148 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005149
5150 cc_library_shared {
5151 name: "libjni",
5152 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005153 shared_libs: ["libfoo"],
5154 stl: "none",
5155 system_shared_libs: [],
5156 apex_available: [ "myapex" ],
5157 sdk_version: "current",
5158 }
5159
5160 cc_library_shared {
5161 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005162 stl: "none",
5163 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005164 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005165 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005166 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005167 `)
5168
Sundong Ahnabb64432019-10-22 13:58:29 +09005169 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005170 apexRule := module.Rule("apexRule")
5171 copyCmds := apexRule.Args["copy_commands"]
5172
5173 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005174 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005175
Colin Crossaede88c2020-08-11 12:17:01 -07005176 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005177 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005178 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005179 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005180 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005181 // JNI libraries including transitive deps are
5182 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005183 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005184 // ... embedded inside APK (jnilibs.zip)
5185 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5186 // ... and not directly inside the APEX
5187 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5188 }
Dario Frenicde2a032019-10-27 00:29:22 +01005189}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005190
Dario Frenicde2a032019-10-27 00:29:22 +01005191func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005192 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005193 apex {
5194 name: "myapex",
5195 key: "myapex.key",
5196 apps: [
5197 "AppFooPrebuilt",
5198 "AppFooPrivPrebuilt",
5199 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005200 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005201 }
5202
5203 apex_key {
5204 name: "myapex.key",
5205 public_key: "testkey.avbpubkey",
5206 private_key: "testkey.pem",
5207 }
5208
5209 android_app_import {
5210 name: "AppFooPrebuilt",
5211 apk: "PrebuiltAppFoo.apk",
5212 presigned: true,
5213 dex_preopt: {
5214 enabled: false,
5215 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005216 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005217 }
5218
5219 android_app_import {
5220 name: "AppFooPrivPrebuilt",
5221 apk: "PrebuiltAppFooPriv.apk",
5222 privileged: true,
5223 presigned: true,
5224 dex_preopt: {
5225 enabled: false,
5226 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005227 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005228 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005229 }
5230 `)
5231
Sundong Ahnabb64432019-10-22 13:58:29 +09005232 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005233 apexRule := module.Rule("apexRule")
5234 copyCmds := apexRule.Args["copy_commands"]
5235
5236 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005237 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5238}
5239
5240func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005241 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005242 apex {
5243 name: "myapex",
5244 key: "myapex.key",
5245 apps: [
5246 "AppFoo",
5247 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005248 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005249 }
5250
5251 apex_key {
5252 name: "myapex.key",
5253 public_key: "testkey.avbpubkey",
5254 private_key: "testkey.pem",
5255 }
5256
5257 android_app {
5258 name: "AppFoo",
5259 srcs: ["foo/bar/MyClass.java"],
5260 sdk_version: "none",
5261 system_modules: "none",
5262 apex_available: [ "myapex" ],
5263 }
5264
5265 android_app_import {
5266 name: "AppFoo",
5267 apk: "AppFooPrebuilt.apk",
5268 filename: "AppFooPrebuilt.apk",
5269 presigned: true,
5270 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005271 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005272 }
5273 `, withFiles(map[string][]byte{
5274 "AppFooPrebuilt.apk": nil,
5275 }))
5276
5277 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005278 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005279 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005280}
5281
Dario Freni6f3937c2019-12-20 22:58:03 +00005282func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005283 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005284 apex {
5285 name: "myapex",
5286 key: "myapex.key",
5287 apps: [
5288 "TesterHelpAppFoo",
5289 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005290 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005291 }
5292
5293 apex_key {
5294 name: "myapex.key",
5295 public_key: "testkey.avbpubkey",
5296 private_key: "testkey.pem",
5297 }
5298
5299 android_test_helper_app {
5300 name: "TesterHelpAppFoo",
5301 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005302 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005303 }
5304
5305 `)
5306
5307 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5308 apexRule := module.Rule("apexRule")
5309 copyCmds := apexRule.Args["copy_commands"]
5310
5311 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5312}
5313
Jooyung Han18020ea2019-11-13 10:50:48 +09005314func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5315 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005316 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005317 apex {
5318 name: "myapex",
5319 key: "myapex.key",
5320 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005321 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005322 }
5323
5324 apex_key {
5325 name: "myapex.key",
5326 public_key: "testkey.avbpubkey",
5327 private_key: "testkey.pem",
5328 }
5329
5330 apex {
5331 name: "otherapex",
5332 key: "myapex.key",
5333 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005334 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005335 }
5336
5337 cc_defaults {
5338 name: "libfoo-defaults",
5339 apex_available: ["otherapex"],
5340 }
5341
5342 cc_library {
5343 name: "libfoo",
5344 defaults: ["libfoo-defaults"],
5345 stl: "none",
5346 system_shared_libs: [],
5347 }`)
5348}
5349
Paul Duffine52e66f2020-03-30 17:54:29 +01005350func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005351 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005352 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005353 apex {
5354 name: "myapex",
5355 key: "myapex.key",
5356 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005357 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005358 }
5359
5360 apex_key {
5361 name: "myapex.key",
5362 public_key: "testkey.avbpubkey",
5363 private_key: "testkey.pem",
5364 }
5365
5366 apex {
5367 name: "otherapex",
5368 key: "otherapex.key",
5369 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005370 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005371 }
5372
5373 apex_key {
5374 name: "otherapex.key",
5375 public_key: "testkey.avbpubkey",
5376 private_key: "testkey.pem",
5377 }
5378
5379 cc_library {
5380 name: "libfoo",
5381 stl: "none",
5382 system_shared_libs: [],
5383 apex_available: ["otherapex"],
5384 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005385}
Jiyong Park127b40b2019-09-30 16:04:35 +09005386
Paul Duffine52e66f2020-03-30 17:54:29 +01005387func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005388 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005389 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005390.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005391.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005392.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005393.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005394.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005395.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005396 apex {
5397 name: "myapex",
5398 key: "myapex.key",
5399 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005400 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005401 }
5402
5403 apex_key {
5404 name: "myapex.key",
5405 public_key: "testkey.avbpubkey",
5406 private_key: "testkey.pem",
5407 }
5408
Jiyong Park127b40b2019-09-30 16:04:35 +09005409 cc_library {
5410 name: "libfoo",
5411 stl: "none",
5412 shared_libs: ["libbar"],
5413 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005414 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005415 }
5416
5417 cc_library {
5418 name: "libbar",
5419 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005420 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005421 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005422 apex_available: ["myapex"],
5423 }
5424
5425 cc_library {
5426 name: "libbaz",
5427 stl: "none",
5428 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005429 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005430}
Jiyong Park127b40b2019-09-30 16:04:35 +09005431
Paul Duffine52e66f2020-03-30 17:54:29 +01005432func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005433 testApexError(t, "\"otherapex\" is not a valid module name", `
5434 apex {
5435 name: "myapex",
5436 key: "myapex.key",
5437 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005438 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005439 }
5440
5441 apex_key {
5442 name: "myapex.key",
5443 public_key: "testkey.avbpubkey",
5444 private_key: "testkey.pem",
5445 }
5446
5447 cc_library {
5448 name: "libfoo",
5449 stl: "none",
5450 system_shared_libs: [],
5451 apex_available: ["otherapex"],
5452 }`)
5453
Paul Duffine52e66f2020-03-30 17:54:29 +01005454 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005455 apex {
5456 name: "myapex",
5457 key: "myapex.key",
5458 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005459 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005460 }
5461
5462 apex_key {
5463 name: "myapex.key",
5464 public_key: "testkey.avbpubkey",
5465 private_key: "testkey.pem",
5466 }
5467
5468 cc_library {
5469 name: "libfoo",
5470 stl: "none",
5471 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005472 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005473 apex_available: ["myapex"],
5474 }
5475
5476 cc_library {
5477 name: "libbar",
5478 stl: "none",
5479 system_shared_libs: [],
5480 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005481 }
5482
5483 cc_library {
5484 name: "libbaz",
5485 stl: "none",
5486 system_shared_libs: [],
5487 stubs: {
5488 versions: ["10", "20", "30"],
5489 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005490 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005491}
Jiyong Park127b40b2019-09-30 16:04:35 +09005492
Jiyong Park89e850a2020-04-07 16:37:39 +09005493func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005494 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005495 apex {
5496 name: "myapex",
5497 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005498 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005499 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005500 }
5501
5502 apex_key {
5503 name: "myapex.key",
5504 public_key: "testkey.avbpubkey",
5505 private_key: "testkey.pem",
5506 }
5507
5508 cc_library {
5509 name: "libfoo",
5510 stl: "none",
5511 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005512 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005513 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005514 }
5515
5516 cc_library {
5517 name: "libfoo2",
5518 stl: "none",
5519 system_shared_libs: [],
5520 shared_libs: ["libbaz"],
5521 apex_available: ["//apex_available:platform"],
5522 }
5523
5524 cc_library {
5525 name: "libbar",
5526 stl: "none",
5527 system_shared_libs: [],
5528 apex_available: ["myapex"],
5529 }
5530
5531 cc_library {
5532 name: "libbaz",
5533 stl: "none",
5534 system_shared_libs: [],
5535 apex_available: ["myapex"],
5536 stubs: {
5537 versions: ["1"],
5538 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005539 }`)
5540
Jiyong Park89e850a2020-04-07 16:37:39 +09005541 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5542 // because it depends on libbar which isn't available to platform
5543 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5544 if libfoo.NotAvailableForPlatform() != true {
5545 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5546 }
5547
5548 // libfoo2 however can be available to platform because it depends on libbaz which provides
5549 // stubs
5550 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5551 if libfoo2.NotAvailableForPlatform() == true {
5552 t.Errorf("%q should be available to platform", libfoo2.String())
5553 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005554}
Jiyong Parka90ca002019-10-07 15:47:24 +09005555
Paul Duffine52e66f2020-03-30 17:54:29 +01005556func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005557 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005558 apex {
5559 name: "myapex",
5560 key: "myapex.key",
5561 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005562 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005563 }
5564
5565 apex_key {
5566 name: "myapex.key",
5567 public_key: "testkey.avbpubkey",
5568 private_key: "testkey.pem",
5569 }
5570
5571 cc_library {
5572 name: "libfoo",
5573 stl: "none",
5574 system_shared_libs: [],
5575 apex_available: ["myapex"],
5576 static: {
5577 apex_available: ["//apex_available:platform"],
5578 },
5579 }`)
5580
Jiyong Park89e850a2020-04-07 16:37:39 +09005581 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5582 if libfooShared.NotAvailableForPlatform() != true {
5583 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5584 }
5585 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5586 if libfooStatic.NotAvailableForPlatform() != false {
5587 t.Errorf("%q should be available to platform", libfooStatic.String())
5588 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005589}
5590
Jiyong Park5d790c32019-11-15 18:40:32 +09005591func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005592 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005593 apex {
5594 name: "myapex",
5595 key: "myapex.key",
5596 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005597 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005598 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005599 }
5600
5601 override_apex {
5602 name: "override_myapex",
5603 base: "myapex",
5604 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005605 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005606 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005607 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005608 }
5609
5610 apex_key {
5611 name: "myapex.key",
5612 public_key: "testkey.avbpubkey",
5613 private_key: "testkey.pem",
5614 }
5615
5616 android_app {
5617 name: "app",
5618 srcs: ["foo/bar/MyClass.java"],
5619 package_name: "foo",
5620 sdk_version: "none",
5621 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005622 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005623 }
5624
5625 override_android_app {
5626 name: "override_app",
5627 base: "app",
5628 package_name: "bar",
5629 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005630 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005631
Jiyong Park317645e2019-12-05 13:20:58 +09005632 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5633 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5634 if originalVariant.GetOverriddenBy() != "" {
5635 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5636 }
5637 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5638 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5639 }
5640
Jiyong Park5d790c32019-11-15 18:40:32 +09005641 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5642 apexRule := module.Rule("apexRule")
5643 copyCmds := apexRule.Args["copy_commands"]
5644
5645 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005646 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005647
5648 apexBundle := module.Module().(*apexBundle)
5649 name := apexBundle.Name()
5650 if name != "override_myapex" {
5651 t.Errorf("name should be \"override_myapex\", but was %q", name)
5652 }
5653
Baligh Uddin004d7172020-02-19 21:29:28 -08005654 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5655 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5656 }
5657
Jiyong Park20bacab2020-03-03 11:45:41 +09005658 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005659 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005660
Colin Crossaa255532020-07-03 13:18:24 -07005661 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005662 var builder strings.Builder
5663 data.Custom(&builder, name, "TARGET_", "", data)
5664 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005665 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005666 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5667 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005668 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005669 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005670 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005671 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5672 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005673}
5674
Jooyung Han214bf372019-11-12 13:03:50 +09005675func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005676 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005677 apex {
5678 name: "myapex",
5679 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005680 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005681 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005682 }
5683
5684 apex_key {
5685 name: "myapex.key",
5686 public_key: "testkey.avbpubkey",
5687 private_key: "testkey.pem",
5688 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005689
5690 cc_library {
5691 name: "mylib",
5692 srcs: ["mylib.cpp"],
5693 stl: "libc++",
5694 system_shared_libs: [],
5695 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005696 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005697 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005698 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005699
5700 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5701 args := module.Rule("apexRule").Args
5702 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005703 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005704
5705 // The copies of the libraries in the apex should have one more dependency than
5706 // the ones outside the apex, namely the unwinder. Ideally we should check
5707 // the dependency names directly here but for some reason the names are blank in
5708 // this test.
5709 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005710 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005711 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5712 if len(apexImplicits) != len(nonApexImplicits)+1 {
5713 t.Errorf("%q missing unwinder dep", lib)
5714 }
5715 }
Jooyung Han214bf372019-11-12 13:03:50 +09005716}
5717
Paul Duffin9b879592020-05-26 13:21:35 +01005718var filesForSdkLibrary = map[string][]byte{
5719 "api/current.txt": nil,
5720 "api/removed.txt": nil,
5721 "api/system-current.txt": nil,
5722 "api/system-removed.txt": nil,
5723 "api/test-current.txt": nil,
5724 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005725
Anton Hanssondff2c782020-12-21 17:10:01 +00005726 "100/public/api/foo.txt": nil,
5727 "100/public/api/foo-removed.txt": nil,
5728 "100/system/api/foo.txt": nil,
5729 "100/system/api/foo-removed.txt": nil,
5730
Paul Duffineedc5d52020-06-12 17:46:39 +01005731 // For java_sdk_library_import
5732 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005733}
5734
Jooyung Han58f26ab2019-12-18 15:34:32 +09005735func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005736 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005737 apex {
5738 name: "myapex",
5739 key: "myapex.key",
5740 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005741 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005742 }
5743
5744 apex_key {
5745 name: "myapex.key",
5746 public_key: "testkey.avbpubkey",
5747 private_key: "testkey.pem",
5748 }
5749
5750 java_sdk_library {
5751 name: "foo",
5752 srcs: ["a.java"],
5753 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005754 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005755 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005756
5757 prebuilt_apis {
5758 name: "sdk",
5759 api_dirs: ["100"],
5760 }
Paul Duffin9b879592020-05-26 13:21:35 +01005761 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005762
5763 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005764 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005765 "javalib/foo.jar",
5766 "etc/permissions/foo.xml",
5767 })
5768 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005769 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5770 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005771}
5772
Paul Duffin9b879592020-05-26 13:21:35 +01005773func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005774 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005775 apex {
5776 name: "myapex",
5777 key: "myapex.key",
5778 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005779 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005780 }
5781
5782 apex_key {
5783 name: "myapex.key",
5784 public_key: "testkey.avbpubkey",
5785 private_key: "testkey.pem",
5786 }
5787
5788 java_sdk_library {
5789 name: "foo",
5790 srcs: ["a.java"],
5791 api_packages: ["foo"],
5792 apex_available: ["myapex"],
5793 sdk_version: "none",
5794 system_modules: "none",
5795 }
5796
5797 java_library {
5798 name: "bar",
5799 srcs: ["a.java"],
5800 libs: ["foo"],
5801 apex_available: ["myapex"],
5802 sdk_version: "none",
5803 system_modules: "none",
5804 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005805
5806 prebuilt_apis {
5807 name: "sdk",
5808 api_dirs: ["100"],
5809 }
Paul Duffin9b879592020-05-26 13:21:35 +01005810 `, withFiles(filesForSdkLibrary))
5811
5812 // java_sdk_library installs both impl jar and permission XML
5813 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5814 "javalib/bar.jar",
5815 "javalib/foo.jar",
5816 "etc/permissions/foo.xml",
5817 })
5818
5819 // The bar library should depend on the implementation jar.
5820 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5821 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5822 t.Errorf("expected %q, found %#q", expected, actual)
5823 }
5824}
5825
5826func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005827 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005828 apex {
5829 name: "myapex",
5830 key: "myapex.key",
5831 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005832 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005833 }
5834
5835 apex_key {
5836 name: "myapex.key",
5837 public_key: "testkey.avbpubkey",
5838 private_key: "testkey.pem",
5839 }
5840
5841 java_sdk_library {
5842 name: "foo",
5843 srcs: ["a.java"],
5844 api_packages: ["foo"],
5845 apex_available: ["myapex"],
5846 sdk_version: "none",
5847 system_modules: "none",
5848 }
5849
5850 java_library {
5851 name: "bar",
5852 srcs: ["a.java"],
5853 libs: ["foo"],
5854 sdk_version: "none",
5855 system_modules: "none",
5856 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005857
5858 prebuilt_apis {
5859 name: "sdk",
5860 api_dirs: ["100"],
5861 }
Paul Duffin9b879592020-05-26 13:21:35 +01005862 `, withFiles(filesForSdkLibrary))
5863
5864 // java_sdk_library installs both impl jar and permission XML
5865 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5866 "javalib/foo.jar",
5867 "etc/permissions/foo.xml",
5868 })
5869
5870 // The bar library should depend on the stubs jar.
5871 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5872 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5873 t.Errorf("expected %q, found %#q", expected, actual)
5874 }
5875}
5876
Paul Duffineedc5d52020-06-12 17:46:39 +01005877func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005878 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005879 prebuilt_apis {
5880 name: "sdk",
5881 api_dirs: ["100"],
5882 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005883 withFiles(map[string][]byte{
5884 "apex/a.java": nil,
5885 "apex/apex_manifest.json": nil,
5886 "apex/Android.bp": []byte(`
5887 package {
5888 default_visibility: ["//visibility:private"],
5889 }
5890
5891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005895 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
5904 java_library {
5905 name: "bar",
5906 srcs: ["a.java"],
5907 libs: ["foo"],
5908 apex_available: ["myapex"],
5909 sdk_version: "none",
5910 system_modules: "none",
5911 }
5912`),
5913 "source/a.java": nil,
5914 "source/api/current.txt": nil,
5915 "source/api/removed.txt": nil,
5916 "source/Android.bp": []byte(`
5917 package {
5918 default_visibility: ["//visibility:private"],
5919 }
5920
5921 java_sdk_library {
5922 name: "foo",
5923 visibility: ["//apex"],
5924 srcs: ["a.java"],
5925 api_packages: ["foo"],
5926 apex_available: ["myapex"],
5927 sdk_version: "none",
5928 system_modules: "none",
5929 public: {
5930 enabled: true,
5931 },
5932 }
5933`),
5934 "prebuilt/a.jar": nil,
5935 "prebuilt/Android.bp": []byte(`
5936 package {
5937 default_visibility: ["//visibility:private"],
5938 }
5939
5940 java_sdk_library_import {
5941 name: "foo",
5942 visibility: ["//apex", "//source"],
5943 apex_available: ["myapex"],
5944 prefer: true,
5945 public: {
5946 jars: ["a.jar"],
5947 },
5948 }
5949`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005950 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005951 )
5952
5953 // java_sdk_library installs both impl jar and permission XML
5954 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5955 "javalib/bar.jar",
5956 "javalib/foo.jar",
5957 "etc/permissions/foo.xml",
5958 })
5959
5960 // The bar library should depend on the implementation jar.
5961 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5962 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5963 t.Errorf("expected %q, found %#q", expected, actual)
5964 }
5965}
5966
5967func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5968 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5969 apex {
5970 name: "myapex",
5971 key: "myapex.key",
5972 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005973 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005974 }
5975
5976 apex_key {
5977 name: "myapex.key",
5978 public_key: "testkey.avbpubkey",
5979 private_key: "testkey.pem",
5980 }
5981
5982 java_sdk_library_import {
5983 name: "foo",
5984 apex_available: ["myapex"],
5985 prefer: true,
5986 public: {
5987 jars: ["a.jar"],
5988 },
5989 }
5990
5991 `, withFiles(filesForSdkLibrary))
5992}
5993
atrost6e126252020-01-27 17:01:16 +00005994func TestCompatConfig(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005995 ctx := testApex(t, `
atrost6e126252020-01-27 17:01:16 +00005996 apex {
5997 name: "myapex",
5998 key: "myapex.key",
5999 prebuilts: ["myjar-platform-compat-config"],
6000 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006001 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006002 }
6003
6004 apex_key {
6005 name: "myapex.key",
6006 public_key: "testkey.avbpubkey",
6007 private_key: "testkey.pem",
6008 }
6009
6010 platform_compat_config {
6011 name: "myjar-platform-compat-config",
6012 src: ":myjar",
6013 }
6014
6015 java_library {
6016 name: "myjar",
6017 srcs: ["foo/bar/MyClass.java"],
6018 sdk_version: "none",
6019 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006020 apex_available: [ "myapex" ],
6021 }
6022 `)
6023 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6024 "etc/compatconfig/myjar-platform-compat-config.xml",
6025 "javalib/myjar.jar",
6026 })
6027}
6028
Jiyong Park479321d2019-12-16 11:47:12 +09006029func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6030 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6031 apex {
6032 name: "myapex",
6033 key: "myapex.key",
6034 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006035 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006036 }
6037
6038 apex_key {
6039 name: "myapex.key",
6040 public_key: "testkey.avbpubkey",
6041 private_key: "testkey.pem",
6042 }
6043
6044 java_library {
6045 name: "myjar",
6046 srcs: ["foo/bar/MyClass.java"],
6047 sdk_version: "none",
6048 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006049 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006050 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006051 }
6052 `)
6053}
6054
Jiyong Park7afd1072019-12-30 16:56:33 +09006055func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006056 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006057 apex {
6058 name: "myapex",
6059 key: "myapex.key",
6060 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006061 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006062 }
6063
6064 apex_key {
6065 name: "myapex.key",
6066 public_key: "testkey.avbpubkey",
6067 private_key: "testkey.pem",
6068 }
6069
6070 cc_library {
6071 name: "mylib",
6072 srcs: ["mylib.cpp"],
6073 system_shared_libs: [],
6074 stl: "none",
6075 required: ["a", "b"],
6076 host_required: ["c", "d"],
6077 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006078 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006079 }
6080 `)
6081
6082 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006083 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006084 name := apexBundle.BaseModuleName()
6085 prefix := "TARGET_"
6086 var builder strings.Builder
6087 data.Custom(&builder, name, prefix, "", data)
6088 androidMk := builder.String()
6089 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6090 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6091 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6092}
6093
Jiyong Park7cd10e32020-01-14 09:22:18 +09006094func TestSymlinksFromApexToSystem(t *testing.T) {
6095 bp := `
6096 apex {
6097 name: "myapex",
6098 key: "myapex.key",
6099 native_shared_libs: ["mylib"],
6100 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006101 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006102 }
6103
Jiyong Park9d677202020-02-19 16:29:35 +09006104 apex {
6105 name: "myapex.updatable",
6106 key: "myapex.key",
6107 native_shared_libs: ["mylib"],
6108 java_libs: ["myjar"],
6109 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006110 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006111 }
6112
Jiyong Park7cd10e32020-01-14 09:22:18 +09006113 apex_key {
6114 name: "myapex.key",
6115 public_key: "testkey.avbpubkey",
6116 private_key: "testkey.pem",
6117 }
6118
6119 cc_library {
6120 name: "mylib",
6121 srcs: ["mylib.cpp"],
6122 shared_libs: ["myotherlib"],
6123 system_shared_libs: [],
6124 stl: "none",
6125 apex_available: [
6126 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006127 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006128 "//apex_available:platform",
6129 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006130 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006131 }
6132
6133 cc_library {
6134 name: "myotherlib",
6135 srcs: ["mylib.cpp"],
6136 system_shared_libs: [],
6137 stl: "none",
6138 apex_available: [
6139 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006140 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006141 "//apex_available:platform",
6142 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006143 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006144 }
6145
6146 java_library {
6147 name: "myjar",
6148 srcs: ["foo/bar/MyClass.java"],
6149 sdk_version: "none",
6150 system_modules: "none",
6151 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006152 apex_available: [
6153 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006154 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006155 "//apex_available:platform",
6156 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006157 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006158 }
6159
6160 java_library {
6161 name: "myotherjar",
6162 srcs: ["foo/bar/MyClass.java"],
6163 sdk_version: "none",
6164 system_modules: "none",
6165 apex_available: [
6166 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006167 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006168 "//apex_available:platform",
6169 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006170 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006171 }
6172 `
6173
6174 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6175 for _, f := range files {
6176 if f.path == file {
6177 if f.isLink {
6178 t.Errorf("%q is not a real file", file)
6179 }
6180 return
6181 }
6182 }
6183 t.Errorf("%q is not found", file)
6184 }
6185
6186 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6187 for _, f := range files {
6188 if f.path == file {
6189 if !f.isLink {
6190 t.Errorf("%q is not a symlink", file)
6191 }
6192 return
6193 }
6194 }
6195 t.Errorf("%q is not found", file)
6196 }
6197
Jiyong Park9d677202020-02-19 16:29:35 +09006198 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6199 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006200 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006201 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006202 ensureRealfileExists(t, files, "javalib/myjar.jar")
6203 ensureRealfileExists(t, files, "lib64/mylib.so")
6204 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6205
Jiyong Park9d677202020-02-19 16:29:35 +09006206 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6207 ensureRealfileExists(t, files, "javalib/myjar.jar")
6208 ensureRealfileExists(t, files, "lib64/mylib.so")
6209 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6210
6211 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006212 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006213 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006214 ensureRealfileExists(t, files, "javalib/myjar.jar")
6215 ensureRealfileExists(t, files, "lib64/mylib.so")
6216 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006217
6218 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6219 ensureRealfileExists(t, files, "javalib/myjar.jar")
6220 ensureRealfileExists(t, files, "lib64/mylib.so")
6221 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006222}
6223
Yo Chiange8128052020-07-23 20:09:18 +08006224func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006225 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006226 apex {
6227 name: "myapex",
6228 key: "myapex.key",
6229 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006230 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006231 }
6232
6233 apex_key {
6234 name: "myapex.key",
6235 public_key: "testkey.avbpubkey",
6236 private_key: "testkey.pem",
6237 }
6238
6239 cc_library_shared {
6240 name: "mylib",
6241 srcs: ["mylib.cpp"],
6242 shared_libs: ["myotherlib"],
6243 system_shared_libs: [],
6244 stl: "none",
6245 apex_available: [
6246 "myapex",
6247 "//apex_available:platform",
6248 ],
6249 }
6250
6251 cc_prebuilt_library_shared {
6252 name: "myotherlib",
6253 srcs: ["prebuilt.so"],
6254 system_shared_libs: [],
6255 stl: "none",
6256 apex_available: [
6257 "myapex",
6258 "//apex_available:platform",
6259 ],
6260 }
6261 `)
6262
6263 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006264 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006265 var builder strings.Builder
6266 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6267 androidMk := builder.String()
6268 // `myotherlib` is added to `myapex` as symlink
6269 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6270 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6271 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6272 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006273 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 +08006274}
6275
Jooyung Han643adc42020-02-27 13:50:06 +09006276func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006277 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006278 apex {
6279 name: "myapex",
6280 key: "myapex.key",
6281 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006282 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006283 }
6284
6285 apex_key {
6286 name: "myapex.key",
6287 public_key: "testkey.avbpubkey",
6288 private_key: "testkey.pem",
6289 }
6290
6291 cc_library {
6292 name: "mylib",
6293 srcs: ["mylib.cpp"],
6294 shared_libs: ["mylib2"],
6295 system_shared_libs: [],
6296 stl: "none",
6297 apex_available: [ "myapex" ],
6298 }
6299
6300 cc_library {
6301 name: "mylib2",
6302 srcs: ["mylib.cpp"],
6303 system_shared_libs: [],
6304 stl: "none",
6305 apex_available: [ "myapex" ],
6306 }
6307 `)
6308
6309 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6310 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6311 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6312 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6313 "lib64/mylib.so",
6314 "lib64/mylib2.so",
6315 })
6316}
6317
Jooyung Han49f67012020-04-17 13:43:10 +09006318func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006319 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006320 apex {
6321 name: "myapex",
6322 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006323 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006324 }
6325 apex_key {
6326 name: "myapex.key",
6327 public_key: "testkey.avbpubkey",
6328 private_key: "testkey.pem",
6329 }
6330 `, func(fs map[string][]byte, config android.Config) {
6331 delete(config.Targets, android.Android)
6332 config.AndroidCommonTarget = android.Target{}
6333 })
6334
6335 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6336 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6337 }
6338}
6339
Jiyong Parkbd159612020-02-28 15:22:21 +09006340func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006341 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006342 apex {
6343 name: "myapex",
6344 key: "myapex.key",
6345 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006346 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006347 }
6348
6349 apex_key {
6350 name: "myapex.key",
6351 public_key: "testkey.avbpubkey",
6352 private_key: "testkey.pem",
6353 }
6354
6355 android_app {
6356 name: "AppFoo",
6357 srcs: ["foo/bar/MyClass.java"],
6358 sdk_version: "none",
6359 system_modules: "none",
6360 apex_available: [ "myapex" ],
6361 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006362 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006363
Colin Crosscf371cc2020-11-13 11:48:42 -08006364 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006365 content := bundleConfigRule.Args["content"]
6366
6367 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006368 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 +09006369}
6370
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006371func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006372 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006373 apex {
6374 name: "myapex",
6375 key: "myapex.key",
6376 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006377 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006378 }
6379
6380 apex_key {
6381 name: "myapex.key",
6382 public_key: "testkey.avbpubkey",
6383 private_key: "testkey.pem",
6384 }
6385
6386 android_app_set {
6387 name: "AppSet",
6388 set: "AppSet.apks",
6389 }`)
6390 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006391 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006392 content := bundleConfigRule.Args["content"]
6393 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6394 s := mod.Rule("apexRule").Args["copy_commands"]
6395 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6396 if len(copyCmds) != 3 {
6397 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6398 }
6399 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6400 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6401 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6402}
6403
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006404func TestAppSetBundlePrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006405 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006406 bp := `
6407 apex_set {
6408 name: "myapex",
6409 filename: "foo_v2.apex",
6410 sanitized: {
6411 none: { set: "myapex.apks", },
6412 hwaddress: { set: "myapex.hwasan.apks", },
6413 },
6414 }`
6415 fs["Android.bp"] = []byte(bp)
6416
6417 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6418 })
6419
6420 m := ctx.ModuleForTests("myapex", "android_common")
6421 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6422
6423 actual := extractedApex.Inputs
6424 if len(actual) != 1 {
6425 t.Errorf("expected a single input")
6426 }
6427
6428 expected := "myapex.hwasan.apks"
6429 if actual[0].String() != expected {
6430 t.Errorf("expected %s, got %s", expected, actual[0].String())
6431 }
6432}
6433
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006434func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006435 t.Helper()
6436
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006437 bp := `
6438 java_library {
6439 name: "some-updatable-apex-lib",
6440 srcs: ["a.java"],
6441 sdk_version: "current",
6442 apex_available: [
6443 "some-updatable-apex",
6444 ],
6445 }
6446
6447 java_library {
6448 name: "some-non-updatable-apex-lib",
6449 srcs: ["a.java"],
6450 apex_available: [
6451 "some-non-updatable-apex",
6452 ],
6453 }
6454
6455 java_library {
6456 name: "some-platform-lib",
6457 srcs: ["a.java"],
6458 sdk_version: "current",
6459 installable: true,
6460 }
6461
6462 java_library {
6463 name: "some-art-lib",
6464 srcs: ["a.java"],
6465 sdk_version: "current",
6466 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006467 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006468 ],
6469 hostdex: true,
6470 }
6471
6472 apex {
6473 name: "some-updatable-apex",
6474 key: "some-updatable-apex.key",
6475 java_libs: ["some-updatable-apex-lib"],
6476 updatable: true,
6477 min_sdk_version: "current",
6478 }
6479
6480 apex {
6481 name: "some-non-updatable-apex",
6482 key: "some-non-updatable-apex.key",
6483 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006484 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006485 }
6486
6487 apex_key {
6488 name: "some-updatable-apex.key",
6489 }
6490
6491 apex_key {
6492 name: "some-non-updatable-apex.key",
6493 }
6494
6495 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006496 name: "com.android.art.debug",
6497 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006498 java_libs: ["some-art-lib"],
6499 updatable: true,
6500 min_sdk_version: "current",
6501 }
6502
6503 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006504 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006505 }
6506
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006507 filegroup {
6508 name: "some-updatable-apex-file_contexts",
6509 srcs: [
6510 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6511 ],
6512 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006513
6514 filegroup {
6515 name: "some-non-updatable-apex-file_contexts",
6516 srcs: [
6517 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6518 ],
6519 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006520 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006521
6522 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6523}
6524
Paul Duffin064b70c2020-11-02 17:32:38 +00006525func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006526 t.Helper()
6527
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006528 bp += cc.GatherRequiredDepsForTest(android.Android)
6529 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006530
6531 fs := map[string][]byte{
6532 "a.java": nil,
6533 "a.jar": nil,
6534 "build/make/target/product/security": nil,
6535 "apex_manifest.json": nil,
6536 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006537 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006538 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6539 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6540 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006541 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006542 }
6543 cc.GatherRequiredFilesForTest(fs)
6544
Paul Duffin39853512021-02-26 11:09:39 +00006545 for k, v := range filesForSdkLibrary {
6546 fs[k] = v
6547 }
Colin Crossae8600b2020-10-29 17:09:13 -07006548 config := android.TestArchConfig(buildDir, nil, bp, fs)
6549
6550 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006551 ctx.RegisterModuleType("apex", BundleFactory)
6552 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006553 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006554 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006555 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006556 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006557 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006558 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006559 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006560 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006561 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6562 ctx.PreDepsMutators(RegisterPreDepsMutators)
6563 ctx.PostDepsMutators(RegisterPostDepsMutators)
6564
Colin Crossae8600b2020-10-29 17:09:13 -07006565 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006566
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006567 pathCtx := android.PathContextForTesting(config)
6568 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6569 transformDexpreoptConfig(dexpreoptConfig)
6570 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6571
Paul Duffinf38931c2021-02-05 16:58:28 +00006572 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006573 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006574 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6575 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6576
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006577 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6578 android.FailIfErrored(t, errs)
6579
6580 _, errs = ctx.PrepareBuildActions(config)
6581 if errmsg == "" {
6582 android.FailIfErrored(t, errs)
6583 } else if len(errs) > 0 {
6584 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006585 } else {
6586 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6587 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006588
6589 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006590}
6591
Jooyung Han548640b2020-04-27 12:10:30 +09006592func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6593 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6594 apex {
6595 name: "myapex",
6596 key: "myapex.key",
6597 updatable: true,
6598 }
6599
6600 apex_key {
6601 name: "myapex.key",
6602 public_key: "testkey.avbpubkey",
6603 private_key: "testkey.pem",
6604 }
6605 `)
6606}
6607
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006608func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6609 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6610 apex {
6611 name: "myapex",
6612 key: "myapex.key",
6613 }
6614
6615 apex_key {
6616 name: "myapex.key",
6617 public_key: "testkey.avbpubkey",
6618 private_key: "testkey.pem",
6619 }
6620 `)
6621}
6622
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006623func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006624 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006625 var transform func(*dexpreopt.GlobalConfig)
6626
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006627 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6628 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006629 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006630 }
6631 testNoUpdatableJarsInBootImage(t, "", transform)
6632 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006633
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006634 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006635 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 +01006636 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006637 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006638 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006639 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006640 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006641
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006642 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 -07006643 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 +01006644 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006645 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006646 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006647 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006648 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006649
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006650 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 -07006651 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006652 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006653 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006654 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006655 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006656 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006657
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006658 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 -07006659 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 +01006660 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006661 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006662 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006663 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006664 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006665
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006666 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6667 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006668 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006669 }
6670 testNoUpdatableJarsInBootImage(t, "", transform)
6671 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006672
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006673 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006674 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006675 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006676 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006677 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006678 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006679 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006680
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006681 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006682 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006683 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006684 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006685 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006686 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006687 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006688
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006689 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006690 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006691 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006692 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006693 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006694 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006695 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006696
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006697 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6698 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006699 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006700 }
6701 testNoUpdatableJarsInBootImage(t, "", transform)
6702 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006703
6704}
6705
6706func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6707 transform := func(config *dexpreopt.GlobalConfig) {
6708 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6709 }
6710 t.Run("prebuilt no source", func(t *testing.T) {
6711 testDexpreoptWithApexes(t, `
6712 prebuilt_apex {
6713 name: "myapex" ,
6714 arch: {
6715 arm64: {
6716 src: "myapex-arm64.apex",
6717 },
6718 arm: {
6719 src: "myapex-arm.apex",
6720 },
6721 },
6722 exported_java_libs: ["libfoo"],
6723 }
6724
6725 java_import {
6726 name: "libfoo",
6727 jars: ["libfoo.jar"],
6728 }
6729`, "", transform)
6730 })
6731
6732 t.Run("prebuilt no source", func(t *testing.T) {
6733 testDexpreoptWithApexes(t, `
6734 prebuilt_apex {
6735 name: "myapex" ,
6736 arch: {
6737 arm64: {
6738 src: "myapex-arm64.apex",
6739 },
6740 arm: {
6741 src: "myapex-arm.apex",
6742 },
6743 },
6744 exported_java_libs: ["libfoo"],
6745 }
6746
6747 java_import {
6748 name: "libfoo",
6749 jars: ["libfoo.jar"],
6750 }
6751`, "", transform)
6752 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006753}
6754
Andrei Onea115e7e72020-06-05 21:14:03 +01006755func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6756 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006757 bp += `
6758 apex_key {
6759 name: "myapex.key",
6760 public_key: "testkey.avbpubkey",
6761 private_key: "testkey.pem",
6762 }`
6763 fs := map[string][]byte{
6764 "lib1/src/A.java": nil,
6765 "lib2/src/B.java": nil,
6766 "system/sepolicy/apex/myapex-file_contexts": nil,
6767 }
6768
Colin Crossae8600b2020-10-29 17:09:13 -07006769 config := android.TestArchConfig(buildDir, nil, bp, fs)
6770 android.SetTestNeverallowRules(config, rules)
6771 updatableBootJars := make([]string, 0, len(apexBootJars))
6772 for _, apexBootJar := range apexBootJars {
6773 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6774 }
6775 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6776
6777 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006778 ctx.RegisterModuleType("apex", BundleFactory)
6779 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6780 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6781 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006782 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006783 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6784 ctx.PreDepsMutators(RegisterPreDepsMutators)
6785 ctx.PostDepsMutators(RegisterPostDepsMutators)
6786 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6787
Colin Crossae8600b2020-10-29 17:09:13 -07006788 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006789
6790 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6791 android.FailIfErrored(t, errs)
6792
6793 _, errs = ctx.PrepareBuildActions(config)
6794 if errmsg == "" {
6795 android.FailIfErrored(t, errs)
6796 } else if len(errs) > 0 {
6797 android.FailIfNoMatchingErrors(t, errmsg, errs)
6798 return
6799 } else {
6800 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6801 }
6802}
6803
6804func TestApexPermittedPackagesRules(t *testing.T) {
6805 testcases := []struct {
6806 name string
6807 expectedError string
6808 bp string
6809 bootJars []string
6810 modulesPackages map[string][]string
6811 }{
6812
6813 {
6814 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6815 expectedError: "",
6816 bp: `
6817 java_library {
6818 name: "bcp_lib1",
6819 srcs: ["lib1/src/*.java"],
6820 permitted_packages: ["foo.bar"],
6821 apex_available: ["myapex"],
6822 sdk_version: "none",
6823 system_modules: "none",
6824 }
6825 java_library {
6826 name: "nonbcp_lib2",
6827 srcs: ["lib2/src/*.java"],
6828 apex_available: ["myapex"],
6829 permitted_packages: ["a.b"],
6830 sdk_version: "none",
6831 system_modules: "none",
6832 }
6833 apex {
6834 name: "myapex",
6835 key: "myapex.key",
6836 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006837 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006838 }`,
6839 bootJars: []string{"bcp_lib1"},
6840 modulesPackages: map[string][]string{
6841 "myapex": []string{
6842 "foo.bar",
6843 },
6844 },
6845 },
6846 {
6847 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6848 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.`,
6849 bp: `
6850 java_library {
6851 name: "bcp_lib1",
6852 srcs: ["lib1/src/*.java"],
6853 apex_available: ["myapex"],
6854 permitted_packages: ["foo.bar"],
6855 sdk_version: "none",
6856 system_modules: "none",
6857 }
6858 java_library {
6859 name: "bcp_lib2",
6860 srcs: ["lib2/src/*.java"],
6861 apex_available: ["myapex"],
6862 permitted_packages: ["foo.bar", "bar.baz"],
6863 sdk_version: "none",
6864 system_modules: "none",
6865 }
6866 apex {
6867 name: "myapex",
6868 key: "myapex.key",
6869 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006870 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006871 }
6872 `,
6873 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6874 modulesPackages: map[string][]string{
6875 "myapex": []string{
6876 "foo.bar",
6877 },
6878 },
6879 },
6880 }
6881 for _, tc := range testcases {
6882 t.Run(tc.name, func(t *testing.T) {
6883 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6884 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6885 })
6886 }
6887}
6888
Jiyong Park62304bb2020-04-13 16:19:48 +09006889func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006890 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006895 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006896 }
6897
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903
6904 cc_library {
6905 name: "mylib",
6906 srcs: ["mylib.cpp"],
6907 system_shared_libs: [],
6908 stl: "none",
6909 stubs: {
6910 versions: ["1"],
6911 },
6912 apex_available: ["myapex"],
6913 }
6914
6915 cc_library {
6916 name: "myprivlib",
6917 srcs: ["mylib.cpp"],
6918 system_shared_libs: [],
6919 stl: "none",
6920 apex_available: ["myapex"],
6921 }
6922
6923
6924 cc_test {
6925 name: "mytest",
6926 gtest: false,
6927 srcs: ["mylib.cpp"],
6928 system_shared_libs: [],
6929 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006930 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006931 test_for: ["myapex"]
6932 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006933
6934 cc_library {
6935 name: "mytestlib",
6936 srcs: ["mylib.cpp"],
6937 system_shared_libs: [],
6938 shared_libs: ["mylib", "myprivlib"],
6939 stl: "none",
6940 test_for: ["myapex"],
6941 }
6942
6943 cc_benchmark {
6944 name: "mybench",
6945 srcs: ["mylib.cpp"],
6946 system_shared_libs: [],
6947 shared_libs: ["mylib", "myprivlib"],
6948 stl: "none",
6949 test_for: ["myapex"],
6950 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006951 `)
6952
6953 // the test 'mytest' is a test for the apex, therefore is linked to the
6954 // actual implementation of mylib instead of its stub.
6955 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6956 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6957 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006958
6959 // The same should be true for cc_library
6960 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6961 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6962 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6963
6964 // ... and for cc_benchmark
6965 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6966 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6967 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006968}
6969
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006970// TODO(jungjw): Move this to proptools
6971func intPtr(i int) *int {
6972 return &i
6973}
6974
6975func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006976 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006977 apex_set {
6978 name: "myapex",
6979 set: "myapex.apks",
6980 filename: "foo_v2.apex",
6981 overrides: ["foo"],
6982 }
6983 `, func(fs map[string][]byte, config android.Config) {
6984 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006985 config.Targets[android.Android] = []android.Target{
6986 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6987 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6988 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006989 })
6990
6991 m := ctx.ModuleForTests("myapex", "android_common")
6992
6993 // Check extract_apks tool parameters.
6994 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6995 actual := extractedApex.Args["abis"]
6996 expected := "ARMEABI_V7A,ARM64_V8A"
6997 if actual != expected {
6998 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6999 }
7000 actual = extractedApex.Args["sdk-version"]
7001 expected = "30"
7002 if actual != expected {
7003 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7004 }
7005
7006 a := m.Module().(*ApexSet)
7007 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007008 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007009 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7010 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7011 }
7012}
7013
Jiyong Park7d95a512020-05-10 15:16:24 +09007014func TestNoStaticLinkingToStubsLib(t *testing.T) {
7015 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7016 apex {
7017 name: "myapex",
7018 key: "myapex.key",
7019 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007020 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007021 }
7022
7023 apex_key {
7024 name: "myapex.key",
7025 public_key: "testkey.avbpubkey",
7026 private_key: "testkey.pem",
7027 }
7028
7029 cc_library {
7030 name: "mylib",
7031 srcs: ["mylib.cpp"],
7032 static_libs: ["otherlib"],
7033 system_shared_libs: [],
7034 stl: "none",
7035 apex_available: [ "myapex" ],
7036 }
7037
7038 cc_library {
7039 name: "otherlib",
7040 srcs: ["mylib.cpp"],
7041 system_shared_libs: [],
7042 stl: "none",
7043 stubs: {
7044 versions: ["1", "2", "3"],
7045 },
7046 apex_available: [ "myapex" ],
7047 }
7048 `)
7049}
7050
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007051func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007052 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007056 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007057 }
7058
7059 apex_key {
7060 name: "myapex.key",
7061 public_key: "testkey.avbpubkey",
7062 private_key: "testkey.pem",
7063 }
7064
7065 prebuilt_apex {
7066 name: "myapex",
7067 prefer: true,
7068 arch: {
7069 arm64: {
7070 src: "myapex-arm64.apex",
7071 },
7072 arm: {
7073 src: "myapex-arm.apex",
7074 },
7075 },
7076 }
7077
7078 apex_set {
7079 name: "myapex_set",
7080 set: "myapex.apks",
7081 filename: "myapex_set.apex",
7082 overrides: ["myapex"],
7083 }
7084 `)
7085
7086 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7087 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7088 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 +09007089 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 +09007090}
7091
Jooyung Han938b5932020-06-20 12:47:47 +09007092func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007093 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007094 apex {
7095 name: "myapex",
7096 key: "myapex.key",
7097 apps: ["app"],
7098 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007099 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007100 }
7101
7102 apex_key {
7103 name: "myapex.key",
7104 public_key: "testkey.avbpubkey",
7105 private_key: "testkey.pem",
7106 }
7107
7108 android_app {
7109 name: "app",
7110 srcs: ["foo/bar/MyClass.java"],
7111 package_name: "foo",
7112 sdk_version: "none",
7113 system_modules: "none",
7114 apex_available: [ "myapex" ],
7115 }
7116 `, withFiles(map[string][]byte{
7117 "sub/Android.bp": []byte(`
7118 override_apex {
7119 name: "override_myapex",
7120 base: "myapex",
7121 apps: ["override_app"],
7122 allowed_files: ":allowed",
7123 }
7124 // Overridable "path" property should be referenced indirectly
7125 filegroup {
7126 name: "allowed",
7127 srcs: ["allowed.txt"],
7128 }
7129 override_android_app {
7130 name: "override_app",
7131 base: "app",
7132 package_name: "bar",
7133 }
7134 `),
7135 }))
7136
7137 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7138 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7139 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7140 }
7141
7142 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7143 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7144 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7145 }
7146}
7147
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007148func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007149 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
7153 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007155 }
7156
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
7162
7163 cc_library {
7164 name: "mylib",
7165 srcs: ["mylib.cpp"],
7166 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007167 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007168 },
7169 apex_available: ["myapex"],
7170 }
7171
7172 cc_prebuilt_library_shared {
7173 name: "mylib",
7174 prefer: false,
7175 srcs: ["prebuilt.so"],
7176 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007177 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007178 },
7179 apex_available: ["myapex"],
7180 }
7181 `)
7182}
7183
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007184func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007185 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007186 apex {
7187 name: "myapex",
7188 key: "myapex.key",
7189 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007190 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007191 }
7192 apex_key {
7193 name: "myapex.key",
7194 public_key: "testkey.avbpubkey",
7195 private_key: "testkey.pem",
7196 }
7197 `, func(fs map[string][]byte, config android.Config) {
7198 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7199 })
7200
7201 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7202 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7203
7204 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7205 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7206
7207 // Make sure output of bundle is .capex
7208 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7209 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7210
7211 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007212 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007213 var builder strings.Builder
7214 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7215 androidMk := builder.String()
7216 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7217}
7218
Martin Stjernholm2856c662020-12-02 15:03:42 +00007219func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007220 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007221 apex {
7222 name: "myapex",
7223 key: "myapex.key",
7224 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007225 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007226 }
7227
7228 apex_key {
7229 name: "myapex.key",
7230 public_key: "testkey.avbpubkey",
7231 private_key: "testkey.pem",
7232 }
7233
7234 cc_library {
7235 name: "mylib",
7236 srcs: ["mylib.cpp"],
7237 apex_available: ["myapex"],
7238 shared_libs: ["otherlib"],
7239 system_shared_libs: [],
7240 }
7241
7242 cc_library {
7243 name: "otherlib",
7244 srcs: ["mylib.cpp"],
7245 stubs: {
7246 versions: ["current"],
7247 },
7248 }
7249
7250 cc_prebuilt_library_shared {
7251 name: "otherlib",
7252 prefer: true,
7253 srcs: ["prebuilt.so"],
7254 stubs: {
7255 versions: ["current"],
7256 },
7257 }
7258 `)
7259
7260 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007261 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007262 var builder strings.Builder
7263 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7264 androidMk := builder.String()
7265
7266 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7267 // a thing there.
7268 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7269}
7270
Jiyong Parke3867542020-12-03 17:28:25 +09007271func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007272 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007273 apex {
7274 name: "myapex",
7275 key: "myapex.key",
7276 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007277 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007278 }
7279
7280 apex_key {
7281 name: "myapex.key",
7282 public_key: "testkey.avbpubkey",
7283 private_key: "testkey.pem",
7284 }
7285
7286 cc_library {
7287 name: "mylib",
7288 srcs: ["mylib.cpp"],
7289 system_shared_libs: [],
7290 stl: "none",
7291 apex_available: ["myapex"],
7292 shared_libs: ["mylib2"],
7293 target: {
7294 apex: {
7295 exclude_shared_libs: ["mylib2"],
7296 },
7297 },
7298 }
7299
7300 cc_library {
7301 name: "mylib2",
7302 srcs: ["mylib.cpp"],
7303 system_shared_libs: [],
7304 stl: "none",
7305 }
7306 `)
7307
7308 // Check if mylib is linked to mylib2 for the non-apex target
7309 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7310 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7311
7312 // Make sure that the link doesn't occur for the apex target
7313 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7314 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7315
7316 // It shouldn't appear in the copy cmd as well.
7317 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7318 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7319}
7320
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007321func TestPrebuiltStubLibDep(t *testing.T) {
7322 bpBase := `
7323 apex {
7324 name: "myapex",
7325 key: "myapex.key",
7326 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007327 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007328 }
7329 apex_key {
7330 name: "myapex.key",
7331 public_key: "testkey.avbpubkey",
7332 private_key: "testkey.pem",
7333 }
7334 cc_library {
7335 name: "mylib",
7336 srcs: ["mylib.cpp"],
7337 apex_available: ["myapex"],
7338 shared_libs: ["stublib"],
7339 system_shared_libs: [],
7340 }
7341 apex {
7342 name: "otherapex",
7343 enabled: %s,
7344 key: "myapex.key",
7345 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007346 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007347 }
7348 `
7349
7350 stublibSourceBp := `
7351 cc_library {
7352 name: "stublib",
7353 srcs: ["mylib.cpp"],
7354 apex_available: ["otherapex"],
7355 system_shared_libs: [],
7356 stl: "none",
7357 stubs: {
7358 versions: ["1"],
7359 },
7360 }
7361 `
7362
7363 stublibPrebuiltBp := `
7364 cc_prebuilt_library_shared {
7365 name: "stublib",
7366 srcs: ["prebuilt.so"],
7367 apex_available: ["otherapex"],
7368 stubs: {
7369 versions: ["1"],
7370 },
7371 %s
7372 }
7373 `
7374
7375 tests := []struct {
7376 name string
7377 stublibBp string
7378 usePrebuilt bool
7379 modNames []string // Modules to collect AndroidMkEntries for
7380 otherApexEnabled []string
7381 }{
7382 {
7383 name: "only_source",
7384 stublibBp: stublibSourceBp,
7385 usePrebuilt: false,
7386 modNames: []string{"stublib"},
7387 otherApexEnabled: []string{"true", "false"},
7388 },
7389 {
7390 name: "source_preferred",
7391 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7392 usePrebuilt: false,
7393 modNames: []string{"stublib", "prebuilt_stublib"},
7394 otherApexEnabled: []string{"true", "false"},
7395 },
7396 {
7397 name: "prebuilt_preferred",
7398 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7399 usePrebuilt: true,
7400 modNames: []string{"stublib", "prebuilt_stublib"},
7401 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7402 },
7403 {
7404 name: "only_prebuilt",
7405 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7406 usePrebuilt: true,
7407 modNames: []string{"stublib"},
7408 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7409 },
7410 }
7411
7412 for _, test := range tests {
7413 t.Run(test.name, func(t *testing.T) {
7414 for _, otherApexEnabled := range test.otherApexEnabled {
7415 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007416 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007417
7418 type modAndMkEntries struct {
7419 mod *cc.Module
7420 mkEntries android.AndroidMkEntries
7421 }
7422 entries := []*modAndMkEntries{}
7423
7424 // Gather shared lib modules that are installable
7425 for _, modName := range test.modNames {
7426 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7427 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7428 continue
7429 }
7430 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007431 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007432 continue
7433 }
Colin Crossaa255532020-07-03 13:18:24 -07007434 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007435 if ent.Disabled {
7436 continue
7437 }
7438 entries = append(entries, &modAndMkEntries{
7439 mod: mod,
7440 mkEntries: ent,
7441 })
7442 }
7443 }
7444 }
7445
7446 var entry *modAndMkEntries = nil
7447 for _, ent := range entries {
7448 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7449 if entry != nil {
7450 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7451 } else {
7452 entry = ent
7453 }
7454 }
7455 }
7456
7457 if entry == nil {
7458 t.Errorf("AndroidMk entry for \"stublib\" missing")
7459 } else {
7460 isPrebuilt := entry.mod.Prebuilt() != nil
7461 if isPrebuilt != test.usePrebuilt {
7462 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7463 }
7464 if !entry.mod.IsStubs() {
7465 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7466 }
7467 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7468 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7469 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007470 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7471 expected := "-D__STUBLIB_API__=1"
7472 if !android.InList(expected, cflags) {
7473 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7474 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007475 }
7476 })
7477 }
7478 })
7479 }
7480}
7481
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007482func TestMain(m *testing.M) {
7483 run := func() int {
7484 setUp()
7485 defer tearDown()
7486
7487 return m.Run()
7488 }
7489
7490 os.Exit(run())
7491}