blob: 7bd037481dfc149ce04d13907db4b559393060bd [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 Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070032 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090033 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090035)
36
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070037var buildDir string
38
Jooyung Hand3639552019-08-09 12:57:43 +090039// names returns name list from white space separated string
40func names(s string) (ns []string) {
41 for _, n := range strings.Split(s, " ") {
42 if len(n) > 0 {
43 ns = append(ns, n)
44 }
45 }
46 return
47}
48
Jooyung Han344d5432019-08-23 11:17:39 +090049func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
50 t.Helper()
51 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090052 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
53 if len(errs) > 0 {
54 android.FailIfNoMatchingErrors(t, pattern, errs)
55 return
56 }
57 _, errs = ctx.PrepareBuildActions(config)
58 if len(errs) > 0 {
59 android.FailIfNoMatchingErrors(t, pattern, errs)
60 return
61 }
62
63 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
64}
65
Jooyung Han344d5432019-08-23 11:17:39 +090066func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
67 t.Helper()
68 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090069 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
70 android.FailIfErrored(t, errs)
71 _, errs = ctx.PrepareBuildActions(config)
72 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070073 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090074}
75
Jooyung Han344d5432019-08-23 11:17:39 +090076type testCustomizer func(fs map[string][]byte, config android.Config)
77
78func withFiles(files map[string][]byte) testCustomizer {
79 return func(fs map[string][]byte, config android.Config) {
80 for k, v := range files {
81 fs[k] = v
82 }
83 }
84}
85
86func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
87 return func(fs map[string][]byte, config android.Config) {
88 for k, v := range targets {
89 config.Targets[k] = v
90 }
91 }
92}
93
Jooyung Han35155c42020-02-06 17:33:20 +090094// withNativeBridgeTargets sets configuration with targets including:
95// - X86_64 (primary)
96// - X86 (secondary)
97// - Arm64 on X86_64 (native bridge)
98// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -070099func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110}
111
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900112func withManifestPackageNameOverrides(specs []string) testCustomizer {
113 return func(fs map[string][]byte, config android.Config) {
114 config.TestProductVariables.ManifestPackageNameOverrides = specs
115 }
116}
117
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700118func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900119 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900123 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900127 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128
129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Dario Frenicde2a032019-10-27 00:29:22 +0100140 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900141
Jooyung Han344d5432019-08-23 11:17:39 +0900142 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "build/make/target/product/security": nil,
147 "apex_manifest.json": nil,
148 "AndroidManifest.xml": nil,
149 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900151 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/commonapex-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800155 "mylib.cpp": nil,
156 "mylib_common.cpp": nil,
157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900191 }
192
Colin Crossf9aabd72020-02-15 11:29:50 -0800193 cc.GatherRequiredFilesForTest(fs)
194
Jooyung Han344d5432019-08-23 11:17:39 +0900195 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800196 // The fs now needs to be populated before creating the config, call handlers twice
197 // for now, once to get any fs changes, and later after the config was created to
198 // set product variables or targets.
199 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
200 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900201 }
202
Colin Cross98be1bb2019-12-13 20:41:13 -0800203 config := android.TestArchConfig(buildDir, nil, bp, fs)
204 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
205 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
206 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
207 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
208 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
209 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
210
211 for _, handler := range handlers {
212 // The fs now needs to be populated before creating the config, call handlers twice
213 // for now, earlier to get any fs changes, and now after the config was created to
214 // set product variables or targets.
215 tempFS := map[string][]byte{}
216 handler(tempFS, config)
217 }
218
219 ctx := android.NewTestArchContext()
220 ctx.RegisterModuleType("apex", BundleFactory)
221 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
222 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
223 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
224 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
225 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
226 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700227 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800228
Jooyung Hana57af4a2020-01-23 05:36:59 +0000229 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
230 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
231
Paul Duffin77980a82019-12-19 16:01:36 +0000232 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800233 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800234 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
235 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700236 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000237 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700238 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800239 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000240 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000241 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000242 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900243 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800244
Colin Cross98be1bb2019-12-13 20:41:13 -0800245 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800247
248 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249
Jooyung Han5c998b92019-06-27 11:30:33 +0900250 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900251}
252
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700253func setUp() {
254 var err error
255 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900256 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700257 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900258 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259}
260
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700261func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700262 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263}
264
Jooyung Han643adc42020-02-27 13:50:06 +0900265// ensure that 'result' equals 'expected'
266func ensureEquals(t *testing.T, result string, expected string) {
267 t.Helper()
268 if result != expected {
269 t.Errorf("%q != %q", expected, result)
270 }
271}
272
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273// ensure that 'result' contains 'expected'
274func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if !strings.Contains(result, expected) {
277 t.Errorf("%q is not found in %q", expected, result)
278 }
279}
280
Liz Kammer5bd365f2020-05-27 15:15:11 -0700281// ensure that 'result' contains 'expected' exactly one time
282func ensureContainsOnce(t *testing.T, result string, expected string) {
283 t.Helper()
284 count := strings.Count(result, expected)
285 if count != 1 {
286 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
287 }
288}
289
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290// ensures that 'result' does not contain 'notExpected'
291func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900292 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900293 if strings.Contains(result, notExpected) {
294 t.Errorf("%q is found in %q", notExpected, result)
295 }
296}
297
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700298func ensureMatches(t *testing.T, result string, expectedRex string) {
299 ok, err := regexp.MatchString(expectedRex, result)
300 if err != nil {
301 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
302 return
303 }
304 if !ok {
305 t.Errorf("%s does not match regular expession %s", result, expectedRex)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900310 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311 if !android.InList(expected, result) {
312 t.Errorf("%q is not found in %v", expected, result)
313 }
314}
315
316func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900317 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900318 if android.InList(notExpected, result) {
319 t.Errorf("%q is found in %v", notExpected, result)
320 }
321}
322
Jooyung Hane1633032019-08-01 17:41:43 +0900323func ensureListEmpty(t *testing.T, result []string) {
324 t.Helper()
325 if len(result) > 0 {
326 t.Errorf("%q is expected to be empty", result)
327 }
328}
329
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330// Minimal test
331func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900332 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex_defaults {
334 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900335 manifest: ":myapex.manifest",
336 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 key: "myapex.key",
338 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800339 multilib: {
340 both: {
341 binaries: ["foo",],
342 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900343 },
Jiyong Park77acec62020-06-01 21:39:15 +0900344 java_libs: [
345 "myjar",
346 "myjar_dex",
347 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 }
349
Jiyong Park30ca9372019-02-07 16:27:23 +0900350 apex {
351 name: "myapex",
352 defaults: ["myapex-defaults"],
353 }
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 apex_key {
356 name: "myapex.key",
357 public_key: "testkey.avbpubkey",
358 private_key: "testkey.pem",
359 }
360
Jiyong Park809bb722019-02-13 21:33:49 +0900361 filegroup {
362 name: "myapex.manifest",
363 srcs: ["apex_manifest.json"],
364 }
365
366 filegroup {
367 name: "myapex.androidmanifest",
368 srcs: ["AndroidManifest.xml"],
369 }
370
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 cc_library {
372 name: "mylib",
373 srcs: ["mylib.cpp"],
374 shared_libs: ["mylib2"],
375 system_shared_libs: [],
376 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000377 // TODO: remove //apex_available:platform
378 apex_available: [
379 "//apex_available:platform",
380 "myapex",
381 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900382 }
383
Alex Light3d673592019-01-18 14:37:31 -0800384 cc_binary {
385 name: "foo",
386 srcs: ["mylib.cpp"],
387 compile_multilib: "both",
388 multilib: {
389 lib32: {
390 suffix: "32",
391 },
392 lib64: {
393 suffix: "64",
394 },
395 },
396 symlinks: ["foo_link_"],
397 symlink_preferred_arch: true,
398 system_shared_libs: [],
399 static_executable: true,
400 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000401 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800402 }
403
Paul Duffindddd5462020-04-07 15:25:44 +0100404 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900405 name: "mylib2",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900409 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900410 static_libs: ["libstatic"],
411 // TODO: remove //apex_available:platform
412 apex_available: [
413 "//apex_available:platform",
414 "myapex",
415 ],
416 }
417
Paul Duffindddd5462020-04-07 15:25:44 +0100418 cc_prebuilt_library_shared {
419 name: "mylib2",
420 srcs: ["prebuilt.so"],
421 // TODO: remove //apex_available:platform
422 apex_available: [
423 "//apex_available:platform",
424 "myapex",
425 ],
426 }
427
Jiyong Park9918e1a2020-03-17 19:16:40 +0900428 cc_library_static {
429 name: "libstatic",
430 srcs: ["mylib.cpp"],
431 system_shared_libs: [],
432 stl: "none",
433 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900439 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900440
441 java_library {
442 name: "myjar",
443 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900444 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900445 sdk_version: "none",
446 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900447 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900448 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000449 // TODO: remove //apex_available:platform
450 apex_available: [
451 "//apex_available:platform",
452 "myapex",
453 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900454 }
455
Jiyong Park77acec62020-06-01 21:39:15 +0900456 dex_import {
457 name: "myjar_dex",
458 jars: ["prebuilt.jar"],
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park7f7766d2019-07-25 22:02:35 +0900465 java_library {
466 name: "myotherjar",
467 srcs: ["foo/bar/MyClass.java"],
468 sdk_version: "none",
469 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900476
477 java_library {
478 name: "mysharedjar",
479 srcs: ["foo/bar/MyClass.java"],
480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900482 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900483 `)
484
Sundong Ahnabb64432019-10-22 13:58:29 +0900485 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900486
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900487 // Make sure that Android.mk is created
488 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
489 data := android.AndroidMkDataForTest(t, config, "", ab)
490 var builder strings.Builder
491 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
492
493 androidMk := builder.String()
494 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
495 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
496
Jiyong Park42cca6c2019-04-01 11:15:50 +0900497 optFlags := apexRule.Args["opt_flags"]
498 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700499 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900500 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900501
Jiyong Park25fc6a92018-11-18 18:02:45 +0900502 copyCmds := apexRule.Args["copy_commands"]
503
504 // Ensure that main rule creates an output
505 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
506
507 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800508 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900509 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900510 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900511
512 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800513 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900514 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515
516 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800517 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
518 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900519 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900520 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900521 // .. but not for java libs
522 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900523 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800524
Colin Cross7113d202019-11-20 16:39:12 -0800525 // Ensure that the platform variant ends with _shared or _common
526 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
527 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900528 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
529 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900530 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
531
532 // Ensure that dynamic dependency to java libs are not included
533 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800534
535 // Ensure that all symlinks are present.
536 found_foo_link_64 := false
537 found_foo := false
538 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900539 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800540 if strings.HasSuffix(cmd, "bin/foo") {
541 found_foo = true
542 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
543 found_foo_link_64 = true
544 }
545 }
546 }
547 good := found_foo && found_foo_link_64
548 if !good {
549 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
550 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900551
Sundong Ahnabb64432019-10-22 13:58:29 +0900552 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700553 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900554 if len(noticeInputs) != 3 {
555 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900556 }
557 ensureListContains(t, noticeInputs, "NOTICE")
558 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900559 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900560
Artur Satayeva8bd1132020-04-27 18:07:06 +0100561 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100562 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
563 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
564 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
565 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
566 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100567
568 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100569 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
570 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
571 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
572 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
573 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800574}
575
Jooyung Hanf21c7972019-12-16 22:32:06 +0900576func TestDefaults(t *testing.T) {
577 ctx, _ := testApex(t, `
578 apex_defaults {
579 name: "myapex-defaults",
580 key: "myapex.key",
581 prebuilts: ["myetc"],
582 native_shared_libs: ["mylib"],
583 java_libs: ["myjar"],
584 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900585 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900586 }
587
588 prebuilt_etc {
589 name: "myetc",
590 src: "myprebuilt",
591 }
592
593 apex {
594 name: "myapex",
595 defaults: ["myapex-defaults"],
596 }
597
598 apex_key {
599 name: "myapex.key",
600 public_key: "testkey.avbpubkey",
601 private_key: "testkey.pem",
602 }
603
604 cc_library {
605 name: "mylib",
606 system_shared_libs: [],
607 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000608 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900609 }
610
611 java_library {
612 name: "myjar",
613 srcs: ["foo/bar/MyClass.java"],
614 sdk_version: "none",
615 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000616 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 android_app {
620 name: "AppFoo",
621 srcs: ["foo/bar/MyClass.java"],
622 sdk_version: "none",
623 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000624 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900625 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900626
627 runtime_resource_overlay {
628 name: "rro",
629 theme: "blue",
630 }
631
Jooyung Hanf21c7972019-12-16 22:32:06 +0900632 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000633 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900634 "etc/myetc",
635 "javalib/myjar.jar",
636 "lib64/mylib.so",
637 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900638 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900639 })
640}
641
Jooyung Han01a3ee22019-11-02 02:52:25 +0900642func TestApexManifest(t *testing.T) {
643 ctx, _ := testApex(t, `
644 apex {
645 name: "myapex",
646 key: "myapex.key",
647 }
648
649 apex_key {
650 name: "myapex.key",
651 public_key: "testkey.avbpubkey",
652 private_key: "testkey.pem",
653 }
654 `)
655
656 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900657 args := module.Rule("apexRule").Args
658 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
659 t.Error("manifest should be apex_manifest.pb, but " + manifest)
660 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900661}
662
Alex Light5098a612018-11-29 17:12:15 -0800663func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700664 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800665 apex {
666 name: "myapex",
667 key: "myapex.key",
668 payload_type: "zip",
669 native_shared_libs: ["mylib"],
670 }
671
672 apex_key {
673 name: "myapex.key",
674 public_key: "testkey.avbpubkey",
675 private_key: "testkey.pem",
676 }
677
678 cc_library {
679 name: "mylib",
680 srcs: ["mylib.cpp"],
681 shared_libs: ["mylib2"],
682 system_shared_libs: [],
683 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000684 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800685 }
686
687 cc_library {
688 name: "mylib2",
689 srcs: ["mylib.cpp"],
690 system_shared_libs: [],
691 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000692 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800693 }
694 `)
695
Sundong Ahnabb64432019-10-22 13:58:29 +0900696 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800697 copyCmds := zipApexRule.Args["copy_commands"]
698
699 // Ensure that main rule creates an output
700 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
701
702 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800703 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800704
705 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800706 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800707
708 // Ensure that both direct and indirect deps are copied into apex
709 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
710 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900711}
712
713func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700714 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900715 apex {
716 name: "myapex",
717 key: "myapex.key",
718 native_shared_libs: ["mylib", "mylib3"],
719 }
720
721 apex_key {
722 name: "myapex.key",
723 public_key: "testkey.avbpubkey",
724 private_key: "testkey.pem",
725 }
726
727 cc_library {
728 name: "mylib",
729 srcs: ["mylib.cpp"],
730 shared_libs: ["mylib2", "mylib3"],
731 system_shared_libs: [],
732 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000733 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900734 }
735
736 cc_library {
737 name: "mylib2",
738 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900739 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900740 system_shared_libs: [],
741 stl: "none",
742 stubs: {
743 versions: ["1", "2", "3"],
744 },
745 }
746
747 cc_library {
748 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900749 srcs: ["mylib.cpp"],
750 shared_libs: ["mylib4"],
751 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900752 stl: "none",
753 stubs: {
754 versions: ["10", "11", "12"],
755 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000756 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900757 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900758
759 cc_library {
760 name: "mylib4",
761 srcs: ["mylib.cpp"],
762 system_shared_libs: [],
763 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000764 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900765 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900766 `)
767
Sundong Ahnabb64432019-10-22 13:58:29 +0900768 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900769 copyCmds := apexRule.Args["copy_commands"]
770
771 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800772 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773
774 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800775 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900776
777 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800778 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900779
Colin Cross7113d202019-11-20 16:39:12 -0800780 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900781
782 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900783 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900784 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900785 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900786
787 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Cross7113d202019-11-20 16:39:12 -0800788 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800790 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900791
792 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900793 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900794 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900795
796 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900797 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900798
Jooyung Hana57af4a2020-01-23 05:36:59 +0000799 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900800 "lib64/mylib.so",
801 "lib64/mylib3.so",
802 "lib64/mylib4.so",
803 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804}
805
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900806func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700807 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900808 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900809 name: "myapex2",
810 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900811 native_shared_libs: ["mylib"],
812 }
813
814 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900815 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900816 public_key: "testkey.avbpubkey",
817 private_key: "testkey.pem",
818 }
819
820 cc_library {
821 name: "mylib",
822 srcs: ["mylib.cpp"],
823 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900824 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900825 system_shared_libs: [],
826 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000827 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900828 }
829
830 cc_library {
831 name: "libfoo",
832 srcs: ["mylib.cpp"],
833 shared_libs: ["libbar"],
834 system_shared_libs: [],
835 stl: "none",
836 stubs: {
837 versions: ["10", "20", "30"],
838 },
839 }
840
841 cc_library {
842 name: "libbar",
843 srcs: ["mylib.cpp"],
844 system_shared_libs: [],
845 stl: "none",
846 }
847
Jiyong Park678c8812020-02-07 17:25:49 +0900848 cc_library_static {
849 name: "libbaz",
850 srcs: ["mylib.cpp"],
851 system_shared_libs: [],
852 stl: "none",
853 apex_available: [ "myapex2" ],
854 }
855
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900856 `)
857
Jiyong Park83dc74b2020-01-14 18:38:44 +0900858 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900859 copyCmds := apexRule.Args["copy_commands"]
860
861 // Ensure that direct non-stubs dep is always included
862 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
863
864 // Ensure that indirect stubs dep is not included
865 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
866
867 // Ensure that dependency of stubs is not included
868 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
869
Jiyong Park83dc74b2020-01-14 18:38:44 +0900870 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900871
872 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900873 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900874 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900875 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900876
Jiyong Park3ff16992019-12-27 14:11:47 +0900877 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900878
879 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
880 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900881
Artur Satayeva8bd1132020-04-27 18:07:06 +0100882 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100883 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
884 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
885 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900886
Artur Satayeva8bd1132020-04-27 18:07:06 +0100887 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100888 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
889 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
890 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900891}
892
Jooyung Hand3639552019-08-09 12:57:43 +0900893func TestApexWithRuntimeLibsDependency(t *testing.T) {
894 /*
895 myapex
896 |
897 v (runtime_libs)
898 mylib ------+------> libfoo [provides stub]
899 |
900 `------> libbar
901 */
902 ctx, _ := testApex(t, `
903 apex {
904 name: "myapex",
905 key: "myapex.key",
906 native_shared_libs: ["mylib"],
907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
918 runtime_libs: ["libfoo", "libbar"],
919 system_shared_libs: [],
920 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900922 }
923
924 cc_library {
925 name: "libfoo",
926 srcs: ["mylib.cpp"],
927 system_shared_libs: [],
928 stl: "none",
929 stubs: {
930 versions: ["10", "20", "30"],
931 },
932 }
933
934 cc_library {
935 name: "libbar",
936 srcs: ["mylib.cpp"],
937 system_shared_libs: [],
938 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000939 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900940 }
941
942 `)
943
Sundong Ahnabb64432019-10-22 13:58:29 +0900944 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900945 copyCmds := apexRule.Args["copy_commands"]
946
947 // Ensure that direct non-stubs dep is always included
948 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
949
950 // Ensure that indirect stubs dep is not included
951 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
952
953 // Ensure that runtime_libs dep in included
954 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
955
Sundong Ahnabb64432019-10-22 13:58:29 +0900956 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900957 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
958 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900959
960}
961
Jooyung Han8ce8db92020-05-15 19:05:05 +0900962func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
963 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
964 bp := `
965 apex {
966 name: "com.android.runtime",
967 key: "com.android.runtime.key",
968 native_shared_libs: ["libc"],
969 }
970
971 apex_key {
972 name: "com.android.runtime.key",
973 public_key: "testkey.avbpubkey",
974 private_key: "testkey.pem",
975 }
976
977 cc_library {
978 name: "libc",
979 no_libcrt: true,
980 nocrt: true,
981 stl: "none",
982 system_shared_libs: [],
983 stubs: { versions: ["1"] },
984 apex_available: ["com.android.runtime"],
985
986 sanitize: {
987 hwaddress: true,
988 }
989 }
990
991 cc_prebuilt_library_shared {
992 name: "libclang_rt.hwasan-aarch64-android",
993 no_libcrt: true,
994 nocrt: true,
995 stl: "none",
996 system_shared_libs: [],
997 srcs: [""],
998 stubs: { versions: ["1"] },
999
1000 sanitize: {
1001 never: true,
1002 },
1003 }
1004 `
1005 // override bp to use hard-coded names: com.android.runtime and libc
1006 fs["Android.bp"] = []byte(bp)
1007 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1008 })
1009
1010 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1011 "lib64/bionic/libc.so",
1012 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1013 })
1014
1015 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1016
1017 installed := hwasan.Description("install libclang_rt.hwasan")
1018 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1019
1020 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1021 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1022 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1023}
1024
1025func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1026 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1027 bp := `
1028 apex {
1029 name: "com.android.runtime",
1030 key: "com.android.runtime.key",
1031 native_shared_libs: ["libc"],
1032 }
1033
1034 apex_key {
1035 name: "com.android.runtime.key",
1036 public_key: "testkey.avbpubkey",
1037 private_key: "testkey.pem",
1038 }
1039
1040 cc_library {
1041 name: "libc",
1042 no_libcrt: true,
1043 nocrt: true,
1044 stl: "none",
1045 system_shared_libs: [],
1046 stubs: { versions: ["1"] },
1047 apex_available: ["com.android.runtime"],
1048 }
1049
1050 cc_prebuilt_library_shared {
1051 name: "libclang_rt.hwasan-aarch64-android",
1052 no_libcrt: true,
1053 nocrt: true,
1054 stl: "none",
1055 system_shared_libs: [],
1056 srcs: [""],
1057 stubs: { versions: ["1"] },
1058
1059 sanitize: {
1060 never: true,
1061 },
1062 }
1063 `
1064 // override bp to use hard-coded names: com.android.runtime and libc
1065 fs["Android.bp"] = []byte(bp)
1066 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1067
1068 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1069 })
1070
1071 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1072 "lib64/bionic/libc.so",
1073 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1074 })
1075
1076 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1077
1078 installed := hwasan.Description("install libclang_rt.hwasan")
1079 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1080
1081 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1082 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1083 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1084}
1085
Jooyung Han61b66e92020-03-21 14:21:46 +00001086func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1087 testcases := []struct {
1088 name string
1089 minSdkVersion string
1090 shouldLink string
1091 shouldNotLink []string
1092 }{
1093 {
Jooyung Han75568392020-03-20 04:29:24 +09001094 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001095 minSdkVersion: "current",
1096 shouldLink: "30",
1097 shouldNotLink: []string{"29"},
1098 },
1099 {
1100 name: "should link to llndk#29",
1101 minSdkVersion: "29",
1102 shouldLink: "29",
1103 shouldNotLink: []string{"30"},
1104 },
1105 }
1106 for _, tc := range testcases {
1107 t.Run(tc.name, func(t *testing.T) {
1108 ctx, _ := testApex(t, `
1109 apex {
1110 name: "myapex",
1111 key: "myapex.key",
1112 use_vendor: true,
1113 native_shared_libs: ["mylib"],
1114 min_sdk_version: "`+tc.minSdkVersion+`",
1115 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001116
Jooyung Han61b66e92020-03-21 14:21:46 +00001117 apex_key {
1118 name: "myapex.key",
1119 public_key: "testkey.avbpubkey",
1120 private_key: "testkey.pem",
1121 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001122
Jooyung Han61b66e92020-03-21 14:21:46 +00001123 cc_library {
1124 name: "mylib",
1125 srcs: ["mylib.cpp"],
1126 vendor_available: true,
1127 shared_libs: ["libbar"],
1128 system_shared_libs: [],
1129 stl: "none",
1130 apex_available: [ "myapex" ],
1131 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001132
Jooyung Han61b66e92020-03-21 14:21:46 +00001133 cc_library {
1134 name: "libbar",
1135 srcs: ["mylib.cpp"],
1136 system_shared_libs: [],
1137 stl: "none",
1138 stubs: { versions: ["29","30"] },
1139 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001140
Jooyung Han61b66e92020-03-21 14:21:46 +00001141 llndk_library {
1142 name: "libbar",
1143 symbol_file: "",
1144 }
1145 `, func(fs map[string][]byte, config android.Config) {
1146 setUseVendorWhitelistForTest(config, []string{"myapex"})
1147 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001148
Jooyung Han61b66e92020-03-21 14:21:46 +00001149 // Ensure that LLNDK dep is not included
1150 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1151 "lib64/mylib.so",
1152 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001153
Jooyung Han61b66e92020-03-21 14:21:46 +00001154 // Ensure that LLNDK dep is required
1155 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1156 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1157 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001158
Jooyung Han61b66e92020-03-21 14:21:46 +00001159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1160 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1161 for _, ver := range tc.shouldNotLink {
1162 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1163 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001164
Jooyung Han61b66e92020-03-21 14:21:46 +00001165 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1166 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1167 })
1168 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001169}
1170
Jiyong Park25fc6a92018-11-18 18:02:45 +09001171func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001172 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001173 apex {
1174 name: "myapex",
1175 key: "myapex.key",
1176 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1177 }
1178
1179 apex_key {
1180 name: "myapex.key",
1181 public_key: "testkey.avbpubkey",
1182 private_key: "testkey.pem",
1183 }
1184
1185 cc_library {
1186 name: "mylib",
1187 srcs: ["mylib.cpp"],
1188 shared_libs: ["libdl#27"],
1189 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001190 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001191 }
1192
1193 cc_library_shared {
1194 name: "mylib_shared",
1195 srcs: ["mylib.cpp"],
1196 shared_libs: ["libdl#27"],
1197 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001198 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001199 }
1200
1201 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001202 name: "libBootstrap",
1203 srcs: ["mylib.cpp"],
1204 stl: "none",
1205 bootstrap: true,
1206 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001207 `)
1208
Sundong Ahnabb64432019-10-22 13:58:29 +09001209 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001210 copyCmds := apexRule.Args["copy_commands"]
1211
1212 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001213 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001214 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1215 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001216
1217 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001218 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001219
Colin Cross7113d202019-11-20 16:39:12 -08001220 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1221 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1222 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001223
1224 // For dependency to libc
1225 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001226 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001227 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001228 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001229 // ... Cflags from stub is correctly exported to mylib
1230 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1231 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1232
1233 // For dependency to libm
1234 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001235 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001236 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001237 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001238 // ... and is not compiling with the stub
1239 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1240 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1241
1242 // For dependency to libdl
1243 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001244 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001245 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001246 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1247 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001248 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001249 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001250 // ... Cflags from stub is correctly exported to mylib
1251 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1252 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001253
1254 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001255 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1256 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1257 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1258 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001259}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001260
Jooyung Han03b51852020-02-26 22:45:42 +09001261func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1262 // there are three links between liba --> libz
1263 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1264 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1265 // 3) (platform) -> liba -> libz : this should be non-stub link
1266 ctx, _ := testApex(t, `
1267 apex {
1268 name: "myapex",
1269 key: "myapex.key",
1270 native_shared_libs: ["libx"],
1271 min_sdk_version: "2",
1272 }
1273
1274 apex {
1275 name: "otherapex",
1276 key: "myapex.key",
1277 native_shared_libs: ["liby"],
1278 min_sdk_version: "3",
1279 }
1280
1281 apex_key {
1282 name: "myapex.key",
1283 public_key: "testkey.avbpubkey",
1284 private_key: "testkey.pem",
1285 }
1286
1287 cc_library {
1288 name: "libx",
1289 shared_libs: ["liba"],
1290 system_shared_libs: [],
1291 stl: "none",
1292 apex_available: [ "myapex" ],
1293 }
1294
1295 cc_library {
1296 name: "liby",
1297 shared_libs: ["liba"],
1298 system_shared_libs: [],
1299 stl: "none",
1300 apex_available: [ "otherapex" ],
1301 }
1302
1303 cc_library {
1304 name: "liba",
1305 shared_libs: ["libz"],
1306 system_shared_libs: [],
1307 stl: "none",
1308 apex_available: [
1309 "//apex_available:anyapex",
1310 "//apex_available:platform",
1311 ],
1312 }
1313
1314 cc_library {
1315 name: "libz",
1316 system_shared_libs: [],
1317 stl: "none",
1318 stubs: {
1319 versions: ["1", "3"],
1320 },
1321 }
1322 `, withUnbundledBuild)
1323
1324 expectLink := func(from, from_variant, to, to_variant string) {
1325 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1326 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1327 }
1328 expectNoLink := func(from, from_variant, to, to_variant string) {
1329 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1330 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1331 }
1332 // platform liba is linked to non-stub version
1333 expectLink("liba", "shared", "libz", "shared")
1334 // liba in myapex is linked to #1
1335 expectLink("liba", "shared_myapex", "libz", "shared_1")
1336 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1337 expectNoLink("liba", "shared_myapex", "libz", "shared")
1338 // liba in otherapex is linked to #3
1339 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1340 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1341 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1342}
1343
Jooyung Hanaed150d2020-04-02 01:41:41 +09001344func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1345 ctx, _ := testApex(t, `
1346 apex {
1347 name: "myapex",
1348 key: "myapex.key",
1349 native_shared_libs: ["libx"],
1350 min_sdk_version: "R",
1351 }
1352
1353 apex_key {
1354 name: "myapex.key",
1355 public_key: "testkey.avbpubkey",
1356 private_key: "testkey.pem",
1357 }
1358
1359 cc_library {
1360 name: "libx",
1361 shared_libs: ["libz"],
1362 system_shared_libs: [],
1363 stl: "none",
1364 apex_available: [ "myapex" ],
1365 }
1366
1367 cc_library {
1368 name: "libz",
1369 system_shared_libs: [],
1370 stl: "none",
1371 stubs: {
1372 versions: ["29", "R"],
1373 },
1374 }
1375 `, func(fs map[string][]byte, config android.Config) {
1376 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1377 })
1378
1379 expectLink := func(from, from_variant, to, to_variant string) {
1380 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1381 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1382 }
1383 expectNoLink := func(from, from_variant, to, to_variant string) {
1384 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1385 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1386 }
1387 // 9000 is quite a magic number.
1388 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1389 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1390 // to distinguish them from finalized and future_api(10000)
1391 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1392 // (refer android/api_levels.go)
1393 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1394 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1395 expectNoLink("libx", "shared_myapex", "libz", "shared")
1396}
1397
Jooyung Han03b51852020-02-26 22:45:42 +09001398func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1399 ctx, _ := testApex(t, `
1400 apex {
1401 name: "myapex",
1402 key: "myapex.key",
1403 native_shared_libs: ["libx"],
1404 }
1405
1406 apex_key {
1407 name: "myapex.key",
1408 public_key: "testkey.avbpubkey",
1409 private_key: "testkey.pem",
1410 }
1411
1412 cc_library {
1413 name: "libx",
1414 shared_libs: ["libz"],
1415 system_shared_libs: [],
1416 stl: "none",
1417 apex_available: [ "myapex" ],
1418 }
1419
1420 cc_library {
1421 name: "libz",
1422 system_shared_libs: [],
1423 stl: "none",
1424 stubs: {
1425 versions: ["1", "2"],
1426 },
1427 }
1428 `)
1429
1430 expectLink := func(from, from_variant, to, to_variant string) {
1431 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1432 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1433 }
1434 expectNoLink := func(from, from_variant, to, to_variant string) {
1435 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1436 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1437 }
1438 expectLink("libx", "shared_myapex", "libz", "shared_2")
1439 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1440 expectNoLink("libx", "shared_myapex", "libz", "shared")
1441}
1442
1443func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1444 ctx, _ := testApex(t, `
1445 apex {
1446 name: "myapex",
1447 key: "myapex.key",
1448 native_shared_libs: ["libx"],
1449 }
1450
1451 apex_key {
1452 name: "myapex.key",
1453 public_key: "testkey.avbpubkey",
1454 private_key: "testkey.pem",
1455 }
1456
1457 cc_library {
1458 name: "libx",
1459 system_shared_libs: [],
1460 stl: "none",
1461 apex_available: [ "myapex" ],
1462 stubs: {
1463 versions: ["1", "2"],
1464 },
1465 }
1466
1467 cc_library {
1468 name: "libz",
1469 shared_libs: ["libx"],
1470 system_shared_libs: [],
1471 stl: "none",
1472 }
1473 `)
1474
1475 expectLink := func(from, from_variant, to, to_variant string) {
1476 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1477 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1478 }
1479 expectNoLink := func(from, from_variant, to, to_variant string) {
1480 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1481 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1482 }
1483 expectLink("libz", "shared", "libx", "shared_2")
1484 expectNoLink("libz", "shared", "libz", "shared_1")
1485 expectNoLink("libz", "shared", "libz", "shared")
1486}
1487
Jooyung Han75568392020-03-20 04:29:24 +09001488func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001489 ctx, _ := testApex(t, `
1490 apex {
1491 name: "myapex",
1492 key: "myapex.key",
1493 native_shared_libs: ["libx"],
1494 min_sdk_version: "29",
1495 }
1496
1497 apex_key {
1498 name: "myapex.key",
1499 public_key: "testkey.avbpubkey",
1500 private_key: "testkey.pem",
1501 }
1502
1503 cc_library {
1504 name: "libx",
1505 shared_libs: ["libbar"],
1506 apex_available: [ "myapex" ],
1507 }
1508
1509 cc_library {
1510 name: "libbar",
1511 stubs: {
1512 versions: ["29", "30"],
1513 },
1514 }
Jooyung Han75568392020-03-20 04:29:24 +09001515 `, func(fs map[string][]byte, config android.Config) {
1516 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1517 })
Jooyung Han03b51852020-02-26 22:45:42 +09001518 expectLink := func(from, from_variant, to, to_variant string) {
1519 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1520 libFlags := ld.Args["libFlags"]
1521 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1522 }
Jooyung Han75568392020-03-20 04:29:24 +09001523 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001524}
1525
Jooyung Han75568392020-03-20 04:29:24 +09001526func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001527 ctx, _ := testApex(t, `
1528 apex {
1529 name: "myapex",
1530 key: "myapex.key",
1531 native_shared_libs: ["libx"],
1532 min_sdk_version: "29",
1533 }
1534
1535 apex_key {
1536 name: "myapex.key",
1537 public_key: "testkey.avbpubkey",
1538 private_key: "testkey.pem",
1539 }
1540
1541 cc_library {
1542 name: "libx",
1543 apex_available: [ "myapex" ],
1544 }
Jooyung Han75568392020-03-20 04:29:24 +09001545 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001546
1547 // ensure apex variant of c++ is linked with static unwinder
1548 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1549 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1550 // note that platform variant is not.
1551 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1552 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001553}
1554
1555func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001556 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001557 apex {
1558 name: "myapex",
1559 key: "myapex.key",
1560 native_shared_libs: ["libx"],
1561 min_sdk_version: "29",
1562 }
1563
1564 apex_key {
1565 name: "myapex.key",
1566 public_key: "testkey.avbpubkey",
1567 private_key: "testkey.pem",
1568 }
1569
1570 cc_library {
1571 name: "libx",
1572 shared_libs: ["libz"],
1573 system_shared_libs: [],
1574 stl: "none",
1575 apex_available: [ "myapex" ],
1576 }
1577
1578 cc_library {
1579 name: "libz",
1580 system_shared_libs: [],
1581 stl: "none",
1582 stubs: {
1583 versions: ["30"],
1584 },
1585 }
Jooyung Han75568392020-03-20 04:29:24 +09001586 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001587
Jooyung Hanaed150d2020-04-02 01:41:41 +09001588 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001589 apex {
1590 name: "myapex",
1591 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001592 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001593 }
1594
1595 apex_key {
1596 name: "myapex.key",
1597 public_key: "testkey.avbpubkey",
1598 private_key: "testkey.pem",
1599 }
1600 `)
1601}
1602
Artur Satayev8cf899a2020-04-15 17:29:42 +01001603func TestJavaStableSdkVersion(t *testing.T) {
1604 testCases := []struct {
1605 name string
1606 expectedError string
1607 bp string
1608 }{
1609 {
1610 name: "Non-updatable apex with non-stable dep",
1611 bp: `
1612 apex {
1613 name: "myapex",
1614 java_libs: ["myjar"],
1615 key: "myapex.key",
1616 }
1617 apex_key {
1618 name: "myapex.key",
1619 public_key: "testkey.avbpubkey",
1620 private_key: "testkey.pem",
1621 }
1622 java_library {
1623 name: "myjar",
1624 srcs: ["foo/bar/MyClass.java"],
1625 sdk_version: "core_platform",
1626 apex_available: ["myapex"],
1627 }
1628 `,
1629 },
1630 {
1631 name: "Updatable apex with stable dep",
1632 bp: `
1633 apex {
1634 name: "myapex",
1635 java_libs: ["myjar"],
1636 key: "myapex.key",
1637 updatable: true,
1638 min_sdk_version: "29",
1639 }
1640 apex_key {
1641 name: "myapex.key",
1642 public_key: "testkey.avbpubkey",
1643 private_key: "testkey.pem",
1644 }
1645 java_library {
1646 name: "myjar",
1647 srcs: ["foo/bar/MyClass.java"],
1648 sdk_version: "current",
1649 apex_available: ["myapex"],
1650 }
1651 `,
1652 },
1653 {
1654 name: "Updatable apex with non-stable dep",
1655 expectedError: "cannot depend on \"myjar\"",
1656 bp: `
1657 apex {
1658 name: "myapex",
1659 java_libs: ["myjar"],
1660 key: "myapex.key",
1661 updatable: true,
1662 }
1663 apex_key {
1664 name: "myapex.key",
1665 public_key: "testkey.avbpubkey",
1666 private_key: "testkey.pem",
1667 }
1668 java_library {
1669 name: "myjar",
1670 srcs: ["foo/bar/MyClass.java"],
1671 sdk_version: "core_platform",
1672 apex_available: ["myapex"],
1673 }
1674 `,
1675 },
1676 {
1677 name: "Updatable apex with non-stable transitive dep",
1678 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1679 bp: `
1680 apex {
1681 name: "myapex",
1682 java_libs: ["myjar"],
1683 key: "myapex.key",
1684 updatable: true,
1685 }
1686 apex_key {
1687 name: "myapex.key",
1688 public_key: "testkey.avbpubkey",
1689 private_key: "testkey.pem",
1690 }
1691 java_library {
1692 name: "myjar",
1693 srcs: ["foo/bar/MyClass.java"],
1694 sdk_version: "current",
1695 apex_available: ["myapex"],
1696 static_libs: ["transitive-jar"],
1697 }
1698 java_library {
1699 name: "transitive-jar",
1700 srcs: ["foo/bar/MyClass.java"],
1701 sdk_version: "core_platform",
1702 apex_available: ["myapex"],
1703 }
1704 `,
1705 },
1706 }
1707
1708 for _, test := range testCases {
1709 t.Run(test.name, func(t *testing.T) {
1710 if test.expectedError == "" {
1711 testApex(t, test.bp)
1712 } else {
1713 testApexError(t, test.expectedError, test.bp)
1714 }
1715 })
1716 }
1717}
1718
Jiyong Park7c2ee712018-12-07 00:42:25 +09001719func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001720 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001721 apex {
1722 name: "myapex",
1723 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001724 native_shared_libs: ["mylib"],
1725 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001726 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001727 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001728 }
1729
1730 apex_key {
1731 name: "myapex.key",
1732 public_key: "testkey.avbpubkey",
1733 private_key: "testkey.pem",
1734 }
1735
1736 prebuilt_etc {
1737 name: "myetc",
1738 src: "myprebuilt",
1739 sub_dir: "foo/bar",
1740 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001741
1742 cc_library {
1743 name: "mylib",
1744 srcs: ["mylib.cpp"],
1745 relative_install_path: "foo/bar",
1746 system_shared_libs: [],
1747 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001748 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001749 }
1750
1751 cc_binary {
1752 name: "mybin",
1753 srcs: ["mylib.cpp"],
1754 relative_install_path: "foo/bar",
1755 system_shared_libs: [],
1756 static_executable: true,
1757 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001758 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001759 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001760 `)
1761
Sundong Ahnabb64432019-10-22 13:58:29 +09001762 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001763 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1764
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001765 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001766 ensureListContains(t, dirs, "etc")
1767 ensureListContains(t, dirs, "etc/foo")
1768 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001769 ensureListContains(t, dirs, "lib64")
1770 ensureListContains(t, dirs, "lib64/foo")
1771 ensureListContains(t, dirs, "lib64/foo/bar")
1772 ensureListContains(t, dirs, "lib")
1773 ensureListContains(t, dirs, "lib/foo")
1774 ensureListContains(t, dirs, "lib/foo/bar")
1775
Jiyong Parkbd13e442019-03-15 18:10:35 +09001776 ensureListContains(t, dirs, "bin")
1777 ensureListContains(t, dirs, "bin/foo")
1778 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001779}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001780
Jooyung Han35155c42020-02-06 17:33:20 +09001781func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1782 ctx, _ := testApex(t, `
1783 apex {
1784 name: "myapex",
1785 key: "myapex.key",
1786 multilib: {
1787 both: {
1788 native_shared_libs: ["mylib"],
1789 binaries: ["mybin"],
1790 },
1791 },
1792 compile_multilib: "both",
1793 native_bridge_supported: true,
1794 }
1795
1796 apex_key {
1797 name: "myapex.key",
1798 public_key: "testkey.avbpubkey",
1799 private_key: "testkey.pem",
1800 }
1801
1802 cc_library {
1803 name: "mylib",
1804 relative_install_path: "foo/bar",
1805 system_shared_libs: [],
1806 stl: "none",
1807 apex_available: [ "myapex" ],
1808 native_bridge_supported: true,
1809 }
1810
1811 cc_binary {
1812 name: "mybin",
1813 relative_install_path: "foo/bar",
1814 system_shared_libs: [],
1815 static_executable: true,
1816 stl: "none",
1817 apex_available: [ "myapex" ],
1818 native_bridge_supported: true,
1819 compile_multilib: "both", // default is "first" for binary
1820 multilib: {
1821 lib64: {
1822 suffix: "64",
1823 },
1824 },
1825 }
1826 `, withNativeBridgeEnabled)
1827 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1828 "bin/foo/bar/mybin",
1829 "bin/foo/bar/mybin64",
1830 "bin/arm/foo/bar/mybin",
1831 "bin/arm64/foo/bar/mybin64",
1832 "lib/foo/bar/mylib.so",
1833 "lib/arm/foo/bar/mylib.so",
1834 "lib64/foo/bar/mylib.so",
1835 "lib64/arm64/foo/bar/mylib.so",
1836 })
1837}
1838
Jiyong Parkda6eb592018-12-19 17:12:36 +09001839func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001840 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001841 apex {
1842 name: "myapex",
1843 key: "myapex.key",
1844 native_shared_libs: ["mylib"],
1845 use_vendor: true,
1846 }
1847
1848 apex_key {
1849 name: "myapex.key",
1850 public_key: "testkey.avbpubkey",
1851 private_key: "testkey.pem",
1852 }
1853
1854 cc_library {
1855 name: "mylib",
1856 srcs: ["mylib.cpp"],
1857 shared_libs: ["mylib2"],
1858 system_shared_libs: [],
1859 vendor_available: true,
1860 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001861 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001862 }
1863
1864 cc_library {
1865 name: "mylib2",
1866 srcs: ["mylib.cpp"],
1867 system_shared_libs: [],
1868 vendor_available: true,
1869 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001870 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001871 }
Jooyung Handc782442019-11-01 03:14:38 +09001872 `, func(fs map[string][]byte, config android.Config) {
1873 setUseVendorWhitelistForTest(config, []string{"myapex"})
1874 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001875
1876 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001877 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001878 for _, implicit := range i.Implicits {
1879 inputsList = append(inputsList, implicit.String())
1880 }
1881 }
1882 inputsString := strings.Join(inputsList, " ")
1883
1884 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001885 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1886 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001887
1888 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001889 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1890 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001891}
Jiyong Park16e91a02018-12-20 18:18:08 +09001892
Jooyung Handc782442019-11-01 03:14:38 +09001893func TestUseVendorRestriction(t *testing.T) {
1894 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 use_vendor: true,
1899 }
1900 apex_key {
1901 name: "myapex.key",
1902 public_key: "testkey.avbpubkey",
1903 private_key: "testkey.pem",
1904 }
1905 `, func(fs map[string][]byte, config android.Config) {
1906 setUseVendorWhitelistForTest(config, []string{""})
1907 })
1908 // no error with whitelist
1909 testApex(t, `
1910 apex {
1911 name: "myapex",
1912 key: "myapex.key",
1913 use_vendor: true,
1914 }
1915 apex_key {
1916 name: "myapex.key",
1917 public_key: "testkey.avbpubkey",
1918 private_key: "testkey.pem",
1919 }
1920 `, func(fs map[string][]byte, config android.Config) {
1921 setUseVendorWhitelistForTest(config, []string{"myapex"})
1922 })
1923}
1924
Jooyung Han5c998b92019-06-27 11:30:33 +09001925func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1926 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1927 apex {
1928 name: "myapex",
1929 key: "myapex.key",
1930 native_shared_libs: ["mylib"],
1931 use_vendor: true,
1932 }
1933
1934 apex_key {
1935 name: "myapex.key",
1936 public_key: "testkey.avbpubkey",
1937 private_key: "testkey.pem",
1938 }
1939
1940 cc_library {
1941 name: "mylib",
1942 srcs: ["mylib.cpp"],
1943 system_shared_libs: [],
1944 stl: "none",
1945 }
1946 `)
1947}
1948
Jiyong Park16e91a02018-12-20 18:18:08 +09001949func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001950 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001951 apex {
1952 name: "myapex",
1953 key: "myapex.key",
1954 native_shared_libs: ["mylib"],
1955 }
1956
1957 apex_key {
1958 name: "myapex.key",
1959 public_key: "testkey.avbpubkey",
1960 private_key: "testkey.pem",
1961 }
1962
1963 cc_library {
1964 name: "mylib",
1965 srcs: ["mylib.cpp"],
1966 system_shared_libs: [],
1967 stl: "none",
1968 stubs: {
1969 versions: ["1", "2", "3"],
1970 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001971 apex_available: [
1972 "//apex_available:platform",
1973 "myapex",
1974 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001975 }
1976
1977 cc_binary {
1978 name: "not_in_apex",
1979 srcs: ["mylib.cpp"],
1980 static_libs: ["mylib"],
1981 static_executable: true,
1982 system_shared_libs: [],
1983 stl: "none",
1984 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001985 `)
1986
Colin Cross7113d202019-11-20 16:39:12 -08001987 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001988
1989 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001990 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001991}
Jiyong Park9335a262018-12-24 11:31:58 +09001992
1993func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001994 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001995 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001996 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001997 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001998 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001999 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002000 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002001 }
2002
2003 cc_library {
2004 name: "mylib",
2005 srcs: ["mylib.cpp"],
2006 system_shared_libs: [],
2007 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002008 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002017 android_app_certificate {
2018 name: "myapex.certificate",
2019 certificate: "testkey",
2020 }
2021
2022 android_app_certificate {
2023 name: "myapex.certificate.override",
2024 certificate: "testkey.override",
2025 }
2026
Jiyong Park9335a262018-12-24 11:31:58 +09002027 `)
2028
2029 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002030 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002031
2032 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2033 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2034 "vendor/foo/devkeys/testkey.avbpubkey")
2035 }
2036 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2037 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2038 "vendor/foo/devkeys/testkey.pem")
2039 }
2040
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002041 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002042 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002043 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002044 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002045 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002046 }
2047}
Jiyong Park58e364a2019-01-19 19:24:06 +09002048
Jooyung Hanf121a652019-12-17 14:30:11 +09002049func TestCertificate(t *testing.T) {
2050 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2051 ctx, _ := testApex(t, `
2052 apex {
2053 name: "myapex",
2054 key: "myapex.key",
2055 }
2056 apex_key {
2057 name: "myapex.key",
2058 public_key: "testkey.avbpubkey",
2059 private_key: "testkey.pem",
2060 }`)
2061 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2062 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2063 if actual := rule.Args["certificates"]; actual != expected {
2064 t.Errorf("certificates should be %q, not %q", expected, actual)
2065 }
2066 })
2067 t.Run("override when unspecified", func(t *testing.T) {
2068 ctx, _ := testApex(t, `
2069 apex {
2070 name: "myapex_keytest",
2071 key: "myapex.key",
2072 file_contexts: ":myapex-file_contexts",
2073 }
2074 apex_key {
2075 name: "myapex.key",
2076 public_key: "testkey.avbpubkey",
2077 private_key: "testkey.pem",
2078 }
2079 android_app_certificate {
2080 name: "myapex.certificate.override",
2081 certificate: "testkey.override",
2082 }`)
2083 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2084 expected := "testkey.override.x509.pem testkey.override.pk8"
2085 if actual := rule.Args["certificates"]; actual != expected {
2086 t.Errorf("certificates should be %q, not %q", expected, actual)
2087 }
2088 })
2089 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2090 ctx, _ := testApex(t, `
2091 apex {
2092 name: "myapex",
2093 key: "myapex.key",
2094 certificate: ":myapex.certificate",
2095 }
2096 apex_key {
2097 name: "myapex.key",
2098 public_key: "testkey.avbpubkey",
2099 private_key: "testkey.pem",
2100 }
2101 android_app_certificate {
2102 name: "myapex.certificate",
2103 certificate: "testkey",
2104 }`)
2105 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2106 expected := "testkey.x509.pem testkey.pk8"
2107 if actual := rule.Args["certificates"]; actual != expected {
2108 t.Errorf("certificates should be %q, not %q", expected, actual)
2109 }
2110 })
2111 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2112 ctx, _ := testApex(t, `
2113 apex {
2114 name: "myapex_keytest",
2115 key: "myapex.key",
2116 file_contexts: ":myapex-file_contexts",
2117 certificate: ":myapex.certificate",
2118 }
2119 apex_key {
2120 name: "myapex.key",
2121 public_key: "testkey.avbpubkey",
2122 private_key: "testkey.pem",
2123 }
2124 android_app_certificate {
2125 name: "myapex.certificate.override",
2126 certificate: "testkey.override",
2127 }`)
2128 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2129 expected := "testkey.override.x509.pem testkey.override.pk8"
2130 if actual := rule.Args["certificates"]; actual != expected {
2131 t.Errorf("certificates should be %q, not %q", expected, actual)
2132 }
2133 })
2134 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2135 ctx, _ := testApex(t, `
2136 apex {
2137 name: "myapex",
2138 key: "myapex.key",
2139 certificate: "testkey",
2140 }
2141 apex_key {
2142 name: "myapex.key",
2143 public_key: "testkey.avbpubkey",
2144 private_key: "testkey.pem",
2145 }`)
2146 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2147 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2148 if actual := rule.Args["certificates"]; actual != expected {
2149 t.Errorf("certificates should be %q, not %q", expected, actual)
2150 }
2151 })
2152 t.Run("override when specified as <name>", func(t *testing.T) {
2153 ctx, _ := testApex(t, `
2154 apex {
2155 name: "myapex_keytest",
2156 key: "myapex.key",
2157 file_contexts: ":myapex-file_contexts",
2158 certificate: "testkey",
2159 }
2160 apex_key {
2161 name: "myapex.key",
2162 public_key: "testkey.avbpubkey",
2163 private_key: "testkey.pem",
2164 }
2165 android_app_certificate {
2166 name: "myapex.certificate.override",
2167 certificate: "testkey.override",
2168 }`)
2169 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2170 expected := "testkey.override.x509.pem testkey.override.pk8"
2171 if actual := rule.Args["certificates"]; actual != expected {
2172 t.Errorf("certificates should be %q, not %q", expected, actual)
2173 }
2174 })
2175}
2176
Jiyong Park58e364a2019-01-19 19:24:06 +09002177func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002178 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002179 apex {
2180 name: "myapex",
2181 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002182 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002183 }
2184
2185 apex {
2186 name: "otherapex",
2187 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002188 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002189 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002190 }
2191
2192 apex_key {
2193 name: "myapex.key",
2194 public_key: "testkey.avbpubkey",
2195 private_key: "testkey.pem",
2196 }
2197
2198 cc_library {
2199 name: "mylib",
2200 srcs: ["mylib.cpp"],
2201 system_shared_libs: [],
2202 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002203 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002204 "myapex",
2205 "otherapex",
2206 ],
Jooyung Han24282772020-03-21 23:20:55 +09002207 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002208 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002209 cc_library {
2210 name: "mylib2",
2211 srcs: ["mylib.cpp"],
2212 system_shared_libs: [],
2213 stl: "none",
2214 apex_available: [
2215 "myapex",
2216 "otherapex",
2217 ],
2218 use_apex_name_macro: true,
2219 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002220 `)
2221
Jooyung Hanc87a0592020-03-02 17:44:33 +09002222 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002223 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002224 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002225 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002226
Jooyung Hanccce2f22020-03-07 03:45:53 +09002227 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002228 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2229 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002230 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002231 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002232
Jooyung Hanccce2f22020-03-07 03:45:53 +09002233 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002234 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2235 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002236 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002237 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002238
Jooyung Hanc87a0592020-03-02 17:44:33 +09002239 // When cc_library sets use_apex_name_macro: true
2240 // apex variants define additional macro to distinguish which apex variant it is built for
2241
2242 // non-APEX variant does not have __ANDROID_APEX__ defined
2243 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2244 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2245
2246 // APEX variant has __ANDROID_APEX__ defined
2247 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002248 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002249 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2250 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002251
Jooyung Hanc87a0592020-03-02 17:44:33 +09002252 // APEX variant has __ANDROID_APEX__ defined
2253 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002254 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002255 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2256 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002257
2258 // recovery variant does not set __ANDROID_SDK_VERSION__
2259 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2260 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2261 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002262}
Jiyong Park7e636d02019-01-28 16:16:54 +09002263
2264func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002265 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["mylib"],
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
2277
2278 cc_library_headers {
2279 name: "mylib_headers",
2280 export_include_dirs: ["my_include"],
2281 system_shared_libs: [],
2282 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002283 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002284 }
2285
2286 cc_library {
2287 name: "mylib",
2288 srcs: ["mylib.cpp"],
2289 system_shared_libs: [],
2290 stl: "none",
2291 header_libs: ["mylib_headers"],
2292 export_header_lib_headers: ["mylib_headers"],
2293 stubs: {
2294 versions: ["1", "2", "3"],
2295 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002296 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002297 }
2298
2299 cc_library {
2300 name: "otherlib",
2301 srcs: ["mylib.cpp"],
2302 system_shared_libs: [],
2303 stl: "none",
2304 shared_libs: ["mylib"],
2305 }
2306 `)
2307
Colin Cross7113d202019-11-20 16:39:12 -08002308 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002309
2310 // Ensure that the include path of the header lib is exported to 'otherlib'
2311 ensureContains(t, cFlags, "-Imy_include")
2312}
Alex Light9670d332019-01-29 18:07:33 -08002313
Jiyong Park7cd10e32020-01-14 09:22:18 +09002314type fileInApex struct {
2315 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002316 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002317 isLink bool
2318}
2319
Jooyung Hana57af4a2020-01-23 05:36:59 +00002320func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002321 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002322 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002323 copyCmds := apexRule.Args["copy_commands"]
2324 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002325 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002326 for _, cmd := range strings.Split(copyCmds, "&&") {
2327 cmd = strings.TrimSpace(cmd)
2328 if cmd == "" {
2329 continue
2330 }
2331 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002332 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002333 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002334 switch terms[0] {
2335 case "mkdir":
2336 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002337 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002338 t.Fatal("copyCmds contains invalid cp command", cmd)
2339 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002340 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002341 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002342 isLink = false
2343 case "ln":
2344 if len(terms) != 3 && len(terms) != 4 {
2345 // ln LINK TARGET or ln -s LINK TARGET
2346 t.Fatal("copyCmds contains invalid ln command", cmd)
2347 }
2348 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002349 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002350 isLink = true
2351 default:
2352 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2353 }
2354 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002355 index := strings.Index(dst, imageApexDir)
2356 if index == -1 {
2357 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2358 }
2359 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002360 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002361 }
2362 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002363 return ret
2364}
2365
Jooyung Hana57af4a2020-01-23 05:36:59 +00002366func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2367 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002368 var failed bool
2369 var surplus []string
2370 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002371 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002372 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002373 for _, expected := range files {
2374 if matched, _ := path.Match(expected, file.path); matched {
2375 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002376 mactchFound = true
2377 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002378 }
2379 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002380 if !mactchFound {
2381 surplus = append(surplus, file.path)
2382 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002383 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002384
Jooyung Han31c470b2019-10-18 16:26:59 +09002385 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002386 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002387 t.Log("surplus files", surplus)
2388 failed = true
2389 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002390
2391 if len(files) > len(filesMatched) {
2392 var missing []string
2393 for _, expected := range files {
2394 if !filesMatched[expected] {
2395 missing = append(missing, expected)
2396 }
2397 }
2398 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002399 t.Log("missing files", missing)
2400 failed = true
2401 }
2402 if failed {
2403 t.Fail()
2404 }
2405}
2406
Jooyung Han344d5432019-08-23 11:17:39 +09002407func TestVndkApexCurrent(t *testing.T) {
2408 ctx, _ := testApex(t, `
2409 apex_vndk {
2410 name: "myapex",
2411 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002412 }
2413
2414 apex_key {
2415 name: "myapex.key",
2416 public_key: "testkey.avbpubkey",
2417 private_key: "testkey.pem",
2418 }
2419
2420 cc_library {
2421 name: "libvndk",
2422 srcs: ["mylib.cpp"],
2423 vendor_available: true,
2424 vndk: {
2425 enabled: true,
2426 },
2427 system_shared_libs: [],
2428 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002429 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002430 }
2431
2432 cc_library {
2433 name: "libvndksp",
2434 srcs: ["mylib.cpp"],
2435 vendor_available: true,
2436 vndk: {
2437 enabled: true,
2438 support_system_process: true,
2439 },
2440 system_shared_libs: [],
2441 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002442 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002443 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002444 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002445
Jooyung Hana57af4a2020-01-23 05:36:59 +00002446 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002447 "lib/libvndk.so",
2448 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002449 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002450 "lib64/libvndk.so",
2451 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002452 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002453 "etc/llndk.libraries.VER.txt",
2454 "etc/vndkcore.libraries.VER.txt",
2455 "etc/vndksp.libraries.VER.txt",
2456 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002457 })
Jooyung Han344d5432019-08-23 11:17:39 +09002458}
2459
2460func TestVndkApexWithPrebuilt(t *testing.T) {
2461 ctx, _ := testApex(t, `
2462 apex_vndk {
2463 name: "myapex",
2464 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
2473 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002474 name: "libvndk",
2475 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002476 vendor_available: true,
2477 vndk: {
2478 enabled: true,
2479 },
2480 system_shared_libs: [],
2481 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002482 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002483 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002484
2485 cc_prebuilt_library_shared {
2486 name: "libvndk.arm",
2487 srcs: ["libvndk.arm.so"],
2488 vendor_available: true,
2489 vndk: {
2490 enabled: true,
2491 },
2492 enabled: false,
2493 arch: {
2494 arm: {
2495 enabled: true,
2496 },
2497 },
2498 system_shared_libs: [],
2499 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002500 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002501 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002502 `+vndkLibrariesTxtFiles("current"),
2503 withFiles(map[string][]byte{
2504 "libvndk.so": nil,
2505 "libvndk.arm.so": nil,
2506 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002507
Jooyung Hana57af4a2020-01-23 05:36:59 +00002508 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002509 "lib/libvndk.so",
2510 "lib/libvndk.arm.so",
2511 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002512 "lib/libc++.so",
2513 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002514 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002515 })
Jooyung Han344d5432019-08-23 11:17:39 +09002516}
2517
Jooyung Han39edb6c2019-11-06 16:53:07 +09002518func vndkLibrariesTxtFiles(vers ...string) (result string) {
2519 for _, v := range vers {
2520 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002521 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002522 result += `
2523 vndk_libraries_txt {
2524 name: "` + txt + `.libraries.txt",
2525 }
2526 `
2527 }
2528 } else {
2529 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2530 result += `
2531 prebuilt_etc {
2532 name: "` + txt + `.libraries.` + v + `.txt",
2533 src: "dummy.txt",
2534 }
2535 `
2536 }
2537 }
2538 }
2539 return
2540}
2541
Jooyung Han344d5432019-08-23 11:17:39 +09002542func TestVndkApexVersion(t *testing.T) {
2543 ctx, _ := testApex(t, `
2544 apex_vndk {
2545 name: "myapex_v27",
2546 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002547 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002548 vndk_version: "27",
2549 }
2550
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556
Jooyung Han31c470b2019-10-18 16:26:59 +09002557 vndk_prebuilt_shared {
2558 name: "libvndk27",
2559 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002560 vendor_available: true,
2561 vndk: {
2562 enabled: true,
2563 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002564 target_arch: "arm64",
2565 arch: {
2566 arm: {
2567 srcs: ["libvndk27_arm.so"],
2568 },
2569 arm64: {
2570 srcs: ["libvndk27_arm64.so"],
2571 },
2572 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002573 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002574 }
2575
2576 vndk_prebuilt_shared {
2577 name: "libvndk27",
2578 version: "27",
2579 vendor_available: true,
2580 vndk: {
2581 enabled: true,
2582 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002583 target_arch: "x86_64",
2584 arch: {
2585 x86: {
2586 srcs: ["libvndk27_x86.so"],
2587 },
2588 x86_64: {
2589 srcs: ["libvndk27_x86_64.so"],
2590 },
2591 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002592 }
2593 `+vndkLibrariesTxtFiles("27"),
2594 withFiles(map[string][]byte{
2595 "libvndk27_arm.so": nil,
2596 "libvndk27_arm64.so": nil,
2597 "libvndk27_x86.so": nil,
2598 "libvndk27_x86_64.so": nil,
2599 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002600
Jooyung Hana57af4a2020-01-23 05:36:59 +00002601 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002602 "lib/libvndk27_arm.so",
2603 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002604 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002605 })
Jooyung Han344d5432019-08-23 11:17:39 +09002606}
2607
2608func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2609 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2610 apex_vndk {
2611 name: "myapex_v27",
2612 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002613 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002614 vndk_version: "27",
2615 }
2616 apex_vndk {
2617 name: "myapex_v27_other",
2618 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002619 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002620 vndk_version: "27",
2621 }
2622
2623 apex_key {
2624 name: "myapex.key",
2625 public_key: "testkey.avbpubkey",
2626 private_key: "testkey.pem",
2627 }
2628
2629 cc_library {
2630 name: "libvndk",
2631 srcs: ["mylib.cpp"],
2632 vendor_available: true,
2633 vndk: {
2634 enabled: true,
2635 },
2636 system_shared_libs: [],
2637 stl: "none",
2638 }
2639
2640 vndk_prebuilt_shared {
2641 name: "libvndk",
2642 version: "27",
2643 vendor_available: true,
2644 vndk: {
2645 enabled: true,
2646 },
2647 srcs: ["libvndk.so"],
2648 }
2649 `, withFiles(map[string][]byte{
2650 "libvndk.so": nil,
2651 }))
2652}
2653
Jooyung Han90eee022019-10-01 20:02:42 +09002654func TestVndkApexNameRule(t *testing.T) {
2655 ctx, _ := testApex(t, `
2656 apex_vndk {
2657 name: "myapex",
2658 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002659 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002660 }
2661 apex_vndk {
2662 name: "myapex_v28",
2663 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002664 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002665 vndk_version: "28",
2666 }
2667 apex_key {
2668 name: "myapex.key",
2669 public_key: "testkey.avbpubkey",
2670 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002671 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002672
2673 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002674 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002675 actual := proptools.String(bundle.properties.Apex_name)
2676 if !reflect.DeepEqual(actual, expected) {
2677 t.Errorf("Got '%v', expected '%v'", actual, expected)
2678 }
2679 }
2680
2681 assertApexName("com.android.vndk.vVER", "myapex")
2682 assertApexName("com.android.vndk.v28", "myapex_v28")
2683}
2684
Jooyung Han344d5432019-08-23 11:17:39 +09002685func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2686 ctx, _ := testApex(t, `
2687 apex_vndk {
2688 name: "myapex",
2689 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002690 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002691 }
2692
2693 apex_key {
2694 name: "myapex.key",
2695 public_key: "testkey.avbpubkey",
2696 private_key: "testkey.pem",
2697 }
2698
2699 cc_library {
2700 name: "libvndk",
2701 srcs: ["mylib.cpp"],
2702 vendor_available: true,
2703 native_bridge_supported: true,
2704 host_supported: true,
2705 vndk: {
2706 enabled: true,
2707 },
2708 system_shared_libs: [],
2709 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002710 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002711 }
Jooyung Han35155c42020-02-06 17:33:20 +09002712 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002713
Jooyung Hana57af4a2020-01-23 05:36:59 +00002714 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002715 "lib/libvndk.so",
2716 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002717 "lib/libc++.so",
2718 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002719 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002720 })
Jooyung Han344d5432019-08-23 11:17:39 +09002721}
2722
2723func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2724 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2725 apex_vndk {
2726 name: "myapex",
2727 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002728 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002729 native_bridge_supported: true,
2730 }
2731
2732 apex_key {
2733 name: "myapex.key",
2734 public_key: "testkey.avbpubkey",
2735 private_key: "testkey.pem",
2736 }
2737
2738 cc_library {
2739 name: "libvndk",
2740 srcs: ["mylib.cpp"],
2741 vendor_available: true,
2742 native_bridge_supported: true,
2743 host_supported: true,
2744 vndk: {
2745 enabled: true,
2746 },
2747 system_shared_libs: [],
2748 stl: "none",
2749 }
2750 `)
2751}
2752
Jooyung Han31c470b2019-10-18 16:26:59 +09002753func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002754 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002755 apex_vndk {
2756 name: "myapex_v27",
2757 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002758 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002759 vndk_version: "27",
2760 }
2761
2762 apex_key {
2763 name: "myapex.key",
2764 public_key: "testkey.avbpubkey",
2765 private_key: "testkey.pem",
2766 }
2767
2768 vndk_prebuilt_shared {
2769 name: "libvndk27",
2770 version: "27",
2771 target_arch: "arm",
2772 vendor_available: true,
2773 vndk: {
2774 enabled: true,
2775 },
2776 arch: {
2777 arm: {
2778 srcs: ["libvndk27.so"],
2779 }
2780 },
2781 }
2782
2783 vndk_prebuilt_shared {
2784 name: "libvndk27",
2785 version: "27",
2786 target_arch: "arm",
2787 binder32bit: true,
2788 vendor_available: true,
2789 vndk: {
2790 enabled: true,
2791 },
2792 arch: {
2793 arm: {
2794 srcs: ["libvndk27binder32.so"],
2795 }
2796 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002797 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002798 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002799 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002800 withFiles(map[string][]byte{
2801 "libvndk27.so": nil,
2802 "libvndk27binder32.so": nil,
2803 }),
2804 withBinder32bit,
2805 withTargets(map[android.OsType][]android.Target{
2806 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002807 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2808 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002809 },
2810 }),
2811 )
2812
Jooyung Hana57af4a2020-01-23 05:36:59 +00002813 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002814 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002815 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002816 })
2817}
2818
Jooyung Hane1633032019-08-01 17:41:43 +09002819func TestDependenciesInApexManifest(t *testing.T) {
2820 ctx, _ := testApex(t, `
2821 apex {
2822 name: "myapex_nodep",
2823 key: "myapex.key",
2824 native_shared_libs: ["lib_nodep"],
2825 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002826 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002827 }
2828
2829 apex {
2830 name: "myapex_dep",
2831 key: "myapex.key",
2832 native_shared_libs: ["lib_dep"],
2833 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002834 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002835 }
2836
2837 apex {
2838 name: "myapex_provider",
2839 key: "myapex.key",
2840 native_shared_libs: ["libfoo"],
2841 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002842 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002843 }
2844
2845 apex {
2846 name: "myapex_selfcontained",
2847 key: "myapex.key",
2848 native_shared_libs: ["lib_dep", "libfoo"],
2849 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002850 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 cc_library {
2860 name: "lib_nodep",
2861 srcs: ["mylib.cpp"],
2862 system_shared_libs: [],
2863 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002864 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002865 }
2866
2867 cc_library {
2868 name: "lib_dep",
2869 srcs: ["mylib.cpp"],
2870 shared_libs: ["libfoo"],
2871 system_shared_libs: [],
2872 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002873 apex_available: [
2874 "myapex_dep",
2875 "myapex_provider",
2876 "myapex_selfcontained",
2877 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002878 }
2879
2880 cc_library {
2881 name: "libfoo",
2882 srcs: ["mytest.cpp"],
2883 stubs: {
2884 versions: ["1"],
2885 },
2886 system_shared_libs: [],
2887 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002888 apex_available: [
2889 "myapex_provider",
2890 "myapex_selfcontained",
2891 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002892 }
2893 `)
2894
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002895 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002896 var provideNativeLibs, requireNativeLibs []string
2897
Sundong Ahnabb64432019-10-22 13:58:29 +09002898 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002899 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2900 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002901 ensureListEmpty(t, provideNativeLibs)
2902 ensureListEmpty(t, requireNativeLibs)
2903
Sundong Ahnabb64432019-10-22 13:58:29 +09002904 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002905 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2906 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002907 ensureListEmpty(t, provideNativeLibs)
2908 ensureListContains(t, requireNativeLibs, "libfoo.so")
2909
Sundong Ahnabb64432019-10-22 13:58:29 +09002910 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002911 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2912 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002913 ensureListContains(t, provideNativeLibs, "libfoo.so")
2914 ensureListEmpty(t, requireNativeLibs)
2915
Sundong Ahnabb64432019-10-22 13:58:29 +09002916 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002917 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2918 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002919 ensureListContains(t, provideNativeLibs, "libfoo.so")
2920 ensureListEmpty(t, requireNativeLibs)
2921}
2922
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002923func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002924 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002925 apex {
2926 name: "myapex",
2927 key: "myapex.key",
2928 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002929 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002930 }
2931
2932 apex_key {
2933 name: "myapex.key",
2934 public_key: "testkey.avbpubkey",
2935 private_key: "testkey.pem",
2936 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002937
2938 cc_library {
2939 name: "mylib",
2940 srcs: ["mylib.cpp"],
2941 system_shared_libs: [],
2942 stl: "none",
2943 apex_available: [
2944 "//apex_available:platform",
2945 "myapex",
2946 ],
2947 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002948 `)
2949
Sundong Ahnabb64432019-10-22 13:58:29 +09002950 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002951 apexManifestRule := module.Rule("apexManifestRule")
2952 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2953 apexRule := module.Rule("apexRule")
2954 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002955
2956 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2957 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2958 name := apexBundle.BaseModuleName()
2959 prefix := "TARGET_"
2960 var builder strings.Builder
2961 data.Custom(&builder, name, prefix, "", data)
2962 androidMk := builder.String()
2963 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2964 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002965}
2966
Alex Light0851b882019-02-07 13:20:53 -08002967func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002968 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002969 apex {
2970 name: "myapex",
2971 key: "myapex.key",
2972 native_shared_libs: ["mylib_common"],
2973 }
2974
2975 apex_key {
2976 name: "myapex.key",
2977 public_key: "testkey.avbpubkey",
2978 private_key: "testkey.pem",
2979 }
2980
2981 cc_library {
2982 name: "mylib_common",
2983 srcs: ["mylib.cpp"],
2984 system_shared_libs: [],
2985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002986 apex_available: [
2987 "//apex_available:platform",
2988 "myapex",
2989 ],
Alex Light0851b882019-02-07 13:20:53 -08002990 }
2991 `)
2992
Sundong Ahnabb64432019-10-22 13:58:29 +09002993 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002994 apexRule := module.Rule("apexRule")
2995 copyCmds := apexRule.Args["copy_commands"]
2996
2997 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2998 t.Log("Apex was a test apex!")
2999 t.Fail()
3000 }
3001 // Ensure that main rule creates an output
3002 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3003
3004 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003005 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003006
3007 // Ensure that both direct and indirect deps are copied into apex
3008 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3009
Colin Cross7113d202019-11-20 16:39:12 -08003010 // Ensure that the platform variant ends with _shared
3011 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003012
3013 if !android.InAnyApex("mylib_common") {
3014 t.Log("Found mylib_common not in any apex!")
3015 t.Fail()
3016 }
3017}
3018
3019func TestTestApex(t *testing.T) {
3020 if android.InAnyApex("mylib_common_test") {
3021 t.Fatal("mylib_common_test must not be used in any other tests since this checks that global state is not updated in an illegal way!")
3022 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003023 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003024 apex_test {
3025 name: "myapex",
3026 key: "myapex.key",
3027 native_shared_libs: ["mylib_common_test"],
3028 }
3029
3030 apex_key {
3031 name: "myapex.key",
3032 public_key: "testkey.avbpubkey",
3033 private_key: "testkey.pem",
3034 }
3035
3036 cc_library {
3037 name: "mylib_common_test",
3038 srcs: ["mylib.cpp"],
3039 system_shared_libs: [],
3040 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003041 // TODO: remove //apex_available:platform
3042 apex_available: [
3043 "//apex_available:platform",
3044 "myapex",
3045 ],
Alex Light0851b882019-02-07 13:20:53 -08003046 }
3047 `)
3048
Sundong Ahnabb64432019-10-22 13:58:29 +09003049 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003050 apexRule := module.Rule("apexRule")
3051 copyCmds := apexRule.Args["copy_commands"]
3052
3053 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3054 t.Log("Apex was not a test apex!")
3055 t.Fail()
3056 }
3057 // Ensure that main rule creates an output
3058 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3059
3060 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003061 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003062
3063 // Ensure that both direct and indirect deps are copied into apex
3064 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3065
Colin Cross7113d202019-11-20 16:39:12 -08003066 // Ensure that the platform variant ends with _shared
3067 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003068}
3069
Alex Light9670d332019-01-29 18:07:33 -08003070func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003071 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003072 apex {
3073 name: "myapex",
3074 key: "myapex.key",
3075 multilib: {
3076 first: {
3077 native_shared_libs: ["mylib_common"],
3078 }
3079 },
3080 target: {
3081 android: {
3082 multilib: {
3083 first: {
3084 native_shared_libs: ["mylib"],
3085 }
3086 }
3087 },
3088 host: {
3089 multilib: {
3090 first: {
3091 native_shared_libs: ["mylib2"],
3092 }
3093 }
3094 }
3095 }
3096 }
3097
3098 apex_key {
3099 name: "myapex.key",
3100 public_key: "testkey.avbpubkey",
3101 private_key: "testkey.pem",
3102 }
3103
3104 cc_library {
3105 name: "mylib",
3106 srcs: ["mylib.cpp"],
3107 system_shared_libs: [],
3108 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003109 // TODO: remove //apex_available:platform
3110 apex_available: [
3111 "//apex_available:platform",
3112 "myapex",
3113 ],
Alex Light9670d332019-01-29 18:07:33 -08003114 }
3115
3116 cc_library {
3117 name: "mylib_common",
3118 srcs: ["mylib.cpp"],
3119 system_shared_libs: [],
3120 stl: "none",
3121 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003122 // TODO: remove //apex_available:platform
3123 apex_available: [
3124 "//apex_available:platform",
3125 "myapex",
3126 ],
Alex Light9670d332019-01-29 18:07:33 -08003127 }
3128
3129 cc_library {
3130 name: "mylib2",
3131 srcs: ["mylib.cpp"],
3132 system_shared_libs: [],
3133 stl: "none",
3134 compile_multilib: "first",
3135 }
3136 `)
3137
Sundong Ahnabb64432019-10-22 13:58:29 +09003138 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003139 copyCmds := apexRule.Args["copy_commands"]
3140
3141 // Ensure that main rule creates an output
3142 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3143
3144 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003145 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3146 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3147 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003148
3149 // Ensure that both direct and indirect deps are copied into apex
3150 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3151 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3152 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3153
Colin Cross7113d202019-11-20 16:39:12 -08003154 // Ensure that the platform variant ends with _shared
3155 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3156 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3157 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003158}
Jiyong Park04480cf2019-02-06 00:16:29 +09003159
3160func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003161 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003162 apex {
3163 name: "myapex",
3164 key: "myapex.key",
3165 binaries: ["myscript"],
3166 }
3167
3168 apex_key {
3169 name: "myapex.key",
3170 public_key: "testkey.avbpubkey",
3171 private_key: "testkey.pem",
3172 }
3173
3174 sh_binary {
3175 name: "myscript",
3176 src: "mylib.cpp",
3177 filename: "myscript.sh",
3178 sub_dir: "script",
3179 }
3180 `)
3181
Sundong Ahnabb64432019-10-22 13:58:29 +09003182 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003183 copyCmds := apexRule.Args["copy_commands"]
3184
3185 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3186}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003187
Jooyung Han91df2082019-11-20 01:49:42 +09003188func TestApexInVariousPartition(t *testing.T) {
3189 testcases := []struct {
3190 propName, parition, flattenedPartition string
3191 }{
3192 {"", "system", "system_ext"},
3193 {"product_specific: true", "product", "product"},
3194 {"soc_specific: true", "vendor", "vendor"},
3195 {"proprietary: true", "vendor", "vendor"},
3196 {"vendor: true", "vendor", "vendor"},
3197 {"system_ext_specific: true", "system_ext", "system_ext"},
3198 }
3199 for _, tc := range testcases {
3200 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3201 ctx, _ := testApex(t, `
3202 apex {
3203 name: "myapex",
3204 key: "myapex.key",
3205 `+tc.propName+`
3206 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003207
Jooyung Han91df2082019-11-20 01:49:42 +09003208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003214
Jooyung Han91df2082019-11-20 01:49:42 +09003215 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3216 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3217 actual := apex.installDir.String()
3218 if actual != expected {
3219 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3220 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003221
Jooyung Han91df2082019-11-20 01:49:42 +09003222 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3223 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3224 actual = flattened.installDir.String()
3225 if actual != expected {
3226 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3227 }
3228 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003229 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003230}
Jiyong Park67882562019-03-21 01:11:21 +09003231
Jooyung Han54aca7b2019-11-20 02:26:02 +09003232func TestFileContexts(t *testing.T) {
3233 ctx, _ := testApex(t, `
3234 apex {
3235 name: "myapex",
3236 key: "myapex.key",
3237 }
3238
3239 apex_key {
3240 name: "myapex.key",
3241 public_key: "testkey.avbpubkey",
3242 private_key: "testkey.pem",
3243 }
3244 `)
3245 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3246 apexRule := module.Rule("apexRule")
3247 actual := apexRule.Args["file_contexts"]
3248 expected := "system/sepolicy/apex/myapex-file_contexts"
3249 if actual != expected {
3250 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3251 }
3252
3253 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3254 apex {
3255 name: "myapex",
3256 key: "myapex.key",
3257 file_contexts: "my_own_file_contexts",
3258 }
3259
3260 apex_key {
3261 name: "myapex.key",
3262 public_key: "testkey.avbpubkey",
3263 private_key: "testkey.pem",
3264 }
3265 `, withFiles(map[string][]byte{
3266 "my_own_file_contexts": nil,
3267 }))
3268
3269 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
3273 product_specific: true,
3274 file_contexts: "product_specific_file_contexts",
3275 }
3276
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282 `)
3283
3284 ctx, _ = testApex(t, `
3285 apex {
3286 name: "myapex",
3287 key: "myapex.key",
3288 product_specific: true,
3289 file_contexts: "product_specific_file_contexts",
3290 }
3291
3292 apex_key {
3293 name: "myapex.key",
3294 public_key: "testkey.avbpubkey",
3295 private_key: "testkey.pem",
3296 }
3297 `, withFiles(map[string][]byte{
3298 "product_specific_file_contexts": nil,
3299 }))
3300 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3301 apexRule = module.Rule("apexRule")
3302 actual = apexRule.Args["file_contexts"]
3303 expected = "product_specific_file_contexts"
3304 if actual != expected {
3305 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3306 }
3307
3308 ctx, _ = testApex(t, `
3309 apex {
3310 name: "myapex",
3311 key: "myapex.key",
3312 product_specific: true,
3313 file_contexts: ":my-file-contexts",
3314 }
3315
3316 apex_key {
3317 name: "myapex.key",
3318 public_key: "testkey.avbpubkey",
3319 private_key: "testkey.pem",
3320 }
3321
3322 filegroup {
3323 name: "my-file-contexts",
3324 srcs: ["product_specific_file_contexts"],
3325 }
3326 `, withFiles(map[string][]byte{
3327 "product_specific_file_contexts": nil,
3328 }))
3329 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3330 apexRule = module.Rule("apexRule")
3331 actual = apexRule.Args["file_contexts"]
3332 expected = "product_specific_file_contexts"
3333 if actual != expected {
3334 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3335 }
3336}
3337
Jiyong Park67882562019-03-21 01:11:21 +09003338func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003339 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003340 apex_key {
3341 name: "myapex.key",
3342 public_key: ":my.avbpubkey",
3343 private_key: ":my.pem",
3344 product_specific: true,
3345 }
3346
3347 filegroup {
3348 name: "my.avbpubkey",
3349 srcs: ["testkey2.avbpubkey"],
3350 }
3351
3352 filegroup {
3353 name: "my.pem",
3354 srcs: ["testkey2.pem"],
3355 }
3356 `)
3357
3358 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3359 expected_pubkey := "testkey2.avbpubkey"
3360 actual_pubkey := apex_key.public_key_file.String()
3361 if actual_pubkey != expected_pubkey {
3362 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3363 }
3364 expected_privkey := "testkey2.pem"
3365 actual_privkey := apex_key.private_key_file.String()
3366 if actual_privkey != expected_privkey {
3367 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3368 }
3369}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003370
3371func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003372 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003373 prebuilt_apex {
3374 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003375 arch: {
3376 arm64: {
3377 src: "myapex-arm64.apex",
3378 },
3379 arm: {
3380 src: "myapex-arm.apex",
3381 },
3382 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003383 }
3384 `)
3385
3386 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3387
Jiyong Parkc95714e2019-03-29 14:23:10 +09003388 expectedInput := "myapex-arm64.apex"
3389 if prebuilt.inputApex.String() != expectedInput {
3390 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3391 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003392}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003393
3394func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003395 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003396 prebuilt_apex {
3397 name: "myapex",
3398 src: "myapex-arm.apex",
3399 filename: "notmyapex.apex",
3400 }
3401 `)
3402
3403 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3404
3405 expected := "notmyapex.apex"
3406 if p.installFilename != expected {
3407 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3408 }
3409}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003410
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003411func TestPrebuiltOverrides(t *testing.T) {
3412 ctx, config := testApex(t, `
3413 prebuilt_apex {
3414 name: "myapex.prebuilt",
3415 src: "myapex-arm.apex",
3416 overrides: [
3417 "myapex",
3418 ],
3419 }
3420 `)
3421
3422 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3423
3424 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003425 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003426 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003427 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003428 }
3429}
3430
Roland Levillain630846d2019-06-26 12:48:34 +01003431func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003432 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003433 apex_test {
3434 name: "myapex",
3435 key: "myapex.key",
3436 tests: [
3437 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003438 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003439 ],
3440 }
3441
3442 apex_key {
3443 name: "myapex.key",
3444 public_key: "testkey.avbpubkey",
3445 private_key: "testkey.pem",
3446 }
3447
Liz Kammer1c14a212020-05-12 15:26:55 -07003448 filegroup {
3449 name: "fg",
3450 srcs: [
3451 "baz",
3452 "bar/baz"
3453 ],
3454 }
3455
Roland Levillain630846d2019-06-26 12:48:34 +01003456 cc_test {
3457 name: "mytest",
3458 gtest: false,
3459 srcs: ["mytest.cpp"],
3460 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003461 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003462 system_shared_libs: [],
3463 static_executable: true,
3464 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003465 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003466 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003467
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003468 cc_library {
3469 name: "mylib",
3470 srcs: ["mylib.cpp"],
3471 system_shared_libs: [],
3472 stl: "none",
3473 }
3474
Liz Kammer5bd365f2020-05-27 15:15:11 -07003475 filegroup {
3476 name: "fg2",
3477 srcs: [
3478 "testdata/baz"
3479 ],
3480 }
3481
Roland Levillain9b5fde92019-06-28 15:41:19 +01003482 cc_test {
3483 name: "mytests",
3484 gtest: false,
3485 srcs: [
3486 "mytest1.cpp",
3487 "mytest2.cpp",
3488 "mytest3.cpp",
3489 ],
3490 test_per_src: true,
3491 relative_install_path: "test",
3492 system_shared_libs: [],
3493 static_executable: true,
3494 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003495 data: [
3496 ":fg",
3497 ":fg2",
3498 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003499 }
Roland Levillain630846d2019-06-26 12:48:34 +01003500 `)
3501
Sundong Ahnabb64432019-10-22 13:58:29 +09003502 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003503 copyCmds := apexRule.Args["copy_commands"]
3504
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003505 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003506 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003507 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003508
Liz Kammer1c14a212020-05-12 15:26:55 -07003509 //Ensure that test data are copied into apex.
3510 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3511 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3512
Roland Levillain9b5fde92019-06-28 15:41:19 +01003513 // Ensure that test deps built with `test_per_src` are copied into apex.
3514 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3515 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3516 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003517
3518 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003519 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3520 data := android.AndroidMkDataForTest(t, config, "", bundle)
3521 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003522 prefix := "TARGET_"
3523 var builder strings.Builder
3524 data.Custom(&builder, name, prefix, "", data)
3525 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003526 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3527 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3528 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3529 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003530 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003531 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003532 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003533
3534 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3535 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3536 data.Custom(&builder, name, prefix, "", data)
3537 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003538 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3539 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003540}
3541
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003542func TestInstallExtraFlattenedApexes(t *testing.T) {
3543 ctx, config := testApex(t, `
3544 apex {
3545 name: "myapex",
3546 key: "myapex.key",
3547 }
3548 apex_key {
3549 name: "myapex.key",
3550 public_key: "testkey.avbpubkey",
3551 private_key: "testkey.pem",
3552 }
3553 `, func(fs map[string][]byte, config android.Config) {
3554 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3555 })
3556 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003557 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003558 mk := android.AndroidMkDataForTest(t, config, "", ab)
3559 var builder strings.Builder
3560 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3561 androidMk := builder.String()
3562 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3563}
3564
Jooyung Han5c998b92019-06-27 11:30:33 +09003565func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003566 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003567 apex {
3568 name: "myapex",
3569 key: "myapex.key",
3570 native_shared_libs: ["mylib"],
3571 uses: ["commonapex"],
3572 }
3573
3574 apex {
3575 name: "commonapex",
3576 key: "myapex.key",
3577 native_shared_libs: ["libcommon"],
3578 provide_cpp_shared_libs: true,
3579 }
3580
3581 apex_key {
3582 name: "myapex.key",
3583 public_key: "testkey.avbpubkey",
3584 private_key: "testkey.pem",
3585 }
3586
3587 cc_library {
3588 name: "mylib",
3589 srcs: ["mylib.cpp"],
3590 shared_libs: ["libcommon"],
3591 system_shared_libs: [],
3592 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003593 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003594 }
3595
3596 cc_library {
3597 name: "libcommon",
3598 srcs: ["mylib_common.cpp"],
3599 system_shared_libs: [],
3600 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003601 // TODO: remove //apex_available:platform
3602 apex_available: [
3603 "//apex_available:platform",
3604 "commonapex",
3605 "myapex",
3606 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003607 }
3608 `)
3609
Sundong Ahnabb64432019-10-22 13:58:29 +09003610 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003611 apexRule1 := module1.Rule("apexRule")
3612 copyCmds1 := apexRule1.Args["copy_commands"]
3613
Sundong Ahnabb64432019-10-22 13:58:29 +09003614 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003615 apexRule2 := module2.Rule("apexRule")
3616 copyCmds2 := apexRule2.Args["copy_commands"]
3617
Colin Cross7113d202019-11-20 16:39:12 -08003618 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3619 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003620 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3621 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3622 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3623}
3624
3625func TestApexUsesFailsIfNotProvided(t *testing.T) {
3626 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3627 apex {
3628 name: "myapex",
3629 key: "myapex.key",
3630 uses: ["commonapex"],
3631 }
3632
3633 apex {
3634 name: "commonapex",
3635 key: "myapex.key",
3636 }
3637
3638 apex_key {
3639 name: "myapex.key",
3640 public_key: "testkey.avbpubkey",
3641 private_key: "testkey.pem",
3642 }
3643 `)
3644 testApexError(t, `uses: "commonapex" is not a provider`, `
3645 apex {
3646 name: "myapex",
3647 key: "myapex.key",
3648 uses: ["commonapex"],
3649 }
3650
3651 cc_library {
3652 name: "commonapex",
3653 system_shared_libs: [],
3654 stl: "none",
3655 }
3656
3657 apex_key {
3658 name: "myapex.key",
3659 public_key: "testkey.avbpubkey",
3660 private_key: "testkey.pem",
3661 }
3662 `)
3663}
3664
3665func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3666 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3667 apex {
3668 name: "myapex",
3669 key: "myapex.key",
3670 use_vendor: true,
3671 uses: ["commonapex"],
3672 }
3673
3674 apex {
3675 name: "commonapex",
3676 key: "myapex.key",
3677 provide_cpp_shared_libs: true,
3678 }
3679
3680 apex_key {
3681 name: "myapex.key",
3682 public_key: "testkey.avbpubkey",
3683 private_key: "testkey.pem",
3684 }
Jooyung Handc782442019-11-01 03:14:38 +09003685 `, func(fs map[string][]byte, config android.Config) {
3686 setUseVendorWhitelistForTest(config, []string{"myapex"})
3687 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003688}
3689
Jooyung Hand48f3c32019-08-23 11:18:57 +09003690func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3691 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3692 apex {
3693 name: "myapex",
3694 key: "myapex.key",
3695 native_shared_libs: ["libfoo"],
3696 }
3697
3698 apex_key {
3699 name: "myapex.key",
3700 public_key: "testkey.avbpubkey",
3701 private_key: "testkey.pem",
3702 }
3703
3704 cc_library {
3705 name: "libfoo",
3706 stl: "none",
3707 system_shared_libs: [],
3708 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003709 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003710 }
3711 `)
3712 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3713 apex {
3714 name: "myapex",
3715 key: "myapex.key",
3716 java_libs: ["myjar"],
3717 }
3718
3719 apex_key {
3720 name: "myapex.key",
3721 public_key: "testkey.avbpubkey",
3722 private_key: "testkey.pem",
3723 }
3724
3725 java_library {
3726 name: "myjar",
3727 srcs: ["foo/bar/MyClass.java"],
3728 sdk_version: "none",
3729 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003730 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003731 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003732 }
3733 `)
3734}
3735
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003736func TestApexWithApps(t *testing.T) {
3737 ctx, _ := testApex(t, `
3738 apex {
3739 name: "myapex",
3740 key: "myapex.key",
3741 apps: [
3742 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003743 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003744 ],
3745 }
3746
3747 apex_key {
3748 name: "myapex.key",
3749 public_key: "testkey.avbpubkey",
3750 private_key: "testkey.pem",
3751 }
3752
3753 android_app {
3754 name: "AppFoo",
3755 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003756 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003757 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003758 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003759 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003760 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003761 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003762
3763 android_app {
3764 name: "AppFooPriv",
3765 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003766 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003767 system_modules: "none",
3768 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003770 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003771 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003772
3773 cc_library_shared {
3774 name: "libjni",
3775 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003776 shared_libs: ["libfoo"],
3777 stl: "none",
3778 system_shared_libs: [],
3779 apex_available: [ "myapex" ],
3780 sdk_version: "current",
3781 }
3782
3783 cc_library_shared {
3784 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003785 stl: "none",
3786 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003787 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003788 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003789 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003790 `)
3791
Sundong Ahnabb64432019-10-22 13:58:29 +09003792 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003793 apexRule := module.Rule("apexRule")
3794 copyCmds := apexRule.Args["copy_commands"]
3795
3796 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003797 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003798
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003799 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3800 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003801 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003802 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003803 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003804 // JNI libraries including transitive deps are
3805 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003806 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003807 // ... embedded inside APK (jnilibs.zip)
3808 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3809 // ... and not directly inside the APEX
3810 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3811 }
Dario Frenicde2a032019-10-27 00:29:22 +01003812}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003813
Dario Frenicde2a032019-10-27 00:29:22 +01003814func TestApexWithAppImports(t *testing.T) {
3815 ctx, _ := testApex(t, `
3816 apex {
3817 name: "myapex",
3818 key: "myapex.key",
3819 apps: [
3820 "AppFooPrebuilt",
3821 "AppFooPrivPrebuilt",
3822 ],
3823 }
3824
3825 apex_key {
3826 name: "myapex.key",
3827 public_key: "testkey.avbpubkey",
3828 private_key: "testkey.pem",
3829 }
3830
3831 android_app_import {
3832 name: "AppFooPrebuilt",
3833 apk: "PrebuiltAppFoo.apk",
3834 presigned: true,
3835 dex_preopt: {
3836 enabled: false,
3837 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003838 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003839 }
3840
3841 android_app_import {
3842 name: "AppFooPrivPrebuilt",
3843 apk: "PrebuiltAppFooPriv.apk",
3844 privileged: true,
3845 presigned: true,
3846 dex_preopt: {
3847 enabled: false,
3848 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003849 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003850 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003851 }
3852 `)
3853
Sundong Ahnabb64432019-10-22 13:58:29 +09003854 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003855 apexRule := module.Rule("apexRule")
3856 copyCmds := apexRule.Args["copy_commands"]
3857
3858 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003859 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3860}
3861
3862func TestApexWithAppImportsPrefer(t *testing.T) {
3863 ctx, _ := testApex(t, `
3864 apex {
3865 name: "myapex",
3866 key: "myapex.key",
3867 apps: [
3868 "AppFoo",
3869 ],
3870 }
3871
3872 apex_key {
3873 name: "myapex.key",
3874 public_key: "testkey.avbpubkey",
3875 private_key: "testkey.pem",
3876 }
3877
3878 android_app {
3879 name: "AppFoo",
3880 srcs: ["foo/bar/MyClass.java"],
3881 sdk_version: "none",
3882 system_modules: "none",
3883 apex_available: [ "myapex" ],
3884 }
3885
3886 android_app_import {
3887 name: "AppFoo",
3888 apk: "AppFooPrebuilt.apk",
3889 filename: "AppFooPrebuilt.apk",
3890 presigned: true,
3891 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003892 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003893 }
3894 `, withFiles(map[string][]byte{
3895 "AppFooPrebuilt.apk": nil,
3896 }))
3897
3898 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3899 "app/AppFoo/AppFooPrebuilt.apk",
3900 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003901}
3902
Dario Freni6f3937c2019-12-20 22:58:03 +00003903func TestApexWithTestHelperApp(t *testing.T) {
3904 ctx, _ := testApex(t, `
3905 apex {
3906 name: "myapex",
3907 key: "myapex.key",
3908 apps: [
3909 "TesterHelpAppFoo",
3910 ],
3911 }
3912
3913 apex_key {
3914 name: "myapex.key",
3915 public_key: "testkey.avbpubkey",
3916 private_key: "testkey.pem",
3917 }
3918
3919 android_test_helper_app {
3920 name: "TesterHelpAppFoo",
3921 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003922 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003923 }
3924
3925 `)
3926
3927 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3928 apexRule := module.Rule("apexRule")
3929 copyCmds := apexRule.Args["copy_commands"]
3930
3931 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3932}
3933
Jooyung Han18020ea2019-11-13 10:50:48 +09003934func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3935 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003936 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003937 apex {
3938 name: "myapex",
3939 key: "myapex.key",
3940 native_shared_libs: ["libfoo"],
3941 }
3942
3943 apex_key {
3944 name: "myapex.key",
3945 public_key: "testkey.avbpubkey",
3946 private_key: "testkey.pem",
3947 }
3948
3949 apex {
3950 name: "otherapex",
3951 key: "myapex.key",
3952 native_shared_libs: ["libfoo"],
3953 }
3954
3955 cc_defaults {
3956 name: "libfoo-defaults",
3957 apex_available: ["otherapex"],
3958 }
3959
3960 cc_library {
3961 name: "libfoo",
3962 defaults: ["libfoo-defaults"],
3963 stl: "none",
3964 system_shared_libs: [],
3965 }`)
3966}
3967
Paul Duffine52e66f2020-03-30 17:54:29 +01003968func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003969 // libfoo is not available to myapex, but only to otherapex
3970 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3971 apex {
3972 name: "myapex",
3973 key: "myapex.key",
3974 native_shared_libs: ["libfoo"],
3975 }
3976
3977 apex_key {
3978 name: "myapex.key",
3979 public_key: "testkey.avbpubkey",
3980 private_key: "testkey.pem",
3981 }
3982
3983 apex {
3984 name: "otherapex",
3985 key: "otherapex.key",
3986 native_shared_libs: ["libfoo"],
3987 }
3988
3989 apex_key {
3990 name: "otherapex.key",
3991 public_key: "testkey.avbpubkey",
3992 private_key: "testkey.pem",
3993 }
3994
3995 cc_library {
3996 name: "libfoo",
3997 stl: "none",
3998 system_shared_libs: [],
3999 apex_available: ["otherapex"],
4000 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004001}
Jiyong Park127b40b2019-09-30 16:04:35 +09004002
Paul Duffine52e66f2020-03-30 17:54:29 +01004003func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004004 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004005 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004006.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004007.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004008.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004009.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004010.*via tag cc\.DependencyTag.*"shared".*
4011.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004012 apex {
4013 name: "myapex",
4014 key: "myapex.key",
4015 native_shared_libs: ["libfoo"],
4016 }
4017
4018 apex_key {
4019 name: "myapex.key",
4020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023
Jiyong Park127b40b2019-09-30 16:04:35 +09004024 cc_library {
4025 name: "libfoo",
4026 stl: "none",
4027 shared_libs: ["libbar"],
4028 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004029 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004030 }
4031
4032 cc_library {
4033 name: "libbar",
4034 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004035 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004036 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004037 apex_available: ["myapex"],
4038 }
4039
4040 cc_library {
4041 name: "libbaz",
4042 stl: "none",
4043 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004044 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004045}
Jiyong Park127b40b2019-09-30 16:04:35 +09004046
Paul Duffine52e66f2020-03-30 17:54:29 +01004047func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004048 testApexError(t, "\"otherapex\" is not a valid module name", `
4049 apex {
4050 name: "myapex",
4051 key: "myapex.key",
4052 native_shared_libs: ["libfoo"],
4053 }
4054
4055 apex_key {
4056 name: "myapex.key",
4057 public_key: "testkey.avbpubkey",
4058 private_key: "testkey.pem",
4059 }
4060
4061 cc_library {
4062 name: "libfoo",
4063 stl: "none",
4064 system_shared_libs: [],
4065 apex_available: ["otherapex"],
4066 }`)
4067
Paul Duffine52e66f2020-03-30 17:54:29 +01004068 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004069 apex {
4070 name: "myapex",
4071 key: "myapex.key",
4072 native_shared_libs: ["libfoo", "libbar"],
4073 }
4074
4075 apex_key {
4076 name: "myapex.key",
4077 public_key: "testkey.avbpubkey",
4078 private_key: "testkey.pem",
4079 }
4080
4081 cc_library {
4082 name: "libfoo",
4083 stl: "none",
4084 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004085 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004086 apex_available: ["myapex"],
4087 }
4088
4089 cc_library {
4090 name: "libbar",
4091 stl: "none",
4092 system_shared_libs: [],
4093 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004094 }
4095
4096 cc_library {
4097 name: "libbaz",
4098 stl: "none",
4099 system_shared_libs: [],
4100 stubs: {
4101 versions: ["10", "20", "30"],
4102 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004103 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004104}
Jiyong Park127b40b2019-09-30 16:04:35 +09004105
Jiyong Park89e850a2020-04-07 16:37:39 +09004106func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004107 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004108 apex {
4109 name: "myapex",
4110 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004111 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004112 }
4113
4114 apex_key {
4115 name: "myapex.key",
4116 public_key: "testkey.avbpubkey",
4117 private_key: "testkey.pem",
4118 }
4119
4120 cc_library {
4121 name: "libfoo",
4122 stl: "none",
4123 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004124 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004125 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004126 }
4127
4128 cc_library {
4129 name: "libfoo2",
4130 stl: "none",
4131 system_shared_libs: [],
4132 shared_libs: ["libbaz"],
4133 apex_available: ["//apex_available:platform"],
4134 }
4135
4136 cc_library {
4137 name: "libbar",
4138 stl: "none",
4139 system_shared_libs: [],
4140 apex_available: ["myapex"],
4141 }
4142
4143 cc_library {
4144 name: "libbaz",
4145 stl: "none",
4146 system_shared_libs: [],
4147 apex_available: ["myapex"],
4148 stubs: {
4149 versions: ["1"],
4150 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004151 }`)
4152
Jiyong Park89e850a2020-04-07 16:37:39 +09004153 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4154 // because it depends on libbar which isn't available to platform
4155 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4156 if libfoo.NotAvailableForPlatform() != true {
4157 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4158 }
4159
4160 // libfoo2 however can be available to platform because it depends on libbaz which provides
4161 // stubs
4162 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4163 if libfoo2.NotAvailableForPlatform() == true {
4164 t.Errorf("%q should be available to platform", libfoo2.String())
4165 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004166}
Jiyong Parka90ca002019-10-07 15:47:24 +09004167
Paul Duffine52e66f2020-03-30 17:54:29 +01004168func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004169 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004170 apex {
4171 name: "myapex",
4172 key: "myapex.key",
4173 native_shared_libs: ["libfoo"],
4174 }
4175
4176 apex_key {
4177 name: "myapex.key",
4178 public_key: "testkey.avbpubkey",
4179 private_key: "testkey.pem",
4180 }
4181
4182 cc_library {
4183 name: "libfoo",
4184 stl: "none",
4185 system_shared_libs: [],
4186 apex_available: ["myapex"],
4187 static: {
4188 apex_available: ["//apex_available:platform"],
4189 },
4190 }`)
4191
Jiyong Park89e850a2020-04-07 16:37:39 +09004192 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4193 if libfooShared.NotAvailableForPlatform() != true {
4194 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4195 }
4196 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4197 if libfooStatic.NotAvailableForPlatform() != false {
4198 t.Errorf("%q should be available to platform", libfooStatic.String())
4199 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004200}
4201
Jiyong Park5d790c32019-11-15 18:40:32 +09004202func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004203 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004204 apex {
4205 name: "myapex",
4206 key: "myapex.key",
4207 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004208 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004209 }
4210
4211 override_apex {
4212 name: "override_myapex",
4213 base: "myapex",
4214 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004215 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004216 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004217 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004218 }
4219
4220 apex_key {
4221 name: "myapex.key",
4222 public_key: "testkey.avbpubkey",
4223 private_key: "testkey.pem",
4224 }
4225
4226 android_app {
4227 name: "app",
4228 srcs: ["foo/bar/MyClass.java"],
4229 package_name: "foo",
4230 sdk_version: "none",
4231 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004232 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004233 }
4234
4235 override_android_app {
4236 name: "override_app",
4237 base: "app",
4238 package_name: "bar",
4239 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004240 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004241
Jiyong Park317645e2019-12-05 13:20:58 +09004242 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4243 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4244 if originalVariant.GetOverriddenBy() != "" {
4245 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4246 }
4247 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4248 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4249 }
4250
Jiyong Park5d790c32019-11-15 18:40:32 +09004251 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4252 apexRule := module.Rule("apexRule")
4253 copyCmds := apexRule.Args["copy_commands"]
4254
4255 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004256 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004257
4258 apexBundle := module.Module().(*apexBundle)
4259 name := apexBundle.Name()
4260 if name != "override_myapex" {
4261 t.Errorf("name should be \"override_myapex\", but was %q", name)
4262 }
4263
Baligh Uddin004d7172020-02-19 21:29:28 -08004264 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4265 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4266 }
4267
Jiyong Park20bacab2020-03-03 11:45:41 +09004268 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004269 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004270
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004271 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4272 var builder strings.Builder
4273 data.Custom(&builder, name, "TARGET_", "", data)
4274 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004275 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004276 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4277 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004278 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004279 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004280 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004281 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4282 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004283}
4284
Jooyung Han214bf372019-11-12 13:03:50 +09004285func TestLegacyAndroid10Support(t *testing.T) {
4286 ctx, _ := testApex(t, `
4287 apex {
4288 name: "myapex",
4289 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004290 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004291 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004292 }
4293
4294 apex_key {
4295 name: "myapex.key",
4296 public_key: "testkey.avbpubkey",
4297 private_key: "testkey.pem",
4298 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004299
4300 cc_library {
4301 name: "mylib",
4302 srcs: ["mylib.cpp"],
4303 stl: "libc++",
4304 system_shared_libs: [],
4305 apex_available: [ "myapex" ],
4306 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004307 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004308
4309 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4310 args := module.Rule("apexRule").Args
4311 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004312 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004313
4314 // The copies of the libraries in the apex should have one more dependency than
4315 // the ones outside the apex, namely the unwinder. Ideally we should check
4316 // the dependency names directly here but for some reason the names are blank in
4317 // this test.
4318 for _, lib := range []string{"libc++", "mylib"} {
4319 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4320 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4321 if len(apexImplicits) != len(nonApexImplicits)+1 {
4322 t.Errorf("%q missing unwinder dep", lib)
4323 }
4324 }
Jooyung Han214bf372019-11-12 13:03:50 +09004325}
4326
Paul Duffin9b879592020-05-26 13:21:35 +01004327var filesForSdkLibrary = map[string][]byte{
4328 "api/current.txt": nil,
4329 "api/removed.txt": nil,
4330 "api/system-current.txt": nil,
4331 "api/system-removed.txt": nil,
4332 "api/test-current.txt": nil,
4333 "api/test-removed.txt": nil,
4334}
4335
Jooyung Han58f26ab2019-12-18 15:34:32 +09004336func TestJavaSDKLibrary(t *testing.T) {
4337 ctx, _ := testApex(t, `
4338 apex {
4339 name: "myapex",
4340 key: "myapex.key",
4341 java_libs: ["foo"],
4342 }
4343
4344 apex_key {
4345 name: "myapex.key",
4346 public_key: "testkey.avbpubkey",
4347 private_key: "testkey.pem",
4348 }
4349
4350 java_sdk_library {
4351 name: "foo",
4352 srcs: ["a.java"],
4353 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004354 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004355 }
Paul Duffin9b879592020-05-26 13:21:35 +01004356 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004357
4358 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004359 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004360 "javalib/foo.jar",
4361 "etc/permissions/foo.xml",
4362 })
4363 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004364 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4365 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004366}
4367
Paul Duffin9b879592020-05-26 13:21:35 +01004368func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4369 ctx, _ := testApex(t, `
4370 apex {
4371 name: "myapex",
4372 key: "myapex.key",
4373 java_libs: ["foo", "bar"],
4374 }
4375
4376 apex_key {
4377 name: "myapex.key",
4378 public_key: "testkey.avbpubkey",
4379 private_key: "testkey.pem",
4380 }
4381
4382 java_sdk_library {
4383 name: "foo",
4384 srcs: ["a.java"],
4385 api_packages: ["foo"],
4386 apex_available: ["myapex"],
4387 sdk_version: "none",
4388 system_modules: "none",
4389 }
4390
4391 java_library {
4392 name: "bar",
4393 srcs: ["a.java"],
4394 libs: ["foo"],
4395 apex_available: ["myapex"],
4396 sdk_version: "none",
4397 system_modules: "none",
4398 }
4399 `, withFiles(filesForSdkLibrary))
4400
4401 // java_sdk_library installs both impl jar and permission XML
4402 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4403 "javalib/bar.jar",
4404 "javalib/foo.jar",
4405 "etc/permissions/foo.xml",
4406 })
4407
4408 // The bar library should depend on the implementation jar.
4409 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4410 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4411 t.Errorf("expected %q, found %#q", expected, actual)
4412 }
4413}
4414
4415func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4416 ctx, _ := testApex(t, `
4417 apex {
4418 name: "myapex",
4419 key: "myapex.key",
4420 java_libs: ["foo"],
4421 }
4422
4423 apex_key {
4424 name: "myapex.key",
4425 public_key: "testkey.avbpubkey",
4426 private_key: "testkey.pem",
4427 }
4428
4429 java_sdk_library {
4430 name: "foo",
4431 srcs: ["a.java"],
4432 api_packages: ["foo"],
4433 apex_available: ["myapex"],
4434 sdk_version: "none",
4435 system_modules: "none",
4436 }
4437
4438 java_library {
4439 name: "bar",
4440 srcs: ["a.java"],
4441 libs: ["foo"],
4442 sdk_version: "none",
4443 system_modules: "none",
4444 }
4445 `, withFiles(filesForSdkLibrary))
4446
4447 // java_sdk_library installs both impl jar and permission XML
4448 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4449 "javalib/foo.jar",
4450 "etc/permissions/foo.xml",
4451 })
4452
4453 // The bar library should depend on the stubs jar.
4454 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4455 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4456 t.Errorf("expected %q, found %#q", expected, actual)
4457 }
4458}
4459
atrost6e126252020-01-27 17:01:16 +00004460func TestCompatConfig(t *testing.T) {
4461 ctx, _ := testApex(t, `
4462 apex {
4463 name: "myapex",
4464 key: "myapex.key",
4465 prebuilts: ["myjar-platform-compat-config"],
4466 java_libs: ["myjar"],
4467 }
4468
4469 apex_key {
4470 name: "myapex.key",
4471 public_key: "testkey.avbpubkey",
4472 private_key: "testkey.pem",
4473 }
4474
4475 platform_compat_config {
4476 name: "myjar-platform-compat-config",
4477 src: ":myjar",
4478 }
4479
4480 java_library {
4481 name: "myjar",
4482 srcs: ["foo/bar/MyClass.java"],
4483 sdk_version: "none",
4484 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004485 apex_available: [ "myapex" ],
4486 }
4487 `)
4488 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4489 "etc/compatconfig/myjar-platform-compat-config.xml",
4490 "javalib/myjar.jar",
4491 })
4492}
4493
Jiyong Park479321d2019-12-16 11:47:12 +09004494func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4495 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4496 apex {
4497 name: "myapex",
4498 key: "myapex.key",
4499 java_libs: ["myjar"],
4500 }
4501
4502 apex_key {
4503 name: "myapex.key",
4504 public_key: "testkey.avbpubkey",
4505 private_key: "testkey.pem",
4506 }
4507
4508 java_library {
4509 name: "myjar",
4510 srcs: ["foo/bar/MyClass.java"],
4511 sdk_version: "none",
4512 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004513 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004514 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004515 }
4516 `)
4517}
4518
Jiyong Park7afd1072019-12-30 16:56:33 +09004519func TestCarryRequiredModuleNames(t *testing.T) {
4520 ctx, config := testApex(t, `
4521 apex {
4522 name: "myapex",
4523 key: "myapex.key",
4524 native_shared_libs: ["mylib"],
4525 }
4526
4527 apex_key {
4528 name: "myapex.key",
4529 public_key: "testkey.avbpubkey",
4530 private_key: "testkey.pem",
4531 }
4532
4533 cc_library {
4534 name: "mylib",
4535 srcs: ["mylib.cpp"],
4536 system_shared_libs: [],
4537 stl: "none",
4538 required: ["a", "b"],
4539 host_required: ["c", "d"],
4540 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004541 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004542 }
4543 `)
4544
4545 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4546 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4547 name := apexBundle.BaseModuleName()
4548 prefix := "TARGET_"
4549 var builder strings.Builder
4550 data.Custom(&builder, name, prefix, "", data)
4551 androidMk := builder.String()
4552 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4553 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4554 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4555}
4556
Jiyong Park7cd10e32020-01-14 09:22:18 +09004557func TestSymlinksFromApexToSystem(t *testing.T) {
4558 bp := `
4559 apex {
4560 name: "myapex",
4561 key: "myapex.key",
4562 native_shared_libs: ["mylib"],
4563 java_libs: ["myjar"],
4564 }
4565
Jiyong Park9d677202020-02-19 16:29:35 +09004566 apex {
4567 name: "myapex.updatable",
4568 key: "myapex.key",
4569 native_shared_libs: ["mylib"],
4570 java_libs: ["myjar"],
4571 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004572 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004573 }
4574
Jiyong Park7cd10e32020-01-14 09:22:18 +09004575 apex_key {
4576 name: "myapex.key",
4577 public_key: "testkey.avbpubkey",
4578 private_key: "testkey.pem",
4579 }
4580
4581 cc_library {
4582 name: "mylib",
4583 srcs: ["mylib.cpp"],
4584 shared_libs: ["myotherlib"],
4585 system_shared_libs: [],
4586 stl: "none",
4587 apex_available: [
4588 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004589 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004590 "//apex_available:platform",
4591 ],
4592 }
4593
4594 cc_library {
4595 name: "myotherlib",
4596 srcs: ["mylib.cpp"],
4597 system_shared_libs: [],
4598 stl: "none",
4599 apex_available: [
4600 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004601 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004602 "//apex_available:platform",
4603 ],
4604 }
4605
4606 java_library {
4607 name: "myjar",
4608 srcs: ["foo/bar/MyClass.java"],
4609 sdk_version: "none",
4610 system_modules: "none",
4611 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004612 apex_available: [
4613 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004614 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004615 "//apex_available:platform",
4616 ],
4617 }
4618
4619 java_library {
4620 name: "myotherjar",
4621 srcs: ["foo/bar/MyClass.java"],
4622 sdk_version: "none",
4623 system_modules: "none",
4624 apex_available: [
4625 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004626 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004627 "//apex_available:platform",
4628 ],
4629 }
4630 `
4631
4632 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4633 for _, f := range files {
4634 if f.path == file {
4635 if f.isLink {
4636 t.Errorf("%q is not a real file", file)
4637 }
4638 return
4639 }
4640 }
4641 t.Errorf("%q is not found", file)
4642 }
4643
4644 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4645 for _, f := range files {
4646 if f.path == file {
4647 if !f.isLink {
4648 t.Errorf("%q is not a symlink", file)
4649 }
4650 return
4651 }
4652 }
4653 t.Errorf("%q is not found", file)
4654 }
4655
Jiyong Park9d677202020-02-19 16:29:35 +09004656 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4657 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004658 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004659 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004660 ensureRealfileExists(t, files, "javalib/myjar.jar")
4661 ensureRealfileExists(t, files, "lib64/mylib.so")
4662 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4663
Jiyong Park9d677202020-02-19 16:29:35 +09004664 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4665 ensureRealfileExists(t, files, "javalib/myjar.jar")
4666 ensureRealfileExists(t, files, "lib64/mylib.so")
4667 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4668
4669 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004670 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004671 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004672 ensureRealfileExists(t, files, "javalib/myjar.jar")
4673 ensureRealfileExists(t, files, "lib64/mylib.so")
4674 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004675
4676 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4677 ensureRealfileExists(t, files, "javalib/myjar.jar")
4678 ensureRealfileExists(t, files, "lib64/mylib.so")
4679 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004680}
4681
Jooyung Han643adc42020-02-27 13:50:06 +09004682func TestApexWithJniLibs(t *testing.T) {
4683 ctx, _ := testApex(t, `
4684 apex {
4685 name: "myapex",
4686 key: "myapex.key",
4687 jni_libs: ["mylib"],
4688 }
4689
4690 apex_key {
4691 name: "myapex.key",
4692 public_key: "testkey.avbpubkey",
4693 private_key: "testkey.pem",
4694 }
4695
4696 cc_library {
4697 name: "mylib",
4698 srcs: ["mylib.cpp"],
4699 shared_libs: ["mylib2"],
4700 system_shared_libs: [],
4701 stl: "none",
4702 apex_available: [ "myapex" ],
4703 }
4704
4705 cc_library {
4706 name: "mylib2",
4707 srcs: ["mylib.cpp"],
4708 system_shared_libs: [],
4709 stl: "none",
4710 apex_available: [ "myapex" ],
4711 }
4712 `)
4713
4714 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4715 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4716 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4717 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4718 "lib64/mylib.so",
4719 "lib64/mylib2.so",
4720 })
4721}
4722
Jooyung Han49f67012020-04-17 13:43:10 +09004723func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4724 ctx, _ := testApex(t, `
4725 apex {
4726 name: "myapex",
4727 key: "myapex.key",
4728 }
4729 apex_key {
4730 name: "myapex.key",
4731 public_key: "testkey.avbpubkey",
4732 private_key: "testkey.pem",
4733 }
4734 `, func(fs map[string][]byte, config android.Config) {
4735 delete(config.Targets, android.Android)
4736 config.AndroidCommonTarget = android.Target{}
4737 })
4738
4739 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4740 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4741 }
4742}
4743
Jooyung Han643adc42020-02-27 13:50:06 +09004744func TestApexWithJniLibs_Errors(t *testing.T) {
4745 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4746 apex {
4747 name: "myapex",
4748 key: "myapex.key",
4749 jni_libs: ["xxx"],
4750 }
4751
4752 apex_key {
4753 name: "myapex.key",
4754 public_key: "testkey.avbpubkey",
4755 private_key: "testkey.pem",
4756 }
4757
4758 prebuilt_etc {
4759 name: "xxx",
4760 src: "xxx",
4761 }
4762 `, withFiles(map[string][]byte{
4763 "xxx": nil,
4764 }))
4765}
4766
Jiyong Parkbd159612020-02-28 15:22:21 +09004767func TestAppBundle(t *testing.T) {
4768 ctx, _ := testApex(t, `
4769 apex {
4770 name: "myapex",
4771 key: "myapex.key",
4772 apps: ["AppFoo"],
4773 }
4774
4775 apex_key {
4776 name: "myapex.key",
4777 public_key: "testkey.avbpubkey",
4778 private_key: "testkey.pem",
4779 }
4780
4781 android_app {
4782 name: "AppFoo",
4783 srcs: ["foo/bar/MyClass.java"],
4784 sdk_version: "none",
4785 system_modules: "none",
4786 apex_available: [ "myapex" ],
4787 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004788 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004789
4790 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4791 content := bundleConfigRule.Args["content"]
4792
4793 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004794 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 +09004795}
4796
Sasha Smundak18d98bc2020-05-27 16:36:07 -07004797func TestAppSetBundle(t *testing.T) {
4798 ctx, _ := testApex(t, `
4799 apex {
4800 name: "myapex",
4801 key: "myapex.key",
4802 apps: ["AppSet"],
4803 }
4804
4805 apex_key {
4806 name: "myapex.key",
4807 public_key: "testkey.avbpubkey",
4808 private_key: "testkey.pem",
4809 }
4810
4811 android_app_set {
4812 name: "AppSet",
4813 set: "AppSet.apks",
4814 }`)
4815 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4816 bundleConfigRule := mod.Description("Bundle Config")
4817 content := bundleConfigRule.Args["content"]
4818 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
4819 s := mod.Rule("apexRule").Args["copy_commands"]
4820 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
4821 if len(copyCmds) != 3 {
4822 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
4823 }
4824 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
4825 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
4826 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
4827}
4828
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004829func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004830 t.Helper()
4831
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004832 bp := `
4833 java_library {
4834 name: "some-updatable-apex-lib",
4835 srcs: ["a.java"],
4836 sdk_version: "current",
4837 apex_available: [
4838 "some-updatable-apex",
4839 ],
4840 }
4841
4842 java_library {
4843 name: "some-non-updatable-apex-lib",
4844 srcs: ["a.java"],
4845 apex_available: [
4846 "some-non-updatable-apex",
4847 ],
4848 }
4849
4850 java_library {
4851 name: "some-platform-lib",
4852 srcs: ["a.java"],
4853 sdk_version: "current",
4854 installable: true,
4855 }
4856
4857 java_library {
4858 name: "some-art-lib",
4859 srcs: ["a.java"],
4860 sdk_version: "current",
4861 apex_available: [
4862 "com.android.art.something",
4863 ],
4864 hostdex: true,
4865 }
4866
4867 apex {
4868 name: "some-updatable-apex",
4869 key: "some-updatable-apex.key",
4870 java_libs: ["some-updatable-apex-lib"],
4871 updatable: true,
4872 min_sdk_version: "current",
4873 }
4874
4875 apex {
4876 name: "some-non-updatable-apex",
4877 key: "some-non-updatable-apex.key",
4878 java_libs: ["some-non-updatable-apex-lib"],
4879 }
4880
4881 apex_key {
4882 name: "some-updatable-apex.key",
4883 }
4884
4885 apex_key {
4886 name: "some-non-updatable-apex.key",
4887 }
4888
4889 apex {
4890 name: "com.android.art.something",
4891 key: "com.android.art.something.key",
4892 java_libs: ["some-art-lib"],
4893 updatable: true,
4894 min_sdk_version: "current",
4895 }
4896
4897 apex_key {
4898 name: "com.android.art.something.key",
4899 }
4900
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004901 filegroup {
4902 name: "some-updatable-apex-file_contexts",
4903 srcs: [
4904 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4905 ],
4906 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004907
4908 filegroup {
4909 name: "some-non-updatable-apex-file_contexts",
4910 srcs: [
4911 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4912 ],
4913 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004914 `
4915 bp += cc.GatherRequiredDepsForTest(android.Android)
4916 bp += java.GatherRequiredDepsForTest()
4917 bp += dexpreopt.BpToolModulesForTest()
4918
4919 fs := map[string][]byte{
4920 "a.java": nil,
4921 "a.jar": nil,
4922 "build/make/target/product/security": nil,
4923 "apex_manifest.json": nil,
4924 "AndroidManifest.xml": nil,
4925 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004926 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004927 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4928 "framework/aidl/a.aidl": nil,
4929 }
4930 cc.GatherRequiredFilesForTest(fs)
4931
4932 ctx := android.NewTestArchContext()
4933 ctx.RegisterModuleType("apex", BundleFactory)
4934 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4935 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004936 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004937 cc.RegisterRequiredBuildComponentsForTest(ctx)
4938 java.RegisterJavaBuildComponents(ctx)
4939 java.RegisterSystemModulesBuildComponents(ctx)
4940 java.RegisterAppBuildComponents(ctx)
4941 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004942 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4943 ctx.PreDepsMutators(RegisterPreDepsMutators)
4944 ctx.PostDepsMutators(RegisterPostDepsMutators)
4945
4946 config := android.TestArchConfig(buildDir, nil, bp, fs)
4947 ctx.Register(config)
4948
4949 _ = dexpreopt.GlobalSoongConfigForTests(config)
4950 dexpreopt.RegisterToolModulesForTest(ctx)
4951 pathCtx := android.PathContextForTesting(config)
4952 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4953 transformDexpreoptConfig(dexpreoptConfig)
4954 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4955
4956 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4957 android.FailIfErrored(t, errs)
4958
4959 _, errs = ctx.PrepareBuildActions(config)
4960 if errmsg == "" {
4961 android.FailIfErrored(t, errs)
4962 } else if len(errs) > 0 {
4963 android.FailIfNoMatchingErrors(t, errmsg, errs)
4964 return
4965 } else {
4966 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4967 }
4968}
4969
Jooyung Han548640b2020-04-27 12:10:30 +09004970func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4971 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4972 apex {
4973 name: "myapex",
4974 key: "myapex.key",
4975 updatable: true,
4976 }
4977
4978 apex_key {
4979 name: "myapex.key",
4980 public_key: "testkey.avbpubkey",
4981 private_key: "testkey.pem",
4982 }
4983 `)
4984}
4985
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004986func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004987
Sasha Smundak18d98bc2020-05-27 16:36:07 -07004988 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004989 var transform func(*dexpreopt.GlobalConfig)
4990
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004991 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
4992 transform = func(config *dexpreopt.GlobalConfig) {
4993 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
4994 }
4995 testNoUpdatableJarsInBootImage(t, "", transform)
4996 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004997
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004998 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07004999 err = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005000 transform = func(config *dexpreopt.GlobalConfig) {
5001 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5002 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005003 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005004 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005005
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005006 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005007 err = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005008 transform = func(config *dexpreopt.GlobalConfig) {
5009 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5010 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005011 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005012 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005013
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005014 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005015 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005016 transform = func(config *dexpreopt.GlobalConfig) {
5017 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5018 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005019 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005020 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005021
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005022 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005023 err = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005024 transform = func(config *dexpreopt.GlobalConfig) {
5025 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5026 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005027 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005028 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005029
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005030 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5031 transform = func(config *dexpreopt.GlobalConfig) {
5032 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5033 }
5034 testNoUpdatableJarsInBootImage(t, "", transform)
5035 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005036
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005037 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005038 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005039 transform = func(config *dexpreopt.GlobalConfig) {
5040 config.ArtApexJars = []string{"platform:nonexistent"}
5041 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005042 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005043 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005044
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005045 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005046 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005047 transform = func(config *dexpreopt.GlobalConfig) {
5048 config.BootJars = []string{"platform:nonexistent"}
5049 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005050 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005051 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005052
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005053 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005054 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005055 transform = func(config *dexpreopt.GlobalConfig) {
5056 config.ArtApexJars = []string{"platform:some-platform-lib"}
5057 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005058 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005059 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005060
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005061 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5062 transform = func(config *dexpreopt.GlobalConfig) {
5063 config.BootJars = []string{"platform:some-platform-lib"}
5064 }
5065 testNoUpdatableJarsInBootImage(t, "", transform)
5066 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005067}
5068
Jiyong Park62304bb2020-04-13 16:19:48 +09005069func TestTestFor(t *testing.T) {
5070 ctx, _ := testApex(t, `
5071 apex {
5072 name: "myapex",
5073 key: "myapex.key",
5074 native_shared_libs: ["mylib", "myprivlib"],
5075 }
5076
5077 apex_key {
5078 name: "myapex.key",
5079 public_key: "testkey.avbpubkey",
5080 private_key: "testkey.pem",
5081 }
5082
5083 cc_library {
5084 name: "mylib",
5085 srcs: ["mylib.cpp"],
5086 system_shared_libs: [],
5087 stl: "none",
5088 stubs: {
5089 versions: ["1"],
5090 },
5091 apex_available: ["myapex"],
5092 }
5093
5094 cc_library {
5095 name: "myprivlib",
5096 srcs: ["mylib.cpp"],
5097 system_shared_libs: [],
5098 stl: "none",
5099 apex_available: ["myapex"],
5100 }
5101
5102
5103 cc_test {
5104 name: "mytest",
5105 gtest: false,
5106 srcs: ["mylib.cpp"],
5107 system_shared_libs: [],
5108 stl: "none",
5109 shared_libs: ["mylib", "myprivlib"],
5110 test_for: ["myapex"]
5111 }
5112 `)
5113
5114 // the test 'mytest' is a test for the apex, therefore is linked to the
5115 // actual implementation of mylib instead of its stub.
5116 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5117 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5118 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5119}
5120
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005121// TODO(jungjw): Move this to proptools
5122func intPtr(i int) *int {
5123 return &i
5124}
5125
5126func TestApexSet(t *testing.T) {
5127 ctx, config := testApex(t, `
5128 apex_set {
5129 name: "myapex",
5130 set: "myapex.apks",
5131 filename: "foo_v2.apex",
5132 overrides: ["foo"],
5133 }
5134 `, func(fs map[string][]byte, config android.Config) {
5135 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5136 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5137 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5138 })
5139
5140 m := ctx.ModuleForTests("myapex", "android_common")
5141
5142 // Check extract_apks tool parameters.
5143 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5144 actual := extractedApex.Args["abis"]
5145 expected := "ARMEABI_V7A,ARM64_V8A"
5146 if actual != expected {
5147 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5148 }
5149 actual = extractedApex.Args["sdk-version"]
5150 expected = "30"
5151 if actual != expected {
5152 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5153 }
5154
5155 a := m.Module().(*ApexSet)
5156 expectedOverrides := []string{"foo"}
5157 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5158 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5159 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5160 }
5161}
5162
Jiyong Park7d95a512020-05-10 15:16:24 +09005163func TestNoStaticLinkingToStubsLib(t *testing.T) {
5164 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5165 apex {
5166 name: "myapex",
5167 key: "myapex.key",
5168 native_shared_libs: ["mylib"],
5169 }
5170
5171 apex_key {
5172 name: "myapex.key",
5173 public_key: "testkey.avbpubkey",
5174 private_key: "testkey.pem",
5175 }
5176
5177 cc_library {
5178 name: "mylib",
5179 srcs: ["mylib.cpp"],
5180 static_libs: ["otherlib"],
5181 system_shared_libs: [],
5182 stl: "none",
5183 apex_available: [ "myapex" ],
5184 }
5185
5186 cc_library {
5187 name: "otherlib",
5188 srcs: ["mylib.cpp"],
5189 system_shared_libs: [],
5190 stl: "none",
5191 stubs: {
5192 versions: ["1", "2", "3"],
5193 },
5194 apex_available: [ "myapex" ],
5195 }
5196 `)
5197}
5198
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005199func TestMain(m *testing.M) {
5200 run := func() int {
5201 setUp()
5202 defer tearDown()
5203
5204 return m.Run()
5205 }
5206
5207 os.Exit(run())
5208}