blob: 6a832af93f83f8aca6e6065fb6f5dd173af9d185 [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)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900244 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800245
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800247 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800248
249 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900250
Jooyung Han5c998b92019-06-27 11:30:33 +0900251 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252}
253
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700254func setUp() {
255 var err error
256 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900257 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700258 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260}
261
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700262func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700263 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264}
265
Jooyung Han643adc42020-02-27 13:50:06 +0900266// ensure that 'result' equals 'expected'
267func ensureEquals(t *testing.T, result string, expected string) {
268 t.Helper()
269 if result != expected {
270 t.Errorf("%q != %q", expected, result)
271 }
272}
273
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274// ensure that 'result' contains 'expected'
275func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900276 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 if !strings.Contains(result, expected) {
278 t.Errorf("%q is not found in %q", expected, result)
279 }
280}
281
Liz Kammer5bd365f2020-05-27 15:15:11 -0700282// ensure that 'result' contains 'expected' exactly one time
283func ensureContainsOnce(t *testing.T, result string, expected string) {
284 t.Helper()
285 count := strings.Count(result, expected)
286 if count != 1 {
287 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
288 }
289}
290
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291// ensures that 'result' does not contain 'notExpected'
292func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if strings.Contains(result, notExpected) {
295 t.Errorf("%q is found in %q", notExpected, result)
296 }
297}
298
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700299func ensureMatches(t *testing.T, result string, expectedRex string) {
300 ok, err := regexp.MatchString(expectedRex, result)
301 if err != nil {
302 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
303 return
304 }
305 if !ok {
306 t.Errorf("%s does not match regular expession %s", result, expectedRex)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900311 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 if !android.InList(expected, result) {
313 t.Errorf("%q is not found in %v", expected, result)
314 }
315}
316
317func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900318 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900319 if android.InList(notExpected, result) {
320 t.Errorf("%q is found in %v", notExpected, result)
321 }
322}
323
Jooyung Hane1633032019-08-01 17:41:43 +0900324func ensureListEmpty(t *testing.T, result []string) {
325 t.Helper()
326 if len(result) > 0 {
327 t.Errorf("%q is expected to be empty", result)
328 }
329}
330
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331// Minimal test
332func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900333 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900334 apex_defaults {
335 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900336 manifest: ":myapex.manifest",
337 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 key: "myapex.key",
339 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800340 multilib: {
341 both: {
342 binaries: ["foo",],
343 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900344 },
Jiyong Park77acec62020-06-01 21:39:15 +0900345 java_libs: [
346 "myjar",
347 "myjar_dex",
348 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900349 }
350
Jiyong Park30ca9372019-02-07 16:27:23 +0900351 apex {
352 name: "myapex",
353 defaults: ["myapex-defaults"],
354 }
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 apex_key {
357 name: "myapex.key",
358 public_key: "testkey.avbpubkey",
359 private_key: "testkey.pem",
360 }
361
Jiyong Park809bb722019-02-13 21:33:49 +0900362 filegroup {
363 name: "myapex.manifest",
364 srcs: ["apex_manifest.json"],
365 }
366
367 filegroup {
368 name: "myapex.androidmanifest",
369 srcs: ["AndroidManifest.xml"],
370 }
371
Jiyong Park25fc6a92018-11-18 18:02:45 +0900372 cc_library {
373 name: "mylib",
374 srcs: ["mylib.cpp"],
375 shared_libs: ["mylib2"],
376 system_shared_libs: [],
377 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000378 // TODO: remove //apex_available:platform
379 apex_available: [
380 "//apex_available:platform",
381 "myapex",
382 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900383 }
384
Alex Light3d673592019-01-18 14:37:31 -0800385 cc_binary {
386 name: "foo",
387 srcs: ["mylib.cpp"],
388 compile_multilib: "both",
389 multilib: {
390 lib32: {
391 suffix: "32",
392 },
393 lib64: {
394 suffix: "64",
395 },
396 },
397 symlinks: ["foo_link_"],
398 symlink_preferred_arch: true,
399 system_shared_libs: [],
400 static_executable: true,
401 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000402 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800403 }
404
Paul Duffindddd5462020-04-07 15:25:44 +0100405 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900406 name: "mylib2",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900410 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900411 static_libs: ["libstatic"],
412 // TODO: remove //apex_available:platform
413 apex_available: [
414 "//apex_available:platform",
415 "myapex",
416 ],
417 }
418
Paul Duffindddd5462020-04-07 15:25:44 +0100419 cc_prebuilt_library_shared {
420 name: "mylib2",
421 srcs: ["prebuilt.so"],
422 // TODO: remove //apex_available:platform
423 apex_available: [
424 "//apex_available:platform",
425 "myapex",
426 ],
427 }
428
Jiyong Park9918e1a2020-03-17 19:16:40 +0900429 cc_library_static {
430 name: "libstatic",
431 srcs: ["mylib.cpp"],
432 system_shared_libs: [],
433 stl: "none",
434 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000435 // TODO: remove //apex_available:platform
436 apex_available: [
437 "//apex_available:platform",
438 "myapex",
439 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900440 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900441
442 java_library {
443 name: "myjar",
444 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900445 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900446 sdk_version: "none",
447 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900448 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900449 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900455 }
456
Jiyong Park77acec62020-06-01 21:39:15 +0900457 dex_import {
458 name: "myjar_dex",
459 jars: ["prebuilt.jar"],
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
464 }
465
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 java_library {
467 name: "myotherjar",
468 srcs: ["foo/bar/MyClass.java"],
469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900477
478 java_library {
479 name: "mysharedjar",
480 srcs: ["foo/bar/MyClass.java"],
481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900484 `)
485
Sundong Ahnabb64432019-10-22 13:58:29 +0900486 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900487
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900488 // Make sure that Android.mk is created
489 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
490 data := android.AndroidMkDataForTest(t, config, "", ab)
491 var builder strings.Builder
492 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
493
494 androidMk := builder.String()
495 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
496 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
497
Jiyong Park42cca6c2019-04-01 11:15:50 +0900498 optFlags := apexRule.Args["opt_flags"]
499 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700500 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900501 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900502
Jiyong Park25fc6a92018-11-18 18:02:45 +0900503 copyCmds := apexRule.Args["copy_commands"]
504
505 // Ensure that main rule creates an output
506 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
507
508 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800509 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900511 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900512
513 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800514 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900515 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900516
517 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800518 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
519 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900520 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900521 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 // .. but not for java libs
523 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900524 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800525
Colin Cross7113d202019-11-20 16:39:12 -0800526 // Ensure that the platform variant ends with _shared or _common
527 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
528 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900529 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
530 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900531 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
532
533 // Ensure that dynamic dependency to java libs are not included
534 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800535
536 // Ensure that all symlinks are present.
537 found_foo_link_64 := false
538 found_foo := false
539 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900540 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800541 if strings.HasSuffix(cmd, "bin/foo") {
542 found_foo = true
543 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
544 found_foo_link_64 = true
545 }
546 }
547 }
548 good := found_foo && found_foo_link_64
549 if !good {
550 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
551 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900552
Sundong Ahnabb64432019-10-22 13:58:29 +0900553 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700554 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900555 if len(noticeInputs) != 3 {
556 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900557 }
558 ensureListContains(t, noticeInputs, "NOTICE")
559 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900560 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900561
Artur Satayeva8bd1132020-04-27 18:07:06 +0100562 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100563 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
564 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
565 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
566 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
567 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100568
569 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100570 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
571 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
572 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
573 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
574 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800575}
576
Jooyung Hanf21c7972019-12-16 22:32:06 +0900577func TestDefaults(t *testing.T) {
578 ctx, _ := testApex(t, `
579 apex_defaults {
580 name: "myapex-defaults",
581 key: "myapex.key",
582 prebuilts: ["myetc"],
583 native_shared_libs: ["mylib"],
584 java_libs: ["myjar"],
585 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900586 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900587 }
588
589 prebuilt_etc {
590 name: "myetc",
591 src: "myprebuilt",
592 }
593
594 apex {
595 name: "myapex",
596 defaults: ["myapex-defaults"],
597 }
598
599 apex_key {
600 name: "myapex.key",
601 public_key: "testkey.avbpubkey",
602 private_key: "testkey.pem",
603 }
604
605 cc_library {
606 name: "mylib",
607 system_shared_libs: [],
608 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000609 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610 }
611
612 java_library {
613 name: "myjar",
614 srcs: ["foo/bar/MyClass.java"],
615 sdk_version: "none",
616 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000617 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 }
619
620 android_app {
621 name: "AppFoo",
622 srcs: ["foo/bar/MyClass.java"],
623 sdk_version: "none",
624 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000625 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900627
628 runtime_resource_overlay {
629 name: "rro",
630 theme: "blue",
631 }
632
Jooyung Hanf21c7972019-12-16 22:32:06 +0900633 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000634 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900635 "etc/myetc",
636 "javalib/myjar.jar",
637 "lib64/mylib.so",
638 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900639 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 })
641}
642
Jooyung Han01a3ee22019-11-02 02:52:25 +0900643func TestApexManifest(t *testing.T) {
644 ctx, _ := testApex(t, `
645 apex {
646 name: "myapex",
647 key: "myapex.key",
648 }
649
650 apex_key {
651 name: "myapex.key",
652 public_key: "testkey.avbpubkey",
653 private_key: "testkey.pem",
654 }
655 `)
656
657 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900658 args := module.Rule("apexRule").Args
659 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
660 t.Error("manifest should be apex_manifest.pb, but " + manifest)
661 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900662}
663
Alex Light5098a612018-11-29 17:12:15 -0800664func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700665 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800666 apex {
667 name: "myapex",
668 key: "myapex.key",
669 payload_type: "zip",
670 native_shared_libs: ["mylib"],
671 }
672
673 apex_key {
674 name: "myapex.key",
675 public_key: "testkey.avbpubkey",
676 private_key: "testkey.pem",
677 }
678
679 cc_library {
680 name: "mylib",
681 srcs: ["mylib.cpp"],
682 shared_libs: ["mylib2"],
683 system_shared_libs: [],
684 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000685 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800686 }
687
688 cc_library {
689 name: "mylib2",
690 srcs: ["mylib.cpp"],
691 system_shared_libs: [],
692 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000693 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800694 }
695 `)
696
Sundong Ahnabb64432019-10-22 13:58:29 +0900697 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800698 copyCmds := zipApexRule.Args["copy_commands"]
699
700 // Ensure that main rule creates an output
701 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
702
703 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800704 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800705
706 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800707 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800708
709 // Ensure that both direct and indirect deps are copied into apex
710 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
711 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900712}
713
714func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700715 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900716 apex {
717 name: "myapex",
718 key: "myapex.key",
719 native_shared_libs: ["mylib", "mylib3"],
720 }
721
722 apex_key {
723 name: "myapex.key",
724 public_key: "testkey.avbpubkey",
725 private_key: "testkey.pem",
726 }
727
728 cc_library {
729 name: "mylib",
730 srcs: ["mylib.cpp"],
731 shared_libs: ["mylib2", "mylib3"],
732 system_shared_libs: [],
733 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000734 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900735 }
736
737 cc_library {
738 name: "mylib2",
739 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900740 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900741 system_shared_libs: [],
742 stl: "none",
743 stubs: {
744 versions: ["1", "2", "3"],
745 },
746 }
747
748 cc_library {
749 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900750 srcs: ["mylib.cpp"],
751 shared_libs: ["mylib4"],
752 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900753 stl: "none",
754 stubs: {
755 versions: ["10", "11", "12"],
756 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000757 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900758 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900759
760 cc_library {
761 name: "mylib4",
762 srcs: ["mylib.cpp"],
763 system_shared_libs: [],
764 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000765 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900766 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900767 `)
768
Sundong Ahnabb64432019-10-22 13:58:29 +0900769 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900770 copyCmds := apexRule.Args["copy_commands"]
771
772 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800773 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900774
775 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800776 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900777
778 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800779 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780
Colin Cross7113d202019-11-20 16:39:12 -0800781 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900782
783 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900784 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900786 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900787
788 // 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 -0800789 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800791 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900792
793 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900794 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900795 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900796
797 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900798 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900799
Jooyung Hana57af4a2020-01-23 05:36:59 +0000800 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900801 "lib64/mylib.so",
802 "lib64/mylib3.so",
803 "lib64/mylib4.so",
804 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900805}
806
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900807func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700808 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900809 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900810 name: "myapex2",
811 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900812 native_shared_libs: ["mylib"],
813 }
814
815 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900816 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900817 public_key: "testkey.avbpubkey",
818 private_key: "testkey.pem",
819 }
820
821 cc_library {
822 name: "mylib",
823 srcs: ["mylib.cpp"],
824 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900825 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900826 system_shared_libs: [],
827 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000828 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829 }
830
831 cc_library {
832 name: "libfoo",
833 srcs: ["mylib.cpp"],
834 shared_libs: ["libbar"],
835 system_shared_libs: [],
836 stl: "none",
837 stubs: {
838 versions: ["10", "20", "30"],
839 },
840 }
841
842 cc_library {
843 name: "libbar",
844 srcs: ["mylib.cpp"],
845 system_shared_libs: [],
846 stl: "none",
847 }
848
Jiyong Park678c8812020-02-07 17:25:49 +0900849 cc_library_static {
850 name: "libbaz",
851 srcs: ["mylib.cpp"],
852 system_shared_libs: [],
853 stl: "none",
854 apex_available: [ "myapex2" ],
855 }
856
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900857 `)
858
Jiyong Park83dc74b2020-01-14 18:38:44 +0900859 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900860 copyCmds := apexRule.Args["copy_commands"]
861
862 // Ensure that direct non-stubs dep is always included
863 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
864
865 // Ensure that indirect stubs dep is not included
866 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
867
868 // Ensure that dependency of stubs is not included
869 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
870
Jiyong Park83dc74b2020-01-14 18:38:44 +0900871 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900872
873 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900874 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900875 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900876 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900877
Jiyong Park3ff16992019-12-27 14:11:47 +0900878 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900879
880 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
881 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900882
Artur Satayeva8bd1132020-04-27 18:07:06 +0100883 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100884 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
885 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
886 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900887
Artur Satayeva8bd1132020-04-27 18:07:06 +0100888 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100889 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
890 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
891 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892}
893
Jooyung Hand3639552019-08-09 12:57:43 +0900894func TestApexWithRuntimeLibsDependency(t *testing.T) {
895 /*
896 myapex
897 |
898 v (runtime_libs)
899 mylib ------+------> libfoo [provides stub]
900 |
901 `------> libbar
902 */
903 ctx, _ := testApex(t, `
904 apex {
905 name: "myapex",
906 key: "myapex.key",
907 native_shared_libs: ["mylib"],
908 }
909
910 apex_key {
911 name: "myapex.key",
912 public_key: "testkey.avbpubkey",
913 private_key: "testkey.pem",
914 }
915
916 cc_library {
917 name: "mylib",
918 srcs: ["mylib.cpp"],
919 runtime_libs: ["libfoo", "libbar"],
920 system_shared_libs: [],
921 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000922 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900923 }
924
925 cc_library {
926 name: "libfoo",
927 srcs: ["mylib.cpp"],
928 system_shared_libs: [],
929 stl: "none",
930 stubs: {
931 versions: ["10", "20", "30"],
932 },
933 }
934
935 cc_library {
936 name: "libbar",
937 srcs: ["mylib.cpp"],
938 system_shared_libs: [],
939 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000940 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900941 }
942
943 `)
944
Sundong Ahnabb64432019-10-22 13:58:29 +0900945 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900946 copyCmds := apexRule.Args["copy_commands"]
947
948 // Ensure that direct non-stubs dep is always included
949 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
950
951 // Ensure that indirect stubs dep is not included
952 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
953
954 // Ensure that runtime_libs dep in included
955 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
956
Sundong Ahnabb64432019-10-22 13:58:29 +0900957 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900958 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
959 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900960
961}
962
Jooyung Han8ce8db92020-05-15 19:05:05 +0900963func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
964 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
965 bp := `
966 apex {
967 name: "com.android.runtime",
968 key: "com.android.runtime.key",
969 native_shared_libs: ["libc"],
970 }
971
972 apex_key {
973 name: "com.android.runtime.key",
974 public_key: "testkey.avbpubkey",
975 private_key: "testkey.pem",
976 }
977
978 cc_library {
979 name: "libc",
980 no_libcrt: true,
981 nocrt: true,
982 stl: "none",
983 system_shared_libs: [],
984 stubs: { versions: ["1"] },
985 apex_available: ["com.android.runtime"],
986
987 sanitize: {
988 hwaddress: true,
989 }
990 }
991
992 cc_prebuilt_library_shared {
993 name: "libclang_rt.hwasan-aarch64-android",
994 no_libcrt: true,
995 nocrt: true,
996 stl: "none",
997 system_shared_libs: [],
998 srcs: [""],
999 stubs: { versions: ["1"] },
1000
1001 sanitize: {
1002 never: true,
1003 },
1004 }
1005 `
1006 // override bp to use hard-coded names: com.android.runtime and libc
1007 fs["Android.bp"] = []byte(bp)
1008 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1009 })
1010
1011 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1012 "lib64/bionic/libc.so",
1013 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1014 })
1015
1016 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1017
1018 installed := hwasan.Description("install libclang_rt.hwasan")
1019 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1020
1021 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1022 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1023 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1024}
1025
1026func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1027 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1028 bp := `
1029 apex {
1030 name: "com.android.runtime",
1031 key: "com.android.runtime.key",
1032 native_shared_libs: ["libc"],
1033 }
1034
1035 apex_key {
1036 name: "com.android.runtime.key",
1037 public_key: "testkey.avbpubkey",
1038 private_key: "testkey.pem",
1039 }
1040
1041 cc_library {
1042 name: "libc",
1043 no_libcrt: true,
1044 nocrt: true,
1045 stl: "none",
1046 system_shared_libs: [],
1047 stubs: { versions: ["1"] },
1048 apex_available: ["com.android.runtime"],
1049 }
1050
1051 cc_prebuilt_library_shared {
1052 name: "libclang_rt.hwasan-aarch64-android",
1053 no_libcrt: true,
1054 nocrt: true,
1055 stl: "none",
1056 system_shared_libs: [],
1057 srcs: [""],
1058 stubs: { versions: ["1"] },
1059
1060 sanitize: {
1061 never: true,
1062 },
1063 }
1064 `
1065 // override bp to use hard-coded names: com.android.runtime and libc
1066 fs["Android.bp"] = []byte(bp)
1067 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1068
1069 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1070 })
1071
1072 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1073 "lib64/bionic/libc.so",
1074 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1075 })
1076
1077 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1078
1079 installed := hwasan.Description("install libclang_rt.hwasan")
1080 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1081
1082 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1083 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1084 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1085}
1086
Jooyung Han61b66e92020-03-21 14:21:46 +00001087func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1088 testcases := []struct {
1089 name string
1090 minSdkVersion string
1091 shouldLink string
1092 shouldNotLink []string
1093 }{
1094 {
Jooyung Han75568392020-03-20 04:29:24 +09001095 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001096 minSdkVersion: "current",
1097 shouldLink: "30",
1098 shouldNotLink: []string{"29"},
1099 },
1100 {
1101 name: "should link to llndk#29",
1102 minSdkVersion: "29",
1103 shouldLink: "29",
1104 shouldNotLink: []string{"30"},
1105 },
1106 }
1107 for _, tc := range testcases {
1108 t.Run(tc.name, func(t *testing.T) {
1109 ctx, _ := testApex(t, `
1110 apex {
1111 name: "myapex",
1112 key: "myapex.key",
1113 use_vendor: true,
1114 native_shared_libs: ["mylib"],
1115 min_sdk_version: "`+tc.minSdkVersion+`",
1116 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001117
Jooyung Han61b66e92020-03-21 14:21:46 +00001118 apex_key {
1119 name: "myapex.key",
1120 public_key: "testkey.avbpubkey",
1121 private_key: "testkey.pem",
1122 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001123
Jooyung Han61b66e92020-03-21 14:21:46 +00001124 cc_library {
1125 name: "mylib",
1126 srcs: ["mylib.cpp"],
1127 vendor_available: true,
1128 shared_libs: ["libbar"],
1129 system_shared_libs: [],
1130 stl: "none",
1131 apex_available: [ "myapex" ],
1132 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001133
Jooyung Han61b66e92020-03-21 14:21:46 +00001134 cc_library {
1135 name: "libbar",
1136 srcs: ["mylib.cpp"],
1137 system_shared_libs: [],
1138 stl: "none",
1139 stubs: { versions: ["29","30"] },
1140 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001141
Jooyung Han61b66e92020-03-21 14:21:46 +00001142 llndk_library {
1143 name: "libbar",
1144 symbol_file: "",
1145 }
1146 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001147 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001148 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001149
Jooyung Han61b66e92020-03-21 14:21:46 +00001150 // Ensure that LLNDK dep is not included
1151 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1152 "lib64/mylib.so",
1153 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001154
Jooyung Han61b66e92020-03-21 14:21:46 +00001155 // Ensure that LLNDK dep is required
1156 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1157 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1158 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001159
Jooyung Han61b66e92020-03-21 14:21:46 +00001160 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1161 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1162 for _, ver := range tc.shouldNotLink {
1163 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1164 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001165
Jooyung Han61b66e92020-03-21 14:21:46 +00001166 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1167 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1168 })
1169 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001170}
1171
Jiyong Park25fc6a92018-11-18 18:02:45 +09001172func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001173 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001174 apex {
1175 name: "myapex",
1176 key: "myapex.key",
1177 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1178 }
1179
1180 apex_key {
1181 name: "myapex.key",
1182 public_key: "testkey.avbpubkey",
1183 private_key: "testkey.pem",
1184 }
1185
1186 cc_library {
1187 name: "mylib",
1188 srcs: ["mylib.cpp"],
1189 shared_libs: ["libdl#27"],
1190 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001191 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001192 }
1193
1194 cc_library_shared {
1195 name: "mylib_shared",
1196 srcs: ["mylib.cpp"],
1197 shared_libs: ["libdl#27"],
1198 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001199 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001200 }
1201
1202 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001203 name: "libBootstrap",
1204 srcs: ["mylib.cpp"],
1205 stl: "none",
1206 bootstrap: true,
1207 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001208 `)
1209
Sundong Ahnabb64432019-10-22 13:58:29 +09001210 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001211 copyCmds := apexRule.Args["copy_commands"]
1212
1213 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001214 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001215 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1216 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001217
1218 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001219 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001220
Colin Cross7113d202019-11-20 16:39:12 -08001221 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1222 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1223 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001224
1225 // For dependency to libc
1226 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001227 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001228 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001229 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001230 // ... Cflags from stub is correctly exported to mylib
1231 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1232 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1233
1234 // For dependency to libm
1235 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001236 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001237 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001238 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001239 // ... and is not compiling with the stub
1240 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1241 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1242
1243 // For dependency to libdl
1244 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001245 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001246 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001247 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1248 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001249 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001250 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001251 // ... Cflags from stub is correctly exported to mylib
1252 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1253 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001254
1255 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001256 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1257 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1258 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1259 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001261
Jooyung Han03b51852020-02-26 22:45:42 +09001262func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1263 // there are three links between liba --> libz
1264 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1265 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1266 // 3) (platform) -> liba -> libz : this should be non-stub link
1267 ctx, _ := testApex(t, `
1268 apex {
1269 name: "myapex",
1270 key: "myapex.key",
1271 native_shared_libs: ["libx"],
1272 min_sdk_version: "2",
1273 }
1274
1275 apex {
1276 name: "otherapex",
1277 key: "myapex.key",
1278 native_shared_libs: ["liby"],
1279 min_sdk_version: "3",
1280 }
1281
1282 apex_key {
1283 name: "myapex.key",
1284 public_key: "testkey.avbpubkey",
1285 private_key: "testkey.pem",
1286 }
1287
1288 cc_library {
1289 name: "libx",
1290 shared_libs: ["liba"],
1291 system_shared_libs: [],
1292 stl: "none",
1293 apex_available: [ "myapex" ],
1294 }
1295
1296 cc_library {
1297 name: "liby",
1298 shared_libs: ["liba"],
1299 system_shared_libs: [],
1300 stl: "none",
1301 apex_available: [ "otherapex" ],
1302 }
1303
1304 cc_library {
1305 name: "liba",
1306 shared_libs: ["libz"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [
1310 "//apex_available:anyapex",
1311 "//apex_available:platform",
1312 ],
1313 }
1314
1315 cc_library {
1316 name: "libz",
1317 system_shared_libs: [],
1318 stl: "none",
1319 stubs: {
1320 versions: ["1", "3"],
1321 },
1322 }
1323 `, withUnbundledBuild)
1324
1325 expectLink := func(from, from_variant, to, to_variant string) {
1326 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1327 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1328 }
1329 expectNoLink := func(from, from_variant, to, to_variant string) {
1330 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1331 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1332 }
1333 // platform liba is linked to non-stub version
1334 expectLink("liba", "shared", "libz", "shared")
1335 // liba in myapex is linked to #1
1336 expectLink("liba", "shared_myapex", "libz", "shared_1")
1337 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1338 expectNoLink("liba", "shared_myapex", "libz", "shared")
1339 // liba in otherapex is linked to #3
1340 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1341 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1342 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1343}
1344
Jooyung Hanaed150d2020-04-02 01:41:41 +09001345func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1346 ctx, _ := testApex(t, `
1347 apex {
1348 name: "myapex",
1349 key: "myapex.key",
1350 native_shared_libs: ["libx"],
1351 min_sdk_version: "R",
1352 }
1353
1354 apex_key {
1355 name: "myapex.key",
1356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "libx",
1362 shared_libs: ["libz"],
1363 system_shared_libs: [],
1364 stl: "none",
1365 apex_available: [ "myapex" ],
1366 }
1367
1368 cc_library {
1369 name: "libz",
1370 system_shared_libs: [],
1371 stl: "none",
1372 stubs: {
1373 versions: ["29", "R"],
1374 },
1375 }
1376 `, func(fs map[string][]byte, config android.Config) {
1377 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1378 })
1379
1380 expectLink := func(from, from_variant, to, to_variant string) {
1381 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1382 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1383 }
1384 expectNoLink := func(from, from_variant, to, to_variant string) {
1385 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1386 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1387 }
1388 // 9000 is quite a magic number.
1389 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1390 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1391 // to distinguish them from finalized and future_api(10000)
1392 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1393 // (refer android/api_levels.go)
1394 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1395 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1396 expectNoLink("libx", "shared_myapex", "libz", "shared")
1397}
1398
Jooyung Han03b51852020-02-26 22:45:42 +09001399func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1400 ctx, _ := testApex(t, `
1401 apex {
1402 name: "myapex",
1403 key: "myapex.key",
1404 native_shared_libs: ["libx"],
1405 }
1406
1407 apex_key {
1408 name: "myapex.key",
1409 public_key: "testkey.avbpubkey",
1410 private_key: "testkey.pem",
1411 }
1412
1413 cc_library {
1414 name: "libx",
1415 shared_libs: ["libz"],
1416 system_shared_libs: [],
1417 stl: "none",
1418 apex_available: [ "myapex" ],
1419 }
1420
1421 cc_library {
1422 name: "libz",
1423 system_shared_libs: [],
1424 stl: "none",
1425 stubs: {
1426 versions: ["1", "2"],
1427 },
1428 }
1429 `)
1430
1431 expectLink := func(from, from_variant, to, to_variant string) {
1432 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1433 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1434 }
1435 expectNoLink := func(from, from_variant, to, to_variant string) {
1436 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1437 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1438 }
1439 expectLink("libx", "shared_myapex", "libz", "shared_2")
1440 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1441 expectNoLink("libx", "shared_myapex", "libz", "shared")
1442}
1443
1444func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1445 ctx, _ := testApex(t, `
1446 apex {
1447 name: "myapex",
1448 key: "myapex.key",
1449 native_shared_libs: ["libx"],
1450 }
1451
1452 apex_key {
1453 name: "myapex.key",
1454 public_key: "testkey.avbpubkey",
1455 private_key: "testkey.pem",
1456 }
1457
1458 cc_library {
1459 name: "libx",
1460 system_shared_libs: [],
1461 stl: "none",
1462 apex_available: [ "myapex" ],
1463 stubs: {
1464 versions: ["1", "2"],
1465 },
1466 }
1467
1468 cc_library {
1469 name: "libz",
1470 shared_libs: ["libx"],
1471 system_shared_libs: [],
1472 stl: "none",
1473 }
1474 `)
1475
1476 expectLink := func(from, from_variant, to, to_variant string) {
1477 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1478 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1479 }
1480 expectNoLink := func(from, from_variant, to, to_variant string) {
1481 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1482 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1483 }
1484 expectLink("libz", "shared", "libx", "shared_2")
1485 expectNoLink("libz", "shared", "libz", "shared_1")
1486 expectNoLink("libz", "shared", "libz", "shared")
1487}
1488
Jooyung Han75568392020-03-20 04:29:24 +09001489func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001490 ctx, _ := testApex(t, `
1491 apex {
1492 name: "myapex",
1493 key: "myapex.key",
1494 native_shared_libs: ["libx"],
1495 min_sdk_version: "29",
1496 }
1497
1498 apex_key {
1499 name: "myapex.key",
1500 public_key: "testkey.avbpubkey",
1501 private_key: "testkey.pem",
1502 }
1503
1504 cc_library {
1505 name: "libx",
1506 shared_libs: ["libbar"],
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libbar",
1512 stubs: {
1513 versions: ["29", "30"],
1514 },
1515 }
Jooyung Han75568392020-03-20 04:29:24 +09001516 `, func(fs map[string][]byte, config android.Config) {
1517 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1518 })
Jooyung Han03b51852020-02-26 22:45:42 +09001519 expectLink := func(from, from_variant, to, to_variant string) {
1520 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1521 libFlags := ld.Args["libFlags"]
1522 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1523 }
Jooyung Han75568392020-03-20 04:29:24 +09001524 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001525}
1526
Jooyung Han75568392020-03-20 04:29:24 +09001527func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001528 ctx, _ := testApex(t, `
1529 apex {
1530 name: "myapex",
1531 key: "myapex.key",
1532 native_shared_libs: ["libx"],
1533 min_sdk_version: "29",
1534 }
1535
1536 apex_key {
1537 name: "myapex.key",
1538 public_key: "testkey.avbpubkey",
1539 private_key: "testkey.pem",
1540 }
1541
1542 cc_library {
1543 name: "libx",
1544 apex_available: [ "myapex" ],
1545 }
Jooyung Han75568392020-03-20 04:29:24 +09001546 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001547
1548 // ensure apex variant of c++ is linked with static unwinder
1549 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1550 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1551 // note that platform variant is not.
1552 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1553 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001554}
1555
1556func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001557 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001558 apex {
1559 name: "myapex",
1560 key: "myapex.key",
1561 native_shared_libs: ["libx"],
1562 min_sdk_version: "29",
1563 }
1564
1565 apex_key {
1566 name: "myapex.key",
1567 public_key: "testkey.avbpubkey",
1568 private_key: "testkey.pem",
1569 }
1570
1571 cc_library {
1572 name: "libx",
1573 shared_libs: ["libz"],
1574 system_shared_libs: [],
1575 stl: "none",
1576 apex_available: [ "myapex" ],
1577 }
1578
1579 cc_library {
1580 name: "libz",
1581 system_shared_libs: [],
1582 stl: "none",
1583 stubs: {
1584 versions: ["30"],
1585 },
1586 }
Jooyung Han75568392020-03-20 04:29:24 +09001587 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001588
Jooyung Hanaed150d2020-04-02 01:41:41 +09001589 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001590 apex {
1591 name: "myapex",
1592 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001593 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001594 }
1595
1596 apex_key {
1597 name: "myapex.key",
1598 public_key: "testkey.avbpubkey",
1599 private_key: "testkey.pem",
1600 }
1601 `)
1602}
1603
Artur Satayev8cf899a2020-04-15 17:29:42 +01001604func TestJavaStableSdkVersion(t *testing.T) {
1605 testCases := []struct {
1606 name string
1607 expectedError string
1608 bp string
1609 }{
1610 {
1611 name: "Non-updatable apex with non-stable dep",
1612 bp: `
1613 apex {
1614 name: "myapex",
1615 java_libs: ["myjar"],
1616 key: "myapex.key",
1617 }
1618 apex_key {
1619 name: "myapex.key",
1620 public_key: "testkey.avbpubkey",
1621 private_key: "testkey.pem",
1622 }
1623 java_library {
1624 name: "myjar",
1625 srcs: ["foo/bar/MyClass.java"],
1626 sdk_version: "core_platform",
1627 apex_available: ["myapex"],
1628 }
1629 `,
1630 },
1631 {
1632 name: "Updatable apex with stable dep",
1633 bp: `
1634 apex {
1635 name: "myapex",
1636 java_libs: ["myjar"],
1637 key: "myapex.key",
1638 updatable: true,
1639 min_sdk_version: "29",
1640 }
1641 apex_key {
1642 name: "myapex.key",
1643 public_key: "testkey.avbpubkey",
1644 private_key: "testkey.pem",
1645 }
1646 java_library {
1647 name: "myjar",
1648 srcs: ["foo/bar/MyClass.java"],
1649 sdk_version: "current",
1650 apex_available: ["myapex"],
1651 }
1652 `,
1653 },
1654 {
1655 name: "Updatable apex with non-stable dep",
1656 expectedError: "cannot depend on \"myjar\"",
1657 bp: `
1658 apex {
1659 name: "myapex",
1660 java_libs: ["myjar"],
1661 key: "myapex.key",
1662 updatable: true,
1663 }
1664 apex_key {
1665 name: "myapex.key",
1666 public_key: "testkey.avbpubkey",
1667 private_key: "testkey.pem",
1668 }
1669 java_library {
1670 name: "myjar",
1671 srcs: ["foo/bar/MyClass.java"],
1672 sdk_version: "core_platform",
1673 apex_available: ["myapex"],
1674 }
1675 `,
1676 },
1677 {
1678 name: "Updatable apex with non-stable transitive dep",
1679 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1680 bp: `
1681 apex {
1682 name: "myapex",
1683 java_libs: ["myjar"],
1684 key: "myapex.key",
1685 updatable: true,
1686 }
1687 apex_key {
1688 name: "myapex.key",
1689 public_key: "testkey.avbpubkey",
1690 private_key: "testkey.pem",
1691 }
1692 java_library {
1693 name: "myjar",
1694 srcs: ["foo/bar/MyClass.java"],
1695 sdk_version: "current",
1696 apex_available: ["myapex"],
1697 static_libs: ["transitive-jar"],
1698 }
1699 java_library {
1700 name: "transitive-jar",
1701 srcs: ["foo/bar/MyClass.java"],
1702 sdk_version: "core_platform",
1703 apex_available: ["myapex"],
1704 }
1705 `,
1706 },
1707 }
1708
1709 for _, test := range testCases {
1710 t.Run(test.name, func(t *testing.T) {
1711 if test.expectedError == "" {
1712 testApex(t, test.bp)
1713 } else {
1714 testApexError(t, test.expectedError, test.bp)
1715 }
1716 })
1717 }
1718}
1719
Jiyong Park7c2ee712018-12-07 00:42:25 +09001720func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001721 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001722 apex {
1723 name: "myapex",
1724 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001725 native_shared_libs: ["mylib"],
1726 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001727 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001728 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001729 }
1730
1731 apex_key {
1732 name: "myapex.key",
1733 public_key: "testkey.avbpubkey",
1734 private_key: "testkey.pem",
1735 }
1736
1737 prebuilt_etc {
1738 name: "myetc",
1739 src: "myprebuilt",
1740 sub_dir: "foo/bar",
1741 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001742
1743 cc_library {
1744 name: "mylib",
1745 srcs: ["mylib.cpp"],
1746 relative_install_path: "foo/bar",
1747 system_shared_libs: [],
1748 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001749 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001750 }
1751
1752 cc_binary {
1753 name: "mybin",
1754 srcs: ["mylib.cpp"],
1755 relative_install_path: "foo/bar",
1756 system_shared_libs: [],
1757 static_executable: true,
1758 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001759 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001760 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001761 `)
1762
Sundong Ahnabb64432019-10-22 13:58:29 +09001763 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001764 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1765
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001766 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001767 ensureListContains(t, dirs, "etc")
1768 ensureListContains(t, dirs, "etc/foo")
1769 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001770 ensureListContains(t, dirs, "lib64")
1771 ensureListContains(t, dirs, "lib64/foo")
1772 ensureListContains(t, dirs, "lib64/foo/bar")
1773 ensureListContains(t, dirs, "lib")
1774 ensureListContains(t, dirs, "lib/foo")
1775 ensureListContains(t, dirs, "lib/foo/bar")
1776
Jiyong Parkbd13e442019-03-15 18:10:35 +09001777 ensureListContains(t, dirs, "bin")
1778 ensureListContains(t, dirs, "bin/foo")
1779 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001780}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001781
Jooyung Han35155c42020-02-06 17:33:20 +09001782func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1783 ctx, _ := testApex(t, `
1784 apex {
1785 name: "myapex",
1786 key: "myapex.key",
1787 multilib: {
1788 both: {
1789 native_shared_libs: ["mylib"],
1790 binaries: ["mybin"],
1791 },
1792 },
1793 compile_multilib: "both",
1794 native_bridge_supported: true,
1795 }
1796
1797 apex_key {
1798 name: "myapex.key",
1799 public_key: "testkey.avbpubkey",
1800 private_key: "testkey.pem",
1801 }
1802
1803 cc_library {
1804 name: "mylib",
1805 relative_install_path: "foo/bar",
1806 system_shared_libs: [],
1807 stl: "none",
1808 apex_available: [ "myapex" ],
1809 native_bridge_supported: true,
1810 }
1811
1812 cc_binary {
1813 name: "mybin",
1814 relative_install_path: "foo/bar",
1815 system_shared_libs: [],
1816 static_executable: true,
1817 stl: "none",
1818 apex_available: [ "myapex" ],
1819 native_bridge_supported: true,
1820 compile_multilib: "both", // default is "first" for binary
1821 multilib: {
1822 lib64: {
1823 suffix: "64",
1824 },
1825 },
1826 }
1827 `, withNativeBridgeEnabled)
1828 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1829 "bin/foo/bar/mybin",
1830 "bin/foo/bar/mybin64",
1831 "bin/arm/foo/bar/mybin",
1832 "bin/arm64/foo/bar/mybin64",
1833 "lib/foo/bar/mylib.so",
1834 "lib/arm/foo/bar/mylib.so",
1835 "lib64/foo/bar/mylib.so",
1836 "lib64/arm64/foo/bar/mylib.so",
1837 })
1838}
1839
Jiyong Parkda6eb592018-12-19 17:12:36 +09001840func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001841 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001842 apex {
1843 name: "myapex",
1844 key: "myapex.key",
1845 native_shared_libs: ["mylib"],
1846 use_vendor: true,
1847 }
1848
1849 apex_key {
1850 name: "myapex.key",
1851 public_key: "testkey.avbpubkey",
1852 private_key: "testkey.pem",
1853 }
1854
1855 cc_library {
1856 name: "mylib",
1857 srcs: ["mylib.cpp"],
1858 shared_libs: ["mylib2"],
1859 system_shared_libs: [],
1860 vendor_available: true,
1861 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001862 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001863 }
1864
1865 cc_library {
1866 name: "mylib2",
1867 srcs: ["mylib.cpp"],
1868 system_shared_libs: [],
1869 vendor_available: true,
1870 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001871 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001872 }
Jooyung Handc782442019-11-01 03:14:38 +09001873 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001874 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09001875 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001876
1877 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001878 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001879 for _, implicit := range i.Implicits {
1880 inputsList = append(inputsList, implicit.String())
1881 }
1882 }
1883 inputsString := strings.Join(inputsList, " ")
1884
1885 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001886 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1887 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001888
1889 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001890 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1891 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001892}
Jiyong Park16e91a02018-12-20 18:18:08 +09001893
Jooyung Handc782442019-11-01 03:14:38 +09001894func TestUseVendorRestriction(t *testing.T) {
1895 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 use_vendor: true,
1900 }
1901 apex_key {
1902 name: "myapex.key",
1903 public_key: "testkey.avbpubkey",
1904 private_key: "testkey.pem",
1905 }
1906 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001907 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09001908 })
Colin Cross440e0d02020-06-11 11:32:11 -07001909 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09001910 testApex(t, `
1911 apex {
1912 name: "myapex",
1913 key: "myapex.key",
1914 use_vendor: true,
1915 }
1916 apex_key {
1917 name: "myapex.key",
1918 public_key: "testkey.avbpubkey",
1919 private_key: "testkey.pem",
1920 }
1921 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001922 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09001923 })
1924}
1925
Jooyung Han5c998b92019-06-27 11:30:33 +09001926func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1927 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1928 apex {
1929 name: "myapex",
1930 key: "myapex.key",
1931 native_shared_libs: ["mylib"],
1932 use_vendor: true,
1933 }
1934
1935 apex_key {
1936 name: "myapex.key",
1937 public_key: "testkey.avbpubkey",
1938 private_key: "testkey.pem",
1939 }
1940
1941 cc_library {
1942 name: "mylib",
1943 srcs: ["mylib.cpp"],
1944 system_shared_libs: [],
1945 stl: "none",
1946 }
1947 `)
1948}
1949
Jiyong Park16e91a02018-12-20 18:18:08 +09001950func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001951 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001952 apex {
1953 name: "myapex",
1954 key: "myapex.key",
1955 native_shared_libs: ["mylib"],
1956 }
1957
1958 apex_key {
1959 name: "myapex.key",
1960 public_key: "testkey.avbpubkey",
1961 private_key: "testkey.pem",
1962 }
1963
1964 cc_library {
1965 name: "mylib",
1966 srcs: ["mylib.cpp"],
1967 system_shared_libs: [],
1968 stl: "none",
1969 stubs: {
1970 versions: ["1", "2", "3"],
1971 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001972 apex_available: [
1973 "//apex_available:platform",
1974 "myapex",
1975 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001976 }
1977
1978 cc_binary {
1979 name: "not_in_apex",
1980 srcs: ["mylib.cpp"],
1981 static_libs: ["mylib"],
1982 static_executable: true,
1983 system_shared_libs: [],
1984 stl: "none",
1985 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001986 `)
1987
Colin Cross7113d202019-11-20 16:39:12 -08001988 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001989
1990 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001991 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001992}
Jiyong Park9335a262018-12-24 11:31:58 +09001993
1994func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001995 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001996 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001997 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001998 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001999 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002000 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002001 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002002 }
2003
2004 cc_library {
2005 name: "mylib",
2006 srcs: ["mylib.cpp"],
2007 system_shared_libs: [],
2008 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002009 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002010 }
2011
2012 apex_key {
2013 name: "myapex.key",
2014 public_key: "testkey.avbpubkey",
2015 private_key: "testkey.pem",
2016 }
2017
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002018 android_app_certificate {
2019 name: "myapex.certificate",
2020 certificate: "testkey",
2021 }
2022
2023 android_app_certificate {
2024 name: "myapex.certificate.override",
2025 certificate: "testkey.override",
2026 }
2027
Jiyong Park9335a262018-12-24 11:31:58 +09002028 `)
2029
2030 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002031 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002032
2033 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2034 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2035 "vendor/foo/devkeys/testkey.avbpubkey")
2036 }
2037 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2038 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2039 "vendor/foo/devkeys/testkey.pem")
2040 }
2041
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002042 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002043 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002044 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002045 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002046 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002047 }
2048}
Jiyong Park58e364a2019-01-19 19:24:06 +09002049
Jooyung Hanf121a652019-12-17 14:30:11 +09002050func TestCertificate(t *testing.T) {
2051 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2052 ctx, _ := testApex(t, `
2053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 }
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }`)
2062 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2063 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2064 if actual := rule.Args["certificates"]; actual != expected {
2065 t.Errorf("certificates should be %q, not %q", expected, actual)
2066 }
2067 })
2068 t.Run("override when unspecified", func(t *testing.T) {
2069 ctx, _ := testApex(t, `
2070 apex {
2071 name: "myapex_keytest",
2072 key: "myapex.key",
2073 file_contexts: ":myapex-file_contexts",
2074 }
2075 apex_key {
2076 name: "myapex.key",
2077 public_key: "testkey.avbpubkey",
2078 private_key: "testkey.pem",
2079 }
2080 android_app_certificate {
2081 name: "myapex.certificate.override",
2082 certificate: "testkey.override",
2083 }`)
2084 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2085 expected := "testkey.override.x509.pem testkey.override.pk8"
2086 if actual := rule.Args["certificates"]; actual != expected {
2087 t.Errorf("certificates should be %q, not %q", expected, actual)
2088 }
2089 })
2090 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2091 ctx, _ := testApex(t, `
2092 apex {
2093 name: "myapex",
2094 key: "myapex.key",
2095 certificate: ":myapex.certificate",
2096 }
2097 apex_key {
2098 name: "myapex.key",
2099 public_key: "testkey.avbpubkey",
2100 private_key: "testkey.pem",
2101 }
2102 android_app_certificate {
2103 name: "myapex.certificate",
2104 certificate: "testkey",
2105 }`)
2106 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2107 expected := "testkey.x509.pem testkey.pk8"
2108 if actual := rule.Args["certificates"]; actual != expected {
2109 t.Errorf("certificates should be %q, not %q", expected, actual)
2110 }
2111 })
2112 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2113 ctx, _ := testApex(t, `
2114 apex {
2115 name: "myapex_keytest",
2116 key: "myapex.key",
2117 file_contexts: ":myapex-file_contexts",
2118 certificate: ":myapex.certificate",
2119 }
2120 apex_key {
2121 name: "myapex.key",
2122 public_key: "testkey.avbpubkey",
2123 private_key: "testkey.pem",
2124 }
2125 android_app_certificate {
2126 name: "myapex.certificate.override",
2127 certificate: "testkey.override",
2128 }`)
2129 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2130 expected := "testkey.override.x509.pem testkey.override.pk8"
2131 if actual := rule.Args["certificates"]; actual != expected {
2132 t.Errorf("certificates should be %q, not %q", expected, actual)
2133 }
2134 })
2135 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2136 ctx, _ := testApex(t, `
2137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 certificate: "testkey",
2141 }
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }`)
2147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2148 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2149 if actual := rule.Args["certificates"]; actual != expected {
2150 t.Errorf("certificates should be %q, not %q", expected, actual)
2151 }
2152 })
2153 t.Run("override when specified as <name>", func(t *testing.T) {
2154 ctx, _ := testApex(t, `
2155 apex {
2156 name: "myapex_keytest",
2157 key: "myapex.key",
2158 file_contexts: ":myapex-file_contexts",
2159 certificate: "testkey",
2160 }
2161 apex_key {
2162 name: "myapex.key",
2163 public_key: "testkey.avbpubkey",
2164 private_key: "testkey.pem",
2165 }
2166 android_app_certificate {
2167 name: "myapex.certificate.override",
2168 certificate: "testkey.override",
2169 }`)
2170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2171 expected := "testkey.override.x509.pem testkey.override.pk8"
2172 if actual := rule.Args["certificates"]; actual != expected {
2173 t.Errorf("certificates should be %q, not %q", expected, actual)
2174 }
2175 })
2176}
2177
Jiyong Park58e364a2019-01-19 19:24:06 +09002178func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002179 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002180 apex {
2181 name: "myapex",
2182 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002183 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002184 }
2185
2186 apex {
2187 name: "otherapex",
2188 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002189 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002190 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002191 }
2192
2193 apex_key {
2194 name: "myapex.key",
2195 public_key: "testkey.avbpubkey",
2196 private_key: "testkey.pem",
2197 }
2198
2199 cc_library {
2200 name: "mylib",
2201 srcs: ["mylib.cpp"],
2202 system_shared_libs: [],
2203 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002204 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002205 "myapex",
2206 "otherapex",
2207 ],
Jooyung Han24282772020-03-21 23:20:55 +09002208 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002209 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002210 cc_library {
2211 name: "mylib2",
2212 srcs: ["mylib.cpp"],
2213 system_shared_libs: [],
2214 stl: "none",
2215 apex_available: [
2216 "myapex",
2217 "otherapex",
2218 ],
2219 use_apex_name_macro: true,
2220 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002221 `)
2222
Jooyung Hanc87a0592020-03-02 17:44:33 +09002223 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002224 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002225 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002226 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002227
Jooyung Hanccce2f22020-03-07 03:45:53 +09002228 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002229 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2230 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002231 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002232 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002233
Jooyung Hanccce2f22020-03-07 03:45:53 +09002234 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002235 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2236 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002237 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002238 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002239
Jooyung Hanc87a0592020-03-02 17:44:33 +09002240 // When cc_library sets use_apex_name_macro: true
2241 // apex variants define additional macro to distinguish which apex variant it is built for
2242
2243 // non-APEX variant does not have __ANDROID_APEX__ defined
2244 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2245 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2246
2247 // APEX variant has __ANDROID_APEX__ defined
2248 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002249 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002250 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2251 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002252
Jooyung Hanc87a0592020-03-02 17:44:33 +09002253 // APEX variant has __ANDROID_APEX__ defined
2254 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002255 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002256 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2257 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002258
2259 // recovery variant does not set __ANDROID_SDK_VERSION__
2260 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2261 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2262 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002263}
Jiyong Park7e636d02019-01-28 16:16:54 +09002264
2265func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002266 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 native_shared_libs: ["mylib"],
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 cc_library_headers {
2280 name: "mylib_headers",
2281 export_include_dirs: ["my_include"],
2282 system_shared_libs: [],
2283 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002284 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002285 }
2286
2287 cc_library {
2288 name: "mylib",
2289 srcs: ["mylib.cpp"],
2290 system_shared_libs: [],
2291 stl: "none",
2292 header_libs: ["mylib_headers"],
2293 export_header_lib_headers: ["mylib_headers"],
2294 stubs: {
2295 versions: ["1", "2", "3"],
2296 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002297 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002298 }
2299
2300 cc_library {
2301 name: "otherlib",
2302 srcs: ["mylib.cpp"],
2303 system_shared_libs: [],
2304 stl: "none",
2305 shared_libs: ["mylib"],
2306 }
2307 `)
2308
Colin Cross7113d202019-11-20 16:39:12 -08002309 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002310
2311 // Ensure that the include path of the header lib is exported to 'otherlib'
2312 ensureContains(t, cFlags, "-Imy_include")
2313}
Alex Light9670d332019-01-29 18:07:33 -08002314
Jiyong Park7cd10e32020-01-14 09:22:18 +09002315type fileInApex struct {
2316 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002317 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002318 isLink bool
2319}
2320
Jooyung Hana57af4a2020-01-23 05:36:59 +00002321func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002322 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002323 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002324 copyCmds := apexRule.Args["copy_commands"]
2325 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002326 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002327 for _, cmd := range strings.Split(copyCmds, "&&") {
2328 cmd = strings.TrimSpace(cmd)
2329 if cmd == "" {
2330 continue
2331 }
2332 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002333 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002334 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002335 switch terms[0] {
2336 case "mkdir":
2337 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002338 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002339 t.Fatal("copyCmds contains invalid cp command", cmd)
2340 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002341 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002342 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002343 isLink = false
2344 case "ln":
2345 if len(terms) != 3 && len(terms) != 4 {
2346 // ln LINK TARGET or ln -s LINK TARGET
2347 t.Fatal("copyCmds contains invalid ln command", cmd)
2348 }
2349 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002350 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002351 isLink = true
2352 default:
2353 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2354 }
2355 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002356 index := strings.Index(dst, imageApexDir)
2357 if index == -1 {
2358 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2359 }
2360 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002361 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002362 }
2363 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002364 return ret
2365}
2366
Jooyung Hana57af4a2020-01-23 05:36:59 +00002367func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2368 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002369 var failed bool
2370 var surplus []string
2371 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002372 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002373 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002374 for _, expected := range files {
2375 if matched, _ := path.Match(expected, file.path); matched {
2376 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002377 mactchFound = true
2378 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002379 }
2380 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002381 if !mactchFound {
2382 surplus = append(surplus, file.path)
2383 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002384 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002385
Jooyung Han31c470b2019-10-18 16:26:59 +09002386 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002387 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002388 t.Log("surplus files", surplus)
2389 failed = true
2390 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002391
2392 if len(files) > len(filesMatched) {
2393 var missing []string
2394 for _, expected := range files {
2395 if !filesMatched[expected] {
2396 missing = append(missing, expected)
2397 }
2398 }
2399 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002400 t.Log("missing files", missing)
2401 failed = true
2402 }
2403 if failed {
2404 t.Fail()
2405 }
2406}
2407
Jooyung Han344d5432019-08-23 11:17:39 +09002408func TestVndkApexCurrent(t *testing.T) {
2409 ctx, _ := testApex(t, `
2410 apex_vndk {
2411 name: "myapex",
2412 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002413 }
2414
2415 apex_key {
2416 name: "myapex.key",
2417 public_key: "testkey.avbpubkey",
2418 private_key: "testkey.pem",
2419 }
2420
2421 cc_library {
2422 name: "libvndk",
2423 srcs: ["mylib.cpp"],
2424 vendor_available: true,
2425 vndk: {
2426 enabled: true,
2427 },
2428 system_shared_libs: [],
2429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002430 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002431 }
2432
2433 cc_library {
2434 name: "libvndksp",
2435 srcs: ["mylib.cpp"],
2436 vendor_available: true,
2437 vndk: {
2438 enabled: true,
2439 support_system_process: true,
2440 },
2441 system_shared_libs: [],
2442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002443 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002444 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002445 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002446
Jooyung Hana57af4a2020-01-23 05:36:59 +00002447 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002448 "lib/libvndk.so",
2449 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002450 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002451 "lib64/libvndk.so",
2452 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002453 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002454 "etc/llndk.libraries.VER.txt",
2455 "etc/vndkcore.libraries.VER.txt",
2456 "etc/vndksp.libraries.VER.txt",
2457 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002458 })
Jooyung Han344d5432019-08-23 11:17:39 +09002459}
2460
2461func TestVndkApexWithPrebuilt(t *testing.T) {
2462 ctx, _ := testApex(t, `
2463 apex_vndk {
2464 name: "myapex",
2465 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002466 }
2467
2468 apex_key {
2469 name: "myapex.key",
2470 public_key: "testkey.avbpubkey",
2471 private_key: "testkey.pem",
2472 }
2473
2474 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002475 name: "libvndk",
2476 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002477 vendor_available: true,
2478 vndk: {
2479 enabled: true,
2480 },
2481 system_shared_libs: [],
2482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002483 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002484 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002485
2486 cc_prebuilt_library_shared {
2487 name: "libvndk.arm",
2488 srcs: ["libvndk.arm.so"],
2489 vendor_available: true,
2490 vndk: {
2491 enabled: true,
2492 },
2493 enabled: false,
2494 arch: {
2495 arm: {
2496 enabled: true,
2497 },
2498 },
2499 system_shared_libs: [],
2500 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002501 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002502 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002503 `+vndkLibrariesTxtFiles("current"),
2504 withFiles(map[string][]byte{
2505 "libvndk.so": nil,
2506 "libvndk.arm.so": nil,
2507 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002508
Jooyung Hana57af4a2020-01-23 05:36:59 +00002509 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002510 "lib/libvndk.so",
2511 "lib/libvndk.arm.so",
2512 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002513 "lib/libc++.so",
2514 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002515 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002516 })
Jooyung Han344d5432019-08-23 11:17:39 +09002517}
2518
Jooyung Han39edb6c2019-11-06 16:53:07 +09002519func vndkLibrariesTxtFiles(vers ...string) (result string) {
2520 for _, v := range vers {
2521 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002522 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002523 result += `
2524 vndk_libraries_txt {
2525 name: "` + txt + `.libraries.txt",
2526 }
2527 `
2528 }
2529 } else {
2530 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2531 result += `
2532 prebuilt_etc {
2533 name: "` + txt + `.libraries.` + v + `.txt",
2534 src: "dummy.txt",
2535 }
2536 `
2537 }
2538 }
2539 }
2540 return
2541}
2542
Jooyung Han344d5432019-08-23 11:17:39 +09002543func TestVndkApexVersion(t *testing.T) {
2544 ctx, _ := testApex(t, `
2545 apex_vndk {
2546 name: "myapex_v27",
2547 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002548 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002549 vndk_version: "27",
2550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
Jooyung Han31c470b2019-10-18 16:26:59 +09002558 vndk_prebuilt_shared {
2559 name: "libvndk27",
2560 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002561 vendor_available: true,
2562 vndk: {
2563 enabled: true,
2564 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002565 target_arch: "arm64",
2566 arch: {
2567 arm: {
2568 srcs: ["libvndk27_arm.so"],
2569 },
2570 arm64: {
2571 srcs: ["libvndk27_arm64.so"],
2572 },
2573 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002574 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002575 }
2576
2577 vndk_prebuilt_shared {
2578 name: "libvndk27",
2579 version: "27",
2580 vendor_available: true,
2581 vndk: {
2582 enabled: true,
2583 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002584 target_arch: "x86_64",
2585 arch: {
2586 x86: {
2587 srcs: ["libvndk27_x86.so"],
2588 },
2589 x86_64: {
2590 srcs: ["libvndk27_x86_64.so"],
2591 },
2592 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002593 }
2594 `+vndkLibrariesTxtFiles("27"),
2595 withFiles(map[string][]byte{
2596 "libvndk27_arm.so": nil,
2597 "libvndk27_arm64.so": nil,
2598 "libvndk27_x86.so": nil,
2599 "libvndk27_x86_64.so": nil,
2600 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002601
Jooyung Hana57af4a2020-01-23 05:36:59 +00002602 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002603 "lib/libvndk27_arm.so",
2604 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002605 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002606 })
Jooyung Han344d5432019-08-23 11:17:39 +09002607}
2608
2609func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2610 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2611 apex_vndk {
2612 name: "myapex_v27",
2613 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002614 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002615 vndk_version: "27",
2616 }
2617 apex_vndk {
2618 name: "myapex_v27_other",
2619 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002620 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002621 vndk_version: "27",
2622 }
2623
2624 apex_key {
2625 name: "myapex.key",
2626 public_key: "testkey.avbpubkey",
2627 private_key: "testkey.pem",
2628 }
2629
2630 cc_library {
2631 name: "libvndk",
2632 srcs: ["mylib.cpp"],
2633 vendor_available: true,
2634 vndk: {
2635 enabled: true,
2636 },
2637 system_shared_libs: [],
2638 stl: "none",
2639 }
2640
2641 vndk_prebuilt_shared {
2642 name: "libvndk",
2643 version: "27",
2644 vendor_available: true,
2645 vndk: {
2646 enabled: true,
2647 },
2648 srcs: ["libvndk.so"],
2649 }
2650 `, withFiles(map[string][]byte{
2651 "libvndk.so": nil,
2652 }))
2653}
2654
Jooyung Han90eee022019-10-01 20:02:42 +09002655func TestVndkApexNameRule(t *testing.T) {
2656 ctx, _ := testApex(t, `
2657 apex_vndk {
2658 name: "myapex",
2659 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002660 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002661 }
2662 apex_vndk {
2663 name: "myapex_v28",
2664 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002665 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002666 vndk_version: "28",
2667 }
2668 apex_key {
2669 name: "myapex.key",
2670 public_key: "testkey.avbpubkey",
2671 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002672 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002673
2674 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002675 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002676 actual := proptools.String(bundle.properties.Apex_name)
2677 if !reflect.DeepEqual(actual, expected) {
2678 t.Errorf("Got '%v', expected '%v'", actual, expected)
2679 }
2680 }
2681
2682 assertApexName("com.android.vndk.vVER", "myapex")
2683 assertApexName("com.android.vndk.v28", "myapex_v28")
2684}
2685
Jooyung Han344d5432019-08-23 11:17:39 +09002686func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2687 ctx, _ := testApex(t, `
2688 apex_vndk {
2689 name: "myapex",
2690 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002691 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002692 }
2693
2694 apex_key {
2695 name: "myapex.key",
2696 public_key: "testkey.avbpubkey",
2697 private_key: "testkey.pem",
2698 }
2699
2700 cc_library {
2701 name: "libvndk",
2702 srcs: ["mylib.cpp"],
2703 vendor_available: true,
2704 native_bridge_supported: true,
2705 host_supported: true,
2706 vndk: {
2707 enabled: true,
2708 },
2709 system_shared_libs: [],
2710 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002711 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002712 }
Jooyung Han35155c42020-02-06 17:33:20 +09002713 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002714
Jooyung Hana57af4a2020-01-23 05:36:59 +00002715 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002716 "lib/libvndk.so",
2717 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002718 "lib/libc++.so",
2719 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002720 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002721 })
Jooyung Han344d5432019-08-23 11:17:39 +09002722}
2723
2724func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2725 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2726 apex_vndk {
2727 name: "myapex",
2728 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002729 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002730 native_bridge_supported: true,
2731 }
2732
2733 apex_key {
2734 name: "myapex.key",
2735 public_key: "testkey.avbpubkey",
2736 private_key: "testkey.pem",
2737 }
2738
2739 cc_library {
2740 name: "libvndk",
2741 srcs: ["mylib.cpp"],
2742 vendor_available: true,
2743 native_bridge_supported: true,
2744 host_supported: true,
2745 vndk: {
2746 enabled: true,
2747 },
2748 system_shared_libs: [],
2749 stl: "none",
2750 }
2751 `)
2752}
2753
Jooyung Han31c470b2019-10-18 16:26:59 +09002754func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002755 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002756 apex_vndk {
2757 name: "myapex_v27",
2758 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002759 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002760 vndk_version: "27",
2761 }
2762
2763 apex_key {
2764 name: "myapex.key",
2765 public_key: "testkey.avbpubkey",
2766 private_key: "testkey.pem",
2767 }
2768
2769 vndk_prebuilt_shared {
2770 name: "libvndk27",
2771 version: "27",
2772 target_arch: "arm",
2773 vendor_available: true,
2774 vndk: {
2775 enabled: true,
2776 },
2777 arch: {
2778 arm: {
2779 srcs: ["libvndk27.so"],
2780 }
2781 },
2782 }
2783
2784 vndk_prebuilt_shared {
2785 name: "libvndk27",
2786 version: "27",
2787 target_arch: "arm",
2788 binder32bit: true,
2789 vendor_available: true,
2790 vndk: {
2791 enabled: true,
2792 },
2793 arch: {
2794 arm: {
2795 srcs: ["libvndk27binder32.so"],
2796 }
2797 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002798 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002799 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002800 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002801 withFiles(map[string][]byte{
2802 "libvndk27.so": nil,
2803 "libvndk27binder32.so": nil,
2804 }),
2805 withBinder32bit,
2806 withTargets(map[android.OsType][]android.Target{
2807 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002808 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2809 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002810 },
2811 }),
2812 )
2813
Jooyung Hana57af4a2020-01-23 05:36:59 +00002814 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002815 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002816 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002817 })
2818}
2819
Jooyung Han45a96772020-06-15 14:59:42 +09002820func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
2821 ctx, _ := testApex(t, `
2822 apex_vndk {
2823 name: "myapex",
2824 key: "myapex.key",
2825 file_contexts: ":myapex-file_contexts",
2826 }
2827
2828 apex_key {
2829 name: "myapex.key",
2830 public_key: "testkey.avbpubkey",
2831 private_key: "testkey.pem",
2832 }
2833
2834 cc_library {
2835 name: "libz",
2836 vendor_available: true,
2837 vndk: {
2838 enabled: true,
2839 },
2840 stubs: {
2841 symbol_file: "libz.map.txt",
2842 versions: ["30"],
2843 }
2844 }
2845 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
2846 "libz.map.txt": nil,
2847 }))
2848
2849 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
2850 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
2851 ensureListEmpty(t, provideNativeLibs)
2852}
2853
Jooyung Hane1633032019-08-01 17:41:43 +09002854func TestDependenciesInApexManifest(t *testing.T) {
2855 ctx, _ := testApex(t, `
2856 apex {
2857 name: "myapex_nodep",
2858 key: "myapex.key",
2859 native_shared_libs: ["lib_nodep"],
2860 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002861 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002862 }
2863
2864 apex {
2865 name: "myapex_dep",
2866 key: "myapex.key",
2867 native_shared_libs: ["lib_dep"],
2868 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002869 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002870 }
2871
2872 apex {
2873 name: "myapex_provider",
2874 key: "myapex.key",
2875 native_shared_libs: ["libfoo"],
2876 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002877 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002878 }
2879
2880 apex {
2881 name: "myapex_selfcontained",
2882 key: "myapex.key",
2883 native_shared_libs: ["lib_dep", "libfoo"],
2884 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002885 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002886 }
2887
2888 apex_key {
2889 name: "myapex.key",
2890 public_key: "testkey.avbpubkey",
2891 private_key: "testkey.pem",
2892 }
2893
2894 cc_library {
2895 name: "lib_nodep",
2896 srcs: ["mylib.cpp"],
2897 system_shared_libs: [],
2898 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002899 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002900 }
2901
2902 cc_library {
2903 name: "lib_dep",
2904 srcs: ["mylib.cpp"],
2905 shared_libs: ["libfoo"],
2906 system_shared_libs: [],
2907 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002908 apex_available: [
2909 "myapex_dep",
2910 "myapex_provider",
2911 "myapex_selfcontained",
2912 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002913 }
2914
2915 cc_library {
2916 name: "libfoo",
2917 srcs: ["mytest.cpp"],
2918 stubs: {
2919 versions: ["1"],
2920 },
2921 system_shared_libs: [],
2922 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002923 apex_available: [
2924 "myapex_provider",
2925 "myapex_selfcontained",
2926 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002927 }
2928 `)
2929
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002930 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002931 var provideNativeLibs, requireNativeLibs []string
2932
Sundong Ahnabb64432019-10-22 13:58:29 +09002933 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002934 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2935 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002936 ensureListEmpty(t, provideNativeLibs)
2937 ensureListEmpty(t, requireNativeLibs)
2938
Sundong Ahnabb64432019-10-22 13:58:29 +09002939 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002940 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2941 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002942 ensureListEmpty(t, provideNativeLibs)
2943 ensureListContains(t, requireNativeLibs, "libfoo.so")
2944
Sundong Ahnabb64432019-10-22 13:58:29 +09002945 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002946 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2947 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002948 ensureListContains(t, provideNativeLibs, "libfoo.so")
2949 ensureListEmpty(t, requireNativeLibs)
2950
Sundong Ahnabb64432019-10-22 13:58:29 +09002951 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002952 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2953 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002954 ensureListContains(t, provideNativeLibs, "libfoo.so")
2955 ensureListEmpty(t, requireNativeLibs)
2956}
2957
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002958func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002959 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002960 apex {
2961 name: "myapex",
2962 key: "myapex.key",
2963 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002964 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002965 }
2966
2967 apex_key {
2968 name: "myapex.key",
2969 public_key: "testkey.avbpubkey",
2970 private_key: "testkey.pem",
2971 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002972
2973 cc_library {
2974 name: "mylib",
2975 srcs: ["mylib.cpp"],
2976 system_shared_libs: [],
2977 stl: "none",
2978 apex_available: [
2979 "//apex_available:platform",
2980 "myapex",
2981 ],
2982 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002983 `)
2984
Sundong Ahnabb64432019-10-22 13:58:29 +09002985 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002986 apexManifestRule := module.Rule("apexManifestRule")
2987 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2988 apexRule := module.Rule("apexRule")
2989 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002990
2991 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2992 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2993 name := apexBundle.BaseModuleName()
2994 prefix := "TARGET_"
2995 var builder strings.Builder
2996 data.Custom(&builder, name, prefix, "", data)
2997 androidMk := builder.String()
2998 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2999 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003000}
3001
Alex Light0851b882019-02-07 13:20:53 -08003002func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003003 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 native_shared_libs: ["mylib_common"],
3008 }
3009
3010 apex_key {
3011 name: "myapex.key",
3012 public_key: "testkey.avbpubkey",
3013 private_key: "testkey.pem",
3014 }
3015
3016 cc_library {
3017 name: "mylib_common",
3018 srcs: ["mylib.cpp"],
3019 system_shared_libs: [],
3020 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003021 apex_available: [
3022 "//apex_available:platform",
3023 "myapex",
3024 ],
Alex Light0851b882019-02-07 13:20:53 -08003025 }
3026 `)
3027
Sundong Ahnabb64432019-10-22 13:58:29 +09003028 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003029 apexRule := module.Rule("apexRule")
3030 copyCmds := apexRule.Args["copy_commands"]
3031
3032 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3033 t.Log("Apex was a test apex!")
3034 t.Fail()
3035 }
3036 // Ensure that main rule creates an output
3037 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3038
3039 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003040 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003041
3042 // Ensure that both direct and indirect deps are copied into apex
3043 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3044
Colin Cross7113d202019-11-20 16:39:12 -08003045 // Ensure that the platform variant ends with _shared
3046 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003047
3048 if !android.InAnyApex("mylib_common") {
3049 t.Log("Found mylib_common not in any apex!")
3050 t.Fail()
3051 }
3052}
3053
3054func TestTestApex(t *testing.T) {
3055 if android.InAnyApex("mylib_common_test") {
3056 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!")
3057 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003058 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003059 apex_test {
3060 name: "myapex",
3061 key: "myapex.key",
3062 native_shared_libs: ["mylib_common_test"],
3063 }
3064
3065 apex_key {
3066 name: "myapex.key",
3067 public_key: "testkey.avbpubkey",
3068 private_key: "testkey.pem",
3069 }
3070
3071 cc_library {
3072 name: "mylib_common_test",
3073 srcs: ["mylib.cpp"],
3074 system_shared_libs: [],
3075 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003076 // TODO: remove //apex_available:platform
3077 apex_available: [
3078 "//apex_available:platform",
3079 "myapex",
3080 ],
Alex Light0851b882019-02-07 13:20:53 -08003081 }
3082 `)
3083
Sundong Ahnabb64432019-10-22 13:58:29 +09003084 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003085 apexRule := module.Rule("apexRule")
3086 copyCmds := apexRule.Args["copy_commands"]
3087
3088 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3089 t.Log("Apex was not a test apex!")
3090 t.Fail()
3091 }
3092 // Ensure that main rule creates an output
3093 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3094
3095 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003096 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003097
3098 // Ensure that both direct and indirect deps are copied into apex
3099 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3100
Colin Cross7113d202019-11-20 16:39:12 -08003101 // Ensure that the platform variant ends with _shared
3102 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003103}
3104
Alex Light9670d332019-01-29 18:07:33 -08003105func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003106 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003107 apex {
3108 name: "myapex",
3109 key: "myapex.key",
3110 multilib: {
3111 first: {
3112 native_shared_libs: ["mylib_common"],
3113 }
3114 },
3115 target: {
3116 android: {
3117 multilib: {
3118 first: {
3119 native_shared_libs: ["mylib"],
3120 }
3121 }
3122 },
3123 host: {
3124 multilib: {
3125 first: {
3126 native_shared_libs: ["mylib2"],
3127 }
3128 }
3129 }
3130 }
3131 }
3132
3133 apex_key {
3134 name: "myapex.key",
3135 public_key: "testkey.avbpubkey",
3136 private_key: "testkey.pem",
3137 }
3138
3139 cc_library {
3140 name: "mylib",
3141 srcs: ["mylib.cpp"],
3142 system_shared_libs: [],
3143 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003144 // TODO: remove //apex_available:platform
3145 apex_available: [
3146 "//apex_available:platform",
3147 "myapex",
3148 ],
Alex Light9670d332019-01-29 18:07:33 -08003149 }
3150
3151 cc_library {
3152 name: "mylib_common",
3153 srcs: ["mylib.cpp"],
3154 system_shared_libs: [],
3155 stl: "none",
3156 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003157 // TODO: remove //apex_available:platform
3158 apex_available: [
3159 "//apex_available:platform",
3160 "myapex",
3161 ],
Alex Light9670d332019-01-29 18:07:33 -08003162 }
3163
3164 cc_library {
3165 name: "mylib2",
3166 srcs: ["mylib.cpp"],
3167 system_shared_libs: [],
3168 stl: "none",
3169 compile_multilib: "first",
3170 }
3171 `)
3172
Sundong Ahnabb64432019-10-22 13:58:29 +09003173 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003174 copyCmds := apexRule.Args["copy_commands"]
3175
3176 // Ensure that main rule creates an output
3177 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3178
3179 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003180 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3181 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3182 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003183
3184 // Ensure that both direct and indirect deps are copied into apex
3185 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3186 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3187 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3188
Colin Cross7113d202019-11-20 16:39:12 -08003189 // Ensure that the platform variant ends with _shared
3190 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3191 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3192 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003193}
Jiyong Park04480cf2019-02-06 00:16:29 +09003194
3195func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003196 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003197 apex {
3198 name: "myapex",
3199 key: "myapex.key",
3200 binaries: ["myscript"],
3201 }
3202
3203 apex_key {
3204 name: "myapex.key",
3205 public_key: "testkey.avbpubkey",
3206 private_key: "testkey.pem",
3207 }
3208
3209 sh_binary {
3210 name: "myscript",
3211 src: "mylib.cpp",
3212 filename: "myscript.sh",
3213 sub_dir: "script",
3214 }
3215 `)
3216
Sundong Ahnabb64432019-10-22 13:58:29 +09003217 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003218 copyCmds := apexRule.Args["copy_commands"]
3219
3220 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3221}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003222
Jooyung Han91df2082019-11-20 01:49:42 +09003223func TestApexInVariousPartition(t *testing.T) {
3224 testcases := []struct {
3225 propName, parition, flattenedPartition string
3226 }{
3227 {"", "system", "system_ext"},
3228 {"product_specific: true", "product", "product"},
3229 {"soc_specific: true", "vendor", "vendor"},
3230 {"proprietary: true", "vendor", "vendor"},
3231 {"vendor: true", "vendor", "vendor"},
3232 {"system_ext_specific: true", "system_ext", "system_ext"},
3233 }
3234 for _, tc := range testcases {
3235 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3236 ctx, _ := testApex(t, `
3237 apex {
3238 name: "myapex",
3239 key: "myapex.key",
3240 `+tc.propName+`
3241 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003242
Jooyung Han91df2082019-11-20 01:49:42 +09003243 apex_key {
3244 name: "myapex.key",
3245 public_key: "testkey.avbpubkey",
3246 private_key: "testkey.pem",
3247 }
3248 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003249
Jooyung Han91df2082019-11-20 01:49:42 +09003250 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3251 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3252 actual := apex.installDir.String()
3253 if actual != expected {
3254 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3255 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003256
Jooyung Han91df2082019-11-20 01:49:42 +09003257 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3258 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3259 actual = flattened.installDir.String()
3260 if actual != expected {
3261 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3262 }
3263 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003264 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003265}
Jiyong Park67882562019-03-21 01:11:21 +09003266
Jooyung Han54aca7b2019-11-20 02:26:02 +09003267func TestFileContexts(t *testing.T) {
3268 ctx, _ := testApex(t, `
3269 apex {
3270 name: "myapex",
3271 key: "myapex.key",
3272 }
3273
3274 apex_key {
3275 name: "myapex.key",
3276 public_key: "testkey.avbpubkey",
3277 private_key: "testkey.pem",
3278 }
3279 `)
3280 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3281 apexRule := module.Rule("apexRule")
3282 actual := apexRule.Args["file_contexts"]
3283 expected := "system/sepolicy/apex/myapex-file_contexts"
3284 if actual != expected {
3285 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3286 }
3287
3288 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3289 apex {
3290 name: "myapex",
3291 key: "myapex.key",
3292 file_contexts: "my_own_file_contexts",
3293 }
3294
3295 apex_key {
3296 name: "myapex.key",
3297 public_key: "testkey.avbpubkey",
3298 private_key: "testkey.pem",
3299 }
3300 `, withFiles(map[string][]byte{
3301 "my_own_file_contexts": nil,
3302 }))
3303
3304 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3305 apex {
3306 name: "myapex",
3307 key: "myapex.key",
3308 product_specific: true,
3309 file_contexts: "product_specific_file_contexts",
3310 }
3311
3312 apex_key {
3313 name: "myapex.key",
3314 public_key: "testkey.avbpubkey",
3315 private_key: "testkey.pem",
3316 }
3317 `)
3318
3319 ctx, _ = testApex(t, `
3320 apex {
3321 name: "myapex",
3322 key: "myapex.key",
3323 product_specific: true,
3324 file_contexts: "product_specific_file_contexts",
3325 }
3326
3327 apex_key {
3328 name: "myapex.key",
3329 public_key: "testkey.avbpubkey",
3330 private_key: "testkey.pem",
3331 }
3332 `, withFiles(map[string][]byte{
3333 "product_specific_file_contexts": nil,
3334 }))
3335 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3336 apexRule = module.Rule("apexRule")
3337 actual = apexRule.Args["file_contexts"]
3338 expected = "product_specific_file_contexts"
3339 if actual != expected {
3340 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3341 }
3342
3343 ctx, _ = testApex(t, `
3344 apex {
3345 name: "myapex",
3346 key: "myapex.key",
3347 product_specific: true,
3348 file_contexts: ":my-file-contexts",
3349 }
3350
3351 apex_key {
3352 name: "myapex.key",
3353 public_key: "testkey.avbpubkey",
3354 private_key: "testkey.pem",
3355 }
3356
3357 filegroup {
3358 name: "my-file-contexts",
3359 srcs: ["product_specific_file_contexts"],
3360 }
3361 `, withFiles(map[string][]byte{
3362 "product_specific_file_contexts": nil,
3363 }))
3364 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3365 apexRule = module.Rule("apexRule")
3366 actual = apexRule.Args["file_contexts"]
3367 expected = "product_specific_file_contexts"
3368 if actual != expected {
3369 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3370 }
3371}
3372
Jiyong Park67882562019-03-21 01:11:21 +09003373func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003374 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003375 apex_key {
3376 name: "myapex.key",
3377 public_key: ":my.avbpubkey",
3378 private_key: ":my.pem",
3379 product_specific: true,
3380 }
3381
3382 filegroup {
3383 name: "my.avbpubkey",
3384 srcs: ["testkey2.avbpubkey"],
3385 }
3386
3387 filegroup {
3388 name: "my.pem",
3389 srcs: ["testkey2.pem"],
3390 }
3391 `)
3392
3393 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3394 expected_pubkey := "testkey2.avbpubkey"
3395 actual_pubkey := apex_key.public_key_file.String()
3396 if actual_pubkey != expected_pubkey {
3397 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3398 }
3399 expected_privkey := "testkey2.pem"
3400 actual_privkey := apex_key.private_key_file.String()
3401 if actual_privkey != expected_privkey {
3402 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3403 }
3404}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003405
3406func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003407 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003408 prebuilt_apex {
3409 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003410 arch: {
3411 arm64: {
3412 src: "myapex-arm64.apex",
3413 },
3414 arm: {
3415 src: "myapex-arm.apex",
3416 },
3417 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003418 }
3419 `)
3420
3421 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3422
Jiyong Parkc95714e2019-03-29 14:23:10 +09003423 expectedInput := "myapex-arm64.apex"
3424 if prebuilt.inputApex.String() != expectedInput {
3425 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3426 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003427}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003428
3429func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003430 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003431 prebuilt_apex {
3432 name: "myapex",
3433 src: "myapex-arm.apex",
3434 filename: "notmyapex.apex",
3435 }
3436 `)
3437
3438 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3439
3440 expected := "notmyapex.apex"
3441 if p.installFilename != expected {
3442 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3443 }
3444}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003445
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003446func TestPrebuiltOverrides(t *testing.T) {
3447 ctx, config := testApex(t, `
3448 prebuilt_apex {
3449 name: "myapex.prebuilt",
3450 src: "myapex-arm.apex",
3451 overrides: [
3452 "myapex",
3453 ],
3454 }
3455 `)
3456
3457 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3458
3459 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003460 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003461 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003462 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003463 }
3464}
3465
Roland Levillain630846d2019-06-26 12:48:34 +01003466func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003467 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003468 apex_test {
3469 name: "myapex",
3470 key: "myapex.key",
3471 tests: [
3472 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003473 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003474 ],
3475 }
3476
3477 apex_key {
3478 name: "myapex.key",
3479 public_key: "testkey.avbpubkey",
3480 private_key: "testkey.pem",
3481 }
3482
Liz Kammer1c14a212020-05-12 15:26:55 -07003483 filegroup {
3484 name: "fg",
3485 srcs: [
3486 "baz",
3487 "bar/baz"
3488 ],
3489 }
3490
Roland Levillain630846d2019-06-26 12:48:34 +01003491 cc_test {
3492 name: "mytest",
3493 gtest: false,
3494 srcs: ["mytest.cpp"],
3495 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003496 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003497 system_shared_libs: [],
3498 static_executable: true,
3499 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003500 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003501 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003502
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003503 cc_library {
3504 name: "mylib",
3505 srcs: ["mylib.cpp"],
3506 system_shared_libs: [],
3507 stl: "none",
3508 }
3509
Liz Kammer5bd365f2020-05-27 15:15:11 -07003510 filegroup {
3511 name: "fg2",
3512 srcs: [
3513 "testdata/baz"
3514 ],
3515 }
3516
Roland Levillain9b5fde92019-06-28 15:41:19 +01003517 cc_test {
3518 name: "mytests",
3519 gtest: false,
3520 srcs: [
3521 "mytest1.cpp",
3522 "mytest2.cpp",
3523 "mytest3.cpp",
3524 ],
3525 test_per_src: true,
3526 relative_install_path: "test",
3527 system_shared_libs: [],
3528 static_executable: true,
3529 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003530 data: [
3531 ":fg",
3532 ":fg2",
3533 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003534 }
Roland Levillain630846d2019-06-26 12:48:34 +01003535 `)
3536
Sundong Ahnabb64432019-10-22 13:58:29 +09003537 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003538 copyCmds := apexRule.Args["copy_commands"]
3539
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003540 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003541 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003542 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003543
Liz Kammer1c14a212020-05-12 15:26:55 -07003544 //Ensure that test data are copied into apex.
3545 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3546 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3547
Roland Levillain9b5fde92019-06-28 15:41:19 +01003548 // Ensure that test deps built with `test_per_src` are copied into apex.
3549 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3550 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3551 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003552
3553 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003554 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3555 data := android.AndroidMkDataForTest(t, config, "", bundle)
3556 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003557 prefix := "TARGET_"
3558 var builder strings.Builder
3559 data.Custom(&builder, name, prefix, "", data)
3560 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003561 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3562 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3563 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3564 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003565 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003566 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003567 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003568
3569 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3570 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3571 data.Custom(&builder, name, prefix, "", data)
3572 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003573 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3574 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003575}
3576
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003577func TestInstallExtraFlattenedApexes(t *testing.T) {
3578 ctx, config := testApex(t, `
3579 apex {
3580 name: "myapex",
3581 key: "myapex.key",
3582 }
3583 apex_key {
3584 name: "myapex.key",
3585 public_key: "testkey.avbpubkey",
3586 private_key: "testkey.pem",
3587 }
3588 `, func(fs map[string][]byte, config android.Config) {
3589 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3590 })
3591 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003592 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003593 mk := android.AndroidMkDataForTest(t, config, "", ab)
3594 var builder strings.Builder
3595 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3596 androidMk := builder.String()
3597 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3598}
3599
Jooyung Han5c998b92019-06-27 11:30:33 +09003600func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003601 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003602 apex {
3603 name: "myapex",
3604 key: "myapex.key",
3605 native_shared_libs: ["mylib"],
3606 uses: ["commonapex"],
3607 }
3608
3609 apex {
3610 name: "commonapex",
3611 key: "myapex.key",
3612 native_shared_libs: ["libcommon"],
3613 provide_cpp_shared_libs: true,
3614 }
3615
3616 apex_key {
3617 name: "myapex.key",
3618 public_key: "testkey.avbpubkey",
3619 private_key: "testkey.pem",
3620 }
3621
3622 cc_library {
3623 name: "mylib",
3624 srcs: ["mylib.cpp"],
3625 shared_libs: ["libcommon"],
3626 system_shared_libs: [],
3627 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003628 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003629 }
3630
3631 cc_library {
3632 name: "libcommon",
3633 srcs: ["mylib_common.cpp"],
3634 system_shared_libs: [],
3635 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003636 // TODO: remove //apex_available:platform
3637 apex_available: [
3638 "//apex_available:platform",
3639 "commonapex",
3640 "myapex",
3641 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003642 }
3643 `)
3644
Sundong Ahnabb64432019-10-22 13:58:29 +09003645 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003646 apexRule1 := module1.Rule("apexRule")
3647 copyCmds1 := apexRule1.Args["copy_commands"]
3648
Sundong Ahnabb64432019-10-22 13:58:29 +09003649 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003650 apexRule2 := module2.Rule("apexRule")
3651 copyCmds2 := apexRule2.Args["copy_commands"]
3652
Colin Cross7113d202019-11-20 16:39:12 -08003653 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3654 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003655 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3656 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3657 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3658}
3659
3660func TestApexUsesFailsIfNotProvided(t *testing.T) {
3661 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3662 apex {
3663 name: "myapex",
3664 key: "myapex.key",
3665 uses: ["commonapex"],
3666 }
3667
3668 apex {
3669 name: "commonapex",
3670 key: "myapex.key",
3671 }
3672
3673 apex_key {
3674 name: "myapex.key",
3675 public_key: "testkey.avbpubkey",
3676 private_key: "testkey.pem",
3677 }
3678 `)
3679 testApexError(t, `uses: "commonapex" is not a provider`, `
3680 apex {
3681 name: "myapex",
3682 key: "myapex.key",
3683 uses: ["commonapex"],
3684 }
3685
3686 cc_library {
3687 name: "commonapex",
3688 system_shared_libs: [],
3689 stl: "none",
3690 }
3691
3692 apex_key {
3693 name: "myapex.key",
3694 public_key: "testkey.avbpubkey",
3695 private_key: "testkey.pem",
3696 }
3697 `)
3698}
3699
3700func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3701 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3702 apex {
3703 name: "myapex",
3704 key: "myapex.key",
3705 use_vendor: true,
3706 uses: ["commonapex"],
3707 }
3708
3709 apex {
3710 name: "commonapex",
3711 key: "myapex.key",
3712 provide_cpp_shared_libs: true,
3713 }
3714
3715 apex_key {
3716 name: "myapex.key",
3717 public_key: "testkey.avbpubkey",
3718 private_key: "testkey.pem",
3719 }
Jooyung Handc782442019-11-01 03:14:38 +09003720 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07003721 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09003722 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003723}
3724
Jooyung Hand48f3c32019-08-23 11:18:57 +09003725func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3726 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3727 apex {
3728 name: "myapex",
3729 key: "myapex.key",
3730 native_shared_libs: ["libfoo"],
3731 }
3732
3733 apex_key {
3734 name: "myapex.key",
3735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
3738
3739 cc_library {
3740 name: "libfoo",
3741 stl: "none",
3742 system_shared_libs: [],
3743 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003744 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003745 }
3746 `)
3747 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3748 apex {
3749 name: "myapex",
3750 key: "myapex.key",
3751 java_libs: ["myjar"],
3752 }
3753
3754 apex_key {
3755 name: "myapex.key",
3756 public_key: "testkey.avbpubkey",
3757 private_key: "testkey.pem",
3758 }
3759
3760 java_library {
3761 name: "myjar",
3762 srcs: ["foo/bar/MyClass.java"],
3763 sdk_version: "none",
3764 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003765 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003766 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003767 }
3768 `)
3769}
3770
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003771func TestApexWithApps(t *testing.T) {
3772 ctx, _ := testApex(t, `
3773 apex {
3774 name: "myapex",
3775 key: "myapex.key",
3776 apps: [
3777 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003778 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003779 ],
3780 }
3781
3782 apex_key {
3783 name: "myapex.key",
3784 public_key: "testkey.avbpubkey",
3785 private_key: "testkey.pem",
3786 }
3787
3788 android_app {
3789 name: "AppFoo",
3790 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003791 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003792 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003793 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003794 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003795 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003796 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003797
3798 android_app {
3799 name: "AppFooPriv",
3800 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003801 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003802 system_modules: "none",
3803 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003805 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003806 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003807
3808 cc_library_shared {
3809 name: "libjni",
3810 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003811 shared_libs: ["libfoo"],
3812 stl: "none",
3813 system_shared_libs: [],
3814 apex_available: [ "myapex" ],
3815 sdk_version: "current",
3816 }
3817
3818 cc_library_shared {
3819 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003820 stl: "none",
3821 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003822 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003823 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003824 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003825 `)
3826
Sundong Ahnabb64432019-10-22 13:58:29 +09003827 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003828 apexRule := module.Rule("apexRule")
3829 copyCmds := apexRule.Args["copy_commands"]
3830
3831 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003832 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003833
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003834 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3835 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003836 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003837 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003838 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003839 // JNI libraries including transitive deps are
3840 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003841 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003842 // ... embedded inside APK (jnilibs.zip)
3843 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3844 // ... and not directly inside the APEX
3845 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3846 }
Dario Frenicde2a032019-10-27 00:29:22 +01003847}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003848
Dario Frenicde2a032019-10-27 00:29:22 +01003849func TestApexWithAppImports(t *testing.T) {
3850 ctx, _ := testApex(t, `
3851 apex {
3852 name: "myapex",
3853 key: "myapex.key",
3854 apps: [
3855 "AppFooPrebuilt",
3856 "AppFooPrivPrebuilt",
3857 ],
3858 }
3859
3860 apex_key {
3861 name: "myapex.key",
3862 public_key: "testkey.avbpubkey",
3863 private_key: "testkey.pem",
3864 }
3865
3866 android_app_import {
3867 name: "AppFooPrebuilt",
3868 apk: "PrebuiltAppFoo.apk",
3869 presigned: true,
3870 dex_preopt: {
3871 enabled: false,
3872 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003873 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003874 }
3875
3876 android_app_import {
3877 name: "AppFooPrivPrebuilt",
3878 apk: "PrebuiltAppFooPriv.apk",
3879 privileged: true,
3880 presigned: true,
3881 dex_preopt: {
3882 enabled: false,
3883 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003884 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003885 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003886 }
3887 `)
3888
Sundong Ahnabb64432019-10-22 13:58:29 +09003889 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003890 apexRule := module.Rule("apexRule")
3891 copyCmds := apexRule.Args["copy_commands"]
3892
3893 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003894 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3895}
3896
3897func TestApexWithAppImportsPrefer(t *testing.T) {
3898 ctx, _ := testApex(t, `
3899 apex {
3900 name: "myapex",
3901 key: "myapex.key",
3902 apps: [
3903 "AppFoo",
3904 ],
3905 }
3906
3907 apex_key {
3908 name: "myapex.key",
3909 public_key: "testkey.avbpubkey",
3910 private_key: "testkey.pem",
3911 }
3912
3913 android_app {
3914 name: "AppFoo",
3915 srcs: ["foo/bar/MyClass.java"],
3916 sdk_version: "none",
3917 system_modules: "none",
3918 apex_available: [ "myapex" ],
3919 }
3920
3921 android_app_import {
3922 name: "AppFoo",
3923 apk: "AppFooPrebuilt.apk",
3924 filename: "AppFooPrebuilt.apk",
3925 presigned: true,
3926 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003927 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003928 }
3929 `, withFiles(map[string][]byte{
3930 "AppFooPrebuilt.apk": nil,
3931 }))
3932
3933 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3934 "app/AppFoo/AppFooPrebuilt.apk",
3935 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003936}
3937
Dario Freni6f3937c2019-12-20 22:58:03 +00003938func TestApexWithTestHelperApp(t *testing.T) {
3939 ctx, _ := testApex(t, `
3940 apex {
3941 name: "myapex",
3942 key: "myapex.key",
3943 apps: [
3944 "TesterHelpAppFoo",
3945 ],
3946 }
3947
3948 apex_key {
3949 name: "myapex.key",
3950 public_key: "testkey.avbpubkey",
3951 private_key: "testkey.pem",
3952 }
3953
3954 android_test_helper_app {
3955 name: "TesterHelpAppFoo",
3956 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003957 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003958 }
3959
3960 `)
3961
3962 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3963 apexRule := module.Rule("apexRule")
3964 copyCmds := apexRule.Args["copy_commands"]
3965
3966 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3967}
3968
Jooyung Han18020ea2019-11-13 10:50:48 +09003969func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3970 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003971 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003972 apex {
3973 name: "myapex",
3974 key: "myapex.key",
3975 native_shared_libs: ["libfoo"],
3976 }
3977
3978 apex_key {
3979 name: "myapex.key",
3980 public_key: "testkey.avbpubkey",
3981 private_key: "testkey.pem",
3982 }
3983
3984 apex {
3985 name: "otherapex",
3986 key: "myapex.key",
3987 native_shared_libs: ["libfoo"],
3988 }
3989
3990 cc_defaults {
3991 name: "libfoo-defaults",
3992 apex_available: ["otherapex"],
3993 }
3994
3995 cc_library {
3996 name: "libfoo",
3997 defaults: ["libfoo-defaults"],
3998 stl: "none",
3999 system_shared_libs: [],
4000 }`)
4001}
4002
Paul Duffine52e66f2020-03-30 17:54:29 +01004003func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004004 // libfoo is not available to myapex, but only to otherapex
4005 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4006 apex {
4007 name: "myapex",
4008 key: "myapex.key",
4009 native_shared_libs: ["libfoo"],
4010 }
4011
4012 apex_key {
4013 name: "myapex.key",
4014 public_key: "testkey.avbpubkey",
4015 private_key: "testkey.pem",
4016 }
4017
4018 apex {
4019 name: "otherapex",
4020 key: "otherapex.key",
4021 native_shared_libs: ["libfoo"],
4022 }
4023
4024 apex_key {
4025 name: "otherapex.key",
4026 public_key: "testkey.avbpubkey",
4027 private_key: "testkey.pem",
4028 }
4029
4030 cc_library {
4031 name: "libfoo",
4032 stl: "none",
4033 system_shared_libs: [],
4034 apex_available: ["otherapex"],
4035 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004036}
Jiyong Park127b40b2019-09-30 16:04:35 +09004037
Paul Duffine52e66f2020-03-30 17:54:29 +01004038func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004039 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004040 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004041.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004042.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004043.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004044.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004045.*via tag cc\.DependencyTag.*"shared".*
4046.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004047 apex {
4048 name: "myapex",
4049 key: "myapex.key",
4050 native_shared_libs: ["libfoo"],
4051 }
4052
4053 apex_key {
4054 name: "myapex.key",
4055 public_key: "testkey.avbpubkey",
4056 private_key: "testkey.pem",
4057 }
4058
Jiyong Park127b40b2019-09-30 16:04:35 +09004059 cc_library {
4060 name: "libfoo",
4061 stl: "none",
4062 shared_libs: ["libbar"],
4063 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004064 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004065 }
4066
4067 cc_library {
4068 name: "libbar",
4069 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004070 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004071 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004072 apex_available: ["myapex"],
4073 }
4074
4075 cc_library {
4076 name: "libbaz",
4077 stl: "none",
4078 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004079 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004080}
Jiyong Park127b40b2019-09-30 16:04:35 +09004081
Paul Duffine52e66f2020-03-30 17:54:29 +01004082func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004083 testApexError(t, "\"otherapex\" is not a valid module name", `
4084 apex {
4085 name: "myapex",
4086 key: "myapex.key",
4087 native_shared_libs: ["libfoo"],
4088 }
4089
4090 apex_key {
4091 name: "myapex.key",
4092 public_key: "testkey.avbpubkey",
4093 private_key: "testkey.pem",
4094 }
4095
4096 cc_library {
4097 name: "libfoo",
4098 stl: "none",
4099 system_shared_libs: [],
4100 apex_available: ["otherapex"],
4101 }`)
4102
Paul Duffine52e66f2020-03-30 17:54:29 +01004103 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004104 apex {
4105 name: "myapex",
4106 key: "myapex.key",
4107 native_shared_libs: ["libfoo", "libbar"],
4108 }
4109
4110 apex_key {
4111 name: "myapex.key",
4112 public_key: "testkey.avbpubkey",
4113 private_key: "testkey.pem",
4114 }
4115
4116 cc_library {
4117 name: "libfoo",
4118 stl: "none",
4119 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004120 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004121 apex_available: ["myapex"],
4122 }
4123
4124 cc_library {
4125 name: "libbar",
4126 stl: "none",
4127 system_shared_libs: [],
4128 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004129 }
4130
4131 cc_library {
4132 name: "libbaz",
4133 stl: "none",
4134 system_shared_libs: [],
4135 stubs: {
4136 versions: ["10", "20", "30"],
4137 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004138 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004139}
Jiyong Park127b40b2019-09-30 16:04:35 +09004140
Jiyong Park89e850a2020-04-07 16:37:39 +09004141func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004142 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004143 apex {
4144 name: "myapex",
4145 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004146 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004147 }
4148
4149 apex_key {
4150 name: "myapex.key",
4151 public_key: "testkey.avbpubkey",
4152 private_key: "testkey.pem",
4153 }
4154
4155 cc_library {
4156 name: "libfoo",
4157 stl: "none",
4158 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004159 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004160 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004161 }
4162
4163 cc_library {
4164 name: "libfoo2",
4165 stl: "none",
4166 system_shared_libs: [],
4167 shared_libs: ["libbaz"],
4168 apex_available: ["//apex_available:platform"],
4169 }
4170
4171 cc_library {
4172 name: "libbar",
4173 stl: "none",
4174 system_shared_libs: [],
4175 apex_available: ["myapex"],
4176 }
4177
4178 cc_library {
4179 name: "libbaz",
4180 stl: "none",
4181 system_shared_libs: [],
4182 apex_available: ["myapex"],
4183 stubs: {
4184 versions: ["1"],
4185 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004186 }`)
4187
Jiyong Park89e850a2020-04-07 16:37:39 +09004188 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4189 // because it depends on libbar which isn't available to platform
4190 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4191 if libfoo.NotAvailableForPlatform() != true {
4192 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4193 }
4194
4195 // libfoo2 however can be available to platform because it depends on libbaz which provides
4196 // stubs
4197 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4198 if libfoo2.NotAvailableForPlatform() == true {
4199 t.Errorf("%q should be available to platform", libfoo2.String())
4200 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004201}
Jiyong Parka90ca002019-10-07 15:47:24 +09004202
Paul Duffine52e66f2020-03-30 17:54:29 +01004203func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004204 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
4208 native_shared_libs: ["libfoo"],
4209 }
4210
4211 apex_key {
4212 name: "myapex.key",
4213 public_key: "testkey.avbpubkey",
4214 private_key: "testkey.pem",
4215 }
4216
4217 cc_library {
4218 name: "libfoo",
4219 stl: "none",
4220 system_shared_libs: [],
4221 apex_available: ["myapex"],
4222 static: {
4223 apex_available: ["//apex_available:platform"],
4224 },
4225 }`)
4226
Jiyong Park89e850a2020-04-07 16:37:39 +09004227 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4228 if libfooShared.NotAvailableForPlatform() != true {
4229 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4230 }
4231 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4232 if libfooStatic.NotAvailableForPlatform() != false {
4233 t.Errorf("%q should be available to platform", libfooStatic.String())
4234 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004235}
4236
Jiyong Park5d790c32019-11-15 18:40:32 +09004237func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004238 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004239 apex {
4240 name: "myapex",
4241 key: "myapex.key",
4242 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004243 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004244 }
4245
4246 override_apex {
4247 name: "override_myapex",
4248 base: "myapex",
4249 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004250 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004251 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004252 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004253 }
4254
4255 apex_key {
4256 name: "myapex.key",
4257 public_key: "testkey.avbpubkey",
4258 private_key: "testkey.pem",
4259 }
4260
4261 android_app {
4262 name: "app",
4263 srcs: ["foo/bar/MyClass.java"],
4264 package_name: "foo",
4265 sdk_version: "none",
4266 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004267 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004268 }
4269
4270 override_android_app {
4271 name: "override_app",
4272 base: "app",
4273 package_name: "bar",
4274 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004275 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004276
Jiyong Park317645e2019-12-05 13:20:58 +09004277 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4278 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4279 if originalVariant.GetOverriddenBy() != "" {
4280 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4281 }
4282 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4283 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4284 }
4285
Jiyong Park5d790c32019-11-15 18:40:32 +09004286 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4287 apexRule := module.Rule("apexRule")
4288 copyCmds := apexRule.Args["copy_commands"]
4289
4290 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004291 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004292
4293 apexBundle := module.Module().(*apexBundle)
4294 name := apexBundle.Name()
4295 if name != "override_myapex" {
4296 t.Errorf("name should be \"override_myapex\", but was %q", name)
4297 }
4298
Baligh Uddin004d7172020-02-19 21:29:28 -08004299 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4300 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4301 }
4302
Jiyong Park20bacab2020-03-03 11:45:41 +09004303 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004304 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004305
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004306 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4307 var builder strings.Builder
4308 data.Custom(&builder, name, "TARGET_", "", data)
4309 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004310 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004311 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4312 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004313 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004314 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004315 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004316 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4317 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004318}
4319
Jooyung Han214bf372019-11-12 13:03:50 +09004320func TestLegacyAndroid10Support(t *testing.T) {
4321 ctx, _ := testApex(t, `
4322 apex {
4323 name: "myapex",
4324 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004325 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004326 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004327 }
4328
4329 apex_key {
4330 name: "myapex.key",
4331 public_key: "testkey.avbpubkey",
4332 private_key: "testkey.pem",
4333 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004334
4335 cc_library {
4336 name: "mylib",
4337 srcs: ["mylib.cpp"],
4338 stl: "libc++",
4339 system_shared_libs: [],
4340 apex_available: [ "myapex" ],
4341 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004342 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004343
4344 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4345 args := module.Rule("apexRule").Args
4346 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004347 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004348
4349 // The copies of the libraries in the apex should have one more dependency than
4350 // the ones outside the apex, namely the unwinder. Ideally we should check
4351 // the dependency names directly here but for some reason the names are blank in
4352 // this test.
4353 for _, lib := range []string{"libc++", "mylib"} {
4354 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4355 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4356 if len(apexImplicits) != len(nonApexImplicits)+1 {
4357 t.Errorf("%q missing unwinder dep", lib)
4358 }
4359 }
Jooyung Han214bf372019-11-12 13:03:50 +09004360}
4361
Paul Duffin9b879592020-05-26 13:21:35 +01004362var filesForSdkLibrary = map[string][]byte{
4363 "api/current.txt": nil,
4364 "api/removed.txt": nil,
4365 "api/system-current.txt": nil,
4366 "api/system-removed.txt": nil,
4367 "api/test-current.txt": nil,
4368 "api/test-removed.txt": nil,
4369}
4370
Jooyung Han58f26ab2019-12-18 15:34:32 +09004371func TestJavaSDKLibrary(t *testing.T) {
4372 ctx, _ := testApex(t, `
4373 apex {
4374 name: "myapex",
4375 key: "myapex.key",
4376 java_libs: ["foo"],
4377 }
4378
4379 apex_key {
4380 name: "myapex.key",
4381 public_key: "testkey.avbpubkey",
4382 private_key: "testkey.pem",
4383 }
4384
4385 java_sdk_library {
4386 name: "foo",
4387 srcs: ["a.java"],
4388 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004389 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004390 }
Paul Duffin9b879592020-05-26 13:21:35 +01004391 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004392
4393 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004394 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004395 "javalib/foo.jar",
4396 "etc/permissions/foo.xml",
4397 })
4398 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004399 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4400 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004401}
4402
Paul Duffin9b879592020-05-26 13:21:35 +01004403func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4404 ctx, _ := testApex(t, `
4405 apex {
4406 name: "myapex",
4407 key: "myapex.key",
4408 java_libs: ["foo", "bar"],
4409 }
4410
4411 apex_key {
4412 name: "myapex.key",
4413 public_key: "testkey.avbpubkey",
4414 private_key: "testkey.pem",
4415 }
4416
4417 java_sdk_library {
4418 name: "foo",
4419 srcs: ["a.java"],
4420 api_packages: ["foo"],
4421 apex_available: ["myapex"],
4422 sdk_version: "none",
4423 system_modules: "none",
4424 }
4425
4426 java_library {
4427 name: "bar",
4428 srcs: ["a.java"],
4429 libs: ["foo"],
4430 apex_available: ["myapex"],
4431 sdk_version: "none",
4432 system_modules: "none",
4433 }
4434 `, withFiles(filesForSdkLibrary))
4435
4436 // java_sdk_library installs both impl jar and permission XML
4437 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4438 "javalib/bar.jar",
4439 "javalib/foo.jar",
4440 "etc/permissions/foo.xml",
4441 })
4442
4443 // The bar library should depend on the implementation jar.
4444 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4445 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4446 t.Errorf("expected %q, found %#q", expected, actual)
4447 }
4448}
4449
4450func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4451 ctx, _ := testApex(t, `
4452 apex {
4453 name: "myapex",
4454 key: "myapex.key",
4455 java_libs: ["foo"],
4456 }
4457
4458 apex_key {
4459 name: "myapex.key",
4460 public_key: "testkey.avbpubkey",
4461 private_key: "testkey.pem",
4462 }
4463
4464 java_sdk_library {
4465 name: "foo",
4466 srcs: ["a.java"],
4467 api_packages: ["foo"],
4468 apex_available: ["myapex"],
4469 sdk_version: "none",
4470 system_modules: "none",
4471 }
4472
4473 java_library {
4474 name: "bar",
4475 srcs: ["a.java"],
4476 libs: ["foo"],
4477 sdk_version: "none",
4478 system_modules: "none",
4479 }
4480 `, withFiles(filesForSdkLibrary))
4481
4482 // java_sdk_library installs both impl jar and permission XML
4483 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4484 "javalib/foo.jar",
4485 "etc/permissions/foo.xml",
4486 })
4487
4488 // The bar library should depend on the stubs jar.
4489 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4490 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4491 t.Errorf("expected %q, found %#q", expected, actual)
4492 }
4493}
4494
atrost6e126252020-01-27 17:01:16 +00004495func TestCompatConfig(t *testing.T) {
4496 ctx, _ := testApex(t, `
4497 apex {
4498 name: "myapex",
4499 key: "myapex.key",
4500 prebuilts: ["myjar-platform-compat-config"],
4501 java_libs: ["myjar"],
4502 }
4503
4504 apex_key {
4505 name: "myapex.key",
4506 public_key: "testkey.avbpubkey",
4507 private_key: "testkey.pem",
4508 }
4509
4510 platform_compat_config {
4511 name: "myjar-platform-compat-config",
4512 src: ":myjar",
4513 }
4514
4515 java_library {
4516 name: "myjar",
4517 srcs: ["foo/bar/MyClass.java"],
4518 sdk_version: "none",
4519 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004520 apex_available: [ "myapex" ],
4521 }
4522 `)
4523 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4524 "etc/compatconfig/myjar-platform-compat-config.xml",
4525 "javalib/myjar.jar",
4526 })
4527}
4528
Jiyong Park479321d2019-12-16 11:47:12 +09004529func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4530 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4531 apex {
4532 name: "myapex",
4533 key: "myapex.key",
4534 java_libs: ["myjar"],
4535 }
4536
4537 apex_key {
4538 name: "myapex.key",
4539 public_key: "testkey.avbpubkey",
4540 private_key: "testkey.pem",
4541 }
4542
4543 java_library {
4544 name: "myjar",
4545 srcs: ["foo/bar/MyClass.java"],
4546 sdk_version: "none",
4547 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004548 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004549 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004550 }
4551 `)
4552}
4553
Jiyong Park7afd1072019-12-30 16:56:33 +09004554func TestCarryRequiredModuleNames(t *testing.T) {
4555 ctx, config := testApex(t, `
4556 apex {
4557 name: "myapex",
4558 key: "myapex.key",
4559 native_shared_libs: ["mylib"],
4560 }
4561
4562 apex_key {
4563 name: "myapex.key",
4564 public_key: "testkey.avbpubkey",
4565 private_key: "testkey.pem",
4566 }
4567
4568 cc_library {
4569 name: "mylib",
4570 srcs: ["mylib.cpp"],
4571 system_shared_libs: [],
4572 stl: "none",
4573 required: ["a", "b"],
4574 host_required: ["c", "d"],
4575 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004576 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004577 }
4578 `)
4579
4580 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4581 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4582 name := apexBundle.BaseModuleName()
4583 prefix := "TARGET_"
4584 var builder strings.Builder
4585 data.Custom(&builder, name, prefix, "", data)
4586 androidMk := builder.String()
4587 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4588 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4589 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4590}
4591
Jiyong Park7cd10e32020-01-14 09:22:18 +09004592func TestSymlinksFromApexToSystem(t *testing.T) {
4593 bp := `
4594 apex {
4595 name: "myapex",
4596 key: "myapex.key",
4597 native_shared_libs: ["mylib"],
4598 java_libs: ["myjar"],
4599 }
4600
Jiyong Park9d677202020-02-19 16:29:35 +09004601 apex {
4602 name: "myapex.updatable",
4603 key: "myapex.key",
4604 native_shared_libs: ["mylib"],
4605 java_libs: ["myjar"],
4606 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004607 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004608 }
4609
Jiyong Park7cd10e32020-01-14 09:22:18 +09004610 apex_key {
4611 name: "myapex.key",
4612 public_key: "testkey.avbpubkey",
4613 private_key: "testkey.pem",
4614 }
4615
4616 cc_library {
4617 name: "mylib",
4618 srcs: ["mylib.cpp"],
4619 shared_libs: ["myotherlib"],
4620 system_shared_libs: [],
4621 stl: "none",
4622 apex_available: [
4623 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004624 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004625 "//apex_available:platform",
4626 ],
4627 }
4628
4629 cc_library {
4630 name: "myotherlib",
4631 srcs: ["mylib.cpp"],
4632 system_shared_libs: [],
4633 stl: "none",
4634 apex_available: [
4635 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004636 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004637 "//apex_available:platform",
4638 ],
4639 }
4640
4641 java_library {
4642 name: "myjar",
4643 srcs: ["foo/bar/MyClass.java"],
4644 sdk_version: "none",
4645 system_modules: "none",
4646 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004647 apex_available: [
4648 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004649 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004650 "//apex_available:platform",
4651 ],
4652 }
4653
4654 java_library {
4655 name: "myotherjar",
4656 srcs: ["foo/bar/MyClass.java"],
4657 sdk_version: "none",
4658 system_modules: "none",
4659 apex_available: [
4660 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004661 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004662 "//apex_available:platform",
4663 ],
4664 }
4665 `
4666
4667 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4668 for _, f := range files {
4669 if f.path == file {
4670 if f.isLink {
4671 t.Errorf("%q is not a real file", file)
4672 }
4673 return
4674 }
4675 }
4676 t.Errorf("%q is not found", file)
4677 }
4678
4679 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4680 for _, f := range files {
4681 if f.path == file {
4682 if !f.isLink {
4683 t.Errorf("%q is not a symlink", file)
4684 }
4685 return
4686 }
4687 }
4688 t.Errorf("%q is not found", file)
4689 }
4690
Jiyong Park9d677202020-02-19 16:29:35 +09004691 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4692 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004693 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004694 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004695 ensureRealfileExists(t, files, "javalib/myjar.jar")
4696 ensureRealfileExists(t, files, "lib64/mylib.so")
4697 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4698
Jiyong Park9d677202020-02-19 16:29:35 +09004699 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4700 ensureRealfileExists(t, files, "javalib/myjar.jar")
4701 ensureRealfileExists(t, files, "lib64/mylib.so")
4702 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4703
4704 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004705 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004706 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004707 ensureRealfileExists(t, files, "javalib/myjar.jar")
4708 ensureRealfileExists(t, files, "lib64/mylib.so")
4709 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004710
4711 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4712 ensureRealfileExists(t, files, "javalib/myjar.jar")
4713 ensureRealfileExists(t, files, "lib64/mylib.so")
4714 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004715}
4716
Jooyung Han643adc42020-02-27 13:50:06 +09004717func TestApexWithJniLibs(t *testing.T) {
4718 ctx, _ := testApex(t, `
4719 apex {
4720 name: "myapex",
4721 key: "myapex.key",
4722 jni_libs: ["mylib"],
4723 }
4724
4725 apex_key {
4726 name: "myapex.key",
4727 public_key: "testkey.avbpubkey",
4728 private_key: "testkey.pem",
4729 }
4730
4731 cc_library {
4732 name: "mylib",
4733 srcs: ["mylib.cpp"],
4734 shared_libs: ["mylib2"],
4735 system_shared_libs: [],
4736 stl: "none",
4737 apex_available: [ "myapex" ],
4738 }
4739
4740 cc_library {
4741 name: "mylib2",
4742 srcs: ["mylib.cpp"],
4743 system_shared_libs: [],
4744 stl: "none",
4745 apex_available: [ "myapex" ],
4746 }
4747 `)
4748
4749 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4750 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4751 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4752 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4753 "lib64/mylib.so",
4754 "lib64/mylib2.so",
4755 })
4756}
4757
Jooyung Han49f67012020-04-17 13:43:10 +09004758func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4759 ctx, _ := testApex(t, `
4760 apex {
4761 name: "myapex",
4762 key: "myapex.key",
4763 }
4764 apex_key {
4765 name: "myapex.key",
4766 public_key: "testkey.avbpubkey",
4767 private_key: "testkey.pem",
4768 }
4769 `, func(fs map[string][]byte, config android.Config) {
4770 delete(config.Targets, android.Android)
4771 config.AndroidCommonTarget = android.Target{}
4772 })
4773
4774 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4775 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4776 }
4777}
4778
Jooyung Han643adc42020-02-27 13:50:06 +09004779func TestApexWithJniLibs_Errors(t *testing.T) {
4780 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4781 apex {
4782 name: "myapex",
4783 key: "myapex.key",
4784 jni_libs: ["xxx"],
4785 }
4786
4787 apex_key {
4788 name: "myapex.key",
4789 public_key: "testkey.avbpubkey",
4790 private_key: "testkey.pem",
4791 }
4792
4793 prebuilt_etc {
4794 name: "xxx",
4795 src: "xxx",
4796 }
4797 `, withFiles(map[string][]byte{
4798 "xxx": nil,
4799 }))
4800}
4801
Jiyong Parkbd159612020-02-28 15:22:21 +09004802func TestAppBundle(t *testing.T) {
4803 ctx, _ := testApex(t, `
4804 apex {
4805 name: "myapex",
4806 key: "myapex.key",
4807 apps: ["AppFoo"],
4808 }
4809
4810 apex_key {
4811 name: "myapex.key",
4812 public_key: "testkey.avbpubkey",
4813 private_key: "testkey.pem",
4814 }
4815
4816 android_app {
4817 name: "AppFoo",
4818 srcs: ["foo/bar/MyClass.java"],
4819 sdk_version: "none",
4820 system_modules: "none",
4821 apex_available: [ "myapex" ],
4822 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004823 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004824
4825 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4826 content := bundleConfigRule.Args["content"]
4827
4828 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004829 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 +09004830}
4831
Sasha Smundak18d98bc2020-05-27 16:36:07 -07004832func TestAppSetBundle(t *testing.T) {
4833 ctx, _ := testApex(t, `
4834 apex {
4835 name: "myapex",
4836 key: "myapex.key",
4837 apps: ["AppSet"],
4838 }
4839
4840 apex_key {
4841 name: "myapex.key",
4842 public_key: "testkey.avbpubkey",
4843 private_key: "testkey.pem",
4844 }
4845
4846 android_app_set {
4847 name: "AppSet",
4848 set: "AppSet.apks",
4849 }`)
4850 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4851 bundleConfigRule := mod.Description("Bundle Config")
4852 content := bundleConfigRule.Args["content"]
4853 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
4854 s := mod.Rule("apexRule").Args["copy_commands"]
4855 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
4856 if len(copyCmds) != 3 {
4857 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
4858 }
4859 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
4860 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
4861 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
4862}
4863
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004864func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004865 t.Helper()
4866
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004867 bp := `
4868 java_library {
4869 name: "some-updatable-apex-lib",
4870 srcs: ["a.java"],
4871 sdk_version: "current",
4872 apex_available: [
4873 "some-updatable-apex",
4874 ],
4875 }
4876
4877 java_library {
4878 name: "some-non-updatable-apex-lib",
4879 srcs: ["a.java"],
4880 apex_available: [
4881 "some-non-updatable-apex",
4882 ],
4883 }
4884
4885 java_library {
4886 name: "some-platform-lib",
4887 srcs: ["a.java"],
4888 sdk_version: "current",
4889 installable: true,
4890 }
4891
4892 java_library {
4893 name: "some-art-lib",
4894 srcs: ["a.java"],
4895 sdk_version: "current",
4896 apex_available: [
4897 "com.android.art.something",
4898 ],
4899 hostdex: true,
4900 }
4901
4902 apex {
4903 name: "some-updatable-apex",
4904 key: "some-updatable-apex.key",
4905 java_libs: ["some-updatable-apex-lib"],
4906 updatable: true,
4907 min_sdk_version: "current",
4908 }
4909
4910 apex {
4911 name: "some-non-updatable-apex",
4912 key: "some-non-updatable-apex.key",
4913 java_libs: ["some-non-updatable-apex-lib"],
4914 }
4915
4916 apex_key {
4917 name: "some-updatable-apex.key",
4918 }
4919
4920 apex_key {
4921 name: "some-non-updatable-apex.key",
4922 }
4923
4924 apex {
4925 name: "com.android.art.something",
4926 key: "com.android.art.something.key",
4927 java_libs: ["some-art-lib"],
4928 updatable: true,
4929 min_sdk_version: "current",
4930 }
4931
4932 apex_key {
4933 name: "com.android.art.something.key",
4934 }
4935
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004936 filegroup {
4937 name: "some-updatable-apex-file_contexts",
4938 srcs: [
4939 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4940 ],
4941 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004942
4943 filegroup {
4944 name: "some-non-updatable-apex-file_contexts",
4945 srcs: [
4946 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4947 ],
4948 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004949 `
4950 bp += cc.GatherRequiredDepsForTest(android.Android)
4951 bp += java.GatherRequiredDepsForTest()
4952 bp += dexpreopt.BpToolModulesForTest()
4953
4954 fs := map[string][]byte{
4955 "a.java": nil,
4956 "a.jar": nil,
4957 "build/make/target/product/security": nil,
4958 "apex_manifest.json": nil,
4959 "AndroidManifest.xml": nil,
4960 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004961 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004962 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4963 "framework/aidl/a.aidl": nil,
4964 }
4965 cc.GatherRequiredFilesForTest(fs)
4966
4967 ctx := android.NewTestArchContext()
4968 ctx.RegisterModuleType("apex", BundleFactory)
4969 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4970 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004971 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004972 cc.RegisterRequiredBuildComponentsForTest(ctx)
4973 java.RegisterJavaBuildComponents(ctx)
4974 java.RegisterSystemModulesBuildComponents(ctx)
4975 java.RegisterAppBuildComponents(ctx)
4976 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004977 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4978 ctx.PreDepsMutators(RegisterPreDepsMutators)
4979 ctx.PostDepsMutators(RegisterPostDepsMutators)
4980
4981 config := android.TestArchConfig(buildDir, nil, bp, fs)
4982 ctx.Register(config)
4983
4984 _ = dexpreopt.GlobalSoongConfigForTests(config)
4985 dexpreopt.RegisterToolModulesForTest(ctx)
4986 pathCtx := android.PathContextForTesting(config)
4987 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4988 transformDexpreoptConfig(dexpreoptConfig)
4989 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4990
4991 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4992 android.FailIfErrored(t, errs)
4993
4994 _, errs = ctx.PrepareBuildActions(config)
4995 if errmsg == "" {
4996 android.FailIfErrored(t, errs)
4997 } else if len(errs) > 0 {
4998 android.FailIfNoMatchingErrors(t, errmsg, errs)
4999 return
5000 } else {
5001 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5002 }
5003}
5004
Jooyung Han548640b2020-04-27 12:10:30 +09005005func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5006 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5007 apex {
5008 name: "myapex",
5009 key: "myapex.key",
5010 updatable: true,
5011 }
5012
5013 apex_key {
5014 name: "myapex.key",
5015 public_key: "testkey.avbpubkey",
5016 private_key: "testkey.pem",
5017 }
5018 `)
5019}
5020
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005021func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005022
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005023 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005024 var transform func(*dexpreopt.GlobalConfig)
5025
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005026 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5027 transform = func(config *dexpreopt.GlobalConfig) {
5028 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
5029 }
5030 testNoUpdatableJarsInBootImage(t, "", transform)
5031 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005032
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005033 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005034 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 +01005035 transform = func(config *dexpreopt.GlobalConfig) {
5036 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5037 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005038 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005039 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005040
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005041 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 -07005042 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 +01005043 transform = func(config *dexpreopt.GlobalConfig) {
5044 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5045 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005046 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005047 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005048
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005049 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 -07005050 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005051 transform = func(config *dexpreopt.GlobalConfig) {
5052 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5053 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005054 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005055 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005056
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005057 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 -07005058 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 +01005059 transform = func(config *dexpreopt.GlobalConfig) {
5060 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5061 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005062 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005063 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005064
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005065 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5066 transform = func(config *dexpreopt.GlobalConfig) {
5067 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5068 }
5069 testNoUpdatableJarsInBootImage(t, "", transform)
5070 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005071
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005072 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005073 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005074 transform = func(config *dexpreopt.GlobalConfig) {
5075 config.ArtApexJars = []string{"platform:nonexistent"}
5076 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005077 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005078 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005079
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005080 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005081 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005082 transform = func(config *dexpreopt.GlobalConfig) {
5083 config.BootJars = []string{"platform:nonexistent"}
5084 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005085 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005086 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005087
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005088 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005089 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005090 transform = func(config *dexpreopt.GlobalConfig) {
5091 config.ArtApexJars = []string{"platform:some-platform-lib"}
5092 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005093 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005094 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005095
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005096 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5097 transform = func(config *dexpreopt.GlobalConfig) {
5098 config.BootJars = []string{"platform:some-platform-lib"}
5099 }
5100 testNoUpdatableJarsInBootImage(t, "", transform)
5101 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005102}
5103
Jiyong Park62304bb2020-04-13 16:19:48 +09005104func TestTestFor(t *testing.T) {
5105 ctx, _ := testApex(t, `
5106 apex {
5107 name: "myapex",
5108 key: "myapex.key",
5109 native_shared_libs: ["mylib", "myprivlib"],
5110 }
5111
5112 apex_key {
5113 name: "myapex.key",
5114 public_key: "testkey.avbpubkey",
5115 private_key: "testkey.pem",
5116 }
5117
5118 cc_library {
5119 name: "mylib",
5120 srcs: ["mylib.cpp"],
5121 system_shared_libs: [],
5122 stl: "none",
5123 stubs: {
5124 versions: ["1"],
5125 },
5126 apex_available: ["myapex"],
5127 }
5128
5129 cc_library {
5130 name: "myprivlib",
5131 srcs: ["mylib.cpp"],
5132 system_shared_libs: [],
5133 stl: "none",
5134 apex_available: ["myapex"],
5135 }
5136
5137
5138 cc_test {
5139 name: "mytest",
5140 gtest: false,
5141 srcs: ["mylib.cpp"],
5142 system_shared_libs: [],
5143 stl: "none",
5144 shared_libs: ["mylib", "myprivlib"],
5145 test_for: ["myapex"]
5146 }
5147 `)
5148
5149 // the test 'mytest' is a test for the apex, therefore is linked to the
5150 // actual implementation of mylib instead of its stub.
5151 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5152 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5153 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5154}
5155
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005156// TODO(jungjw): Move this to proptools
5157func intPtr(i int) *int {
5158 return &i
5159}
5160
5161func TestApexSet(t *testing.T) {
5162 ctx, config := testApex(t, `
5163 apex_set {
5164 name: "myapex",
5165 set: "myapex.apks",
5166 filename: "foo_v2.apex",
5167 overrides: ["foo"],
5168 }
5169 `, func(fs map[string][]byte, config android.Config) {
5170 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5171 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5172 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5173 })
5174
5175 m := ctx.ModuleForTests("myapex", "android_common")
5176
5177 // Check extract_apks tool parameters.
5178 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5179 actual := extractedApex.Args["abis"]
5180 expected := "ARMEABI_V7A,ARM64_V8A"
5181 if actual != expected {
5182 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5183 }
5184 actual = extractedApex.Args["sdk-version"]
5185 expected = "30"
5186 if actual != expected {
5187 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5188 }
5189
5190 a := m.Module().(*ApexSet)
5191 expectedOverrides := []string{"foo"}
5192 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5193 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5194 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5195 }
5196}
5197
Jiyong Park7d95a512020-05-10 15:16:24 +09005198func TestNoStaticLinkingToStubsLib(t *testing.T) {
5199 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5200 apex {
5201 name: "myapex",
5202 key: "myapex.key",
5203 native_shared_libs: ["mylib"],
5204 }
5205
5206 apex_key {
5207 name: "myapex.key",
5208 public_key: "testkey.avbpubkey",
5209 private_key: "testkey.pem",
5210 }
5211
5212 cc_library {
5213 name: "mylib",
5214 srcs: ["mylib.cpp"],
5215 static_libs: ["otherlib"],
5216 system_shared_libs: [],
5217 stl: "none",
5218 apex_available: [ "myapex" ],
5219 }
5220
5221 cc_library {
5222 name: "otherlib",
5223 srcs: ["mylib.cpp"],
5224 system_shared_libs: [],
5225 stl: "none",
5226 stubs: {
5227 versions: ["1", "2", "3"],
5228 },
5229 apex_available: [ "myapex" ],
5230 }
5231 `)
5232}
5233
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005234func TestApexKeysTxt(t *testing.T) {
5235 ctx, _ := testApex(t, `
5236 apex {
5237 name: "myapex",
5238 key: "myapex.key",
5239 }
5240
5241 apex_key {
5242 name: "myapex.key",
5243 public_key: "testkey.avbpubkey",
5244 private_key: "testkey.pem",
5245 }
5246
5247 prebuilt_apex {
5248 name: "myapex",
5249 prefer: true,
5250 arch: {
5251 arm64: {
5252 src: "myapex-arm64.apex",
5253 },
5254 arm: {
5255 src: "myapex-arm.apex",
5256 },
5257 },
5258 }
5259
5260 apex_set {
5261 name: "myapex_set",
5262 set: "myapex.apks",
5263 filename: "myapex_set.apex",
5264 overrides: ["myapex"],
5265 }
5266 `)
5267
5268 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5269 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5270 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
5271 ensureNotContains(t, content, "myapex.apex")
5272}
5273
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005274func TestMain(m *testing.M) {
5275 run := func() int {
5276 setUp()
5277 defer tearDown()
5278
5279 return m.Run()
5280 }
5281
5282 os.Exit(run())
5283}