blob: dd290d3bda22bd088df07a11d22ac8808dcdd7db [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 {
Artur Satayev533b98c2021-03-11 18:03:42 +0000525 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900526 srcs: ["foo.rs"],
527 rlibs: ["libfoo.rlib.rust"],
528 dylibs: ["libfoo.dylib.rust"],
529 apex_available: ["myapex"],
530 }
531
532 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000533 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900534 srcs: ["foo.rs"],
535 crate_name: "foo",
536 apex_available: ["myapex"],
537 }
538
539 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000540 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900541 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")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100735 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
736 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
737 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100738
739 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100740 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100741 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
742 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
743 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800744}
745
Jooyung Hanf21c7972019-12-16 22:32:06 +0900746func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800747 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900748 apex_defaults {
749 name: "myapex-defaults",
750 key: "myapex.key",
751 prebuilts: ["myetc"],
752 native_shared_libs: ["mylib"],
753 java_libs: ["myjar"],
754 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900755 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800756 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000757 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900758 }
759
760 prebuilt_etc {
761 name: "myetc",
762 src: "myprebuilt",
763 }
764
765 apex {
766 name: "myapex",
767 defaults: ["myapex-defaults"],
768 }
769
770 apex_key {
771 name: "myapex.key",
772 public_key: "testkey.avbpubkey",
773 private_key: "testkey.pem",
774 }
775
776 cc_library {
777 name: "mylib",
778 system_shared_libs: [],
779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000780 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900781 }
782
783 java_library {
784 name: "myjar",
785 srcs: ["foo/bar/MyClass.java"],
786 sdk_version: "none",
787 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000788 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900789 }
790
791 android_app {
792 name: "AppFoo",
793 srcs: ["foo/bar/MyClass.java"],
794 sdk_version: "none",
795 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000796 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900797 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900798
799 runtime_resource_overlay {
800 name: "rro",
801 theme: "blue",
802 }
803
markchien2f59ec92020-09-02 16:23:38 +0800804 bpf {
805 name: "bpf",
806 srcs: ["bpf.c", "bpf2.c"],
807 }
808
Jooyung Hanf21c7972019-12-16 22:32:06 +0900809 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000810 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900811 "etc/myetc",
812 "javalib/myjar.jar",
813 "lib64/mylib.so",
814 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900815 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800816 "etc/bpf/bpf.o",
817 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900818 })
819}
820
Jooyung Han01a3ee22019-11-02 02:52:25 +0900821func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800822 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900823 apex {
824 name: "myapex",
825 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000826 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900827 }
828
829 apex_key {
830 name: "myapex.key",
831 public_key: "testkey.avbpubkey",
832 private_key: "testkey.pem",
833 }
834 `)
835
836 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900837 args := module.Rule("apexRule").Args
838 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
839 t.Error("manifest should be apex_manifest.pb, but " + manifest)
840 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900841}
842
Alex Light5098a612018-11-29 17:12:15 -0800843func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800844 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800845 apex {
846 name: "myapex",
847 key: "myapex.key",
848 payload_type: "zip",
849 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000850 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800851 }
852
853 apex_key {
854 name: "myapex.key",
855 public_key: "testkey.avbpubkey",
856 private_key: "testkey.pem",
857 }
858
859 cc_library {
860 name: "mylib",
861 srcs: ["mylib.cpp"],
862 shared_libs: ["mylib2"],
863 system_shared_libs: [],
864 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000865 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800866 }
867
868 cc_library {
869 name: "mylib2",
870 srcs: ["mylib.cpp"],
871 system_shared_libs: [],
872 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000873 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800874 }
875 `)
876
Sundong Ahnabb64432019-10-22 13:58:29 +0900877 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800878 copyCmds := zipApexRule.Args["copy_commands"]
879
880 // Ensure that main rule creates an output
881 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
882
883 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800885
886 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700887 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800888
889 // Ensure that both direct and indirect deps are copied into apex
890 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
891 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900892}
893
894func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800895 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 apex {
897 name: "myapex",
898 key: "myapex.key",
899 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000900 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 }
902
903 apex_key {
904 name: "myapex.key",
905 public_key: "testkey.avbpubkey",
906 private_key: "testkey.pem",
907 }
908
909 cc_library {
910 name: "mylib",
911 srcs: ["mylib.cpp"],
912 shared_libs: ["mylib2", "mylib3"],
913 system_shared_libs: [],
914 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000915 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 }
917
918 cc_library {
919 name: "mylib2",
920 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900921 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 system_shared_libs: [],
923 stl: "none",
924 stubs: {
925 versions: ["1", "2", "3"],
926 },
927 }
928
929 cc_library {
930 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900931 srcs: ["mylib.cpp"],
932 shared_libs: ["mylib4"],
933 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934 stl: "none",
935 stubs: {
936 versions: ["10", "11", "12"],
937 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000938 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900939 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900940
941 cc_library {
942 name: "mylib4",
943 srcs: ["mylib.cpp"],
944 system_shared_libs: [],
945 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000946 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900947 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900948 `)
949
Sundong Ahnabb64432019-10-22 13:58:29 +0900950 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900951 copyCmds := apexRule.Args["copy_commands"]
952
953 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800954 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900955
956 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800957 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900958
959 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800960 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961
Colin Crossaede88c2020-08-11 12:17:01 -0700962 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963
964 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900965 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900966 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900967 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968
969 // 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 -0700970 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900971 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700972 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900973
974 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900975 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900976 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900977
978 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700979 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900980
Jooyung Hana57af4a2020-01-23 05:36:59 +0000981 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900982 "lib64/mylib.so",
983 "lib64/mylib3.so",
984 "lib64/mylib4.so",
985 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900986}
987
Colin Cross7812fd32020-09-25 12:35:10 -0700988func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
989 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800990 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700991 apex {
992 name: "myapex",
993 key: "myapex.key",
994 native_shared_libs: ["mylib", "mylib3"],
995 min_sdk_version: "29",
996 }
997
998 apex_key {
999 name: "myapex.key",
1000 public_key: "testkey.avbpubkey",
1001 private_key: "testkey.pem",
1002 }
1003
1004 cc_library {
1005 name: "mylib",
1006 srcs: ["mylib.cpp"],
1007 shared_libs: ["mylib2", "mylib3"],
1008 system_shared_libs: [],
1009 stl: "none",
1010 apex_available: [ "myapex" ],
1011 min_sdk_version: "28",
1012 }
1013
1014 cc_library {
1015 name: "mylib2",
1016 srcs: ["mylib.cpp"],
1017 cflags: ["-include mylib.h"],
1018 system_shared_libs: [],
1019 stl: "none",
1020 stubs: {
1021 versions: ["28", "29", "30", "current"],
1022 },
1023 min_sdk_version: "28",
1024 }
1025
1026 cc_library {
1027 name: "mylib3",
1028 srcs: ["mylib.cpp"],
1029 shared_libs: ["mylib4"],
1030 system_shared_libs: [],
1031 stl: "none",
1032 stubs: {
1033 versions: ["28", "29", "30", "current"],
1034 },
1035 apex_available: [ "myapex" ],
1036 min_sdk_version: "28",
1037 }
1038
1039 cc_library {
1040 name: "mylib4",
1041 srcs: ["mylib.cpp"],
1042 system_shared_libs: [],
1043 stl: "none",
1044 apex_available: [ "myapex" ],
1045 min_sdk_version: "28",
1046 }
1047 `)
1048
1049 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1050 copyCmds := apexRule.Args["copy_commands"]
1051
1052 // Ensure that direct non-stubs dep is always included
1053 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1054
1055 // Ensure that indirect stubs dep is not included
1056 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1057
1058 // Ensure that direct stubs dep is included
1059 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1060
1061 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1062
Jiyong Park55549df2021-02-26 23:57:23 +09001063 // Ensure that mylib is linking with the latest version of stub for mylib2
1064 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001065 // ... and not linking to the non-stub (impl) variant of mylib2
1066 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1067
1068 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1069 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1070 // .. and not linking to the stubs variant of mylib3
1071 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1072
1073 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001074 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001075 ensureNotContains(t, mylib2Cflags, "-include ")
1076
1077 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001078 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001079
1080 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1081 "lib64/mylib.so",
1082 "lib64/mylib3.so",
1083 "lib64/mylib4.so",
1084 })
1085}
1086
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001087func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1088 t.Parallel()
1089 // myapex (Z)
1090 // mylib -----------------.
1091 // |
1092 // otherapex (29) |
1093 // libstub's versions: 29 Z current
1094 // |
1095 // <platform> |
1096 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001097 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001098 apex {
1099 name: "myapex",
1100 key: "myapex.key",
1101 native_shared_libs: ["mylib"],
1102 min_sdk_version: "Z", // non-final
1103 }
1104
1105 cc_library {
1106 name: "mylib",
1107 srcs: ["mylib.cpp"],
1108 shared_libs: ["libstub"],
1109 apex_available: ["myapex"],
1110 min_sdk_version: "Z",
1111 }
1112
1113 apex_key {
1114 name: "myapex.key",
1115 public_key: "testkey.avbpubkey",
1116 private_key: "testkey.pem",
1117 }
1118
1119 apex {
1120 name: "otherapex",
1121 key: "myapex.key",
1122 native_shared_libs: ["libstub"],
1123 min_sdk_version: "29",
1124 }
1125
1126 cc_library {
1127 name: "libstub",
1128 srcs: ["mylib.cpp"],
1129 stubs: {
1130 versions: ["29", "Z", "current"],
1131 },
1132 apex_available: ["otherapex"],
1133 min_sdk_version: "29",
1134 }
1135
1136 // platform module depending on libstub from otherapex should use the latest stub("current")
1137 cc_library {
1138 name: "libplatform",
1139 srcs: ["mylib.cpp"],
1140 shared_libs: ["libstub"],
1141 }
1142 `, func(fs map[string][]byte, config android.Config) {
1143 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1144 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1145 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1146 })
1147
Jiyong Park55549df2021-02-26 23:57:23 +09001148 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001149 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001150 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001151 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001152 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001153
1154 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1155 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1156 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1157 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1158 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1159}
1160
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001161func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001162 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001163 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001164 name: "myapex2",
1165 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001166 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001167 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001168 }
1169
1170 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001171 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001172 public_key: "testkey.avbpubkey",
1173 private_key: "testkey.pem",
1174 }
1175
1176 cc_library {
1177 name: "mylib",
1178 srcs: ["mylib.cpp"],
1179 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001180 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001181 system_shared_libs: [],
1182 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001183 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001184 }
1185
1186 cc_library {
1187 name: "libfoo",
1188 srcs: ["mylib.cpp"],
1189 shared_libs: ["libbar"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 stubs: {
1193 versions: ["10", "20", "30"],
1194 },
1195 }
1196
1197 cc_library {
1198 name: "libbar",
1199 srcs: ["mylib.cpp"],
1200 system_shared_libs: [],
1201 stl: "none",
1202 }
1203
Jiyong Park678c8812020-02-07 17:25:49 +09001204 cc_library_static {
1205 name: "libbaz",
1206 srcs: ["mylib.cpp"],
1207 system_shared_libs: [],
1208 stl: "none",
1209 apex_available: [ "myapex2" ],
1210 }
1211
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001212 `)
1213
Jiyong Park83dc74b2020-01-14 18:38:44 +09001214 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001215 copyCmds := apexRule.Args["copy_commands"]
1216
1217 // Ensure that direct non-stubs dep is always included
1218 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1219
1220 // Ensure that indirect stubs dep is not included
1221 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1222
1223 // Ensure that dependency of stubs is not included
1224 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1225
Colin Crossaede88c2020-08-11 12:17:01 -07001226 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227
1228 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001229 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001231 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232
Jiyong Park3ff16992019-12-27 14:11:47 +09001233 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234
1235 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1236 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001237
Artur Satayeva8bd1132020-04-27 18:07:06 +01001238 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001239 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001240
Artur Satayeva8bd1132020-04-27 18:07:06 +01001241 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001242 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243}
1244
Jooyung Hand3639552019-08-09 12:57:43 +09001245func TestApexWithRuntimeLibsDependency(t *testing.T) {
1246 /*
1247 myapex
1248 |
1249 v (runtime_libs)
1250 mylib ------+------> libfoo [provides stub]
1251 |
1252 `------> libbar
1253 */
Colin Cross1c460562021-02-16 17:55:47 -08001254 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001255 apex {
1256 name: "myapex",
1257 key: "myapex.key",
1258 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001259 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001260 }
1261
1262 apex_key {
1263 name: "myapex.key",
1264 public_key: "testkey.avbpubkey",
1265 private_key: "testkey.pem",
1266 }
1267
1268 cc_library {
1269 name: "mylib",
1270 srcs: ["mylib.cpp"],
1271 runtime_libs: ["libfoo", "libbar"],
1272 system_shared_libs: [],
1273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001274 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001275 }
1276
1277 cc_library {
1278 name: "libfoo",
1279 srcs: ["mylib.cpp"],
1280 system_shared_libs: [],
1281 stl: "none",
1282 stubs: {
1283 versions: ["10", "20", "30"],
1284 },
1285 }
1286
1287 cc_library {
1288 name: "libbar",
1289 srcs: ["mylib.cpp"],
1290 system_shared_libs: [],
1291 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001292 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001293 }
1294
1295 `)
1296
Sundong Ahnabb64432019-10-22 13:58:29 +09001297 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001298 copyCmds := apexRule.Args["copy_commands"]
1299
1300 // Ensure that direct non-stubs dep is always included
1301 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1302
1303 // Ensure that indirect stubs dep is not included
1304 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1305
1306 // Ensure that runtime_libs dep in included
1307 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1308
Sundong Ahnabb64432019-10-22 13:58:29 +09001309 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001310 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1311 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001312
1313}
1314
Paul Duffina02cae32021-03-09 01:44:06 +00001315var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1316 cc.PrepareForTestWithCcBuildComponents,
1317 PrepareForTestWithApexBuildComponents,
1318 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001319 apex {
1320 name: "com.android.runtime",
1321 key: "com.android.runtime.key",
1322 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001323 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001324 }
1325
1326 apex_key {
1327 name: "com.android.runtime.key",
1328 public_key: "testkey.avbpubkey",
1329 private_key: "testkey.pem",
1330 }
Paul Duffina02cae32021-03-09 01:44:06 +00001331 `),
1332 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1333)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001334
Paul Duffina02cae32021-03-09 01:44:06 +00001335func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1336 result := emptyFixtureFactory.Extend(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001337 cc_library {
1338 name: "libc",
1339 no_libcrt: true,
1340 nocrt: true,
1341 stl: "none",
1342 system_shared_libs: [],
1343 stubs: { versions: ["1"] },
1344 apex_available: ["com.android.runtime"],
1345
1346 sanitize: {
1347 hwaddress: true,
1348 }
1349 }
1350
1351 cc_prebuilt_library_shared {
1352 name: "libclang_rt.hwasan-aarch64-android",
1353 no_libcrt: true,
1354 nocrt: true,
1355 stl: "none",
1356 system_shared_libs: [],
1357 srcs: [""],
1358 stubs: { versions: ["1"] },
1359
1360 sanitize: {
1361 never: true,
1362 },
Paul Duffina02cae32021-03-09 01:44:06 +00001363 } `)
1364 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001365
1366 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1367 "lib64/bionic/libc.so",
1368 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1369 })
1370
1371 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1372
1373 installed := hwasan.Description("install libclang_rt.hwasan")
1374 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1375
1376 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1377 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1378 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1379}
1380
1381func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffina02cae32021-03-09 01:44:06 +00001382 result := emptyFixtureFactory.Extend(
1383 prepareForTestOfRuntimeApexWithHwasan,
1384 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1385 variables.SanitizeDevice = []string{"hwaddress"}
1386 }),
1387 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001388 cc_library {
1389 name: "libc",
1390 no_libcrt: true,
1391 nocrt: true,
1392 stl: "none",
1393 system_shared_libs: [],
1394 stubs: { versions: ["1"] },
1395 apex_available: ["com.android.runtime"],
1396 }
1397
1398 cc_prebuilt_library_shared {
1399 name: "libclang_rt.hwasan-aarch64-android",
1400 no_libcrt: true,
1401 nocrt: true,
1402 stl: "none",
1403 system_shared_libs: [],
1404 srcs: [""],
1405 stubs: { versions: ["1"] },
1406
1407 sanitize: {
1408 never: true,
1409 },
1410 }
Paul Duffina02cae32021-03-09 01:44:06 +00001411 `)
1412 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001413
1414 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1415 "lib64/bionic/libc.so",
1416 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1417 })
1418
1419 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1420
1421 installed := hwasan.Description("install libclang_rt.hwasan")
1422 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1423
1424 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1425 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1426 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1427}
1428
Jooyung Han61b66e92020-03-21 14:21:46 +00001429func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1430 testcases := []struct {
1431 name string
1432 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001433 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001434 shouldLink string
1435 shouldNotLink []string
1436 }{
1437 {
Jiyong Park55549df2021-02-26 23:57:23 +09001438 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001439 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001440 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001441 shouldLink: "30",
1442 shouldNotLink: []string{"29"},
1443 },
1444 {
Jiyong Park55549df2021-02-26 23:57:23 +09001445 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001446 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001447 apexVariant: "apex29",
Jiyong Park55549df2021-02-26 23:57:23 +09001448 shouldLink: "30",
1449 shouldNotLink: []string{"29"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001450 },
1451 }
1452 for _, tc := range testcases {
1453 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001454 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001455 apex {
1456 name: "myapex",
1457 key: "myapex.key",
1458 use_vendor: true,
1459 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001460 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001461 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001462 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001463
Jooyung Han61b66e92020-03-21 14:21:46 +00001464 apex_key {
1465 name: "myapex.key",
1466 public_key: "testkey.avbpubkey",
1467 private_key: "testkey.pem",
1468 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001469
Jooyung Han61b66e92020-03-21 14:21:46 +00001470 cc_library {
1471 name: "mylib",
1472 srcs: ["mylib.cpp"],
1473 vendor_available: true,
1474 shared_libs: ["libbar"],
1475 system_shared_libs: [],
1476 stl: "none",
1477 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001478 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001479 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001480
Jooyung Han61b66e92020-03-21 14:21:46 +00001481 cc_library {
1482 name: "libbar",
1483 srcs: ["mylib.cpp"],
1484 system_shared_libs: [],
1485 stl: "none",
1486 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001487 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001488 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001489
Jooyung Han61b66e92020-03-21 14:21:46 +00001490 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001491 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001492 symbol_file: "",
1493 }
1494 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001495 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001496 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001497
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 // Ensure that LLNDK dep is not included
1499 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1500 "lib64/mylib.so",
1501 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001502
Jooyung Han61b66e92020-03-21 14:21:46 +00001503 // Ensure that LLNDK dep is required
1504 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1505 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1506 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001507
Colin Crossaede88c2020-08-11 12:17:01 -07001508 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001509 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001510 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001511 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001512 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001513
Colin Crossaede88c2020-08-11 12:17:01 -07001514 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001515 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1516 })
1517 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001518}
1519
Jiyong Park25fc6a92018-11-18 18:02:45 +09001520func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001521 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001522 apex {
1523 name: "myapex",
1524 key: "myapex.key",
1525 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001526 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001527 }
1528
1529 apex_key {
1530 name: "myapex.key",
1531 public_key: "testkey.avbpubkey",
1532 private_key: "testkey.pem",
1533 }
1534
1535 cc_library {
1536 name: "mylib",
1537 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001538 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001539 shared_libs: ["libdl#27"],
1540 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001541 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001542 }
1543
1544 cc_library_shared {
1545 name: "mylib_shared",
1546 srcs: ["mylib.cpp"],
1547 shared_libs: ["libdl#27"],
1548 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001549 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001550 }
1551
1552 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001553 name: "libBootstrap",
1554 srcs: ["mylib.cpp"],
1555 stl: "none",
1556 bootstrap: true,
1557 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001558 `)
1559
Sundong Ahnabb64432019-10-22 13:58:29 +09001560 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001561 copyCmds := apexRule.Args["copy_commands"]
1562
1563 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001564 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001565 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1566 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001567
1568 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001569 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001570
Colin Crossaede88c2020-08-11 12:17:01 -07001571 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1572 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1573 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001574
1575 // For dependency to libc
1576 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001577 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001578 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001579 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001580 // ... Cflags from stub is correctly exported to mylib
1581 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1582 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1583
1584 // For dependency to libm
1585 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001586 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001587 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001588 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001589 // ... and is not compiling with the stub
1590 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1591 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1592
1593 // For dependency to libdl
1594 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001595 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001596 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001597 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1598 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001599 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001600 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001601 // ... Cflags from stub is correctly exported to mylib
1602 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1603 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001604
1605 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001606 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1607 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1608 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1609 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001610}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001611
Jooyung Han749dc692020-04-15 11:03:39 +09001612func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001613 // there are three links between liba --> libz.
1614 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001615 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001616 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001617 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001618 apex {
1619 name: "myapex",
1620 key: "myapex.key",
1621 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001622 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001623 }
1624
1625 apex {
1626 name: "otherapex",
1627 key: "myapex.key",
1628 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001629 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001630 }
1631
1632 apex_key {
1633 name: "myapex.key",
1634 public_key: "testkey.avbpubkey",
1635 private_key: "testkey.pem",
1636 }
1637
1638 cc_library {
1639 name: "libx",
1640 shared_libs: ["liba"],
1641 system_shared_libs: [],
1642 stl: "none",
1643 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001644 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001645 }
1646
1647 cc_library {
1648 name: "liby",
1649 shared_libs: ["liba"],
1650 system_shared_libs: [],
1651 stl: "none",
1652 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001653 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001654 }
1655
1656 cc_library {
1657 name: "liba",
1658 shared_libs: ["libz"],
1659 system_shared_libs: [],
1660 stl: "none",
1661 apex_available: [
1662 "//apex_available:anyapex",
1663 "//apex_available:platform",
1664 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001665 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001666 }
1667
1668 cc_library {
1669 name: "libz",
1670 system_shared_libs: [],
1671 stl: "none",
1672 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001673 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001674 },
1675 }
Jooyung Han749dc692020-04-15 11:03:39 +09001676 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001677
1678 expectLink := func(from, from_variant, to, to_variant string) {
1679 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1680 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1681 }
1682 expectNoLink := func(from, from_variant, to, to_variant string) {
1683 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1684 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1685 }
1686 // platform liba is linked to non-stub version
1687 expectLink("liba", "shared", "libz", "shared")
Jiyong Park55549df2021-02-26 23:57:23 +09001688 // liba in myapex is linked to #30
1689 expectLink("liba", "shared_apex29", "libz", "shared_30")
1690 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001691 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001692 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001693 expectLink("liba", "shared_apex30", "libz", "shared_30")
1694 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1695 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001696}
1697
Jooyung Hanaed150d2020-04-02 01:41:41 +09001698func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001699 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001700 apex {
1701 name: "myapex",
1702 key: "myapex.key",
1703 native_shared_libs: ["libx"],
1704 min_sdk_version: "R",
1705 }
1706
1707 apex_key {
1708 name: "myapex.key",
1709 public_key: "testkey.avbpubkey",
1710 private_key: "testkey.pem",
1711 }
1712
1713 cc_library {
1714 name: "libx",
1715 shared_libs: ["libz"],
1716 system_shared_libs: [],
1717 stl: "none",
1718 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001719 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001720 }
1721
1722 cc_library {
1723 name: "libz",
1724 system_shared_libs: [],
1725 stl: "none",
1726 stubs: {
1727 versions: ["29", "R"],
1728 },
1729 }
1730 `, func(fs map[string][]byte, config android.Config) {
1731 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1732 })
1733
1734 expectLink := func(from, from_variant, to, to_variant string) {
1735 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1736 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1737 }
1738 expectNoLink := func(from, from_variant, to, to_variant string) {
1739 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1740 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1741 }
Dan Albertc8060532020-07-22 22:32:17 -07001742 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001743 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1744 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001745}
1746
Jooyung Han749dc692020-04-15 11:03:39 +09001747func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001748 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001749 apex {
1750 name: "myapex",
1751 key: "myapex.key",
1752 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001753 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001754 }
1755
1756 apex_key {
1757 name: "myapex.key",
1758 public_key: "testkey.avbpubkey",
1759 private_key: "testkey.pem",
1760 }
1761
1762 cc_library {
1763 name: "libx",
1764 shared_libs: ["libz"],
1765 system_shared_libs: [],
1766 stl: "none",
1767 apex_available: [ "myapex" ],
1768 }
1769
1770 cc_library {
1771 name: "libz",
1772 system_shared_libs: [],
1773 stl: "none",
1774 stubs: {
1775 versions: ["1", "2"],
1776 },
1777 }
1778 `)
1779
1780 expectLink := func(from, from_variant, to, to_variant string) {
1781 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1782 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1783 }
1784 expectNoLink := func(from, from_variant, to, to_variant string) {
1785 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1786 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1787 }
Colin Crossaede88c2020-08-11 12:17:01 -07001788 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1789 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1790 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001791}
1792
1793func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001794 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001795 apex {
1796 name: "myapex",
1797 key: "myapex.key",
1798 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001799 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001800 }
1801
1802 apex_key {
1803 name: "myapex.key",
1804 public_key: "testkey.avbpubkey",
1805 private_key: "testkey.pem",
1806 }
1807
1808 cc_library {
1809 name: "libx",
1810 system_shared_libs: [],
1811 stl: "none",
1812 apex_available: [ "myapex" ],
1813 stubs: {
1814 versions: ["1", "2"],
1815 },
1816 }
1817
1818 cc_library {
1819 name: "libz",
1820 shared_libs: ["libx"],
1821 system_shared_libs: [],
1822 stl: "none",
1823 }
1824 `)
1825
1826 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001827 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001828 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1829 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1830 }
1831 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001832 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001833 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1834 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1835 }
1836 expectLink("libz", "shared", "libx", "shared_2")
1837 expectNoLink("libz", "shared", "libz", "shared_1")
1838 expectNoLink("libz", "shared", "libz", "shared")
1839}
1840
Jooyung Han75568392020-03-20 04:29:24 +09001841func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001842 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001843 apex {
1844 name: "myapex",
1845 key: "myapex.key",
1846 native_shared_libs: ["libx"],
1847 min_sdk_version: "29",
1848 }
1849
1850 apex_key {
1851 name: "myapex.key",
1852 public_key: "testkey.avbpubkey",
1853 private_key: "testkey.pem",
1854 }
1855
1856 cc_library {
1857 name: "libx",
1858 shared_libs: ["libbar"],
1859 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001860 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001861 }
1862
1863 cc_library {
1864 name: "libbar",
1865 stubs: {
1866 versions: ["29", "30"],
1867 },
1868 }
Jooyung Han75568392020-03-20 04:29:24 +09001869 `, func(fs map[string][]byte, config android.Config) {
1870 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1871 })
Jooyung Han03b51852020-02-26 22:45:42 +09001872 expectLink := func(from, from_variant, to, to_variant string) {
1873 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1874 libFlags := ld.Args["libFlags"]
1875 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1876 }
Colin Crossaede88c2020-08-11 12:17:01 -07001877 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001878}
1879
Jooyung Han75568392020-03-20 04:29:24 +09001880func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001881 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001882 apex {
1883 name: "myapex",
1884 key: "myapex.key",
1885 native_shared_libs: ["libx"],
1886 min_sdk_version: "29",
1887 }
1888
1889 apex_key {
1890 name: "myapex.key",
1891 public_key: "testkey.avbpubkey",
1892 private_key: "testkey.pem",
1893 }
1894
1895 cc_library {
1896 name: "libx",
1897 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001898 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001899 }
Jooyung Han75568392020-03-20 04:29:24 +09001900 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001901
1902 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001903 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001904 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001905 // note that platform variant is not.
1906 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001907 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001908}
1909
Jooyung Han749dc692020-04-15 11:03:39 +09001910func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1911 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001912 apex {
1913 name: "myapex",
1914 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001915 native_shared_libs: ["mylib"],
1916 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001917 }
1918
1919 apex_key {
1920 name: "myapex.key",
1921 public_key: "testkey.avbpubkey",
1922 private_key: "testkey.pem",
1923 }
Jooyung Han749dc692020-04-15 11:03:39 +09001924
1925 cc_library {
1926 name: "mylib",
1927 srcs: ["mylib.cpp"],
1928 system_shared_libs: [],
1929 stl: "none",
1930 apex_available: [
1931 "myapex",
1932 ],
1933 min_sdk_version: "30",
1934 }
1935 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001936
1937 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1938 apex {
1939 name: "myapex",
1940 key: "myapex.key",
1941 native_shared_libs: ["libfoo.ffi"],
1942 min_sdk_version: "29",
1943 }
1944
1945 apex_key {
1946 name: "myapex.key",
1947 public_key: "testkey.avbpubkey",
1948 private_key: "testkey.pem",
1949 }
1950
1951 rust_ffi_shared {
1952 name: "libfoo.ffi",
1953 srcs: ["foo.rs"],
1954 crate_name: "foo",
1955 apex_available: [
1956 "myapex",
1957 ],
1958 min_sdk_version: "30",
1959 }
1960 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001961}
1962
1963func TestApexMinSdkVersion_Okay(t *testing.T) {
1964 testApex(t, `
1965 apex {
1966 name: "myapex",
1967 key: "myapex.key",
1968 native_shared_libs: ["libfoo"],
1969 java_libs: ["libbar"],
1970 min_sdk_version: "29",
1971 }
1972
1973 apex_key {
1974 name: "myapex.key",
1975 public_key: "testkey.avbpubkey",
1976 private_key: "testkey.pem",
1977 }
1978
1979 cc_library {
1980 name: "libfoo",
1981 srcs: ["mylib.cpp"],
1982 shared_libs: ["libfoo_dep"],
1983 apex_available: ["myapex"],
1984 min_sdk_version: "29",
1985 }
1986
1987 cc_library {
1988 name: "libfoo_dep",
1989 srcs: ["mylib.cpp"],
1990 apex_available: ["myapex"],
1991 min_sdk_version: "29",
1992 }
1993
1994 java_library {
1995 name: "libbar",
1996 sdk_version: "current",
1997 srcs: ["a.java"],
1998 static_libs: ["libbar_dep"],
1999 apex_available: ["myapex"],
2000 min_sdk_version: "29",
2001 }
2002
2003 java_library {
2004 name: "libbar_dep",
2005 sdk_version: "current",
2006 srcs: ["a.java"],
2007 apex_available: ["myapex"],
2008 min_sdk_version: "29",
2009 }
Jooyung Han03b51852020-02-26 22:45:42 +09002010 `)
2011}
2012
Artur Satayev8cf899a2020-04-15 17:29:42 +01002013func TestJavaStableSdkVersion(t *testing.T) {
2014 testCases := []struct {
2015 name string
2016 expectedError string
2017 bp string
2018 }{
2019 {
2020 name: "Non-updatable apex with non-stable dep",
2021 bp: `
2022 apex {
2023 name: "myapex",
2024 java_libs: ["myjar"],
2025 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002026 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002027 }
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033 java_library {
2034 name: "myjar",
2035 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002036 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002037 apex_available: ["myapex"],
2038 }
2039 `,
2040 },
2041 {
2042 name: "Updatable apex with stable dep",
2043 bp: `
2044 apex {
2045 name: "myapex",
2046 java_libs: ["myjar"],
2047 key: "myapex.key",
2048 updatable: true,
2049 min_sdk_version: "29",
2050 }
2051 apex_key {
2052 name: "myapex.key",
2053 public_key: "testkey.avbpubkey",
2054 private_key: "testkey.pem",
2055 }
2056 java_library {
2057 name: "myjar",
2058 srcs: ["foo/bar/MyClass.java"],
2059 sdk_version: "current",
2060 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002061 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002062 }
2063 `,
2064 },
2065 {
2066 name: "Updatable apex with non-stable dep",
2067 expectedError: "cannot depend on \"myjar\"",
2068 bp: `
2069 apex {
2070 name: "myapex",
2071 java_libs: ["myjar"],
2072 key: "myapex.key",
2073 updatable: true,
2074 }
2075 apex_key {
2076 name: "myapex.key",
2077 public_key: "testkey.avbpubkey",
2078 private_key: "testkey.pem",
2079 }
2080 java_library {
2081 name: "myjar",
2082 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002083 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002084 apex_available: ["myapex"],
2085 }
2086 `,
2087 },
2088 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002089 name: "Updatable apex with non-stable transitive dep",
2090 // This is not actually detecting that the transitive dependency is unstable, rather it is
2091 // detecting that the transitive dependency is building against a wider API surface than the
2092 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002093 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002094 bp: `
2095 apex {
2096 name: "myapex",
2097 java_libs: ["myjar"],
2098 key: "myapex.key",
2099 updatable: true,
2100 }
2101 apex_key {
2102 name: "myapex.key",
2103 public_key: "testkey.avbpubkey",
2104 private_key: "testkey.pem",
2105 }
2106 java_library {
2107 name: "myjar",
2108 srcs: ["foo/bar/MyClass.java"],
2109 sdk_version: "current",
2110 apex_available: ["myapex"],
2111 static_libs: ["transitive-jar"],
2112 }
2113 java_library {
2114 name: "transitive-jar",
2115 srcs: ["foo/bar/MyClass.java"],
2116 sdk_version: "core_platform",
2117 apex_available: ["myapex"],
2118 }
2119 `,
2120 },
2121 }
2122
2123 for _, test := range testCases {
2124 t.Run(test.name, func(t *testing.T) {
2125 if test.expectedError == "" {
2126 testApex(t, test.bp)
2127 } else {
2128 testApexError(t, test.expectedError, test.bp)
2129 }
2130 })
2131 }
2132}
2133
Jooyung Han749dc692020-04-15 11:03:39 +09002134func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2135 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2136 apex {
2137 name: "myapex",
2138 key: "myapex.key",
2139 native_shared_libs: ["mylib"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "mylib",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["mylib2"],
2153 system_shared_libs: [],
2154 stl: "none",
2155 apex_available: [
2156 "myapex",
2157 ],
2158 min_sdk_version: "29",
2159 }
2160
2161 // indirect part of the apex
2162 cc_library {
2163 name: "mylib2",
2164 srcs: ["mylib.cpp"],
2165 system_shared_libs: [],
2166 stl: "none",
2167 apex_available: [
2168 "myapex",
2169 ],
2170 min_sdk_version: "30",
2171 }
2172 `)
2173}
2174
2175func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2176 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2177 apex {
2178 name: "myapex",
2179 key: "myapex.key",
2180 apps: ["AppFoo"],
2181 min_sdk_version: "29",
2182 }
2183
2184 apex_key {
2185 name: "myapex.key",
2186 public_key: "testkey.avbpubkey",
2187 private_key: "testkey.pem",
2188 }
2189
2190 android_app {
2191 name: "AppFoo",
2192 srcs: ["foo/bar/MyClass.java"],
2193 sdk_version: "current",
2194 min_sdk_version: "29",
2195 system_modules: "none",
2196 stl: "none",
2197 static_libs: ["bar"],
2198 apex_available: [ "myapex" ],
2199 }
2200
2201 java_library {
2202 name: "bar",
2203 sdk_version: "current",
2204 srcs: ["a.java"],
2205 apex_available: [ "myapex" ],
2206 }
2207 `)
2208}
2209
2210func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002211 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002212 apex {
2213 name: "myapex",
2214 key: "myapex.key",
2215 native_shared_libs: ["mylib"],
2216 min_sdk_version: "29",
2217 }
2218
2219 apex_key {
2220 name: "myapex.key",
2221 public_key: "testkey.avbpubkey",
2222 private_key: "testkey.pem",
2223 }
2224
Jiyong Park55549df2021-02-26 23:57:23 +09002225 // mylib in myapex will link to mylib2#30
Jooyung Han749dc692020-04-15 11:03:39 +09002226 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2227 cc_library {
2228 name: "mylib",
2229 srcs: ["mylib.cpp"],
2230 shared_libs: ["mylib2"],
2231 system_shared_libs: [],
2232 stl: "none",
2233 apex_available: ["myapex", "otherapex"],
2234 min_sdk_version: "29",
2235 }
2236
2237 cc_library {
2238 name: "mylib2",
2239 srcs: ["mylib.cpp"],
2240 system_shared_libs: [],
2241 stl: "none",
2242 apex_available: ["otherapex"],
2243 stubs: { versions: ["29", "30"] },
2244 min_sdk_version: "30",
2245 }
2246
2247 apex {
2248 name: "otherapex",
2249 key: "myapex.key",
2250 native_shared_libs: ["mylib", "mylib2"],
2251 min_sdk_version: "30",
2252 }
2253 `)
2254 expectLink := func(from, from_variant, to, to_variant string) {
2255 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2256 libFlags := ld.Args["libFlags"]
2257 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2258 }
Jiyong Park55549df2021-02-26 23:57:23 +09002259 expectLink("mylib", "shared_apex29", "mylib2", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002260 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002261}
2262
Jooyung Haned124c32021-01-26 11:43:46 +09002263func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2264 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2265 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2266 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2267 }
2268 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2269 apex {
2270 name: "myapex",
2271 key: "myapex.key",
2272 native_shared_libs: ["libfoo"],
2273 min_sdk_version: "S",
2274 }
2275 apex_key {
2276 name: "myapex.key",
2277 public_key: "testkey.avbpubkey",
2278 private_key: "testkey.pem",
2279 }
2280 cc_library {
2281 name: "libfoo",
2282 shared_libs: ["libbar"],
2283 apex_available: ["myapex"],
2284 min_sdk_version: "29",
2285 }
2286 cc_library {
2287 name: "libbar",
2288 apex_available: ["myapex"],
2289 }
2290 `, withSAsActiveCodeNames)
2291}
2292
2293func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2294 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2295 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2296 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2297 }
Colin Cross1c460562021-02-16 17:55:47 -08002298 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002299 apex {
2300 name: "myapex",
2301 key: "myapex.key",
2302 native_shared_libs: ["libfoo"],
2303 min_sdk_version: "S",
2304 }
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
2310 cc_library {
2311 name: "libfoo",
2312 shared_libs: ["libbar"],
2313 apex_available: ["myapex"],
2314 min_sdk_version: "S",
2315 }
2316 cc_library {
2317 name: "libbar",
2318 stubs: {
2319 symbol_file: "libbar.map.txt",
2320 versions: ["30", "S", "T"],
2321 },
2322 }
2323 `, withSAsActiveCodeNames)
2324
2325 // ensure libfoo is linked with "S" version of libbar stub
2326 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2327 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09002328 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_T/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002329}
2330
Jiyong Park7c2ee712018-12-07 00:42:25 +09002331func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002332 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002333 apex {
2334 name: "myapex",
2335 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002336 native_shared_libs: ["mylib"],
2337 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002338 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002339 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002340 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002341 }
2342
2343 apex_key {
2344 name: "myapex.key",
2345 public_key: "testkey.avbpubkey",
2346 private_key: "testkey.pem",
2347 }
2348
2349 prebuilt_etc {
2350 name: "myetc",
2351 src: "myprebuilt",
2352 sub_dir: "foo/bar",
2353 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002354
2355 cc_library {
2356 name: "mylib",
2357 srcs: ["mylib.cpp"],
2358 relative_install_path: "foo/bar",
2359 system_shared_libs: [],
2360 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002361 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002362 }
2363
2364 cc_binary {
2365 name: "mybin",
2366 srcs: ["mylib.cpp"],
2367 relative_install_path: "foo/bar",
2368 system_shared_libs: [],
2369 static_executable: true,
2370 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002371 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002372 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002373 `)
2374
Sundong Ahnabb64432019-10-22 13:58:29 +09002375 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002376 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2377
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002378 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002379 ensureListContains(t, dirs, "etc")
2380 ensureListContains(t, dirs, "etc/foo")
2381 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002382 ensureListContains(t, dirs, "lib64")
2383 ensureListContains(t, dirs, "lib64/foo")
2384 ensureListContains(t, dirs, "lib64/foo/bar")
2385 ensureListContains(t, dirs, "lib")
2386 ensureListContains(t, dirs, "lib/foo")
2387 ensureListContains(t, dirs, "lib/foo/bar")
2388
Jiyong Parkbd13e442019-03-15 18:10:35 +09002389 ensureListContains(t, dirs, "bin")
2390 ensureListContains(t, dirs, "bin/foo")
2391 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002392}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002393
Jooyung Han35155c42020-02-06 17:33:20 +09002394func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002395 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002396 apex {
2397 name: "myapex",
2398 key: "myapex.key",
2399 multilib: {
2400 both: {
2401 native_shared_libs: ["mylib"],
2402 binaries: ["mybin"],
2403 },
2404 },
2405 compile_multilib: "both",
2406 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002407 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002408 }
2409
2410 apex_key {
2411 name: "myapex.key",
2412 public_key: "testkey.avbpubkey",
2413 private_key: "testkey.pem",
2414 }
2415
2416 cc_library {
2417 name: "mylib",
2418 relative_install_path: "foo/bar",
2419 system_shared_libs: [],
2420 stl: "none",
2421 apex_available: [ "myapex" ],
2422 native_bridge_supported: true,
2423 }
2424
2425 cc_binary {
2426 name: "mybin",
2427 relative_install_path: "foo/bar",
2428 system_shared_libs: [],
2429 static_executable: true,
2430 stl: "none",
2431 apex_available: [ "myapex" ],
2432 native_bridge_supported: true,
2433 compile_multilib: "both", // default is "first" for binary
2434 multilib: {
2435 lib64: {
2436 suffix: "64",
2437 },
2438 },
2439 }
2440 `, withNativeBridgeEnabled)
2441 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2442 "bin/foo/bar/mybin",
2443 "bin/foo/bar/mybin64",
2444 "bin/arm/foo/bar/mybin",
2445 "bin/arm64/foo/bar/mybin64",
2446 "lib/foo/bar/mylib.so",
2447 "lib/arm/foo/bar/mylib.so",
2448 "lib64/foo/bar/mylib.so",
2449 "lib64/arm64/foo/bar/mylib.so",
2450 })
2451}
2452
Jiyong Parkda6eb592018-12-19 17:12:36 +09002453func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002454 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002455 apex {
2456 name: "myapex",
2457 key: "myapex.key",
2458 native_shared_libs: ["mylib"],
2459 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002460 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002461 }
2462
2463 apex_key {
2464 name: "myapex.key",
2465 public_key: "testkey.avbpubkey",
2466 private_key: "testkey.pem",
2467 }
2468
2469 cc_library {
2470 name: "mylib",
2471 srcs: ["mylib.cpp"],
2472 shared_libs: ["mylib2"],
2473 system_shared_libs: [],
2474 vendor_available: true,
2475 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002476 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002477 }
2478
2479 cc_library {
2480 name: "mylib2",
2481 srcs: ["mylib.cpp"],
2482 system_shared_libs: [],
2483 vendor_available: true,
2484 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002485 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002486 }
Jooyung Handc782442019-11-01 03:14:38 +09002487 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002488 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002489 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002490
2491 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002492 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002493 for _, implicit := range i.Implicits {
2494 inputsList = append(inputsList, implicit.String())
2495 }
2496 }
2497 inputsString := strings.Join(inputsList, " ")
2498
2499 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002500 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2501 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002502
2503 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002504 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2505 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002506}
Jiyong Park16e91a02018-12-20 18:18:08 +09002507
Jooyung Han85d61762020-06-24 23:50:26 +09002508func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002509 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2510 apex {
2511 name: "myapex",
2512 key: "myapex.key",
2513 use_vendor: true,
2514 }
2515 apex_key {
2516 name: "myapex.key",
2517 public_key: "testkey.avbpubkey",
2518 private_key: "testkey.pem",
2519 }
2520 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002521 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002522 })
Colin Cross440e0d02020-06-11 11:32:11 -07002523 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002524 testApex(t, `
2525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002529 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002530 }
2531 apex_key {
2532 name: "myapex.key",
2533 public_key: "testkey.avbpubkey",
2534 private_key: "testkey.pem",
2535 }
2536 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002537 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002538 })
2539}
2540
Jooyung Han5c998b92019-06-27 11:30:33 +09002541func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2542 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2543 apex {
2544 name: "myapex",
2545 key: "myapex.key",
2546 native_shared_libs: ["mylib"],
2547 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002548 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002549 }
2550
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556
2557 cc_library {
2558 name: "mylib",
2559 srcs: ["mylib.cpp"],
2560 system_shared_libs: [],
2561 stl: "none",
2562 }
2563 `)
2564}
2565
Jooyung Han85d61762020-06-24 23:50:26 +09002566func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002567 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002568 apex {
2569 name: "myapex",
2570 key: "myapex.key",
2571 binaries: ["mybin"],
2572 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002573 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002574 }
2575 apex_key {
2576 name: "myapex.key",
2577 public_key: "testkey.avbpubkey",
2578 private_key: "testkey.pem",
2579 }
2580 cc_binary {
2581 name: "mybin",
2582 vendor: true,
2583 shared_libs: ["libfoo"],
2584 }
2585 cc_library {
2586 name: "libfoo",
2587 proprietary: true,
2588 }
2589 `)
2590
2591 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2592 "bin/mybin",
2593 "lib64/libfoo.so",
2594 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2595 "lib64/libc++.so",
2596 })
2597
2598 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002599 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002600 name := apexBundle.BaseModuleName()
2601 prefix := "TARGET_"
2602 var builder strings.Builder
2603 data.Custom(&builder, name, prefix, "", data)
2604 androidMk := builder.String()
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002605 installPath := path.Join(buildDir, "../target/product/test_device/vendor/apex")
2606 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002607
2608 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2609 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2610 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002611}
2612
Jooyung Handf78e212020-07-22 15:54:47 +09002613func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002614 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002615 apex {
2616 name: "myapex",
2617 key: "myapex.key",
2618 binaries: ["mybin"],
2619 vendor: true,
2620 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002621 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002622 }
2623 apex_key {
2624 name: "myapex.key",
2625 public_key: "testkey.avbpubkey",
2626 private_key: "testkey.pem",
2627 }
2628 cc_binary {
2629 name: "mybin",
2630 vendor: true,
2631 shared_libs: ["libvndk", "libvendor"],
2632 }
2633 cc_library {
2634 name: "libvndk",
2635 vndk: {
2636 enabled: true,
2637 },
2638 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002639 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002640 }
2641 cc_library {
2642 name: "libvendor",
2643 vendor: true,
2644 }
2645 `)
2646
2647 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2648
Colin Crossaede88c2020-08-11 12:17:01 -07002649 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002650 libs := names(ldRule.Args["libFlags"])
2651 // VNDK libs(libvndk/libc++) as they are
2652 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2653 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2654 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002655 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002656
2657 // VNDK libs are not included when use_vndk_as_stable: true
2658 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2659 "bin/mybin",
2660 "lib64/libvendor.so",
2661 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002662
2663 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2664 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2665 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002666}
2667
Jooyung Han8e5685d2020-09-21 11:02:57 +09002668func TestApex_withPrebuiltFirmware(t *testing.T) {
2669 testCases := []struct {
2670 name string
2671 additionalProp string
2672 }{
2673 {"system apex with prebuilt_firmware", ""},
2674 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2675 }
2676 for _, tc := range testCases {
2677 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002678 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002679 apex {
2680 name: "myapex",
2681 key: "myapex.key",
2682 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002683 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002684 `+tc.additionalProp+`
2685 }
2686 apex_key {
2687 name: "myapex.key",
2688 public_key: "testkey.avbpubkey",
2689 private_key: "testkey.pem",
2690 }
2691 prebuilt_firmware {
2692 name: "myfirmware",
2693 src: "myfirmware.bin",
2694 filename_from_src: true,
2695 `+tc.additionalProp+`
2696 }
2697 `)
2698 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2699 "etc/firmware/myfirmware.bin",
2700 })
2701 })
2702 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002703}
2704
Jooyung Hanefb184e2020-06-25 17:14:25 +09002705func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002706 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002707 apex {
2708 name: "myapex",
2709 key: "myapex.key",
2710 use_vendor: true,
2711 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002712 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002713 }
2714
2715 apex_key {
2716 name: "myapex.key",
2717 public_key: "testkey.avbpubkey",
2718 private_key: "testkey.pem",
2719 }
2720
2721 cc_library {
2722 name: "mylib",
2723 vendor_available: true,
2724 apex_available: ["myapex"],
2725 }
2726 `, func(fs map[string][]byte, config android.Config) {
2727 setUseVendorAllowListForTest(config, []string{"myapex"})
2728 })
2729
2730 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002731 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002732 name := apexBundle.BaseModuleName()
2733 prefix := "TARGET_"
2734 var builder strings.Builder
2735 data.Custom(&builder, name, prefix, "", data)
2736 androidMk := builder.String()
2737 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2738}
2739
2740func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002741 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
2745 vendor: true,
2746 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002747 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002748 }
2749
2750 apex_key {
2751 name: "myapex.key",
2752 public_key: "testkey.avbpubkey",
2753 private_key: "testkey.pem",
2754 }
2755
2756 cc_library {
2757 name: "mylib",
2758 vendor_available: true,
2759 }
2760 `)
2761
2762 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002763 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002764 name := apexBundle.BaseModuleName()
2765 prefix := "TARGET_"
2766 var builder strings.Builder
2767 data.Custom(&builder, name, prefix, "", data)
2768 androidMk := builder.String()
2769 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2770}
2771
Jooyung Han2ed99d02020-06-24 23:26:26 +09002772func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002773 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002774 apex {
2775 name: "myapex",
2776 key: "myapex.key",
2777 vintf_fragments: ["fragment.xml"],
2778 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002779 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002780 }
2781 apex_key {
2782 name: "myapex.key",
2783 public_key: "testkey.avbpubkey",
2784 private_key: "testkey.pem",
2785 }
2786 cc_binary {
2787 name: "mybin",
2788 }
2789 `)
2790
2791 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002792 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002793 name := apexBundle.BaseModuleName()
2794 prefix := "TARGET_"
2795 var builder strings.Builder
2796 data.Custom(&builder, name, prefix, "", data)
2797 androidMk := builder.String()
2798 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2799 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2800}
2801
Jiyong Park16e91a02018-12-20 18:18:08 +09002802func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002803 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002804 apex {
2805 name: "myapex",
2806 key: "myapex.key",
2807 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002808 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002809 }
2810
2811 apex_key {
2812 name: "myapex.key",
2813 public_key: "testkey.avbpubkey",
2814 private_key: "testkey.pem",
2815 }
2816
2817 cc_library {
2818 name: "mylib",
2819 srcs: ["mylib.cpp"],
2820 system_shared_libs: [],
2821 stl: "none",
2822 stubs: {
2823 versions: ["1", "2", "3"],
2824 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002825 apex_available: [
2826 "//apex_available:platform",
2827 "myapex",
2828 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002829 }
2830
2831 cc_binary {
2832 name: "not_in_apex",
2833 srcs: ["mylib.cpp"],
2834 static_libs: ["mylib"],
2835 static_executable: true,
2836 system_shared_libs: [],
2837 stl: "none",
2838 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002839 `)
2840
Colin Cross7113d202019-11-20 16:39:12 -08002841 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002842
2843 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002844 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002845}
Jiyong Park9335a262018-12-24 11:31:58 +09002846
2847func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002848 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002849 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002850 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002851 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002852 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002853 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002854 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002855 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002856 }
2857
2858 cc_library {
2859 name: "mylib",
2860 srcs: ["mylib.cpp"],
2861 system_shared_libs: [],
2862 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002863 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002864 }
2865
2866 apex_key {
2867 name: "myapex.key",
2868 public_key: "testkey.avbpubkey",
2869 private_key: "testkey.pem",
2870 }
2871
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002872 android_app_certificate {
2873 name: "myapex.certificate",
2874 certificate: "testkey",
2875 }
2876
2877 android_app_certificate {
2878 name: "myapex.certificate.override",
2879 certificate: "testkey.override",
2880 }
2881
Jiyong Park9335a262018-12-24 11:31:58 +09002882 `)
2883
2884 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002885 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002886
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002887 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2888 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002889 "vendor/foo/devkeys/testkey.avbpubkey")
2890 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002891 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2892 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002893 "vendor/foo/devkeys/testkey.pem")
2894 }
2895
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002896 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002897 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002898 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002899 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002900 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002901 }
2902}
Jiyong Park58e364a2019-01-19 19:24:06 +09002903
Jooyung Hanf121a652019-12-17 14:30:11 +09002904func TestCertificate(t *testing.T) {
2905 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002906 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002907 apex {
2908 name: "myapex",
2909 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002910 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002911 }
2912 apex_key {
2913 name: "myapex.key",
2914 public_key: "testkey.avbpubkey",
2915 private_key: "testkey.pem",
2916 }`)
2917 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2918 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2919 if actual := rule.Args["certificates"]; actual != expected {
2920 t.Errorf("certificates should be %q, not %q", expected, actual)
2921 }
2922 })
2923 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002924 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002925 apex {
2926 name: "myapex_keytest",
2927 key: "myapex.key",
2928 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002929 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002930 }
2931 apex_key {
2932 name: "myapex.key",
2933 public_key: "testkey.avbpubkey",
2934 private_key: "testkey.pem",
2935 }
2936 android_app_certificate {
2937 name: "myapex.certificate.override",
2938 certificate: "testkey.override",
2939 }`)
2940 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2941 expected := "testkey.override.x509.pem testkey.override.pk8"
2942 if actual := rule.Args["certificates"]; actual != expected {
2943 t.Errorf("certificates should be %q, not %q", expected, actual)
2944 }
2945 })
2946 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002947 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002948 apex {
2949 name: "myapex",
2950 key: "myapex.key",
2951 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002952 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002953 }
2954 apex_key {
2955 name: "myapex.key",
2956 public_key: "testkey.avbpubkey",
2957 private_key: "testkey.pem",
2958 }
2959 android_app_certificate {
2960 name: "myapex.certificate",
2961 certificate: "testkey",
2962 }`)
2963 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2964 expected := "testkey.x509.pem testkey.pk8"
2965 if actual := rule.Args["certificates"]; actual != expected {
2966 t.Errorf("certificates should be %q, not %q", expected, actual)
2967 }
2968 })
2969 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002970 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002971 apex {
2972 name: "myapex_keytest",
2973 key: "myapex.key",
2974 file_contexts: ":myapex-file_contexts",
2975 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002976 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }
2983 android_app_certificate {
2984 name: "myapex.certificate.override",
2985 certificate: "testkey.override",
2986 }`)
2987 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2988 expected := "testkey.override.x509.pem testkey.override.pk8"
2989 if actual := rule.Args["certificates"]; actual != expected {
2990 t.Errorf("certificates should be %q, not %q", expected, actual)
2991 }
2992 })
2993 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002994 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002995 apex {
2996 name: "myapex",
2997 key: "myapex.key",
2998 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002999 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003000 }
3001 apex_key {
3002 name: "myapex.key",
3003 public_key: "testkey.avbpubkey",
3004 private_key: "testkey.pem",
3005 }`)
3006 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3007 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3008 if actual := rule.Args["certificates"]; actual != expected {
3009 t.Errorf("certificates should be %q, not %q", expected, actual)
3010 }
3011 })
3012 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003013 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003014 apex {
3015 name: "myapex_keytest",
3016 key: "myapex.key",
3017 file_contexts: ":myapex-file_contexts",
3018 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003019 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003020 }
3021 apex_key {
3022 name: "myapex.key",
3023 public_key: "testkey.avbpubkey",
3024 private_key: "testkey.pem",
3025 }
3026 android_app_certificate {
3027 name: "myapex.certificate.override",
3028 certificate: "testkey.override",
3029 }`)
3030 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3031 expected := "testkey.override.x509.pem testkey.override.pk8"
3032 if actual := rule.Args["certificates"]; actual != expected {
3033 t.Errorf("certificates should be %q, not %q", expected, actual)
3034 }
3035 })
3036}
3037
Jiyong Park58e364a2019-01-19 19:24:06 +09003038func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003039 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003040 apex {
3041 name: "myapex",
3042 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003043 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003044 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003045 }
3046
3047 apex {
3048 name: "otherapex",
3049 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003050 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003051 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003052 }
3053
3054 apex_key {
3055 name: "myapex.key",
3056 public_key: "testkey.avbpubkey",
3057 private_key: "testkey.pem",
3058 }
3059
3060 cc_library {
3061 name: "mylib",
3062 srcs: ["mylib.cpp"],
3063 system_shared_libs: [],
3064 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003065 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003066 "myapex",
3067 "otherapex",
3068 ],
Jooyung Han24282772020-03-21 23:20:55 +09003069 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003070 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003071 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003072 cc_library {
3073 name: "mylib2",
3074 srcs: ["mylib.cpp"],
3075 system_shared_libs: [],
3076 stl: "none",
3077 apex_available: [
3078 "myapex",
3079 "otherapex",
3080 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003081 static_libs: ["mylib3"],
3082 recovery_available: true,
3083 min_sdk_version: "29",
3084 }
3085 cc_library {
3086 name: "mylib3",
3087 srcs: ["mylib.cpp"],
3088 system_shared_libs: [],
3089 stl: "none",
3090 apex_available: [
3091 "myapex",
3092 "otherapex",
3093 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003094 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003095 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003096 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003097 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003098 `)
3099
Jooyung Hanc87a0592020-03-02 17:44:33 +09003100 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003101 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003102 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003103 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003104
Jooyung Hanccce2f22020-03-07 03:45:53 +09003105 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003106 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003107 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003108 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003109 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003110
Jooyung Hanccce2f22020-03-07 03:45:53 +09003111 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003112 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003113 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003114 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003115 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003116
Colin Crossaede88c2020-08-11 12:17:01 -07003117 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3118 // each variant defines additional macros to distinguish which apex variant it is built for
3119
3120 // non-APEX variant does not have __ANDROID_APEX__ defined
3121 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3122 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3123
3124 // APEX variant has __ANDROID_APEX__ defined
3125 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3126 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3127 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3128 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3129
3130 // APEX variant has __ANDROID_APEX__ defined
3131 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3132 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3133 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3134 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3135
Dan Albertb19953d2020-11-17 15:29:36 -08003136 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003137 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3138 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003139 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003140
3141 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3142 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003143
3144 // non-APEX variant does not have __ANDROID_APEX__ defined
3145 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3146 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3147
3148 // APEX variant has __ANDROID_APEX__ defined
3149 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003150 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003151 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003152 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003153
Jooyung Hanc87a0592020-03-02 17:44:33 +09003154 // APEX variant has __ANDROID_APEX__ defined
3155 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003156 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003157 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003158 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003159
Dan Albertb19953d2020-11-17 15:29:36 -08003160 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003161 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003162 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003163 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003164}
Jiyong Park7e636d02019-01-28 16:16:54 +09003165
3166func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003167 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003168 apex {
3169 name: "myapex",
3170 key: "myapex.key",
3171 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003172 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003173 }
3174
3175 apex_key {
3176 name: "myapex.key",
3177 public_key: "testkey.avbpubkey",
3178 private_key: "testkey.pem",
3179 }
3180
3181 cc_library_headers {
3182 name: "mylib_headers",
3183 export_include_dirs: ["my_include"],
3184 system_shared_libs: [],
3185 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003186 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003187 }
3188
3189 cc_library {
3190 name: "mylib",
3191 srcs: ["mylib.cpp"],
3192 system_shared_libs: [],
3193 stl: "none",
3194 header_libs: ["mylib_headers"],
3195 export_header_lib_headers: ["mylib_headers"],
3196 stubs: {
3197 versions: ["1", "2", "3"],
3198 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003199 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003200 }
3201
3202 cc_library {
3203 name: "otherlib",
3204 srcs: ["mylib.cpp"],
3205 system_shared_libs: [],
3206 stl: "none",
3207 shared_libs: ["mylib"],
3208 }
3209 `)
3210
Colin Cross7113d202019-11-20 16:39:12 -08003211 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003212
3213 // Ensure that the include path of the header lib is exported to 'otherlib'
3214 ensureContains(t, cFlags, "-Imy_include")
3215}
Alex Light9670d332019-01-29 18:07:33 -08003216
Jiyong Park7cd10e32020-01-14 09:22:18 +09003217type fileInApex struct {
3218 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003219 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003220 isLink bool
3221}
3222
Jooyung Hana57af4a2020-01-23 05:36:59 +00003223func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003224 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003225 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003226 copyCmds := apexRule.Args["copy_commands"]
3227 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003228 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003229 for _, cmd := range strings.Split(copyCmds, "&&") {
3230 cmd = strings.TrimSpace(cmd)
3231 if cmd == "" {
3232 continue
3233 }
3234 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003235 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003236 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003237 switch terms[0] {
3238 case "mkdir":
3239 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003240 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003241 t.Fatal("copyCmds contains invalid cp command", cmd)
3242 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003243 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003244 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003245 isLink = false
3246 case "ln":
3247 if len(terms) != 3 && len(terms) != 4 {
3248 // ln LINK TARGET or ln -s LINK TARGET
3249 t.Fatal("copyCmds contains invalid ln command", cmd)
3250 }
3251 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003252 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003253 isLink = true
3254 default:
3255 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3256 }
3257 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003258 index := strings.Index(dst, imageApexDir)
3259 if index == -1 {
3260 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3261 }
3262 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003263 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003264 }
3265 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003266 return ret
3267}
3268
Jooyung Hana57af4a2020-01-23 05:36:59 +00003269func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3270 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003271 var failed bool
3272 var surplus []string
3273 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003274 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003275 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003276 for _, expected := range files {
3277 if matched, _ := path.Match(expected, file.path); matched {
3278 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003279 mactchFound = true
3280 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003281 }
3282 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003283 if !mactchFound {
3284 surplus = append(surplus, file.path)
3285 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003286 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003287
Jooyung Han31c470b2019-10-18 16:26:59 +09003288 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003289 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003290 t.Log("surplus files", surplus)
3291 failed = true
3292 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003293
3294 if len(files) > len(filesMatched) {
3295 var missing []string
3296 for _, expected := range files {
3297 if !filesMatched[expected] {
3298 missing = append(missing, expected)
3299 }
3300 }
3301 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003302 t.Log("missing files", missing)
3303 failed = true
3304 }
3305 if failed {
3306 t.Fail()
3307 }
3308}
3309
Jooyung Han344d5432019-08-23 11:17:39 +09003310func TestVndkApexCurrent(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003311 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003312 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003313 name: "com.android.vndk.current",
3314 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003315 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003316 }
3317
3318 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003319 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
3323
3324 cc_library {
3325 name: "libvndk",
3326 srcs: ["mylib.cpp"],
3327 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003328 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003329 vndk: {
3330 enabled: true,
3331 },
3332 system_shared_libs: [],
3333 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003334 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003335 }
3336
3337 cc_library {
3338 name: "libvndksp",
3339 srcs: ["mylib.cpp"],
3340 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003341 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003342 vndk: {
3343 enabled: true,
3344 support_system_process: true,
3345 },
3346 system_shared_libs: [],
3347 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003348 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003349 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003350 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003351
Colin Cross2807f002021-03-02 10:15:29 -08003352 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003353 "lib/libvndk.so",
3354 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003355 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003356 "lib64/libvndk.so",
3357 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003358 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003359 "etc/llndk.libraries.VER.txt",
3360 "etc/vndkcore.libraries.VER.txt",
3361 "etc/vndksp.libraries.VER.txt",
3362 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003363 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003364 })
Jooyung Han344d5432019-08-23 11:17:39 +09003365}
3366
3367func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003368 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003369 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003370 name: "com.android.vndk.current",
3371 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003372 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003373 }
3374
3375 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003376 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380
3381 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003382 name: "libvndk",
3383 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003384 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003385 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003386 vndk: {
3387 enabled: true,
3388 },
3389 system_shared_libs: [],
3390 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003391 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003392 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003393
3394 cc_prebuilt_library_shared {
3395 name: "libvndk.arm",
3396 srcs: ["libvndk.arm.so"],
3397 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003398 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003399 vndk: {
3400 enabled: true,
3401 },
3402 enabled: false,
3403 arch: {
3404 arm: {
3405 enabled: true,
3406 },
3407 },
3408 system_shared_libs: [],
3409 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003410 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003411 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003412 `+vndkLibrariesTxtFiles("current"),
3413 withFiles(map[string][]byte{
3414 "libvndk.so": nil,
3415 "libvndk.arm.so": nil,
3416 }))
Colin Cross2807f002021-03-02 10:15:29 -08003417 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003418 "lib/libvndk.so",
3419 "lib/libvndk.arm.so",
3420 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003421 "lib/libc++.so",
3422 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003423 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 })
Jooyung Han344d5432019-08-23 11:17:39 +09003425}
3426
Jooyung Han39edb6c2019-11-06 16:53:07 +09003427func vndkLibrariesTxtFiles(vers ...string) (result string) {
3428 for _, v := range vers {
3429 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003430 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003431 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003432 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003433 name: "` + txt + `.libraries.txt",
3434 }
3435 `
3436 }
3437 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003438 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003439 result += `
3440 prebuilt_etc {
3441 name: "` + txt + `.libraries.` + v + `.txt",
3442 src: "dummy.txt",
3443 }
3444 `
3445 }
3446 }
3447 }
3448 return
3449}
3450
Jooyung Han344d5432019-08-23 11:17:39 +09003451func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003452 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003453 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003454 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003455 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003456 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003457 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003458 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003459 }
3460
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466
Jooyung Han31c470b2019-10-18 16:26:59 +09003467 vndk_prebuilt_shared {
3468 name: "libvndk27",
3469 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003470 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003471 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003472 vndk: {
3473 enabled: true,
3474 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003475 target_arch: "arm64",
3476 arch: {
3477 arm: {
3478 srcs: ["libvndk27_arm.so"],
3479 },
3480 arm64: {
3481 srcs: ["libvndk27_arm64.so"],
3482 },
3483 },
Colin Cross2807f002021-03-02 10:15:29 -08003484 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003485 }
3486
3487 vndk_prebuilt_shared {
3488 name: "libvndk27",
3489 version: "27",
3490 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003491 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003492 vndk: {
3493 enabled: true,
3494 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003495 target_arch: "x86_64",
3496 arch: {
3497 x86: {
3498 srcs: ["libvndk27_x86.so"],
3499 },
3500 x86_64: {
3501 srcs: ["libvndk27_x86_64.so"],
3502 },
3503 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003504 }
3505 `+vndkLibrariesTxtFiles("27"),
3506 withFiles(map[string][]byte{
3507 "libvndk27_arm.so": nil,
3508 "libvndk27_arm64.so": nil,
3509 "libvndk27_x86.so": nil,
3510 "libvndk27_x86_64.so": nil,
3511 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003512
Colin Cross2807f002021-03-02 10:15:29 -08003513 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003514 "lib/libvndk27_arm.so",
3515 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003516 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003517 })
Jooyung Han344d5432019-08-23 11:17:39 +09003518}
3519
Jooyung Han90eee022019-10-01 20:02:42 +09003520func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003521 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003522 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003523 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003524 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003525 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003526 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003527 }
3528 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003529 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003530 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003531 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003532 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003534 }
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003539 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003540
3541 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003542 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003543 actual := proptools.String(bundle.properties.Apex_name)
3544 if !reflect.DeepEqual(actual, expected) {
3545 t.Errorf("Got '%v', expected '%v'", actual, expected)
3546 }
3547 }
3548
Colin Cross2807f002021-03-02 10:15:29 -08003549 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3550 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003551}
3552
Jooyung Han344d5432019-08-23 11:17:39 +09003553func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003554 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003555 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003556 name: "com.android.vndk.current",
3557 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003558 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003559 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003560 }
3561
3562 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003563 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003564 public_key: "testkey.avbpubkey",
3565 private_key: "testkey.pem",
3566 }
3567
3568 cc_library {
3569 name: "libvndk",
3570 srcs: ["mylib.cpp"],
3571 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003572 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003573 native_bridge_supported: true,
3574 host_supported: true,
3575 vndk: {
3576 enabled: true,
3577 },
3578 system_shared_libs: [],
3579 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003580 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003581 }
Colin Cross2807f002021-03-02 10:15:29 -08003582 `+vndkLibrariesTxtFiles("current"),
3583 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003584
Colin Cross2807f002021-03-02 10:15:29 -08003585 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003586 "lib/libvndk.so",
3587 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003588 "lib/libc++.so",
3589 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003590 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003591 })
Jooyung Han344d5432019-08-23 11:17:39 +09003592}
3593
3594func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003595 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003596 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003597 name: "com.android.vndk.current",
3598 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003599 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003600 native_bridge_supported: true,
3601 }
3602
3603 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003604 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003605 public_key: "testkey.avbpubkey",
3606 private_key: "testkey.pem",
3607 }
3608
3609 cc_library {
3610 name: "libvndk",
3611 srcs: ["mylib.cpp"],
3612 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003613 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003614 native_bridge_supported: true,
3615 host_supported: true,
3616 vndk: {
3617 enabled: true,
3618 },
3619 system_shared_libs: [],
3620 stl: "none",
3621 }
3622 `)
3623}
3624
Jooyung Han31c470b2019-10-18 16:26:59 +09003625func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003626 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003627 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003628 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003629 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003630 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003631 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003632 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003633 }
3634
3635 apex_key {
3636 name: "myapex.key",
3637 public_key: "testkey.avbpubkey",
3638 private_key: "testkey.pem",
3639 }
3640
3641 vndk_prebuilt_shared {
3642 name: "libvndk27",
3643 version: "27",
3644 target_arch: "arm",
3645 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003646 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 vndk: {
3648 enabled: true,
3649 },
3650 arch: {
3651 arm: {
3652 srcs: ["libvndk27.so"],
3653 }
3654 },
3655 }
3656
3657 vndk_prebuilt_shared {
3658 name: "libvndk27",
3659 version: "27",
3660 target_arch: "arm",
3661 binder32bit: true,
3662 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003663 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003664 vndk: {
3665 enabled: true,
3666 },
3667 arch: {
3668 arm: {
3669 srcs: ["libvndk27binder32.so"],
3670 }
3671 },
Colin Cross2807f002021-03-02 10:15:29 -08003672 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003673 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003674 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003675 withFiles(map[string][]byte{
3676 "libvndk27.so": nil,
3677 "libvndk27binder32.so": nil,
3678 }),
3679 withBinder32bit,
3680 withTargets(map[android.OsType][]android.Target{
3681 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003682 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3683 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 },
3685 }),
3686 )
3687
Colin Cross2807f002021-03-02 10:15:29 -08003688 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003689 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003690 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 })
3692}
3693
Jooyung Han45a96772020-06-15 14:59:42 +09003694func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003695 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003696 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003697 name: "com.android.vndk.current",
3698 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003699 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003700 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003701 }
3702
3703 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003704 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003705 public_key: "testkey.avbpubkey",
3706 private_key: "testkey.pem",
3707 }
3708
3709 cc_library {
3710 name: "libz",
3711 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003712 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003713 vndk: {
3714 enabled: true,
3715 },
3716 stubs: {
3717 symbol_file: "libz.map.txt",
3718 versions: ["30"],
3719 }
3720 }
3721 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3722 "libz.map.txt": nil,
3723 }))
3724
Colin Cross2807f002021-03-02 10:15:29 -08003725 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003726 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3727 ensureListEmpty(t, provideNativeLibs)
3728}
3729
Jooyung Hane1633032019-08-01 17:41:43 +09003730func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003731 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003732 apex {
3733 name: "myapex_nodep",
3734 key: "myapex.key",
3735 native_shared_libs: ["lib_nodep"],
3736 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003737 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003738 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003739 }
3740
3741 apex {
3742 name: "myapex_dep",
3743 key: "myapex.key",
3744 native_shared_libs: ["lib_dep"],
3745 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003746 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003747 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003748 }
3749
3750 apex {
3751 name: "myapex_provider",
3752 key: "myapex.key",
3753 native_shared_libs: ["libfoo"],
3754 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003755 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003756 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003757 }
3758
3759 apex {
3760 name: "myapex_selfcontained",
3761 key: "myapex.key",
3762 native_shared_libs: ["lib_dep", "libfoo"],
3763 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003764 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003765 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003766 }
3767
3768 apex_key {
3769 name: "myapex.key",
3770 public_key: "testkey.avbpubkey",
3771 private_key: "testkey.pem",
3772 }
3773
3774 cc_library {
3775 name: "lib_nodep",
3776 srcs: ["mylib.cpp"],
3777 system_shared_libs: [],
3778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003779 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003780 }
3781
3782 cc_library {
3783 name: "lib_dep",
3784 srcs: ["mylib.cpp"],
3785 shared_libs: ["libfoo"],
3786 system_shared_libs: [],
3787 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003788 apex_available: [
3789 "myapex_dep",
3790 "myapex_provider",
3791 "myapex_selfcontained",
3792 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003793 }
3794
3795 cc_library {
3796 name: "libfoo",
3797 srcs: ["mytest.cpp"],
3798 stubs: {
3799 versions: ["1"],
3800 },
3801 system_shared_libs: [],
3802 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003803 apex_available: [
3804 "myapex_provider",
3805 "myapex_selfcontained",
3806 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003807 }
3808 `)
3809
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003810 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003811 var provideNativeLibs, requireNativeLibs []string
3812
Sundong Ahnabb64432019-10-22 13:58:29 +09003813 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003814 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3815 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003816 ensureListEmpty(t, provideNativeLibs)
3817 ensureListEmpty(t, requireNativeLibs)
3818
Sundong Ahnabb64432019-10-22 13:58:29 +09003819 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003820 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3821 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003822 ensureListEmpty(t, provideNativeLibs)
3823 ensureListContains(t, requireNativeLibs, "libfoo.so")
3824
Sundong Ahnabb64432019-10-22 13:58:29 +09003825 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003826 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3827 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003828 ensureListContains(t, provideNativeLibs, "libfoo.so")
3829 ensureListEmpty(t, requireNativeLibs)
3830
Sundong Ahnabb64432019-10-22 13:58:29 +09003831 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003832 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3833 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003834 ensureListContains(t, provideNativeLibs, "libfoo.so")
3835 ensureListEmpty(t, requireNativeLibs)
3836}
3837
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003838func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003839 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003840 apex {
3841 name: "myapex",
3842 key: "myapex.key",
3843 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003844 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003845 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003846 }
3847
3848 apex_key {
3849 name: "myapex.key",
3850 public_key: "testkey.avbpubkey",
3851 private_key: "testkey.pem",
3852 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003853
3854 cc_library {
3855 name: "mylib",
3856 srcs: ["mylib.cpp"],
3857 system_shared_libs: [],
3858 stl: "none",
3859 apex_available: [
3860 "//apex_available:platform",
3861 "myapex",
3862 ],
3863 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003864 `)
3865
Sundong Ahnabb64432019-10-22 13:58:29 +09003866 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003867 apexManifestRule := module.Rule("apexManifestRule")
3868 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3869 apexRule := module.Rule("apexRule")
3870 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003871
3872 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003873 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003874 name := apexBundle.BaseModuleName()
3875 prefix := "TARGET_"
3876 var builder strings.Builder
3877 data.Custom(&builder, name, prefix, "", data)
3878 androidMk := builder.String()
3879 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3880 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003881}
3882
Alex Light0851b882019-02-07 13:20:53 -08003883func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003884 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003885 apex {
3886 name: "myapex",
3887 key: "myapex.key",
3888 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003889 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003890 }
3891
3892 apex_key {
3893 name: "myapex.key",
3894 public_key: "testkey.avbpubkey",
3895 private_key: "testkey.pem",
3896 }
3897
3898 cc_library {
3899 name: "mylib_common",
3900 srcs: ["mylib.cpp"],
3901 system_shared_libs: [],
3902 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003903 apex_available: [
3904 "//apex_available:platform",
3905 "myapex",
3906 ],
Alex Light0851b882019-02-07 13:20:53 -08003907 }
3908 `)
3909
Sundong Ahnabb64432019-10-22 13:58:29 +09003910 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003911 apexRule := module.Rule("apexRule")
3912 copyCmds := apexRule.Args["copy_commands"]
3913
3914 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3915 t.Log("Apex was a test apex!")
3916 t.Fail()
3917 }
3918 // Ensure that main rule creates an output
3919 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3920
3921 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003922 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003923
3924 // Ensure that both direct and indirect deps are copied into apex
3925 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3926
Colin Cross7113d202019-11-20 16:39:12 -08003927 // Ensure that the platform variant ends with _shared
3928 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003929
Colin Cross56a83212020-09-15 18:30:11 -07003930 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003931 t.Log("Found mylib_common not in any apex!")
3932 t.Fail()
3933 }
3934}
3935
3936func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003937 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003938 apex_test {
3939 name: "myapex",
3940 key: "myapex.key",
3941 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003942 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003943 }
3944
3945 apex_key {
3946 name: "myapex.key",
3947 public_key: "testkey.avbpubkey",
3948 private_key: "testkey.pem",
3949 }
3950
3951 cc_library {
3952 name: "mylib_common_test",
3953 srcs: ["mylib.cpp"],
3954 system_shared_libs: [],
3955 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003956 // TODO: remove //apex_available:platform
3957 apex_available: [
3958 "//apex_available:platform",
3959 "myapex",
3960 ],
Alex Light0851b882019-02-07 13:20:53 -08003961 }
3962 `)
3963
Sundong Ahnabb64432019-10-22 13:58:29 +09003964 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003965 apexRule := module.Rule("apexRule")
3966 copyCmds := apexRule.Args["copy_commands"]
3967
3968 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3969 t.Log("Apex was not a test apex!")
3970 t.Fail()
3971 }
3972 // Ensure that main rule creates an output
3973 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3974
3975 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003976 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003977
3978 // Ensure that both direct and indirect deps are copied into apex
3979 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3980
Colin Cross7113d202019-11-20 16:39:12 -08003981 // Ensure that the platform variant ends with _shared
3982 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003983}
3984
Alex Light9670d332019-01-29 18:07:33 -08003985func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003986 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003987 apex {
3988 name: "myapex",
3989 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003990 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003991 multilib: {
3992 first: {
3993 native_shared_libs: ["mylib_common"],
3994 }
3995 },
3996 target: {
3997 android: {
3998 multilib: {
3999 first: {
4000 native_shared_libs: ["mylib"],
4001 }
4002 }
4003 },
4004 host: {
4005 multilib: {
4006 first: {
4007 native_shared_libs: ["mylib2"],
4008 }
4009 }
4010 }
4011 }
4012 }
4013
4014 apex_key {
4015 name: "myapex.key",
4016 public_key: "testkey.avbpubkey",
4017 private_key: "testkey.pem",
4018 }
4019
4020 cc_library {
4021 name: "mylib",
4022 srcs: ["mylib.cpp"],
4023 system_shared_libs: [],
4024 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004025 // TODO: remove //apex_available:platform
4026 apex_available: [
4027 "//apex_available:platform",
4028 "myapex",
4029 ],
Alex Light9670d332019-01-29 18:07:33 -08004030 }
4031
4032 cc_library {
4033 name: "mylib_common",
4034 srcs: ["mylib.cpp"],
4035 system_shared_libs: [],
4036 stl: "none",
4037 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004038 // TODO: remove //apex_available:platform
4039 apex_available: [
4040 "//apex_available:platform",
4041 "myapex",
4042 ],
Alex Light9670d332019-01-29 18:07:33 -08004043 }
4044
4045 cc_library {
4046 name: "mylib2",
4047 srcs: ["mylib.cpp"],
4048 system_shared_libs: [],
4049 stl: "none",
4050 compile_multilib: "first",
4051 }
4052 `)
4053
Sundong Ahnabb64432019-10-22 13:58:29 +09004054 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004055 copyCmds := apexRule.Args["copy_commands"]
4056
4057 // Ensure that main rule creates an output
4058 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4059
4060 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004061 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4062 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4063 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004064
4065 // Ensure that both direct and indirect deps are copied into apex
4066 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4067 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4068 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4069
Colin Cross7113d202019-11-20 16:39:12 -08004070 // Ensure that the platform variant ends with _shared
4071 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4072 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4073 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004074}
Jiyong Park04480cf2019-02-06 00:16:29 +09004075
Jiyong Park59140302020-12-14 18:44:04 +09004076func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004077 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004078 apex {
4079 name: "myapex",
4080 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004081 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004082 arch: {
4083 arm64: {
4084 native_shared_libs: ["mylib.arm64"],
4085 },
4086 x86_64: {
4087 native_shared_libs: ["mylib.x64"],
4088 },
4089 }
4090 }
4091
4092 apex_key {
4093 name: "myapex.key",
4094 public_key: "testkey.avbpubkey",
4095 private_key: "testkey.pem",
4096 }
4097
4098 cc_library {
4099 name: "mylib.arm64",
4100 srcs: ["mylib.cpp"],
4101 system_shared_libs: [],
4102 stl: "none",
4103 // TODO: remove //apex_available:platform
4104 apex_available: [
4105 "//apex_available:platform",
4106 "myapex",
4107 ],
4108 }
4109
4110 cc_library {
4111 name: "mylib.x64",
4112 srcs: ["mylib.cpp"],
4113 system_shared_libs: [],
4114 stl: "none",
4115 // TODO: remove //apex_available:platform
4116 apex_available: [
4117 "//apex_available:platform",
4118 "myapex",
4119 ],
4120 }
4121 `)
4122
4123 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4124 copyCmds := apexRule.Args["copy_commands"]
4125
4126 // Ensure that apex variant is created for the direct dep
4127 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4128 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4129
4130 // Ensure that both direct and indirect deps are copied into apex
4131 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4132 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4133}
4134
Jiyong Park04480cf2019-02-06 00:16:29 +09004135func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004136 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004137 apex {
4138 name: "myapex",
4139 key: "myapex.key",
4140 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004141 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004142 }
4143
4144 apex_key {
4145 name: "myapex.key",
4146 public_key: "testkey.avbpubkey",
4147 private_key: "testkey.pem",
4148 }
4149
4150 sh_binary {
4151 name: "myscript",
4152 src: "mylib.cpp",
4153 filename: "myscript.sh",
4154 sub_dir: "script",
4155 }
4156 `)
4157
Sundong Ahnabb64432019-10-22 13:58:29 +09004158 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004159 copyCmds := apexRule.Args["copy_commands"]
4160
4161 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4162}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004163
Jooyung Han91df2082019-11-20 01:49:42 +09004164func TestApexInVariousPartition(t *testing.T) {
4165 testcases := []struct {
4166 propName, parition, flattenedPartition string
4167 }{
4168 {"", "system", "system_ext"},
4169 {"product_specific: true", "product", "product"},
4170 {"soc_specific: true", "vendor", "vendor"},
4171 {"proprietary: true", "vendor", "vendor"},
4172 {"vendor: true", "vendor", "vendor"},
4173 {"system_ext_specific: true", "system_ext", "system_ext"},
4174 }
4175 for _, tc := range testcases {
4176 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004177 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004178 apex {
4179 name: "myapex",
4180 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004181 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004182 `+tc.propName+`
4183 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004184
Jooyung Han91df2082019-11-20 01:49:42 +09004185 apex_key {
4186 name: "myapex.key",
4187 public_key: "testkey.avbpubkey",
4188 private_key: "testkey.pem",
4189 }
4190 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004191
Jooyung Han91df2082019-11-20 01:49:42 +09004192 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4193 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4194 actual := apex.installDir.String()
4195 if actual != expected {
4196 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4197 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004198
Jooyung Han91df2082019-11-20 01:49:42 +09004199 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4200 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4201 actual = flattened.installDir.String()
4202 if actual != expected {
4203 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4204 }
4205 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004206 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004207}
Jiyong Park67882562019-03-21 01:11:21 +09004208
Jooyung Han580eb4f2020-06-24 19:33:06 +09004209func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004210 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004211 apex {
4212 name: "myapex",
4213 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004214 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004215 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004216
Jooyung Han580eb4f2020-06-24 19:33:06 +09004217 apex_key {
4218 name: "myapex.key",
4219 public_key: "testkey.avbpubkey",
4220 private_key: "testkey.pem",
4221 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004222 `)
4223 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004224 rule := module.Output("file_contexts")
4225 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4226}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004227
Jooyung Han580eb4f2020-06-24 19:33:06 +09004228func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004229 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004230 apex {
4231 name: "myapex",
4232 key: "myapex.key",
4233 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004234 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004235 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004236
Jooyung Han580eb4f2020-06-24 19:33:06 +09004237 apex_key {
4238 name: "myapex.key",
4239 public_key: "testkey.avbpubkey",
4240 private_key: "testkey.pem",
4241 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004242 `, withFiles(map[string][]byte{
4243 "my_own_file_contexts": nil,
4244 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004245}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004246
Jooyung Han580eb4f2020-06-24 19:33:06 +09004247func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004248 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004249 apex {
4250 name: "myapex",
4251 key: "myapex.key",
4252 product_specific: true,
4253 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004254 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004255 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004256
Jooyung Han580eb4f2020-06-24 19:33:06 +09004257 apex_key {
4258 name: "myapex.key",
4259 public_key: "testkey.avbpubkey",
4260 private_key: "testkey.pem",
4261 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004262 `)
4263
Colin Cross1c460562021-02-16 17:55:47 -08004264 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004265 apex {
4266 name: "myapex",
4267 key: "myapex.key",
4268 product_specific: true,
4269 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004270 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004271 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004272
Jooyung Han580eb4f2020-06-24 19:33:06 +09004273 apex_key {
4274 name: "myapex.key",
4275 public_key: "testkey.avbpubkey",
4276 private_key: "testkey.pem",
4277 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004278 `, withFiles(map[string][]byte{
4279 "product_specific_file_contexts": nil,
4280 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004281 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4282 rule := module.Output("file_contexts")
4283 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4284}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004285
Jooyung Han580eb4f2020-06-24 19:33:06 +09004286func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004287 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004288 apex {
4289 name: "myapex",
4290 key: "myapex.key",
4291 product_specific: true,
4292 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004293 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004294 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004295
Jooyung Han580eb4f2020-06-24 19:33:06 +09004296 apex_key {
4297 name: "myapex.key",
4298 public_key: "testkey.avbpubkey",
4299 private_key: "testkey.pem",
4300 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004301
Jooyung Han580eb4f2020-06-24 19:33:06 +09004302 filegroup {
4303 name: "my-file-contexts",
4304 srcs: ["product_specific_file_contexts"],
4305 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004306 `, withFiles(map[string][]byte{
4307 "product_specific_file_contexts": nil,
4308 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004309 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4310 rule := module.Output("file_contexts")
4311 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004312}
4313
Jiyong Park67882562019-03-21 01:11:21 +09004314func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004315 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004316 apex_key {
4317 name: "myapex.key",
4318 public_key: ":my.avbpubkey",
4319 private_key: ":my.pem",
4320 product_specific: true,
4321 }
4322
4323 filegroup {
4324 name: "my.avbpubkey",
4325 srcs: ["testkey2.avbpubkey"],
4326 }
4327
4328 filegroup {
4329 name: "my.pem",
4330 srcs: ["testkey2.pem"],
4331 }
4332 `)
4333
4334 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4335 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004336 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004337 if actual_pubkey != expected_pubkey {
4338 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4339 }
4340 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004341 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004342 if actual_privkey != expected_privkey {
4343 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4344 }
4345}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004346
4347func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004348 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004349 prebuilt_apex {
4350 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004351 arch: {
4352 arm64: {
4353 src: "myapex-arm64.apex",
4354 },
4355 arm: {
4356 src: "myapex-arm.apex",
4357 },
4358 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004359 }
4360 `)
4361
4362 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4363
Jiyong Parkc95714e2019-03-29 14:23:10 +09004364 expectedInput := "myapex-arm64.apex"
4365 if prebuilt.inputApex.String() != expectedInput {
4366 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4367 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004368}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004369
4370func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004371 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004372 prebuilt_apex {
4373 name: "myapex",
4374 src: "myapex-arm.apex",
4375 filename: "notmyapex.apex",
4376 }
4377 `)
4378
4379 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4380
4381 expected := "notmyapex.apex"
4382 if p.installFilename != expected {
4383 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4384 }
4385}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004386
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004387func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004388 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004389 prebuilt_apex {
4390 name: "myapex.prebuilt",
4391 src: "myapex-arm.apex",
4392 overrides: [
4393 "myapex",
4394 ],
4395 }
4396 `)
4397
4398 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4399
4400 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004401 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004402 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004403 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004404 }
4405}
4406
Paul Duffin092153d2021-01-26 11:42:39 +00004407// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4408// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004409func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4410 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004411 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004412 }
4413
Paul Duffin89886cb2021-02-05 16:44:03 +00004414 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004415 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004416 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004417 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004418 stem := android.RemoveOptionalPrebuiltPrefix(name)
4419 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004420 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4421 }
4422 }
4423
Paul Duffin39853512021-02-26 11:09:39 +00004424 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004425 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004426 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004427 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4428 }
4429 }
4430
4431 t.Run("prebuilt only", func(t *testing.T) {
4432 bp := `
4433 prebuilt_apex {
4434 name: "myapex",
4435 arch: {
4436 arm64: {
4437 src: "myapex-arm64.apex",
4438 },
4439 arm: {
4440 src: "myapex-arm.apex",
4441 },
4442 },
Paul Duffin39853512021-02-26 11:09:39 +00004443 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004444 }
4445
4446 java_import {
4447 name: "libfoo",
4448 jars: ["libfoo.jar"],
4449 }
Paul Duffin39853512021-02-26 11:09:39 +00004450
4451 java_sdk_library_import {
4452 name: "libbar",
4453 public: {
4454 jars: ["libbar.jar"],
4455 },
4456 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004457 `
4458
4459 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4460 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4461
Paul Duffinf6932af2021-02-26 18:21:56 +00004462 // Make sure that the deapexer has the correct input APEX.
4463 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4464 rule := deapexer.Rule("deapexer")
4465 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4466 t.Errorf("expected: %q, found: %q", expected, actual)
4467 }
4468
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004469 // Make sure that the prebuilt_apex has the correct input APEX.
4470 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4471 rule = prebuiltApex.Rule("android/soong/android.Cp")
4472 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4473 t.Errorf("expected: %q, found: %q", expected, actual)
4474 }
4475
Paul Duffin89886cb2021-02-05 16:44:03 +00004476 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004477
4478 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004479 })
4480
4481 t.Run("prebuilt with source preferred", func(t *testing.T) {
4482
4483 bp := `
4484 prebuilt_apex {
4485 name: "myapex",
4486 arch: {
4487 arm64: {
4488 src: "myapex-arm64.apex",
4489 },
4490 arm: {
4491 src: "myapex-arm.apex",
4492 },
4493 },
Paul Duffin39853512021-02-26 11:09:39 +00004494 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004495 }
4496
4497 java_import {
4498 name: "libfoo",
4499 jars: ["libfoo.jar"],
4500 }
4501
4502 java_library {
4503 name: "libfoo",
4504 }
Paul Duffin39853512021-02-26 11:09:39 +00004505
4506 java_sdk_library_import {
4507 name: "libbar",
4508 public: {
4509 jars: ["libbar.jar"],
4510 },
4511 }
4512
4513 java_sdk_library {
4514 name: "libbar",
4515 srcs: ["foo/bar/MyClass.java"],
4516 unsafe_ignore_missing_latest_api: true,
4517 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004518 `
4519
4520 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4521 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4522
Paul Duffin89886cb2021-02-05 16:44:03 +00004523 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004524 ensureNoSourceVariant(t, ctx, "libfoo")
4525
4526 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4527 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004528 })
4529
4530 t.Run("prebuilt preferred with source", func(t *testing.T) {
4531 bp := `
4532 prebuilt_apex {
4533 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004534 arch: {
4535 arm64: {
4536 src: "myapex-arm64.apex",
4537 },
4538 arm: {
4539 src: "myapex-arm.apex",
4540 },
4541 },
Paul Duffin39853512021-02-26 11:09:39 +00004542 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004543 }
4544
4545 java_import {
4546 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004547 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004548 jars: ["libfoo.jar"],
4549 }
4550
4551 java_library {
4552 name: "libfoo",
4553 }
Paul Duffin39853512021-02-26 11:09:39 +00004554
4555 java_sdk_library_import {
4556 name: "libbar",
4557 prefer: true,
4558 public: {
4559 jars: ["libbar.jar"],
4560 },
4561 }
4562
4563 java_sdk_library {
4564 name: "libbar",
4565 srcs: ["foo/bar/MyClass.java"],
4566 unsafe_ignore_missing_latest_api: true,
4567 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004568 `
4569
4570 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4571 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4572
Paul Duffin89886cb2021-02-05 16:44:03 +00004573 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004574 ensureNoSourceVariant(t, ctx, "libfoo")
4575
4576 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4577 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004578 })
4579}
4580
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004581func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4582 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004583 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004584 }
4585
Paul Duffin37856732021-02-26 14:24:15 +00004586 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4587 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004588 s := ctx.SingletonForTests("dex_bootjars")
4589 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004590 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004591 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004592 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004593 foundLibfooJar = true
4594 buildRule := s.Output(output)
4595 actual := android.NormalizePathForTesting(buildRule.Input)
4596 if actual != bootDexJarPath {
4597 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4598 }
4599 }
4600 }
4601 if !foundLibfooJar {
4602 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4603 }
4604 }
4605
Paul Duffin4fd997b2021-02-03 20:06:33 +00004606 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004607 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004608 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4609 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4610 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4611 }
4612
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004613 t.Run("prebuilt only", func(t *testing.T) {
4614 bp := `
4615 prebuilt_apex {
4616 name: "myapex",
4617 arch: {
4618 arm64: {
4619 src: "myapex-arm64.apex",
4620 },
4621 arm: {
4622 src: "myapex-arm.apex",
4623 },
4624 },
Paul Duffin37856732021-02-26 14:24:15 +00004625 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004626 }
4627
4628 java_import {
4629 name: "libfoo",
4630 jars: ["libfoo.jar"],
4631 apex_available: ["myapex"],
4632 }
Paul Duffin37856732021-02-26 14:24:15 +00004633
4634 java_sdk_library_import {
4635 name: "libbar",
4636 public: {
4637 jars: ["libbar.jar"],
4638 },
4639 apex_available: ["myapex"],
4640 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004641 `
4642
4643 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004644 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4645 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004646
Paul Duffin9d67ca62021-02-03 20:06:33 +00004647 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4648 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004649.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004650.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4651`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004652 })
4653
4654 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4655 bp := `
4656 prebuilt_apex {
4657 name: "myapex",
4658 arch: {
4659 arm64: {
4660 src: "myapex-arm64.apex",
4661 },
4662 arm: {
4663 src: "myapex-arm.apex",
4664 },
4665 },
Paul Duffin37856732021-02-26 14:24:15 +00004666 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004667 }
4668
4669 java_import {
4670 name: "libfoo",
4671 jars: ["libfoo.jar"],
4672 apex_available: ["myapex"],
4673 }
4674
4675 java_library {
4676 name: "libfoo",
4677 srcs: ["foo/bar/MyClass.java"],
4678 apex_available: ["myapex"],
4679 }
Paul Duffin37856732021-02-26 14:24:15 +00004680
4681 java_sdk_library_import {
4682 name: "libbar",
4683 public: {
4684 jars: ["libbar.jar"],
4685 },
4686 apex_available: ["myapex"],
4687 }
4688
4689 java_sdk_library {
4690 name: "libbar",
4691 srcs: ["foo/bar/MyClass.java"],
4692 unsafe_ignore_missing_latest_api: true,
4693 apex_available: ["myapex"],
4694 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004695 `
4696
4697 // In this test the source (java_library) libfoo is active since the
4698 // prebuilt (java_import) defaults to prefer:false. However the
4699 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4700 // find the dex boot jar in it. We either need to disable the source libfoo
4701 // or make the prebuilt libfoo preferred.
4702 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4703 })
4704
4705 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4706 bp := `
4707 prebuilt_apex {
4708 name: "myapex",
4709 arch: {
4710 arm64: {
4711 src: "myapex-arm64.apex",
4712 },
4713 arm: {
4714 src: "myapex-arm.apex",
4715 },
4716 },
Paul Duffin37856732021-02-26 14:24:15 +00004717 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004718 }
4719
4720 java_import {
4721 name: "libfoo",
4722 prefer: true,
4723 jars: ["libfoo.jar"],
4724 apex_available: ["myapex"],
4725 }
4726
4727 java_library {
4728 name: "libfoo",
4729 srcs: ["foo/bar/MyClass.java"],
4730 apex_available: ["myapex"],
4731 }
Paul Duffin37856732021-02-26 14:24:15 +00004732
4733 java_sdk_library_import {
4734 name: "libbar",
4735 prefer: true,
4736 public: {
4737 jars: ["libbar.jar"],
4738 },
4739 apex_available: ["myapex"],
4740 }
4741
4742 java_sdk_library {
4743 name: "libbar",
4744 srcs: ["foo/bar/MyClass.java"],
4745 unsafe_ignore_missing_latest_api: true,
4746 apex_available: ["myapex"],
4747 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004748 `
4749
4750 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004751 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4752 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004753
Paul Duffin9d67ca62021-02-03 20:06:33 +00004754 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4755 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004756.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004757.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4758`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004759 })
4760
4761 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4762 bp := `
4763 apex {
4764 name: "myapex",
4765 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004766 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004767 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004768 }
4769
4770 apex_key {
4771 name: "myapex.key",
4772 public_key: "testkey.avbpubkey",
4773 private_key: "testkey.pem",
4774 }
4775
4776 prebuilt_apex {
4777 name: "myapex",
4778 arch: {
4779 arm64: {
4780 src: "myapex-arm64.apex",
4781 },
4782 arm: {
4783 src: "myapex-arm.apex",
4784 },
4785 },
Paul Duffin37856732021-02-26 14:24:15 +00004786 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004787 }
4788
4789 java_import {
4790 name: "libfoo",
4791 jars: ["libfoo.jar"],
4792 apex_available: ["myapex"],
4793 }
4794
4795 java_library {
4796 name: "libfoo",
4797 srcs: ["foo/bar/MyClass.java"],
4798 apex_available: ["myapex"],
4799 }
Paul Duffin37856732021-02-26 14:24:15 +00004800
4801 java_sdk_library_import {
4802 name: "libbar",
4803 public: {
4804 jars: ["libbar.jar"],
4805 },
4806 apex_available: ["myapex"],
4807 }
4808
4809 java_sdk_library {
4810 name: "libbar",
4811 srcs: ["foo/bar/MyClass.java"],
4812 unsafe_ignore_missing_latest_api: true,
4813 apex_available: ["myapex"],
4814 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004815 `
4816
4817 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004818 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4819 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004820
4821 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4822 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004823.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004824.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4825`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004826 })
4827
4828 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4829 bp := `
4830 apex {
4831 name: "myapex",
4832 enabled: false,
4833 key: "myapex.key",
4834 java_libs: ["libfoo"],
4835 }
4836
4837 apex_key {
4838 name: "myapex.key",
4839 public_key: "testkey.avbpubkey",
4840 private_key: "testkey.pem",
4841 }
4842
4843 prebuilt_apex {
4844 name: "myapex",
4845 arch: {
4846 arm64: {
4847 src: "myapex-arm64.apex",
4848 },
4849 arm: {
4850 src: "myapex-arm.apex",
4851 },
4852 },
Paul Duffin37856732021-02-26 14:24:15 +00004853 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004854 }
4855
4856 java_import {
4857 name: "libfoo",
4858 prefer: true,
4859 jars: ["libfoo.jar"],
4860 apex_available: ["myapex"],
4861 }
4862
4863 java_library {
4864 name: "libfoo",
4865 srcs: ["foo/bar/MyClass.java"],
4866 apex_available: ["myapex"],
4867 }
Paul Duffin37856732021-02-26 14:24:15 +00004868
4869 java_sdk_library_import {
4870 name: "libbar",
4871 prefer: true,
4872 public: {
4873 jars: ["libbar.jar"],
4874 },
4875 apex_available: ["myapex"],
4876 }
4877
4878 java_sdk_library {
4879 name: "libbar",
4880 srcs: ["foo/bar/MyClass.java"],
4881 unsafe_ignore_missing_latest_api: true,
4882 apex_available: ["myapex"],
4883 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004884 `
4885
4886 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004887 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4888 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004889
Paul Duffin9d67ca62021-02-03 20:06:33 +00004890 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4891 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004892.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004893.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4894`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004895 })
4896}
4897
Roland Levillain630846d2019-06-26 12:48:34 +01004898func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004899 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004900 apex_test {
4901 name: "myapex",
4902 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004903 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004904 tests: [
4905 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004906 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004907 ],
4908 }
4909
4910 apex_key {
4911 name: "myapex.key",
4912 public_key: "testkey.avbpubkey",
4913 private_key: "testkey.pem",
4914 }
4915
Liz Kammer1c14a212020-05-12 15:26:55 -07004916 filegroup {
4917 name: "fg",
4918 srcs: [
4919 "baz",
4920 "bar/baz"
4921 ],
4922 }
4923
Roland Levillain630846d2019-06-26 12:48:34 +01004924 cc_test {
4925 name: "mytest",
4926 gtest: false,
4927 srcs: ["mytest.cpp"],
4928 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004929 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004930 system_shared_libs: [],
4931 static_executable: true,
4932 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004933 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004934 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004935
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004936 cc_library {
4937 name: "mylib",
4938 srcs: ["mylib.cpp"],
4939 system_shared_libs: [],
4940 stl: "none",
4941 }
4942
Liz Kammer5bd365f2020-05-27 15:15:11 -07004943 filegroup {
4944 name: "fg2",
4945 srcs: [
4946 "testdata/baz"
4947 ],
4948 }
4949
Roland Levillain9b5fde92019-06-28 15:41:19 +01004950 cc_test {
4951 name: "mytests",
4952 gtest: false,
4953 srcs: [
4954 "mytest1.cpp",
4955 "mytest2.cpp",
4956 "mytest3.cpp",
4957 ],
4958 test_per_src: true,
4959 relative_install_path: "test",
4960 system_shared_libs: [],
4961 static_executable: true,
4962 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004963 data: [
4964 ":fg",
4965 ":fg2",
4966 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004967 }
Roland Levillain630846d2019-06-26 12:48:34 +01004968 `)
4969
Sundong Ahnabb64432019-10-22 13:58:29 +09004970 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004971 copyCmds := apexRule.Args["copy_commands"]
4972
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004973 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004974 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004975 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004976
Liz Kammer1c14a212020-05-12 15:26:55 -07004977 //Ensure that test data are copied into apex.
4978 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4979 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4980
Roland Levillain9b5fde92019-06-28 15:41:19 +01004981 // Ensure that test deps built with `test_per_src` are copied into apex.
4982 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4983 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4984 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004985
4986 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004987 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004988 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004989 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004990 prefix := "TARGET_"
4991 var builder strings.Builder
4992 data.Custom(&builder, name, prefix, "", data)
4993 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004994 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4995 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4996 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4997 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004998 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004999 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005000 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005001
5002 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005003 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005004 data.Custom(&builder, name, prefix, "", data)
5005 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005006 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5007 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005008}
5009
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005010func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005011 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005012 apex {
5013 name: "myapex",
5014 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005015 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005016 }
5017 apex_key {
5018 name: "myapex.key",
5019 public_key: "testkey.avbpubkey",
5020 private_key: "testkey.pem",
5021 }
5022 `, func(fs map[string][]byte, config android.Config) {
5023 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5024 })
5025 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005026 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005027 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005028 var builder strings.Builder
5029 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5030 androidMk := builder.String()
5031 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5032}
5033
Jooyung Hand48f3c32019-08-23 11:18:57 +09005034func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5035 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5036 apex {
5037 name: "myapex",
5038 key: "myapex.key",
5039 native_shared_libs: ["libfoo"],
5040 }
5041
5042 apex_key {
5043 name: "myapex.key",
5044 public_key: "testkey.avbpubkey",
5045 private_key: "testkey.pem",
5046 }
5047
5048 cc_library {
5049 name: "libfoo",
5050 stl: "none",
5051 system_shared_libs: [],
5052 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005053 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005054 }
5055 `)
5056 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5057 apex {
5058 name: "myapex",
5059 key: "myapex.key",
5060 java_libs: ["myjar"],
5061 }
5062
5063 apex_key {
5064 name: "myapex.key",
5065 public_key: "testkey.avbpubkey",
5066 private_key: "testkey.pem",
5067 }
5068
5069 java_library {
5070 name: "myjar",
5071 srcs: ["foo/bar/MyClass.java"],
5072 sdk_version: "none",
5073 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005074 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005075 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005076 }
5077 `)
5078}
5079
Bill Peckhama41a6962021-01-11 10:58:54 -08005080func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005081 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005082 apex {
5083 name: "myapex",
5084 key: "myapex.key",
5085 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005086 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005087 }
5088
5089 apex_key {
5090 name: "myapex.key",
5091 public_key: "testkey.avbpubkey",
5092 private_key: "testkey.pem",
5093 }
5094
5095 java_import {
5096 name: "myjavaimport",
5097 apex_available: ["myapex"],
5098 jars: ["my.jar"],
5099 compile_dex: true,
5100 }
5101 `)
5102
5103 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5104 apexRule := module.Rule("apexRule")
5105 copyCmds := apexRule.Args["copy_commands"]
5106 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5107}
5108
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005109func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005110 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005111 apex {
5112 name: "myapex",
5113 key: "myapex.key",
5114 apps: [
5115 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005116 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005117 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005118 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005119 }
5120
5121 apex_key {
5122 name: "myapex.key",
5123 public_key: "testkey.avbpubkey",
5124 private_key: "testkey.pem",
5125 }
5126
5127 android_app {
5128 name: "AppFoo",
5129 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005130 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005131 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005132 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005133 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005134 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005135 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005136
5137 android_app {
5138 name: "AppFooPriv",
5139 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005140 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005141 system_modules: "none",
5142 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005143 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005144 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005145 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005146
5147 cc_library_shared {
5148 name: "libjni",
5149 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005150 shared_libs: ["libfoo"],
5151 stl: "none",
5152 system_shared_libs: [],
5153 apex_available: [ "myapex" ],
5154 sdk_version: "current",
5155 }
5156
5157 cc_library_shared {
5158 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005159 stl: "none",
5160 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005161 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005162 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005163 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005164 `)
5165
Sundong Ahnabb64432019-10-22 13:58:29 +09005166 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005167 apexRule := module.Rule("apexRule")
5168 copyCmds := apexRule.Args["copy_commands"]
5169
5170 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005171 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005172
Colin Crossaede88c2020-08-11 12:17:01 -07005173 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005174 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005175 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005176 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005177 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005178 // JNI libraries including transitive deps are
5179 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005180 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005181 // ... embedded inside APK (jnilibs.zip)
5182 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5183 // ... and not directly inside the APEX
5184 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5185 }
Dario Frenicde2a032019-10-27 00:29:22 +01005186}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005187
Dario Frenicde2a032019-10-27 00:29:22 +01005188func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005189 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005190 apex {
5191 name: "myapex",
5192 key: "myapex.key",
5193 apps: [
5194 "AppFooPrebuilt",
5195 "AppFooPrivPrebuilt",
5196 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005197 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005198 }
5199
5200 apex_key {
5201 name: "myapex.key",
5202 public_key: "testkey.avbpubkey",
5203 private_key: "testkey.pem",
5204 }
5205
5206 android_app_import {
5207 name: "AppFooPrebuilt",
5208 apk: "PrebuiltAppFoo.apk",
5209 presigned: true,
5210 dex_preopt: {
5211 enabled: false,
5212 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005213 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005214 }
5215
5216 android_app_import {
5217 name: "AppFooPrivPrebuilt",
5218 apk: "PrebuiltAppFooPriv.apk",
5219 privileged: true,
5220 presigned: true,
5221 dex_preopt: {
5222 enabled: false,
5223 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005224 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005225 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005226 }
5227 `)
5228
Sundong Ahnabb64432019-10-22 13:58:29 +09005229 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005230 apexRule := module.Rule("apexRule")
5231 copyCmds := apexRule.Args["copy_commands"]
5232
5233 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005234 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5235}
5236
5237func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005238 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005239 apex {
5240 name: "myapex",
5241 key: "myapex.key",
5242 apps: [
5243 "AppFoo",
5244 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005245 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005246 }
5247
5248 apex_key {
5249 name: "myapex.key",
5250 public_key: "testkey.avbpubkey",
5251 private_key: "testkey.pem",
5252 }
5253
5254 android_app {
5255 name: "AppFoo",
5256 srcs: ["foo/bar/MyClass.java"],
5257 sdk_version: "none",
5258 system_modules: "none",
5259 apex_available: [ "myapex" ],
5260 }
5261
5262 android_app_import {
5263 name: "AppFoo",
5264 apk: "AppFooPrebuilt.apk",
5265 filename: "AppFooPrebuilt.apk",
5266 presigned: true,
5267 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005268 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005269 }
5270 `, withFiles(map[string][]byte{
5271 "AppFooPrebuilt.apk": nil,
5272 }))
5273
5274 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005275 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005276 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005277}
5278
Dario Freni6f3937c2019-12-20 22:58:03 +00005279func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005280 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005281 apex {
5282 name: "myapex",
5283 key: "myapex.key",
5284 apps: [
5285 "TesterHelpAppFoo",
5286 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005287 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005288 }
5289
5290 apex_key {
5291 name: "myapex.key",
5292 public_key: "testkey.avbpubkey",
5293 private_key: "testkey.pem",
5294 }
5295
5296 android_test_helper_app {
5297 name: "TesterHelpAppFoo",
5298 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005299 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005300 }
5301
5302 `)
5303
5304 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5305 apexRule := module.Rule("apexRule")
5306 copyCmds := apexRule.Args["copy_commands"]
5307
5308 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5309}
5310
Jooyung Han18020ea2019-11-13 10:50:48 +09005311func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5312 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005313 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005314 apex {
5315 name: "myapex",
5316 key: "myapex.key",
5317 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005318 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005319 }
5320
5321 apex_key {
5322 name: "myapex.key",
5323 public_key: "testkey.avbpubkey",
5324 private_key: "testkey.pem",
5325 }
5326
5327 apex {
5328 name: "otherapex",
5329 key: "myapex.key",
5330 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005331 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005332 }
5333
5334 cc_defaults {
5335 name: "libfoo-defaults",
5336 apex_available: ["otherapex"],
5337 }
5338
5339 cc_library {
5340 name: "libfoo",
5341 defaults: ["libfoo-defaults"],
5342 stl: "none",
5343 system_shared_libs: [],
5344 }`)
5345}
5346
Paul Duffine52e66f2020-03-30 17:54:29 +01005347func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005348 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005349 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005350 apex {
5351 name: "myapex",
5352 key: "myapex.key",
5353 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005354 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005355 }
5356
5357 apex_key {
5358 name: "myapex.key",
5359 public_key: "testkey.avbpubkey",
5360 private_key: "testkey.pem",
5361 }
5362
5363 apex {
5364 name: "otherapex",
5365 key: "otherapex.key",
5366 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005367 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005368 }
5369
5370 apex_key {
5371 name: "otherapex.key",
5372 public_key: "testkey.avbpubkey",
5373 private_key: "testkey.pem",
5374 }
5375
5376 cc_library {
5377 name: "libfoo",
5378 stl: "none",
5379 system_shared_libs: [],
5380 apex_available: ["otherapex"],
5381 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005382}
Jiyong Park127b40b2019-09-30 16:04:35 +09005383
Paul Duffine52e66f2020-03-30 17:54:29 +01005384func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005385 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005386 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005387.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005388.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005389.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005390.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005391.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005392.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005393 apex {
5394 name: "myapex",
5395 key: "myapex.key",
5396 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005397 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005398 }
5399
5400 apex_key {
5401 name: "myapex.key",
5402 public_key: "testkey.avbpubkey",
5403 private_key: "testkey.pem",
5404 }
5405
Jiyong Park127b40b2019-09-30 16:04:35 +09005406 cc_library {
5407 name: "libfoo",
5408 stl: "none",
5409 shared_libs: ["libbar"],
5410 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005411 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005412 }
5413
5414 cc_library {
5415 name: "libbar",
5416 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005417 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005418 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005419 apex_available: ["myapex"],
5420 }
5421
5422 cc_library {
5423 name: "libbaz",
5424 stl: "none",
5425 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005426 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005427}
Jiyong Park127b40b2019-09-30 16:04:35 +09005428
Paul Duffine52e66f2020-03-30 17:54:29 +01005429func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005430 testApexError(t, "\"otherapex\" is not a valid module name", `
5431 apex {
5432 name: "myapex",
5433 key: "myapex.key",
5434 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005435 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005436 }
5437
5438 apex_key {
5439 name: "myapex.key",
5440 public_key: "testkey.avbpubkey",
5441 private_key: "testkey.pem",
5442 }
5443
5444 cc_library {
5445 name: "libfoo",
5446 stl: "none",
5447 system_shared_libs: [],
5448 apex_available: ["otherapex"],
5449 }`)
5450
Paul Duffine52e66f2020-03-30 17:54:29 +01005451 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005452 apex {
5453 name: "myapex",
5454 key: "myapex.key",
5455 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005456 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005457 }
5458
5459 apex_key {
5460 name: "myapex.key",
5461 public_key: "testkey.avbpubkey",
5462 private_key: "testkey.pem",
5463 }
5464
5465 cc_library {
5466 name: "libfoo",
5467 stl: "none",
5468 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005469 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005470 apex_available: ["myapex"],
5471 }
5472
5473 cc_library {
5474 name: "libbar",
5475 stl: "none",
5476 system_shared_libs: [],
5477 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005478 }
5479
5480 cc_library {
5481 name: "libbaz",
5482 stl: "none",
5483 system_shared_libs: [],
5484 stubs: {
5485 versions: ["10", "20", "30"],
5486 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005487 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005488}
Jiyong Park127b40b2019-09-30 16:04:35 +09005489
Jiyong Park89e850a2020-04-07 16:37:39 +09005490func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005491 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005492 apex {
5493 name: "myapex",
5494 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005495 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005496 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005497 }
5498
5499 apex_key {
5500 name: "myapex.key",
5501 public_key: "testkey.avbpubkey",
5502 private_key: "testkey.pem",
5503 }
5504
5505 cc_library {
5506 name: "libfoo",
5507 stl: "none",
5508 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005509 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005510 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005511 }
5512
5513 cc_library {
5514 name: "libfoo2",
5515 stl: "none",
5516 system_shared_libs: [],
5517 shared_libs: ["libbaz"],
5518 apex_available: ["//apex_available:platform"],
5519 }
5520
5521 cc_library {
5522 name: "libbar",
5523 stl: "none",
5524 system_shared_libs: [],
5525 apex_available: ["myapex"],
5526 }
5527
5528 cc_library {
5529 name: "libbaz",
5530 stl: "none",
5531 system_shared_libs: [],
5532 apex_available: ["myapex"],
5533 stubs: {
5534 versions: ["1"],
5535 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005536 }`)
5537
Jiyong Park89e850a2020-04-07 16:37:39 +09005538 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5539 // because it depends on libbar which isn't available to platform
5540 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5541 if libfoo.NotAvailableForPlatform() != true {
5542 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5543 }
5544
5545 // libfoo2 however can be available to platform because it depends on libbaz which provides
5546 // stubs
5547 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5548 if libfoo2.NotAvailableForPlatform() == true {
5549 t.Errorf("%q should be available to platform", libfoo2.String())
5550 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005551}
Jiyong Parka90ca002019-10-07 15:47:24 +09005552
Paul Duffine52e66f2020-03-30 17:54:29 +01005553func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005554 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005555 apex {
5556 name: "myapex",
5557 key: "myapex.key",
5558 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005559 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005560 }
5561
5562 apex_key {
5563 name: "myapex.key",
5564 public_key: "testkey.avbpubkey",
5565 private_key: "testkey.pem",
5566 }
5567
5568 cc_library {
5569 name: "libfoo",
5570 stl: "none",
5571 system_shared_libs: [],
5572 apex_available: ["myapex"],
5573 static: {
5574 apex_available: ["//apex_available:platform"],
5575 },
5576 }`)
5577
Jiyong Park89e850a2020-04-07 16:37:39 +09005578 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5579 if libfooShared.NotAvailableForPlatform() != true {
5580 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5581 }
5582 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5583 if libfooStatic.NotAvailableForPlatform() != false {
5584 t.Errorf("%q should be available to platform", libfooStatic.String())
5585 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005586}
5587
Jiyong Park5d790c32019-11-15 18:40:32 +09005588func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005589 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005590 apex {
5591 name: "myapex",
5592 key: "myapex.key",
5593 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005594 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005595 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005596 }
5597
5598 override_apex {
5599 name: "override_myapex",
5600 base: "myapex",
5601 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005602 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005603 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005604 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005605 }
5606
5607 apex_key {
5608 name: "myapex.key",
5609 public_key: "testkey.avbpubkey",
5610 private_key: "testkey.pem",
5611 }
5612
5613 android_app {
5614 name: "app",
5615 srcs: ["foo/bar/MyClass.java"],
5616 package_name: "foo",
5617 sdk_version: "none",
5618 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005619 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005620 }
5621
5622 override_android_app {
5623 name: "override_app",
5624 base: "app",
5625 package_name: "bar",
5626 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005627 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005628
Jiyong Park317645e2019-12-05 13:20:58 +09005629 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5630 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5631 if originalVariant.GetOverriddenBy() != "" {
5632 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5633 }
5634 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5635 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5636 }
5637
Jiyong Park5d790c32019-11-15 18:40:32 +09005638 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5639 apexRule := module.Rule("apexRule")
5640 copyCmds := apexRule.Args["copy_commands"]
5641
5642 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005643 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005644
5645 apexBundle := module.Module().(*apexBundle)
5646 name := apexBundle.Name()
5647 if name != "override_myapex" {
5648 t.Errorf("name should be \"override_myapex\", but was %q", name)
5649 }
5650
Baligh Uddin004d7172020-02-19 21:29:28 -08005651 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5652 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5653 }
5654
Jiyong Park20bacab2020-03-03 11:45:41 +09005655 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005656 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005657
Colin Crossaa255532020-07-03 13:18:24 -07005658 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005659 var builder strings.Builder
5660 data.Custom(&builder, name, "TARGET_", "", data)
5661 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005662 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005663 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5664 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005665 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005666 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005667 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005668 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5669 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005670}
5671
Jooyung Han214bf372019-11-12 13:03:50 +09005672func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005673 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005674 apex {
5675 name: "myapex",
5676 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005677 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005678 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005679 }
5680
5681 apex_key {
5682 name: "myapex.key",
5683 public_key: "testkey.avbpubkey",
5684 private_key: "testkey.pem",
5685 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005686
5687 cc_library {
5688 name: "mylib",
5689 srcs: ["mylib.cpp"],
5690 stl: "libc++",
5691 system_shared_libs: [],
5692 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005693 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005694 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005695 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005696
5697 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5698 args := module.Rule("apexRule").Args
5699 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005700 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005701
5702 // The copies of the libraries in the apex should have one more dependency than
5703 // the ones outside the apex, namely the unwinder. Ideally we should check
5704 // the dependency names directly here but for some reason the names are blank in
5705 // this test.
5706 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005707 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005708 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5709 if len(apexImplicits) != len(nonApexImplicits)+1 {
5710 t.Errorf("%q missing unwinder dep", lib)
5711 }
5712 }
Jooyung Han214bf372019-11-12 13:03:50 +09005713}
5714
Paul Duffin9b879592020-05-26 13:21:35 +01005715var filesForSdkLibrary = map[string][]byte{
5716 "api/current.txt": nil,
5717 "api/removed.txt": nil,
5718 "api/system-current.txt": nil,
5719 "api/system-removed.txt": nil,
5720 "api/test-current.txt": nil,
5721 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005722
Anton Hanssondff2c782020-12-21 17:10:01 +00005723 "100/public/api/foo.txt": nil,
5724 "100/public/api/foo-removed.txt": nil,
5725 "100/system/api/foo.txt": nil,
5726 "100/system/api/foo-removed.txt": nil,
5727
Paul Duffineedc5d52020-06-12 17:46:39 +01005728 // For java_sdk_library_import
5729 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005730}
5731
Jooyung Han58f26ab2019-12-18 15:34:32 +09005732func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005733 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005734 apex {
5735 name: "myapex",
5736 key: "myapex.key",
5737 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005738 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005739 }
5740
5741 apex_key {
5742 name: "myapex.key",
5743 public_key: "testkey.avbpubkey",
5744 private_key: "testkey.pem",
5745 }
5746
5747 java_sdk_library {
5748 name: "foo",
5749 srcs: ["a.java"],
5750 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005751 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005752 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005753
5754 prebuilt_apis {
5755 name: "sdk",
5756 api_dirs: ["100"],
5757 }
Paul Duffin9b879592020-05-26 13:21:35 +01005758 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005759
5760 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005761 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005762 "javalib/foo.jar",
5763 "etc/permissions/foo.xml",
5764 })
5765 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005766 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5767 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005768}
5769
Paul Duffin9b879592020-05-26 13:21:35 +01005770func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005771 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005772 apex {
5773 name: "myapex",
5774 key: "myapex.key",
5775 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005776 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005777 }
5778
5779 apex_key {
5780 name: "myapex.key",
5781 public_key: "testkey.avbpubkey",
5782 private_key: "testkey.pem",
5783 }
5784
5785 java_sdk_library {
5786 name: "foo",
5787 srcs: ["a.java"],
5788 api_packages: ["foo"],
5789 apex_available: ["myapex"],
5790 sdk_version: "none",
5791 system_modules: "none",
5792 }
5793
5794 java_library {
5795 name: "bar",
5796 srcs: ["a.java"],
5797 libs: ["foo"],
5798 apex_available: ["myapex"],
5799 sdk_version: "none",
5800 system_modules: "none",
5801 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005802
5803 prebuilt_apis {
5804 name: "sdk",
5805 api_dirs: ["100"],
5806 }
Paul Duffin9b879592020-05-26 13:21:35 +01005807 `, withFiles(filesForSdkLibrary))
5808
5809 // java_sdk_library installs both impl jar and permission XML
5810 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5811 "javalib/bar.jar",
5812 "javalib/foo.jar",
5813 "etc/permissions/foo.xml",
5814 })
5815
5816 // The bar library should depend on the implementation jar.
5817 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5818 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5819 t.Errorf("expected %q, found %#q", expected, actual)
5820 }
5821}
5822
5823func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005824 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005825 apex {
5826 name: "myapex",
5827 key: "myapex.key",
5828 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005829 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005830 }
5831
5832 apex_key {
5833 name: "myapex.key",
5834 public_key: "testkey.avbpubkey",
5835 private_key: "testkey.pem",
5836 }
5837
5838 java_sdk_library {
5839 name: "foo",
5840 srcs: ["a.java"],
5841 api_packages: ["foo"],
5842 apex_available: ["myapex"],
5843 sdk_version: "none",
5844 system_modules: "none",
5845 }
5846
5847 java_library {
5848 name: "bar",
5849 srcs: ["a.java"],
5850 libs: ["foo"],
5851 sdk_version: "none",
5852 system_modules: "none",
5853 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005854
5855 prebuilt_apis {
5856 name: "sdk",
5857 api_dirs: ["100"],
5858 }
Paul Duffin9b879592020-05-26 13:21:35 +01005859 `, withFiles(filesForSdkLibrary))
5860
5861 // java_sdk_library installs both impl jar and permission XML
5862 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5863 "javalib/foo.jar",
5864 "etc/permissions/foo.xml",
5865 })
5866
5867 // The bar library should depend on the stubs jar.
5868 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5869 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5870 t.Errorf("expected %q, found %#q", expected, actual)
5871 }
5872}
5873
Paul Duffineedc5d52020-06-12 17:46:39 +01005874func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005875 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005876 prebuilt_apis {
5877 name: "sdk",
5878 api_dirs: ["100"],
5879 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005880 withFiles(map[string][]byte{
5881 "apex/a.java": nil,
5882 "apex/apex_manifest.json": nil,
5883 "apex/Android.bp": []byte(`
5884 package {
5885 default_visibility: ["//visibility:private"],
5886 }
5887
5888 apex {
5889 name: "myapex",
5890 key: "myapex.key",
5891 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005892 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005893 }
5894
5895 apex_key {
5896 name: "myapex.key",
5897 public_key: "testkey.avbpubkey",
5898 private_key: "testkey.pem",
5899 }
5900
5901 java_library {
5902 name: "bar",
5903 srcs: ["a.java"],
5904 libs: ["foo"],
5905 apex_available: ["myapex"],
5906 sdk_version: "none",
5907 system_modules: "none",
5908 }
5909`),
5910 "source/a.java": nil,
5911 "source/api/current.txt": nil,
5912 "source/api/removed.txt": nil,
5913 "source/Android.bp": []byte(`
5914 package {
5915 default_visibility: ["//visibility:private"],
5916 }
5917
5918 java_sdk_library {
5919 name: "foo",
5920 visibility: ["//apex"],
5921 srcs: ["a.java"],
5922 api_packages: ["foo"],
5923 apex_available: ["myapex"],
5924 sdk_version: "none",
5925 system_modules: "none",
5926 public: {
5927 enabled: true,
5928 },
5929 }
5930`),
5931 "prebuilt/a.jar": nil,
5932 "prebuilt/Android.bp": []byte(`
5933 package {
5934 default_visibility: ["//visibility:private"],
5935 }
5936
5937 java_sdk_library_import {
5938 name: "foo",
5939 visibility: ["//apex", "//source"],
5940 apex_available: ["myapex"],
5941 prefer: true,
5942 public: {
5943 jars: ["a.jar"],
5944 },
5945 }
5946`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005947 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005948 )
5949
5950 // java_sdk_library installs both impl jar and permission XML
5951 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5952 "javalib/bar.jar",
5953 "javalib/foo.jar",
5954 "etc/permissions/foo.xml",
5955 })
5956
5957 // The bar library should depend on the implementation jar.
5958 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5959 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5960 t.Errorf("expected %q, found %#q", expected, actual)
5961 }
5962}
5963
5964func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5965 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5966 apex {
5967 name: "myapex",
5968 key: "myapex.key",
5969 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005970 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005971 }
5972
5973 apex_key {
5974 name: "myapex.key",
5975 public_key: "testkey.avbpubkey",
5976 private_key: "testkey.pem",
5977 }
5978
5979 java_sdk_library_import {
5980 name: "foo",
5981 apex_available: ["myapex"],
5982 prefer: true,
5983 public: {
5984 jars: ["a.jar"],
5985 },
5986 }
5987
5988 `, withFiles(filesForSdkLibrary))
5989}
5990
atrost6e126252020-01-27 17:01:16 +00005991func TestCompatConfig(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005992 ctx := testApex(t, `
atrost6e126252020-01-27 17:01:16 +00005993 apex {
5994 name: "myapex",
5995 key: "myapex.key",
5996 prebuilts: ["myjar-platform-compat-config"],
5997 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005998 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005999 }
6000
6001 apex_key {
6002 name: "myapex.key",
6003 public_key: "testkey.avbpubkey",
6004 private_key: "testkey.pem",
6005 }
6006
6007 platform_compat_config {
6008 name: "myjar-platform-compat-config",
6009 src: ":myjar",
6010 }
6011
6012 java_library {
6013 name: "myjar",
6014 srcs: ["foo/bar/MyClass.java"],
6015 sdk_version: "none",
6016 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006017 apex_available: [ "myapex" ],
6018 }
6019 `)
6020 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6021 "etc/compatconfig/myjar-platform-compat-config.xml",
6022 "javalib/myjar.jar",
6023 })
6024}
6025
Jiyong Park479321d2019-12-16 11:47:12 +09006026func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6027 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6028 apex {
6029 name: "myapex",
6030 key: "myapex.key",
6031 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006032 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006033 }
6034
6035 apex_key {
6036 name: "myapex.key",
6037 public_key: "testkey.avbpubkey",
6038 private_key: "testkey.pem",
6039 }
6040
6041 java_library {
6042 name: "myjar",
6043 srcs: ["foo/bar/MyClass.java"],
6044 sdk_version: "none",
6045 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006046 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006047 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006048 }
6049 `)
6050}
6051
Jiyong Park7afd1072019-12-30 16:56:33 +09006052func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006053 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006054 apex {
6055 name: "myapex",
6056 key: "myapex.key",
6057 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006058 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006059 }
6060
6061 apex_key {
6062 name: "myapex.key",
6063 public_key: "testkey.avbpubkey",
6064 private_key: "testkey.pem",
6065 }
6066
6067 cc_library {
6068 name: "mylib",
6069 srcs: ["mylib.cpp"],
6070 system_shared_libs: [],
6071 stl: "none",
6072 required: ["a", "b"],
6073 host_required: ["c", "d"],
6074 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006075 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006076 }
6077 `)
6078
6079 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006080 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006081 name := apexBundle.BaseModuleName()
6082 prefix := "TARGET_"
6083 var builder strings.Builder
6084 data.Custom(&builder, name, prefix, "", data)
6085 androidMk := builder.String()
6086 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6087 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6088 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6089}
6090
Jiyong Park7cd10e32020-01-14 09:22:18 +09006091func TestSymlinksFromApexToSystem(t *testing.T) {
6092 bp := `
6093 apex {
6094 name: "myapex",
6095 key: "myapex.key",
6096 native_shared_libs: ["mylib"],
6097 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006098 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006099 }
6100
Jiyong Park9d677202020-02-19 16:29:35 +09006101 apex {
6102 name: "myapex.updatable",
6103 key: "myapex.key",
6104 native_shared_libs: ["mylib"],
6105 java_libs: ["myjar"],
6106 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006107 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006108 }
6109
Jiyong Park7cd10e32020-01-14 09:22:18 +09006110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
6116 cc_library {
6117 name: "mylib",
6118 srcs: ["mylib.cpp"],
6119 shared_libs: ["myotherlib"],
6120 system_shared_libs: [],
6121 stl: "none",
6122 apex_available: [
6123 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006124 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006125 "//apex_available:platform",
6126 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006127 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006128 }
6129
6130 cc_library {
6131 name: "myotherlib",
6132 srcs: ["mylib.cpp"],
6133 system_shared_libs: [],
6134 stl: "none",
6135 apex_available: [
6136 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006137 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006138 "//apex_available:platform",
6139 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006140 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006141 }
6142
6143 java_library {
6144 name: "myjar",
6145 srcs: ["foo/bar/MyClass.java"],
6146 sdk_version: "none",
6147 system_modules: "none",
6148 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006149 apex_available: [
6150 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006151 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006152 "//apex_available:platform",
6153 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006154 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006155 }
6156
6157 java_library {
6158 name: "myotherjar",
6159 srcs: ["foo/bar/MyClass.java"],
6160 sdk_version: "none",
6161 system_modules: "none",
6162 apex_available: [
6163 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006164 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006165 "//apex_available:platform",
6166 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006167 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006168 }
6169 `
6170
6171 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6172 for _, f := range files {
6173 if f.path == file {
6174 if f.isLink {
6175 t.Errorf("%q is not a real file", file)
6176 }
6177 return
6178 }
6179 }
6180 t.Errorf("%q is not found", file)
6181 }
6182
6183 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6184 for _, f := range files {
6185 if f.path == file {
6186 if !f.isLink {
6187 t.Errorf("%q is not a symlink", file)
6188 }
6189 return
6190 }
6191 }
6192 t.Errorf("%q is not found", file)
6193 }
6194
Jiyong Park9d677202020-02-19 16:29:35 +09006195 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6196 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006197 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006198 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006199 ensureRealfileExists(t, files, "javalib/myjar.jar")
6200 ensureRealfileExists(t, files, "lib64/mylib.so")
6201 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6202
Jiyong Park9d677202020-02-19 16:29:35 +09006203 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6204 ensureRealfileExists(t, files, "javalib/myjar.jar")
6205 ensureRealfileExists(t, files, "lib64/mylib.so")
6206 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6207
6208 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006209 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006210 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006211 ensureRealfileExists(t, files, "javalib/myjar.jar")
6212 ensureRealfileExists(t, files, "lib64/mylib.so")
6213 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006214
6215 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6216 ensureRealfileExists(t, files, "javalib/myjar.jar")
6217 ensureRealfileExists(t, files, "lib64/mylib.so")
6218 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006219}
6220
Yo Chiange8128052020-07-23 20:09:18 +08006221func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006222 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006223 apex {
6224 name: "myapex",
6225 key: "myapex.key",
6226 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006227 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006228 }
6229
6230 apex_key {
6231 name: "myapex.key",
6232 public_key: "testkey.avbpubkey",
6233 private_key: "testkey.pem",
6234 }
6235
6236 cc_library_shared {
6237 name: "mylib",
6238 srcs: ["mylib.cpp"],
6239 shared_libs: ["myotherlib"],
6240 system_shared_libs: [],
6241 stl: "none",
6242 apex_available: [
6243 "myapex",
6244 "//apex_available:platform",
6245 ],
6246 }
6247
6248 cc_prebuilt_library_shared {
6249 name: "myotherlib",
6250 srcs: ["prebuilt.so"],
6251 system_shared_libs: [],
6252 stl: "none",
6253 apex_available: [
6254 "myapex",
6255 "//apex_available:platform",
6256 ],
6257 }
6258 `)
6259
6260 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006261 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006262 var builder strings.Builder
6263 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6264 androidMk := builder.String()
6265 // `myotherlib` is added to `myapex` as symlink
6266 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6267 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6268 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6269 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006270 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 +08006271}
6272
Jooyung Han643adc42020-02-27 13:50:06 +09006273func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006274 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006275 apex {
6276 name: "myapex",
6277 key: "myapex.key",
6278 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006279 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
6288 cc_library {
6289 name: "mylib",
6290 srcs: ["mylib.cpp"],
6291 shared_libs: ["mylib2"],
6292 system_shared_libs: [],
6293 stl: "none",
6294 apex_available: [ "myapex" ],
6295 }
6296
6297 cc_library {
6298 name: "mylib2",
6299 srcs: ["mylib.cpp"],
6300 system_shared_libs: [],
6301 stl: "none",
6302 apex_available: [ "myapex" ],
6303 }
6304 `)
6305
6306 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6307 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6308 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6309 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6310 "lib64/mylib.so",
6311 "lib64/mylib2.so",
6312 })
6313}
6314
Jooyung Han49f67012020-04-17 13:43:10 +09006315func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006316 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006317 apex {
6318 name: "myapex",
6319 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006320 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006321 }
6322 apex_key {
6323 name: "myapex.key",
6324 public_key: "testkey.avbpubkey",
6325 private_key: "testkey.pem",
6326 }
6327 `, func(fs map[string][]byte, config android.Config) {
6328 delete(config.Targets, android.Android)
6329 config.AndroidCommonTarget = android.Target{}
6330 })
6331
6332 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6333 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6334 }
6335}
6336
Jiyong Parkbd159612020-02-28 15:22:21 +09006337func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006338 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006339 apex {
6340 name: "myapex",
6341 key: "myapex.key",
6342 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006343 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006344 }
6345
6346 apex_key {
6347 name: "myapex.key",
6348 public_key: "testkey.avbpubkey",
6349 private_key: "testkey.pem",
6350 }
6351
6352 android_app {
6353 name: "AppFoo",
6354 srcs: ["foo/bar/MyClass.java"],
6355 sdk_version: "none",
6356 system_modules: "none",
6357 apex_available: [ "myapex" ],
6358 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006359 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006360
Colin Crosscf371cc2020-11-13 11:48:42 -08006361 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006362 content := bundleConfigRule.Args["content"]
6363
6364 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006365 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 +09006366}
6367
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006368func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006369 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006370 apex {
6371 name: "myapex",
6372 key: "myapex.key",
6373 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006374 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006375 }
6376
6377 apex_key {
6378 name: "myapex.key",
6379 public_key: "testkey.avbpubkey",
6380 private_key: "testkey.pem",
6381 }
6382
6383 android_app_set {
6384 name: "AppSet",
6385 set: "AppSet.apks",
6386 }`)
6387 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006388 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006389 content := bundleConfigRule.Args["content"]
6390 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6391 s := mod.Rule("apexRule").Args["copy_commands"]
6392 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6393 if len(copyCmds) != 3 {
6394 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6395 }
6396 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6397 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6398 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6399}
6400
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006401func TestAppSetBundlePrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006402 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006403 bp := `
6404 apex_set {
6405 name: "myapex",
6406 filename: "foo_v2.apex",
6407 sanitized: {
6408 none: { set: "myapex.apks", },
6409 hwaddress: { set: "myapex.hwasan.apks", },
6410 },
6411 }`
6412 fs["Android.bp"] = []byte(bp)
6413
6414 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6415 })
6416
6417 m := ctx.ModuleForTests("myapex", "android_common")
6418 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6419
6420 actual := extractedApex.Inputs
6421 if len(actual) != 1 {
6422 t.Errorf("expected a single input")
6423 }
6424
6425 expected := "myapex.hwasan.apks"
6426 if actual[0].String() != expected {
6427 t.Errorf("expected %s, got %s", expected, actual[0].String())
6428 }
6429}
6430
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006431func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006432 t.Helper()
6433
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006434 bp := `
6435 java_library {
6436 name: "some-updatable-apex-lib",
6437 srcs: ["a.java"],
6438 sdk_version: "current",
6439 apex_available: [
6440 "some-updatable-apex",
6441 ],
6442 }
6443
6444 java_library {
6445 name: "some-non-updatable-apex-lib",
6446 srcs: ["a.java"],
6447 apex_available: [
6448 "some-non-updatable-apex",
6449 ],
6450 }
6451
6452 java_library {
6453 name: "some-platform-lib",
6454 srcs: ["a.java"],
6455 sdk_version: "current",
6456 installable: true,
6457 }
6458
6459 java_library {
6460 name: "some-art-lib",
6461 srcs: ["a.java"],
6462 sdk_version: "current",
6463 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006464 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006465 ],
6466 hostdex: true,
6467 }
6468
6469 apex {
6470 name: "some-updatable-apex",
6471 key: "some-updatable-apex.key",
6472 java_libs: ["some-updatable-apex-lib"],
6473 updatable: true,
6474 min_sdk_version: "current",
6475 }
6476
6477 apex {
6478 name: "some-non-updatable-apex",
6479 key: "some-non-updatable-apex.key",
6480 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006481 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006482 }
6483
6484 apex_key {
6485 name: "some-updatable-apex.key",
6486 }
6487
6488 apex_key {
6489 name: "some-non-updatable-apex.key",
6490 }
6491
6492 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006493 name: "com.android.art.debug",
6494 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006495 java_libs: ["some-art-lib"],
6496 updatable: true,
6497 min_sdk_version: "current",
6498 }
6499
6500 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006501 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006502 }
6503
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006504 filegroup {
6505 name: "some-updatable-apex-file_contexts",
6506 srcs: [
6507 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6508 ],
6509 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006510
6511 filegroup {
6512 name: "some-non-updatable-apex-file_contexts",
6513 srcs: [
6514 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6515 ],
6516 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006517 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006518
6519 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6520}
6521
Paul Duffin064b70c2020-11-02 17:32:38 +00006522func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006523 t.Helper()
6524
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006525 bp += cc.GatherRequiredDepsForTest(android.Android)
6526 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006527
6528 fs := map[string][]byte{
6529 "a.java": nil,
6530 "a.jar": nil,
6531 "build/make/target/product/security": nil,
6532 "apex_manifest.json": nil,
6533 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006534 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006535 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6536 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6537 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006538 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006539 }
6540 cc.GatherRequiredFilesForTest(fs)
6541
Paul Duffin39853512021-02-26 11:09:39 +00006542 for k, v := range filesForSdkLibrary {
6543 fs[k] = v
6544 }
Colin Crossae8600b2020-10-29 17:09:13 -07006545 config := android.TestArchConfig(buildDir, nil, bp, fs)
6546
6547 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006548 ctx.RegisterModuleType("apex", BundleFactory)
6549 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006550 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006551 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006552 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006553 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006554 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006555 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006556 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006557 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006558 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6559 ctx.PreDepsMutators(RegisterPreDepsMutators)
6560 ctx.PostDepsMutators(RegisterPostDepsMutators)
6561
Colin Crossae8600b2020-10-29 17:09:13 -07006562 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006563
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006564 pathCtx := android.PathContextForTesting(config)
6565 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6566 transformDexpreoptConfig(dexpreoptConfig)
6567 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6568
Paul Duffinf38931c2021-02-05 16:58:28 +00006569 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006570 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006571 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6572 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6573
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006574 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6575 android.FailIfErrored(t, errs)
6576
6577 _, errs = ctx.PrepareBuildActions(config)
6578 if errmsg == "" {
6579 android.FailIfErrored(t, errs)
6580 } else if len(errs) > 0 {
6581 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006582 } else {
6583 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6584 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006585
6586 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006587}
6588
Jooyung Han548640b2020-04-27 12:10:30 +09006589func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6590 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6591 apex {
6592 name: "myapex",
6593 key: "myapex.key",
6594 updatable: true,
6595 }
6596
6597 apex_key {
6598 name: "myapex.key",
6599 public_key: "testkey.avbpubkey",
6600 private_key: "testkey.pem",
6601 }
6602 `)
6603}
6604
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006605func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6606 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6607 apex {
6608 name: "myapex",
6609 key: "myapex.key",
6610 }
6611
6612 apex_key {
6613 name: "myapex.key",
6614 public_key: "testkey.avbpubkey",
6615 private_key: "testkey.pem",
6616 }
6617 `)
6618}
6619
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006620func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006621 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006622 var transform func(*dexpreopt.GlobalConfig)
6623
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006624 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6625 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006626 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006627 }
6628 testNoUpdatableJarsInBootImage(t, "", transform)
6629 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006630
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006631 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006632 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 +01006633 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006634 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006635 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006636 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006637 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006638
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006639 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 -07006640 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 +01006641 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006642 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006643 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006644 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006645 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006646
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006647 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 -07006648 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006649 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006650 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006651 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006652 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006653 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006654
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006655 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 -07006656 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 +01006657 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006658 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006659 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006660 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006661 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006662
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006663 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6664 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006665 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006666 }
6667 testNoUpdatableJarsInBootImage(t, "", transform)
6668 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006669
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006670 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006671 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006672 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006673 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006674 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006675 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006676 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006677
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006678 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006679 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006680 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006681 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006682 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006683 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006684 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006685
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006686 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006687 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006688 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006689 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006690 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006691 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006692 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006693
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006694 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6695 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006696 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006697 }
6698 testNoUpdatableJarsInBootImage(t, "", transform)
6699 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006700
6701}
6702
6703func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6704 transform := func(config *dexpreopt.GlobalConfig) {
6705 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6706 }
6707 t.Run("prebuilt no source", func(t *testing.T) {
6708 testDexpreoptWithApexes(t, `
6709 prebuilt_apex {
6710 name: "myapex" ,
6711 arch: {
6712 arm64: {
6713 src: "myapex-arm64.apex",
6714 },
6715 arm: {
6716 src: "myapex-arm.apex",
6717 },
6718 },
6719 exported_java_libs: ["libfoo"],
6720 }
6721
6722 java_import {
6723 name: "libfoo",
6724 jars: ["libfoo.jar"],
6725 }
6726`, "", transform)
6727 })
6728
6729 t.Run("prebuilt no source", func(t *testing.T) {
6730 testDexpreoptWithApexes(t, `
6731 prebuilt_apex {
6732 name: "myapex" ,
6733 arch: {
6734 arm64: {
6735 src: "myapex-arm64.apex",
6736 },
6737 arm: {
6738 src: "myapex-arm.apex",
6739 },
6740 },
6741 exported_java_libs: ["libfoo"],
6742 }
6743
6744 java_import {
6745 name: "libfoo",
6746 jars: ["libfoo.jar"],
6747 }
6748`, "", transform)
6749 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006750}
6751
Andrei Onea115e7e72020-06-05 21:14:03 +01006752func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6753 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006754 bp += `
6755 apex_key {
6756 name: "myapex.key",
6757 public_key: "testkey.avbpubkey",
6758 private_key: "testkey.pem",
6759 }`
6760 fs := map[string][]byte{
6761 "lib1/src/A.java": nil,
6762 "lib2/src/B.java": nil,
6763 "system/sepolicy/apex/myapex-file_contexts": nil,
6764 }
6765
Colin Crossae8600b2020-10-29 17:09:13 -07006766 config := android.TestArchConfig(buildDir, nil, bp, fs)
6767 android.SetTestNeverallowRules(config, rules)
6768 updatableBootJars := make([]string, 0, len(apexBootJars))
6769 for _, apexBootJar := range apexBootJars {
6770 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6771 }
6772 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6773
6774 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006775 ctx.RegisterModuleType("apex", BundleFactory)
6776 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6777 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6778 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006779 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006780 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6781 ctx.PreDepsMutators(RegisterPreDepsMutators)
6782 ctx.PostDepsMutators(RegisterPostDepsMutators)
6783 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6784
Colin Crossae8600b2020-10-29 17:09:13 -07006785 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006786
6787 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6788 android.FailIfErrored(t, errs)
6789
6790 _, errs = ctx.PrepareBuildActions(config)
6791 if errmsg == "" {
6792 android.FailIfErrored(t, errs)
6793 } else if len(errs) > 0 {
6794 android.FailIfNoMatchingErrors(t, errmsg, errs)
6795 return
6796 } else {
6797 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6798 }
6799}
6800
6801func TestApexPermittedPackagesRules(t *testing.T) {
6802 testcases := []struct {
6803 name string
6804 expectedError string
6805 bp string
6806 bootJars []string
6807 modulesPackages map[string][]string
6808 }{
6809
6810 {
6811 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6812 expectedError: "",
6813 bp: `
6814 java_library {
6815 name: "bcp_lib1",
6816 srcs: ["lib1/src/*.java"],
6817 permitted_packages: ["foo.bar"],
6818 apex_available: ["myapex"],
6819 sdk_version: "none",
6820 system_modules: "none",
6821 }
6822 java_library {
6823 name: "nonbcp_lib2",
6824 srcs: ["lib2/src/*.java"],
6825 apex_available: ["myapex"],
6826 permitted_packages: ["a.b"],
6827 sdk_version: "none",
6828 system_modules: "none",
6829 }
6830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006834 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006835 }`,
6836 bootJars: []string{"bcp_lib1"},
6837 modulesPackages: map[string][]string{
6838 "myapex": []string{
6839 "foo.bar",
6840 },
6841 },
6842 },
6843 {
6844 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6845 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.`,
6846 bp: `
6847 java_library {
6848 name: "bcp_lib1",
6849 srcs: ["lib1/src/*.java"],
6850 apex_available: ["myapex"],
6851 permitted_packages: ["foo.bar"],
6852 sdk_version: "none",
6853 system_modules: "none",
6854 }
6855 java_library {
6856 name: "bcp_lib2",
6857 srcs: ["lib2/src/*.java"],
6858 apex_available: ["myapex"],
6859 permitted_packages: ["foo.bar", "bar.baz"],
6860 sdk_version: "none",
6861 system_modules: "none",
6862 }
6863 apex {
6864 name: "myapex",
6865 key: "myapex.key",
6866 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006867 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006868 }
6869 `,
6870 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6871 modulesPackages: map[string][]string{
6872 "myapex": []string{
6873 "foo.bar",
6874 },
6875 },
6876 },
6877 }
6878 for _, tc := range testcases {
6879 t.Run(tc.name, func(t *testing.T) {
6880 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6881 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6882 })
6883 }
6884}
6885
Jiyong Park62304bb2020-04-13 16:19:48 +09006886func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006887 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006888 apex {
6889 name: "myapex",
6890 key: "myapex.key",
6891 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006892 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006893 }
6894
6895 apex_key {
6896 name: "myapex.key",
6897 public_key: "testkey.avbpubkey",
6898 private_key: "testkey.pem",
6899 }
6900
6901 cc_library {
6902 name: "mylib",
6903 srcs: ["mylib.cpp"],
6904 system_shared_libs: [],
6905 stl: "none",
6906 stubs: {
6907 versions: ["1"],
6908 },
6909 apex_available: ["myapex"],
6910 }
6911
6912 cc_library {
6913 name: "myprivlib",
6914 srcs: ["mylib.cpp"],
6915 system_shared_libs: [],
6916 stl: "none",
6917 apex_available: ["myapex"],
6918 }
6919
6920
6921 cc_test {
6922 name: "mytest",
6923 gtest: false,
6924 srcs: ["mylib.cpp"],
6925 system_shared_libs: [],
6926 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006927 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006928 test_for: ["myapex"]
6929 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006930
6931 cc_library {
6932 name: "mytestlib",
6933 srcs: ["mylib.cpp"],
6934 system_shared_libs: [],
6935 shared_libs: ["mylib", "myprivlib"],
6936 stl: "none",
6937 test_for: ["myapex"],
6938 }
6939
6940 cc_benchmark {
6941 name: "mybench",
6942 srcs: ["mylib.cpp"],
6943 system_shared_libs: [],
6944 shared_libs: ["mylib", "myprivlib"],
6945 stl: "none",
6946 test_for: ["myapex"],
6947 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006948 `)
6949
6950 // the test 'mytest' is a test for the apex, therefore is linked to the
6951 // actual implementation of mylib instead of its stub.
6952 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6953 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6954 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006955
6956 // The same should be true for cc_library
6957 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6958 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6959 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6960
6961 // ... and for cc_benchmark
6962 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6963 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6964 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006965}
6966
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006967// TODO(jungjw): Move this to proptools
6968func intPtr(i int) *int {
6969 return &i
6970}
6971
6972func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006973 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006974 apex_set {
6975 name: "myapex",
6976 set: "myapex.apks",
6977 filename: "foo_v2.apex",
6978 overrides: ["foo"],
6979 }
6980 `, func(fs map[string][]byte, config android.Config) {
6981 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006982 config.Targets[android.Android] = []android.Target{
6983 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6984 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6985 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006986 })
6987
6988 m := ctx.ModuleForTests("myapex", "android_common")
6989
6990 // Check extract_apks tool parameters.
6991 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6992 actual := extractedApex.Args["abis"]
6993 expected := "ARMEABI_V7A,ARM64_V8A"
6994 if actual != expected {
6995 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6996 }
6997 actual = extractedApex.Args["sdk-version"]
6998 expected = "30"
6999 if actual != expected {
7000 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7001 }
7002
7003 a := m.Module().(*ApexSet)
7004 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007005 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007006 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7007 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7008 }
7009}
7010
Jiyong Park7d95a512020-05-10 15:16:24 +09007011func TestNoStaticLinkingToStubsLib(t *testing.T) {
7012 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7013 apex {
7014 name: "myapex",
7015 key: "myapex.key",
7016 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007017 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007018 }
7019
7020 apex_key {
7021 name: "myapex.key",
7022 public_key: "testkey.avbpubkey",
7023 private_key: "testkey.pem",
7024 }
7025
7026 cc_library {
7027 name: "mylib",
7028 srcs: ["mylib.cpp"],
7029 static_libs: ["otherlib"],
7030 system_shared_libs: [],
7031 stl: "none",
7032 apex_available: [ "myapex" ],
7033 }
7034
7035 cc_library {
7036 name: "otherlib",
7037 srcs: ["mylib.cpp"],
7038 system_shared_libs: [],
7039 stl: "none",
7040 stubs: {
7041 versions: ["1", "2", "3"],
7042 },
7043 apex_available: [ "myapex" ],
7044 }
7045 `)
7046}
7047
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007048func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007049 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007050 apex {
7051 name: "myapex",
7052 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007053 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007054 }
7055
7056 apex_key {
7057 name: "myapex.key",
7058 public_key: "testkey.avbpubkey",
7059 private_key: "testkey.pem",
7060 }
7061
7062 prebuilt_apex {
7063 name: "myapex",
7064 prefer: true,
7065 arch: {
7066 arm64: {
7067 src: "myapex-arm64.apex",
7068 },
7069 arm: {
7070 src: "myapex-arm.apex",
7071 },
7072 },
7073 }
7074
7075 apex_set {
7076 name: "myapex_set",
7077 set: "myapex.apks",
7078 filename: "myapex_set.apex",
7079 overrides: ["myapex"],
7080 }
7081 `)
7082
7083 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7084 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7085 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 +09007086 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 +09007087}
7088
Jooyung Han938b5932020-06-20 12:47:47 +09007089func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007090 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007091 apex {
7092 name: "myapex",
7093 key: "myapex.key",
7094 apps: ["app"],
7095 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007096 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007097 }
7098
7099 apex_key {
7100 name: "myapex.key",
7101 public_key: "testkey.avbpubkey",
7102 private_key: "testkey.pem",
7103 }
7104
7105 android_app {
7106 name: "app",
7107 srcs: ["foo/bar/MyClass.java"],
7108 package_name: "foo",
7109 sdk_version: "none",
7110 system_modules: "none",
7111 apex_available: [ "myapex" ],
7112 }
7113 `, withFiles(map[string][]byte{
7114 "sub/Android.bp": []byte(`
7115 override_apex {
7116 name: "override_myapex",
7117 base: "myapex",
7118 apps: ["override_app"],
7119 allowed_files: ":allowed",
7120 }
7121 // Overridable "path" property should be referenced indirectly
7122 filegroup {
7123 name: "allowed",
7124 srcs: ["allowed.txt"],
7125 }
7126 override_android_app {
7127 name: "override_app",
7128 base: "app",
7129 package_name: "bar",
7130 }
7131 `),
7132 }))
7133
7134 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7135 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7136 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7137 }
7138
7139 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7140 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7141 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7142 }
7143}
7144
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007145func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007146 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007147 apex {
7148 name: "myapex",
7149 key: "myapex.key",
7150 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007151 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007152 }
7153
7154 apex_key {
7155 name: "myapex.key",
7156 public_key: "testkey.avbpubkey",
7157 private_key: "testkey.pem",
7158 }
7159
7160 cc_library {
7161 name: "mylib",
7162 srcs: ["mylib.cpp"],
7163 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007164 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007165 },
7166 apex_available: ["myapex"],
7167 }
7168
7169 cc_prebuilt_library_shared {
7170 name: "mylib",
7171 prefer: false,
7172 srcs: ["prebuilt.so"],
7173 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007174 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007175 },
7176 apex_available: ["myapex"],
7177 }
7178 `)
7179}
7180
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007181func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007182 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007183 apex {
7184 name: "myapex",
7185 key: "myapex.key",
7186 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007187 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007188 }
7189 apex_key {
7190 name: "myapex.key",
7191 public_key: "testkey.avbpubkey",
7192 private_key: "testkey.pem",
7193 }
7194 `, func(fs map[string][]byte, config android.Config) {
7195 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7196 })
7197
7198 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7199 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7200
7201 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7202 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7203
7204 // Make sure output of bundle is .capex
7205 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7206 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7207
7208 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007209 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007210 var builder strings.Builder
7211 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7212 androidMk := builder.String()
7213 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7214}
7215
Martin Stjernholm2856c662020-12-02 15:03:42 +00007216func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007217 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007218 apex {
7219 name: "myapex",
7220 key: "myapex.key",
7221 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007222 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007223 }
7224
7225 apex_key {
7226 name: "myapex.key",
7227 public_key: "testkey.avbpubkey",
7228 private_key: "testkey.pem",
7229 }
7230
7231 cc_library {
7232 name: "mylib",
7233 srcs: ["mylib.cpp"],
7234 apex_available: ["myapex"],
7235 shared_libs: ["otherlib"],
7236 system_shared_libs: [],
7237 }
7238
7239 cc_library {
7240 name: "otherlib",
7241 srcs: ["mylib.cpp"],
7242 stubs: {
7243 versions: ["current"],
7244 },
7245 }
7246
7247 cc_prebuilt_library_shared {
7248 name: "otherlib",
7249 prefer: true,
7250 srcs: ["prebuilt.so"],
7251 stubs: {
7252 versions: ["current"],
7253 },
7254 }
7255 `)
7256
7257 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007258 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007259 var builder strings.Builder
7260 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7261 androidMk := builder.String()
7262
7263 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7264 // a thing there.
7265 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7266}
7267
Jiyong Parke3867542020-12-03 17:28:25 +09007268func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007269 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007270 apex {
7271 name: "myapex",
7272 key: "myapex.key",
7273 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007274 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007275 }
7276
7277 apex_key {
7278 name: "myapex.key",
7279 public_key: "testkey.avbpubkey",
7280 private_key: "testkey.pem",
7281 }
7282
7283 cc_library {
7284 name: "mylib",
7285 srcs: ["mylib.cpp"],
7286 system_shared_libs: [],
7287 stl: "none",
7288 apex_available: ["myapex"],
7289 shared_libs: ["mylib2"],
7290 target: {
7291 apex: {
7292 exclude_shared_libs: ["mylib2"],
7293 },
7294 },
7295 }
7296
7297 cc_library {
7298 name: "mylib2",
7299 srcs: ["mylib.cpp"],
7300 system_shared_libs: [],
7301 stl: "none",
7302 }
7303 `)
7304
7305 // Check if mylib is linked to mylib2 for the non-apex target
7306 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7307 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7308
7309 // Make sure that the link doesn't occur for the apex target
7310 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7311 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7312
7313 // It shouldn't appear in the copy cmd as well.
7314 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7315 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7316}
7317
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007318func TestPrebuiltStubLibDep(t *testing.T) {
7319 bpBase := `
7320 apex {
7321 name: "myapex",
7322 key: "myapex.key",
7323 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007324 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007325 }
7326 apex_key {
7327 name: "myapex.key",
7328 public_key: "testkey.avbpubkey",
7329 private_key: "testkey.pem",
7330 }
7331 cc_library {
7332 name: "mylib",
7333 srcs: ["mylib.cpp"],
7334 apex_available: ["myapex"],
7335 shared_libs: ["stublib"],
7336 system_shared_libs: [],
7337 }
7338 apex {
7339 name: "otherapex",
7340 enabled: %s,
7341 key: "myapex.key",
7342 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007343 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007344 }
7345 `
7346
7347 stublibSourceBp := `
7348 cc_library {
7349 name: "stublib",
7350 srcs: ["mylib.cpp"],
7351 apex_available: ["otherapex"],
7352 system_shared_libs: [],
7353 stl: "none",
7354 stubs: {
7355 versions: ["1"],
7356 },
7357 }
7358 `
7359
7360 stublibPrebuiltBp := `
7361 cc_prebuilt_library_shared {
7362 name: "stublib",
7363 srcs: ["prebuilt.so"],
7364 apex_available: ["otherapex"],
7365 stubs: {
7366 versions: ["1"],
7367 },
7368 %s
7369 }
7370 `
7371
7372 tests := []struct {
7373 name string
7374 stublibBp string
7375 usePrebuilt bool
7376 modNames []string // Modules to collect AndroidMkEntries for
7377 otherApexEnabled []string
7378 }{
7379 {
7380 name: "only_source",
7381 stublibBp: stublibSourceBp,
7382 usePrebuilt: false,
7383 modNames: []string{"stublib"},
7384 otherApexEnabled: []string{"true", "false"},
7385 },
7386 {
7387 name: "source_preferred",
7388 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7389 usePrebuilt: false,
7390 modNames: []string{"stublib", "prebuilt_stublib"},
7391 otherApexEnabled: []string{"true", "false"},
7392 },
7393 {
7394 name: "prebuilt_preferred",
7395 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7396 usePrebuilt: true,
7397 modNames: []string{"stublib", "prebuilt_stublib"},
7398 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7399 },
7400 {
7401 name: "only_prebuilt",
7402 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7403 usePrebuilt: true,
7404 modNames: []string{"stublib"},
7405 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7406 },
7407 }
7408
7409 for _, test := range tests {
7410 t.Run(test.name, func(t *testing.T) {
7411 for _, otherApexEnabled := range test.otherApexEnabled {
7412 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007413 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007414
7415 type modAndMkEntries struct {
7416 mod *cc.Module
7417 mkEntries android.AndroidMkEntries
7418 }
7419 entries := []*modAndMkEntries{}
7420
7421 // Gather shared lib modules that are installable
7422 for _, modName := range test.modNames {
7423 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7424 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7425 continue
7426 }
7427 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007428 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007429 continue
7430 }
Colin Crossaa255532020-07-03 13:18:24 -07007431 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007432 if ent.Disabled {
7433 continue
7434 }
7435 entries = append(entries, &modAndMkEntries{
7436 mod: mod,
7437 mkEntries: ent,
7438 })
7439 }
7440 }
7441 }
7442
7443 var entry *modAndMkEntries = nil
7444 for _, ent := range entries {
7445 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7446 if entry != nil {
7447 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7448 } else {
7449 entry = ent
7450 }
7451 }
7452 }
7453
7454 if entry == nil {
7455 t.Errorf("AndroidMk entry for \"stublib\" missing")
7456 } else {
7457 isPrebuilt := entry.mod.Prebuilt() != nil
7458 if isPrebuilt != test.usePrebuilt {
7459 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7460 }
7461 if !entry.mod.IsStubs() {
7462 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7463 }
7464 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7465 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7466 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007467 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7468 expected := "-D__STUBLIB_API__=1"
7469 if !android.InList(expected, cflags) {
7470 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7471 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007472 }
7473 })
7474 }
7475 })
7476 }
7477}
7478
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007479func TestMain(m *testing.M) {
7480 run := func() int {
7481 setUp()
7482 defer tearDown()
7483
7484 return m.Run()
7485 }
7486
7487 os.Exit(run())
7488}