blob: 29bd087c6ac3a8b36ab4b6b6106059baf0f27806 [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"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090032 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090033)
34
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070035var buildDir string
36
Jooyung Hand3639552019-08-09 12:57:43 +090037// names returns name list from white space separated string
38func names(s string) (ns []string) {
39 for _, n := range strings.Split(s, " ") {
40 if len(n) > 0 {
41 ns = append(ns, n)
42 }
43 }
44 return
45}
46
Jooyung Han344d5432019-08-23 11:17:39 +090047func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
48 t.Helper()
49 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090050 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
51 if len(errs) > 0 {
52 android.FailIfNoMatchingErrors(t, pattern, errs)
53 return
54 }
55 _, errs = ctx.PrepareBuildActions(config)
56 if len(errs) > 0 {
57 android.FailIfNoMatchingErrors(t, pattern, errs)
58 return
59 }
60
61 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
62}
63
Jooyung Han344d5432019-08-23 11:17:39 +090064func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
65 t.Helper()
66 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090067 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
68 android.FailIfErrored(t, errs)
69 _, errs = ctx.PrepareBuildActions(config)
70 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070071 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090072}
73
Jooyung Han344d5432019-08-23 11:17:39 +090074type testCustomizer func(fs map[string][]byte, config android.Config)
75
76func withFiles(files map[string][]byte) testCustomizer {
77 return func(fs map[string][]byte, config android.Config) {
78 for k, v := range files {
79 fs[k] = v
80 }
81 }
82}
83
84func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
85 return func(fs map[string][]byte, config android.Config) {
86 for k, v := range targets {
87 config.Targets[k] = v
88 }
89 }
90}
91
Jooyung Han35155c42020-02-06 17:33:20 +090092// withNativeBridgeTargets sets configuration with targets including:
93// - X86_64 (primary)
94// - X86 (secondary)
95// - Arm64 on X86_64 (native bridge)
96// - Arm on X86 (native bridge)
97func withNativeBridgeEnabled(fs map[string][]byte, config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108}
109
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900110func withManifestPackageNameOverrides(specs []string) testCustomizer {
111 return func(fs map[string][]byte, config android.Config) {
112 config.TestProductVariables.ManifestPackageNameOverrides = specs
113 }
114}
115
Jooyung Han31c470b2019-10-18 16:26:59 +0900116func withBinder32bit(fs map[string][]byte, config android.Config) {
117 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
118}
119
Jiyong Park7cd10e32020-01-14 09:22:18 +0900120func withUnbundledBuild(fs map[string][]byte, config android.Config) {
121 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
122}
123
Jooyung Han344d5432019-08-23 11:17:39 +0900124func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900125 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900126
127 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900128 filegroup {
129 name: "myapex-file_contexts",
130 srcs: [
131 "system/sepolicy/apex/myapex-file_contexts",
132 ],
133 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900134 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800135
Colin Crossf9aabd72020-02-15 11:29:50 -0800136 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
137
Dario Frenicde2a032019-10-27 00:29:22 +0100138 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900139
Jooyung Han344d5432019-08-23 11:17:39 +0900140 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900141 "a.java": nil,
142 "PrebuiltAppFoo.apk": nil,
143 "PrebuiltAppFooPriv.apk": nil,
144 "build/make/target/product/security": nil,
145 "apex_manifest.json": nil,
146 "AndroidManifest.xml": nil,
147 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900148 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900149 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900150 "system/sepolicy/apex/otherapex-file_contexts": nil,
151 "system/sepolicy/apex/commonapex-file_contexts": nil,
152 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800153 "mylib.cpp": nil,
154 "mylib_common.cpp": nil,
155 "mytest.cpp": nil,
156 "mytest1.cpp": nil,
157 "mytest2.cpp": nil,
158 "mytest3.cpp": nil,
159 "myprebuilt": nil,
160 "my_include": nil,
161 "foo/bar/MyClass.java": nil,
162 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100163 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800164 "vendor/foo/devkeys/test.x509.pem": nil,
165 "vendor/foo/devkeys/test.pk8": nil,
166 "testkey.x509.pem": nil,
167 "testkey.pk8": nil,
168 "testkey.override.x509.pem": nil,
169 "testkey.override.pk8": nil,
170 "vendor/foo/devkeys/testkey.avbpubkey": nil,
171 "vendor/foo/devkeys/testkey.pem": nil,
172 "NOTICE": nil,
173 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900174 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800175 "testkey2.avbpubkey": nil,
176 "testkey2.pem": nil,
177 "myapex-arm64.apex": nil,
178 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700179 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800180 "frameworks/base/api/current.txt": nil,
181 "framework/aidl/a.aidl": nil,
182 "build/make/core/proguard.flags": nil,
183 "build/make/core/proguard_basic_keeps.flags": nil,
184 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700185 "baz": nil,
186 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700187 "testdata/baz": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900188 }
189
Colin Crossf9aabd72020-02-15 11:29:50 -0800190 cc.GatherRequiredFilesForTest(fs)
191
Jooyung Han344d5432019-08-23 11:17:39 +0900192 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800193 // The fs now needs to be populated before creating the config, call handlers twice
194 // for now, once to get any fs changes, and later after the config was created to
195 // set product variables or targets.
196 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
197 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900198 }
199
Colin Cross98be1bb2019-12-13 20:41:13 -0800200 config := android.TestArchConfig(buildDir, nil, bp, fs)
201 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
202 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
203 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
204 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
205 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
206 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
207
208 for _, handler := range handlers {
209 // The fs now needs to be populated before creating the config, call handlers twice
210 // for now, earlier to get any fs changes, and now after the config was created to
211 // set product variables or targets.
212 tempFS := map[string][]byte{}
213 handler(tempFS, config)
214 }
215
216 ctx := android.NewTestArchContext()
217 ctx.RegisterModuleType("apex", BundleFactory)
218 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
219 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
220 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
221 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
222 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
223 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700224 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800225
Jooyung Hana57af4a2020-01-23 05:36:59 +0000226 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
227 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
228
Paul Duffin77980a82019-12-19 16:01:36 +0000229 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800230 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800231 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
232 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800233 ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000234 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235 ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800236 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000237 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000238 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000239 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900240 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800241
Colin Cross98be1bb2019-12-13 20:41:13 -0800242 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800243 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800244
245 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246
Jooyung Han5c998b92019-06-27 11:30:33 +0900247 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900248}
249
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700250func setUp() {
251 var err error
252 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900253 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700254 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900255 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900256}
257
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700258func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259 os.RemoveAll(buildDir)
260}
261
Jooyung Han643adc42020-02-27 13:50:06 +0900262// ensure that 'result' equals 'expected'
263func ensureEquals(t *testing.T, result string, expected string) {
264 t.Helper()
265 if result != expected {
266 t.Errorf("%q != %q", expected, result)
267 }
268}
269
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270// ensure that 'result' contains 'expected'
271func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900272 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273 if !strings.Contains(result, expected) {
274 t.Errorf("%q is not found in %q", expected, result)
275 }
276}
277
Liz Kammer5bd365f2020-05-27 15:15:11 -0700278// ensure that 'result' contains 'expected' exactly one time
279func ensureContainsOnce(t *testing.T, result string, expected string) {
280 t.Helper()
281 count := strings.Count(result, expected)
282 if count != 1 {
283 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287// ensures that 'result' does not contain 'notExpected'
288func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if strings.Contains(result, notExpected) {
291 t.Errorf("%q is found in %q", notExpected, result)
292 }
293}
294
295func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900296 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297 if !android.InList(expected, result) {
298 t.Errorf("%q is not found in %v", expected, result)
299 }
300}
301
302func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900303 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900304 if android.InList(notExpected, result) {
305 t.Errorf("%q is found in %v", notExpected, result)
306 }
307}
308
Jooyung Hane1633032019-08-01 17:41:43 +0900309func ensureListEmpty(t *testing.T, result []string) {
310 t.Helper()
311 if len(result) > 0 {
312 t.Errorf("%q is expected to be empty", result)
313 }
314}
315
Jiyong Park25fc6a92018-11-18 18:02:45 +0900316// Minimal test
317func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700318 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900319 apex_defaults {
320 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900321 manifest: ":myapex.manifest",
322 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 key: "myapex.key",
324 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800325 multilib: {
326 both: {
327 binaries: ["foo",],
328 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900329 },
Jooyung Han5a80d9f2019-12-23 15:38:34 +0900330 java_libs: ["myjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
357 shared_libs: ["mylib2"],
358 system_shared_libs: [],
359 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000360 // TODO: remove //apex_available:platform
361 apex_available: [
362 "//apex_available:platform",
363 "myapex",
364 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900365 }
366
Alex Light3d673592019-01-18 14:37:31 -0800367 cc_binary {
368 name: "foo",
369 srcs: ["mylib.cpp"],
370 compile_multilib: "both",
371 multilib: {
372 lib32: {
373 suffix: "32",
374 },
375 lib64: {
376 suffix: "64",
377 },
378 },
379 symlinks: ["foo_link_"],
380 symlink_preferred_arch: true,
381 system_shared_libs: [],
382 static_executable: true,
383 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000384 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800385 }
386
Paul Duffindddd5462020-04-07 15:25:44 +0100387 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900388 name: "mylib2",
389 srcs: ["mylib.cpp"],
390 system_shared_libs: [],
391 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900392 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900393 static_libs: ["libstatic"],
394 // TODO: remove //apex_available:platform
395 apex_available: [
396 "//apex_available:platform",
397 "myapex",
398 ],
399 }
400
Paul Duffindddd5462020-04-07 15:25:44 +0100401 cc_prebuilt_library_shared {
402 name: "mylib2",
403 srcs: ["prebuilt.so"],
404 // TODO: remove //apex_available:platform
405 apex_available: [
406 "//apex_available:platform",
407 "myapex",
408 ],
409 }
410
Jiyong Park9918e1a2020-03-17 19:16:40 +0900411 cc_library_static {
412 name: "libstatic",
413 srcs: ["mylib.cpp"],
414 system_shared_libs: [],
415 stl: "none",
416 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000417 // TODO: remove //apex_available:platform
418 apex_available: [
419 "//apex_available:platform",
420 "myapex",
421 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900422 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900423
424 java_library {
425 name: "myjar",
426 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900427 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900428 sdk_version: "none",
429 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900430 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900431 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000432 // TODO: remove //apex_available:platform
433 apex_available: [
434 "//apex_available:platform",
435 "myapex",
436 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900437 }
438
439 java_library {
440 name: "myotherjar",
441 srcs: ["foo/bar/MyClass.java"],
442 sdk_version: "none",
443 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900449 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900450
451 java_library {
452 name: "mysharedjar",
453 srcs: ["foo/bar/MyClass.java"],
454 sdk_version: "none",
455 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900456 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900457 `)
458
Sundong Ahnabb64432019-10-22 13:58:29 +0900459 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900460
461 optFlags := apexRule.Args["opt_flags"]
462 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700463 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900464 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900465
Jiyong Park25fc6a92018-11-18 18:02:45 +0900466 copyCmds := apexRule.Args["copy_commands"]
467
468 // Ensure that main rule creates an output
469 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
470
471 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800472 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900473 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474
475 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800476 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900478
479 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800480 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
481 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 // .. but not for java libs
484 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900485 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800486
Colin Cross7113d202019-11-20 16:39:12 -0800487 // Ensure that the platform variant ends with _shared or _common
488 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
489 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
491 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900492 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
493
494 // Ensure that dynamic dependency to java libs are not included
495 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800496
497 // Ensure that all symlinks are present.
498 found_foo_link_64 := false
499 found_foo := false
500 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900501 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800502 if strings.HasSuffix(cmd, "bin/foo") {
503 found_foo = true
504 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
505 found_foo_link_64 = true
506 }
507 }
508 }
509 good := found_foo && found_foo_link_64
510 if !good {
511 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
512 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900513
Sundong Ahnabb64432019-10-22 13:58:29 +0900514 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700515 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900516 if len(noticeInputs) != 3 {
517 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900518 }
519 ensureListContains(t, noticeInputs, "NOTICE")
520 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900521 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900522
Artur Satayeva8bd1132020-04-27 18:07:06 +0100523 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100524 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
525 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
526 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
527 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
528 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100529
530 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100531 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
532 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
533 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
534 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
535 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800536}
537
Jooyung Hanf21c7972019-12-16 22:32:06 +0900538func TestDefaults(t *testing.T) {
539 ctx, _ := testApex(t, `
540 apex_defaults {
541 name: "myapex-defaults",
542 key: "myapex.key",
543 prebuilts: ["myetc"],
544 native_shared_libs: ["mylib"],
545 java_libs: ["myjar"],
546 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900547 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900548 }
549
550 prebuilt_etc {
551 name: "myetc",
552 src: "myprebuilt",
553 }
554
555 apex {
556 name: "myapex",
557 defaults: ["myapex-defaults"],
558 }
559
560 apex_key {
561 name: "myapex.key",
562 public_key: "testkey.avbpubkey",
563 private_key: "testkey.pem",
564 }
565
566 cc_library {
567 name: "mylib",
568 system_shared_libs: [],
569 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000570 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900571 }
572
573 java_library {
574 name: "myjar",
575 srcs: ["foo/bar/MyClass.java"],
576 sdk_version: "none",
577 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000578 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900579 }
580
581 android_app {
582 name: "AppFoo",
583 srcs: ["foo/bar/MyClass.java"],
584 sdk_version: "none",
585 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000586 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900587 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900588
589 runtime_resource_overlay {
590 name: "rro",
591 theme: "blue",
592 }
593
Jooyung Hanf21c7972019-12-16 22:32:06 +0900594 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000595 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900596 "etc/myetc",
597 "javalib/myjar.jar",
598 "lib64/mylib.so",
599 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900600 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900601 })
602}
603
Jooyung Han01a3ee22019-11-02 02:52:25 +0900604func TestApexManifest(t *testing.T) {
605 ctx, _ := testApex(t, `
606 apex {
607 name: "myapex",
608 key: "myapex.key",
609 }
610
611 apex_key {
612 name: "myapex.key",
613 public_key: "testkey.avbpubkey",
614 private_key: "testkey.pem",
615 }
616 `)
617
618 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900619 args := module.Rule("apexRule").Args
620 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
621 t.Error("manifest should be apex_manifest.pb, but " + manifest)
622 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900623}
624
Alex Light5098a612018-11-29 17:12:15 -0800625func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700626 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800627 apex {
628 name: "myapex",
629 key: "myapex.key",
630 payload_type: "zip",
631 native_shared_libs: ["mylib"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 srcs: ["mylib.cpp"],
643 shared_libs: ["mylib2"],
644 system_shared_libs: [],
645 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000646 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800647 }
648
649 cc_library {
650 name: "mylib2",
651 srcs: ["mylib.cpp"],
652 system_shared_libs: [],
653 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000654 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800655 }
656 `)
657
Sundong Ahnabb64432019-10-22 13:58:29 +0900658 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800659 copyCmds := zipApexRule.Args["copy_commands"]
660
661 // Ensure that main rule creates an output
662 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
663
664 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800665 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800666
667 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800668 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800669
670 // Ensure that both direct and indirect deps are copied into apex
671 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
672 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900673}
674
675func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700676 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900677 apex {
678 name: "myapex",
679 key: "myapex.key",
680 native_shared_libs: ["mylib", "mylib3"],
681 }
682
683 apex_key {
684 name: "myapex.key",
685 public_key: "testkey.avbpubkey",
686 private_key: "testkey.pem",
687 }
688
689 cc_library {
690 name: "mylib",
691 srcs: ["mylib.cpp"],
692 shared_libs: ["mylib2", "mylib3"],
693 system_shared_libs: [],
694 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000695 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900696 }
697
698 cc_library {
699 name: "mylib2",
700 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900701 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900702 system_shared_libs: [],
703 stl: "none",
704 stubs: {
705 versions: ["1", "2", "3"],
706 },
707 }
708
709 cc_library {
710 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900711 srcs: ["mylib.cpp"],
712 shared_libs: ["mylib4"],
713 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900714 stl: "none",
715 stubs: {
716 versions: ["10", "11", "12"],
717 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000718 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900719 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900720
721 cc_library {
722 name: "mylib4",
723 srcs: ["mylib.cpp"],
724 system_shared_libs: [],
725 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000726 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900727 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728 `)
729
Sundong Ahnabb64432019-10-22 13:58:29 +0900730 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900731 copyCmds := apexRule.Args["copy_commands"]
732
733 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800734 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900735
736 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800737 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900738
739 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800740 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900741
Colin Cross7113d202019-11-20 16:39:12 -0800742 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900743
744 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900745 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900746 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900747 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748
749 // 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 -0800750 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900751 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800752 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900753
754 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900755 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900756 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900757
758 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900759 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900760
Jooyung Hana57af4a2020-01-23 05:36:59 +0000761 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900762 "lib64/mylib.so",
763 "lib64/mylib3.so",
764 "lib64/mylib4.so",
765 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900766}
767
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900768func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700769 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900770 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900771 name: "myapex2",
772 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900773 native_shared_libs: ["mylib"],
774 }
775
776 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900777 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900778 public_key: "testkey.avbpubkey",
779 private_key: "testkey.pem",
780 }
781
782 cc_library {
783 name: "mylib",
784 srcs: ["mylib.cpp"],
785 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900786 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900787 system_shared_libs: [],
788 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000789 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900790 }
791
792 cc_library {
793 name: "libfoo",
794 srcs: ["mylib.cpp"],
795 shared_libs: ["libbar"],
796 system_shared_libs: [],
797 stl: "none",
798 stubs: {
799 versions: ["10", "20", "30"],
800 },
801 }
802
803 cc_library {
804 name: "libbar",
805 srcs: ["mylib.cpp"],
806 system_shared_libs: [],
807 stl: "none",
808 }
809
Jiyong Park678c8812020-02-07 17:25:49 +0900810 cc_library_static {
811 name: "libbaz",
812 srcs: ["mylib.cpp"],
813 system_shared_libs: [],
814 stl: "none",
815 apex_available: [ "myapex2" ],
816 }
817
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900818 `)
819
Jiyong Park83dc74b2020-01-14 18:38:44 +0900820 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900821 copyCmds := apexRule.Args["copy_commands"]
822
823 // Ensure that direct non-stubs dep is always included
824 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
825
826 // Ensure that indirect stubs dep is not included
827 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
828
829 // Ensure that dependency of stubs is not included
830 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
831
Jiyong Park83dc74b2020-01-14 18:38:44 +0900832 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900833
834 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900835 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900836 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900837 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900838
Jiyong Park3ff16992019-12-27 14:11:47 +0900839 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900840
841 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
842 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900843
Artur Satayeva8bd1132020-04-27 18:07:06 +0100844 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100845 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
846 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
847 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900848
Artur Satayeva8bd1132020-04-27 18:07:06 +0100849 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100850 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
851 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
852 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900853}
854
Jooyung Hand3639552019-08-09 12:57:43 +0900855func TestApexWithRuntimeLibsDependency(t *testing.T) {
856 /*
857 myapex
858 |
859 v (runtime_libs)
860 mylib ------+------> libfoo [provides stub]
861 |
862 `------> libbar
863 */
864 ctx, _ := testApex(t, `
865 apex {
866 name: "myapex",
867 key: "myapex.key",
868 native_shared_libs: ["mylib"],
869 }
870
871 apex_key {
872 name: "myapex.key",
873 public_key: "testkey.avbpubkey",
874 private_key: "testkey.pem",
875 }
876
877 cc_library {
878 name: "mylib",
879 srcs: ["mylib.cpp"],
880 runtime_libs: ["libfoo", "libbar"],
881 system_shared_libs: [],
882 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900884 }
885
886 cc_library {
887 name: "libfoo",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
891 stubs: {
892 versions: ["10", "20", "30"],
893 },
894 }
895
896 cc_library {
897 name: "libbar",
898 srcs: ["mylib.cpp"],
899 system_shared_libs: [],
900 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000901 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900902 }
903
904 `)
905
Sundong Ahnabb64432019-10-22 13:58:29 +0900906 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900907 copyCmds := apexRule.Args["copy_commands"]
908
909 // Ensure that direct non-stubs dep is always included
910 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
911
912 // Ensure that indirect stubs dep is not included
913 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
914
915 // Ensure that runtime_libs dep in included
916 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
917
Sundong Ahnabb64432019-10-22 13:58:29 +0900918 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900919 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
920 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900921
922}
923
Jooyung Han8ce8db92020-05-15 19:05:05 +0900924func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
925 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
926 bp := `
927 apex {
928 name: "com.android.runtime",
929 key: "com.android.runtime.key",
930 native_shared_libs: ["libc"],
931 }
932
933 apex_key {
934 name: "com.android.runtime.key",
935 public_key: "testkey.avbpubkey",
936 private_key: "testkey.pem",
937 }
938
939 cc_library {
940 name: "libc",
941 no_libcrt: true,
942 nocrt: true,
943 stl: "none",
944 system_shared_libs: [],
945 stubs: { versions: ["1"] },
946 apex_available: ["com.android.runtime"],
947
948 sanitize: {
949 hwaddress: true,
950 }
951 }
952
953 cc_prebuilt_library_shared {
954 name: "libclang_rt.hwasan-aarch64-android",
955 no_libcrt: true,
956 nocrt: true,
957 stl: "none",
958 system_shared_libs: [],
959 srcs: [""],
960 stubs: { versions: ["1"] },
961
962 sanitize: {
963 never: true,
964 },
965 }
966 `
967 // override bp to use hard-coded names: com.android.runtime and libc
968 fs["Android.bp"] = []byte(bp)
969 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
970 })
971
972 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
973 "lib64/bionic/libc.so",
974 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
975 })
976
977 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
978
979 installed := hwasan.Description("install libclang_rt.hwasan")
980 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
981
982 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
983 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
984 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
985}
986
987func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
988 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
989 bp := `
990 apex {
991 name: "com.android.runtime",
992 key: "com.android.runtime.key",
993 native_shared_libs: ["libc"],
994 }
995
996 apex_key {
997 name: "com.android.runtime.key",
998 public_key: "testkey.avbpubkey",
999 private_key: "testkey.pem",
1000 }
1001
1002 cc_library {
1003 name: "libc",
1004 no_libcrt: true,
1005 nocrt: true,
1006 stl: "none",
1007 system_shared_libs: [],
1008 stubs: { versions: ["1"] },
1009 apex_available: ["com.android.runtime"],
1010 }
1011
1012 cc_prebuilt_library_shared {
1013 name: "libclang_rt.hwasan-aarch64-android",
1014 no_libcrt: true,
1015 nocrt: true,
1016 stl: "none",
1017 system_shared_libs: [],
1018 srcs: [""],
1019 stubs: { versions: ["1"] },
1020
1021 sanitize: {
1022 never: true,
1023 },
1024 }
1025 `
1026 // override bp to use hard-coded names: com.android.runtime and libc
1027 fs["Android.bp"] = []byte(bp)
1028 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1029
1030 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1031 })
1032
1033 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1034 "lib64/bionic/libc.so",
1035 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1036 })
1037
1038 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1039
1040 installed := hwasan.Description("install libclang_rt.hwasan")
1041 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1042
1043 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1044 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1045 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1046}
1047
Jooyung Han61b66e92020-03-21 14:21:46 +00001048func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1049 testcases := []struct {
1050 name string
1051 minSdkVersion string
1052 shouldLink string
1053 shouldNotLink []string
1054 }{
1055 {
Jooyung Han75568392020-03-20 04:29:24 +09001056 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001057 minSdkVersion: "current",
1058 shouldLink: "30",
1059 shouldNotLink: []string{"29"},
1060 },
1061 {
1062 name: "should link to llndk#29",
1063 minSdkVersion: "29",
1064 shouldLink: "29",
1065 shouldNotLink: []string{"30"},
1066 },
1067 }
1068 for _, tc := range testcases {
1069 t.Run(tc.name, func(t *testing.T) {
1070 ctx, _ := testApex(t, `
1071 apex {
1072 name: "myapex",
1073 key: "myapex.key",
1074 use_vendor: true,
1075 native_shared_libs: ["mylib"],
1076 min_sdk_version: "`+tc.minSdkVersion+`",
1077 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001078
Jooyung Han61b66e92020-03-21 14:21:46 +00001079 apex_key {
1080 name: "myapex.key",
1081 public_key: "testkey.avbpubkey",
1082 private_key: "testkey.pem",
1083 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001084
Jooyung Han61b66e92020-03-21 14:21:46 +00001085 cc_library {
1086 name: "mylib",
1087 srcs: ["mylib.cpp"],
1088 vendor_available: true,
1089 shared_libs: ["libbar"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 apex_available: [ "myapex" ],
1093 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001094
Jooyung Han61b66e92020-03-21 14:21:46 +00001095 cc_library {
1096 name: "libbar",
1097 srcs: ["mylib.cpp"],
1098 system_shared_libs: [],
1099 stl: "none",
1100 stubs: { versions: ["29","30"] },
1101 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001102
Jooyung Han61b66e92020-03-21 14:21:46 +00001103 llndk_library {
1104 name: "libbar",
1105 symbol_file: "",
1106 }
1107 `, func(fs map[string][]byte, config android.Config) {
1108 setUseVendorWhitelistForTest(config, []string{"myapex"})
1109 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001110
Jooyung Han61b66e92020-03-21 14:21:46 +00001111 // Ensure that LLNDK dep is not included
1112 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1113 "lib64/mylib.so",
1114 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001115
Jooyung Han61b66e92020-03-21 14:21:46 +00001116 // Ensure that LLNDK dep is required
1117 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1118 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1119 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001120
Jooyung Han61b66e92020-03-21 14:21:46 +00001121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1122 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1123 for _, ver := range tc.shouldNotLink {
1124 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1125 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001126
Jooyung Han61b66e92020-03-21 14:21:46 +00001127 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1128 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1129 })
1130 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001131}
1132
Jiyong Park25fc6a92018-11-18 18:02:45 +09001133func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001134 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001135 apex {
1136 name: "myapex",
1137 key: "myapex.key",
1138 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1139 }
1140
1141 apex_key {
1142 name: "myapex.key",
1143 public_key: "testkey.avbpubkey",
1144 private_key: "testkey.pem",
1145 }
1146
1147 cc_library {
1148 name: "mylib",
1149 srcs: ["mylib.cpp"],
1150 shared_libs: ["libdl#27"],
1151 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001152 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001153 }
1154
1155 cc_library_shared {
1156 name: "mylib_shared",
1157 srcs: ["mylib.cpp"],
1158 shared_libs: ["libdl#27"],
1159 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001160 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001161 }
1162
1163 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001164 name: "libBootstrap",
1165 srcs: ["mylib.cpp"],
1166 stl: "none",
1167 bootstrap: true,
1168 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001169 `)
1170
Sundong Ahnabb64432019-10-22 13:58:29 +09001171 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001172 copyCmds := apexRule.Args["copy_commands"]
1173
1174 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001175 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001176 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1177 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001178
1179 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001180 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001181
Colin Cross7113d202019-11-20 16:39:12 -08001182 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1183 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1184 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001185
1186 // For dependency to libc
1187 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001188 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001189 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001190 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001191 // ... Cflags from stub is correctly exported to mylib
1192 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1193 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1194
1195 // For dependency to libm
1196 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001197 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001198 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001199 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001200 // ... and is not compiling with the stub
1201 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1202 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1203
1204 // For dependency to libdl
1205 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001206 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001207 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001208 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1209 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001210 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001211 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001212 // ... Cflags from stub is correctly exported to mylib
1213 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1214 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001215
1216 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001217 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1218 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1219 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1220 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001221}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001222
Jooyung Han03b51852020-02-26 22:45:42 +09001223func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1224 // there are three links between liba --> libz
1225 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1226 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1227 // 3) (platform) -> liba -> libz : this should be non-stub link
1228 ctx, _ := testApex(t, `
1229 apex {
1230 name: "myapex",
1231 key: "myapex.key",
1232 native_shared_libs: ["libx"],
1233 min_sdk_version: "2",
1234 }
1235
1236 apex {
1237 name: "otherapex",
1238 key: "myapex.key",
1239 native_shared_libs: ["liby"],
1240 min_sdk_version: "3",
1241 }
1242
1243 apex_key {
1244 name: "myapex.key",
1245 public_key: "testkey.avbpubkey",
1246 private_key: "testkey.pem",
1247 }
1248
1249 cc_library {
1250 name: "libx",
1251 shared_libs: ["liba"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 apex_available: [ "myapex" ],
1255 }
1256
1257 cc_library {
1258 name: "liby",
1259 shared_libs: ["liba"],
1260 system_shared_libs: [],
1261 stl: "none",
1262 apex_available: [ "otherapex" ],
1263 }
1264
1265 cc_library {
1266 name: "liba",
1267 shared_libs: ["libz"],
1268 system_shared_libs: [],
1269 stl: "none",
1270 apex_available: [
1271 "//apex_available:anyapex",
1272 "//apex_available:platform",
1273 ],
1274 }
1275
1276 cc_library {
1277 name: "libz",
1278 system_shared_libs: [],
1279 stl: "none",
1280 stubs: {
1281 versions: ["1", "3"],
1282 },
1283 }
1284 `, withUnbundledBuild)
1285
1286 expectLink := func(from, from_variant, to, to_variant string) {
1287 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1288 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1289 }
1290 expectNoLink := func(from, from_variant, to, to_variant string) {
1291 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1292 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1293 }
1294 // platform liba is linked to non-stub version
1295 expectLink("liba", "shared", "libz", "shared")
1296 // liba in myapex is linked to #1
1297 expectLink("liba", "shared_myapex", "libz", "shared_1")
1298 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1299 expectNoLink("liba", "shared_myapex", "libz", "shared")
1300 // liba in otherapex is linked to #3
1301 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1302 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1303 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1304}
1305
Jooyung Hanaed150d2020-04-02 01:41:41 +09001306func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1307 ctx, _ := testApex(t, `
1308 apex {
1309 name: "myapex",
1310 key: "myapex.key",
1311 native_shared_libs: ["libx"],
1312 min_sdk_version: "R",
1313 }
1314
1315 apex_key {
1316 name: "myapex.key",
1317 public_key: "testkey.avbpubkey",
1318 private_key: "testkey.pem",
1319 }
1320
1321 cc_library {
1322 name: "libx",
1323 shared_libs: ["libz"],
1324 system_shared_libs: [],
1325 stl: "none",
1326 apex_available: [ "myapex" ],
1327 }
1328
1329 cc_library {
1330 name: "libz",
1331 system_shared_libs: [],
1332 stl: "none",
1333 stubs: {
1334 versions: ["29", "R"],
1335 },
1336 }
1337 `, func(fs map[string][]byte, config android.Config) {
1338 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1339 })
1340
1341 expectLink := func(from, from_variant, to, to_variant string) {
1342 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1343 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1344 }
1345 expectNoLink := func(from, from_variant, to, to_variant string) {
1346 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1347 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1348 }
1349 // 9000 is quite a magic number.
1350 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1351 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1352 // to distinguish them from finalized and future_api(10000)
1353 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1354 // (refer android/api_levels.go)
1355 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1356 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1357 expectNoLink("libx", "shared_myapex", "libz", "shared")
1358}
1359
Jooyung Han03b51852020-02-26 22:45:42 +09001360func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1361 ctx, _ := testApex(t, `
1362 apex {
1363 name: "myapex",
1364 key: "myapex.key",
1365 native_shared_libs: ["libx"],
1366 }
1367
1368 apex_key {
1369 name: "myapex.key",
1370 public_key: "testkey.avbpubkey",
1371 private_key: "testkey.pem",
1372 }
1373
1374 cc_library {
1375 name: "libx",
1376 shared_libs: ["libz"],
1377 system_shared_libs: [],
1378 stl: "none",
1379 apex_available: [ "myapex" ],
1380 }
1381
1382 cc_library {
1383 name: "libz",
1384 system_shared_libs: [],
1385 stl: "none",
1386 stubs: {
1387 versions: ["1", "2"],
1388 },
1389 }
1390 `)
1391
1392 expectLink := func(from, from_variant, to, to_variant string) {
1393 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1394 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1395 }
1396 expectNoLink := func(from, from_variant, to, to_variant string) {
1397 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1398 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1399 }
1400 expectLink("libx", "shared_myapex", "libz", "shared_2")
1401 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1402 expectNoLink("libx", "shared_myapex", "libz", "shared")
1403}
1404
1405func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1406 ctx, _ := testApex(t, `
1407 apex {
1408 name: "myapex",
1409 key: "myapex.key",
1410 native_shared_libs: ["libx"],
1411 }
1412
1413 apex_key {
1414 name: "myapex.key",
1415 public_key: "testkey.avbpubkey",
1416 private_key: "testkey.pem",
1417 }
1418
1419 cc_library {
1420 name: "libx",
1421 system_shared_libs: [],
1422 stl: "none",
1423 apex_available: [ "myapex" ],
1424 stubs: {
1425 versions: ["1", "2"],
1426 },
1427 }
1428
1429 cc_library {
1430 name: "libz",
1431 shared_libs: ["libx"],
1432 system_shared_libs: [],
1433 stl: "none",
1434 }
1435 `)
1436
1437 expectLink := func(from, from_variant, to, to_variant string) {
1438 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1439 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1440 }
1441 expectNoLink := func(from, from_variant, to, to_variant string) {
1442 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1443 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1444 }
1445 expectLink("libz", "shared", "libx", "shared_2")
1446 expectNoLink("libz", "shared", "libz", "shared_1")
1447 expectNoLink("libz", "shared", "libz", "shared")
1448}
1449
Jooyung Han75568392020-03-20 04:29:24 +09001450func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001451 ctx, _ := testApex(t, `
1452 apex {
1453 name: "myapex",
1454 key: "myapex.key",
1455 native_shared_libs: ["libx"],
1456 min_sdk_version: "29",
1457 }
1458
1459 apex_key {
1460 name: "myapex.key",
1461 public_key: "testkey.avbpubkey",
1462 private_key: "testkey.pem",
1463 }
1464
1465 cc_library {
1466 name: "libx",
1467 shared_libs: ["libbar"],
1468 apex_available: [ "myapex" ],
1469 }
1470
1471 cc_library {
1472 name: "libbar",
1473 stubs: {
1474 versions: ["29", "30"],
1475 },
1476 }
Jooyung Han75568392020-03-20 04:29:24 +09001477 `, func(fs map[string][]byte, config android.Config) {
1478 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1479 })
Jooyung Han03b51852020-02-26 22:45:42 +09001480 expectLink := func(from, from_variant, to, to_variant string) {
1481 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1482 libFlags := ld.Args["libFlags"]
1483 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1484 }
Jooyung Han75568392020-03-20 04:29:24 +09001485 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001486}
1487
Jooyung Han75568392020-03-20 04:29:24 +09001488func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001489 ctx, _ := testApex(t, `
1490 apex {
1491 name: "myapex",
1492 key: "myapex.key",
1493 native_shared_libs: ["libx"],
1494 min_sdk_version: "29",
1495 }
1496
1497 apex_key {
1498 name: "myapex.key",
1499 public_key: "testkey.avbpubkey",
1500 private_key: "testkey.pem",
1501 }
1502
1503 cc_library {
1504 name: "libx",
1505 apex_available: [ "myapex" ],
1506 }
Jooyung Han75568392020-03-20 04:29:24 +09001507 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001508
1509 // ensure apex variant of c++ is linked with static unwinder
1510 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1511 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1512 // note that platform variant is not.
1513 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1514 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001515}
1516
1517func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001518 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
1522 native_shared_libs: ["libx"],
1523 min_sdk_version: "29",
1524 }
1525
1526 apex_key {
1527 name: "myapex.key",
1528 public_key: "testkey.avbpubkey",
1529 private_key: "testkey.pem",
1530 }
1531
1532 cc_library {
1533 name: "libx",
1534 shared_libs: ["libz"],
1535 system_shared_libs: [],
1536 stl: "none",
1537 apex_available: [ "myapex" ],
1538 }
1539
1540 cc_library {
1541 name: "libz",
1542 system_shared_libs: [],
1543 stl: "none",
1544 stubs: {
1545 versions: ["30"],
1546 },
1547 }
Jooyung Han75568392020-03-20 04:29:24 +09001548 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001549
Jooyung Hanaed150d2020-04-02 01:41:41 +09001550 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001551 apex {
1552 name: "myapex",
1553 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001554 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001555 }
1556
1557 apex_key {
1558 name: "myapex.key",
1559 public_key: "testkey.avbpubkey",
1560 private_key: "testkey.pem",
1561 }
1562 `)
1563}
1564
Artur Satayev8cf899a2020-04-15 17:29:42 +01001565func TestJavaStableSdkVersion(t *testing.T) {
1566 testCases := []struct {
1567 name string
1568 expectedError string
1569 bp string
1570 }{
1571 {
1572 name: "Non-updatable apex with non-stable dep",
1573 bp: `
1574 apex {
1575 name: "myapex",
1576 java_libs: ["myjar"],
1577 key: "myapex.key",
1578 }
1579 apex_key {
1580 name: "myapex.key",
1581 public_key: "testkey.avbpubkey",
1582 private_key: "testkey.pem",
1583 }
1584 java_library {
1585 name: "myjar",
1586 srcs: ["foo/bar/MyClass.java"],
1587 sdk_version: "core_platform",
1588 apex_available: ["myapex"],
1589 }
1590 `,
1591 },
1592 {
1593 name: "Updatable apex with stable dep",
1594 bp: `
1595 apex {
1596 name: "myapex",
1597 java_libs: ["myjar"],
1598 key: "myapex.key",
1599 updatable: true,
1600 min_sdk_version: "29",
1601 }
1602 apex_key {
1603 name: "myapex.key",
1604 public_key: "testkey.avbpubkey",
1605 private_key: "testkey.pem",
1606 }
1607 java_library {
1608 name: "myjar",
1609 srcs: ["foo/bar/MyClass.java"],
1610 sdk_version: "current",
1611 apex_available: ["myapex"],
1612 }
1613 `,
1614 },
1615 {
1616 name: "Updatable apex with non-stable dep",
1617 expectedError: "cannot depend on \"myjar\"",
1618 bp: `
1619 apex {
1620 name: "myapex",
1621 java_libs: ["myjar"],
1622 key: "myapex.key",
1623 updatable: true,
1624 }
1625 apex_key {
1626 name: "myapex.key",
1627 public_key: "testkey.avbpubkey",
1628 private_key: "testkey.pem",
1629 }
1630 java_library {
1631 name: "myjar",
1632 srcs: ["foo/bar/MyClass.java"],
1633 sdk_version: "core_platform",
1634 apex_available: ["myapex"],
1635 }
1636 `,
1637 },
1638 {
1639 name: "Updatable apex with non-stable transitive dep",
1640 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1641 bp: `
1642 apex {
1643 name: "myapex",
1644 java_libs: ["myjar"],
1645 key: "myapex.key",
1646 updatable: true,
1647 }
1648 apex_key {
1649 name: "myapex.key",
1650 public_key: "testkey.avbpubkey",
1651 private_key: "testkey.pem",
1652 }
1653 java_library {
1654 name: "myjar",
1655 srcs: ["foo/bar/MyClass.java"],
1656 sdk_version: "current",
1657 apex_available: ["myapex"],
1658 static_libs: ["transitive-jar"],
1659 }
1660 java_library {
1661 name: "transitive-jar",
1662 srcs: ["foo/bar/MyClass.java"],
1663 sdk_version: "core_platform",
1664 apex_available: ["myapex"],
1665 }
1666 `,
1667 },
1668 }
1669
1670 for _, test := range testCases {
1671 t.Run(test.name, func(t *testing.T) {
1672 if test.expectedError == "" {
1673 testApex(t, test.bp)
1674 } else {
1675 testApexError(t, test.expectedError, test.bp)
1676 }
1677 })
1678 }
1679}
1680
Jiyong Park7c2ee712018-12-07 00:42:25 +09001681func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001682 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001683 apex {
1684 name: "myapex",
1685 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001686 native_shared_libs: ["mylib"],
1687 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001688 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001689 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001690 }
1691
1692 apex_key {
1693 name: "myapex.key",
1694 public_key: "testkey.avbpubkey",
1695 private_key: "testkey.pem",
1696 }
1697
1698 prebuilt_etc {
1699 name: "myetc",
1700 src: "myprebuilt",
1701 sub_dir: "foo/bar",
1702 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001703
1704 cc_library {
1705 name: "mylib",
1706 srcs: ["mylib.cpp"],
1707 relative_install_path: "foo/bar",
1708 system_shared_libs: [],
1709 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001710 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001711 }
1712
1713 cc_binary {
1714 name: "mybin",
1715 srcs: ["mylib.cpp"],
1716 relative_install_path: "foo/bar",
1717 system_shared_libs: [],
1718 static_executable: true,
1719 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001720 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001721 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001722 `)
1723
Sundong Ahnabb64432019-10-22 13:58:29 +09001724 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001725 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1726
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001727 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001728 ensureListContains(t, dirs, "etc")
1729 ensureListContains(t, dirs, "etc/foo")
1730 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001731 ensureListContains(t, dirs, "lib64")
1732 ensureListContains(t, dirs, "lib64/foo")
1733 ensureListContains(t, dirs, "lib64/foo/bar")
1734 ensureListContains(t, dirs, "lib")
1735 ensureListContains(t, dirs, "lib/foo")
1736 ensureListContains(t, dirs, "lib/foo/bar")
1737
Jiyong Parkbd13e442019-03-15 18:10:35 +09001738 ensureListContains(t, dirs, "bin")
1739 ensureListContains(t, dirs, "bin/foo")
1740 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001741}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001742
Jooyung Han35155c42020-02-06 17:33:20 +09001743func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1744 ctx, _ := testApex(t, `
1745 apex {
1746 name: "myapex",
1747 key: "myapex.key",
1748 multilib: {
1749 both: {
1750 native_shared_libs: ["mylib"],
1751 binaries: ["mybin"],
1752 },
1753 },
1754 compile_multilib: "both",
1755 native_bridge_supported: true,
1756 }
1757
1758 apex_key {
1759 name: "myapex.key",
1760 public_key: "testkey.avbpubkey",
1761 private_key: "testkey.pem",
1762 }
1763
1764 cc_library {
1765 name: "mylib",
1766 relative_install_path: "foo/bar",
1767 system_shared_libs: [],
1768 stl: "none",
1769 apex_available: [ "myapex" ],
1770 native_bridge_supported: true,
1771 }
1772
1773 cc_binary {
1774 name: "mybin",
1775 relative_install_path: "foo/bar",
1776 system_shared_libs: [],
1777 static_executable: true,
1778 stl: "none",
1779 apex_available: [ "myapex" ],
1780 native_bridge_supported: true,
1781 compile_multilib: "both", // default is "first" for binary
1782 multilib: {
1783 lib64: {
1784 suffix: "64",
1785 },
1786 },
1787 }
1788 `, withNativeBridgeEnabled)
1789 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1790 "bin/foo/bar/mybin",
1791 "bin/foo/bar/mybin64",
1792 "bin/arm/foo/bar/mybin",
1793 "bin/arm64/foo/bar/mybin64",
1794 "lib/foo/bar/mylib.so",
1795 "lib/arm/foo/bar/mylib.so",
1796 "lib64/foo/bar/mylib.so",
1797 "lib64/arm64/foo/bar/mylib.so",
1798 })
1799}
1800
Jiyong Parkda6eb592018-12-19 17:12:36 +09001801func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001802 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001803 apex {
1804 name: "myapex",
1805 key: "myapex.key",
1806 native_shared_libs: ["mylib"],
1807 use_vendor: true,
1808 }
1809
1810 apex_key {
1811 name: "myapex.key",
1812 public_key: "testkey.avbpubkey",
1813 private_key: "testkey.pem",
1814 }
1815
1816 cc_library {
1817 name: "mylib",
1818 srcs: ["mylib.cpp"],
1819 shared_libs: ["mylib2"],
1820 system_shared_libs: [],
1821 vendor_available: true,
1822 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001823 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001824 }
1825
1826 cc_library {
1827 name: "mylib2",
1828 srcs: ["mylib.cpp"],
1829 system_shared_libs: [],
1830 vendor_available: true,
1831 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001832 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001833 }
Jooyung Handc782442019-11-01 03:14:38 +09001834 `, func(fs map[string][]byte, config android.Config) {
1835 setUseVendorWhitelistForTest(config, []string{"myapex"})
1836 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001837
1838 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001839 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001840 for _, implicit := range i.Implicits {
1841 inputsList = append(inputsList, implicit.String())
1842 }
1843 }
1844 inputsString := strings.Join(inputsList, " ")
1845
1846 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001847 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1848 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001849
1850 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001851 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1852 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001853}
Jiyong Park16e91a02018-12-20 18:18:08 +09001854
Jooyung Handc782442019-11-01 03:14:38 +09001855func TestUseVendorRestriction(t *testing.T) {
1856 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1857 apex {
1858 name: "myapex",
1859 key: "myapex.key",
1860 use_vendor: true,
1861 }
1862 apex_key {
1863 name: "myapex.key",
1864 public_key: "testkey.avbpubkey",
1865 private_key: "testkey.pem",
1866 }
1867 `, func(fs map[string][]byte, config android.Config) {
1868 setUseVendorWhitelistForTest(config, []string{""})
1869 })
1870 // no error with whitelist
1871 testApex(t, `
1872 apex {
1873 name: "myapex",
1874 key: "myapex.key",
1875 use_vendor: true,
1876 }
1877 apex_key {
1878 name: "myapex.key",
1879 public_key: "testkey.avbpubkey",
1880 private_key: "testkey.pem",
1881 }
1882 `, func(fs map[string][]byte, config android.Config) {
1883 setUseVendorWhitelistForTest(config, []string{"myapex"})
1884 })
1885}
1886
Jooyung Han5c998b92019-06-27 11:30:33 +09001887func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1888 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1889 apex {
1890 name: "myapex",
1891 key: "myapex.key",
1892 native_shared_libs: ["mylib"],
1893 use_vendor: true,
1894 }
1895
1896 apex_key {
1897 name: "myapex.key",
1898 public_key: "testkey.avbpubkey",
1899 private_key: "testkey.pem",
1900 }
1901
1902 cc_library {
1903 name: "mylib",
1904 srcs: ["mylib.cpp"],
1905 system_shared_libs: [],
1906 stl: "none",
1907 }
1908 `)
1909}
1910
Jiyong Park16e91a02018-12-20 18:18:08 +09001911func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001912 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001913 apex {
1914 name: "myapex",
1915 key: "myapex.key",
1916 native_shared_libs: ["mylib"],
1917 }
1918
1919 apex_key {
1920 name: "myapex.key",
1921 public_key: "testkey.avbpubkey",
1922 private_key: "testkey.pem",
1923 }
1924
1925 cc_library {
1926 name: "mylib",
1927 srcs: ["mylib.cpp"],
1928 system_shared_libs: [],
1929 stl: "none",
1930 stubs: {
1931 versions: ["1", "2", "3"],
1932 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001933 apex_available: [
1934 "//apex_available:platform",
1935 "myapex",
1936 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001937 }
1938
1939 cc_binary {
1940 name: "not_in_apex",
1941 srcs: ["mylib.cpp"],
1942 static_libs: ["mylib"],
1943 static_executable: true,
1944 system_shared_libs: [],
1945 stl: "none",
1946 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001947 `)
1948
Colin Cross7113d202019-11-20 16:39:12 -08001949 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001950
1951 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001952 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001953}
Jiyong Park9335a262018-12-24 11:31:58 +09001954
1955func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001956 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001957 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001958 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001959 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001960 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001961 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001962 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001963 }
1964
1965 cc_library {
1966 name: "mylib",
1967 srcs: ["mylib.cpp"],
1968 system_shared_libs: [],
1969 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001970 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001971 }
1972
1973 apex_key {
1974 name: "myapex.key",
1975 public_key: "testkey.avbpubkey",
1976 private_key: "testkey.pem",
1977 }
1978
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001979 android_app_certificate {
1980 name: "myapex.certificate",
1981 certificate: "testkey",
1982 }
1983
1984 android_app_certificate {
1985 name: "myapex.certificate.override",
1986 certificate: "testkey.override",
1987 }
1988
Jiyong Park9335a262018-12-24 11:31:58 +09001989 `)
1990
1991 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001992 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001993
1994 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1995 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1996 "vendor/foo/devkeys/testkey.avbpubkey")
1997 }
1998 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1999 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2000 "vendor/foo/devkeys/testkey.pem")
2001 }
2002
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002003 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002004 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002005 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002006 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002007 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002008 }
2009}
Jiyong Park58e364a2019-01-19 19:24:06 +09002010
Jooyung Hanf121a652019-12-17 14:30:11 +09002011func TestCertificate(t *testing.T) {
2012 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2013 ctx, _ := testApex(t, `
2014 apex {
2015 name: "myapex",
2016 key: "myapex.key",
2017 }
2018 apex_key {
2019 name: "myapex.key",
2020 public_key: "testkey.avbpubkey",
2021 private_key: "testkey.pem",
2022 }`)
2023 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2024 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2025 if actual := rule.Args["certificates"]; actual != expected {
2026 t.Errorf("certificates should be %q, not %q", expected, actual)
2027 }
2028 })
2029 t.Run("override when unspecified", func(t *testing.T) {
2030 ctx, _ := testApex(t, `
2031 apex {
2032 name: "myapex_keytest",
2033 key: "myapex.key",
2034 file_contexts: ":myapex-file_contexts",
2035 }
2036 apex_key {
2037 name: "myapex.key",
2038 public_key: "testkey.avbpubkey",
2039 private_key: "testkey.pem",
2040 }
2041 android_app_certificate {
2042 name: "myapex.certificate.override",
2043 certificate: "testkey.override",
2044 }`)
2045 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2046 expected := "testkey.override.x509.pem testkey.override.pk8"
2047 if actual := rule.Args["certificates"]; actual != expected {
2048 t.Errorf("certificates should be %q, not %q", expected, actual)
2049 }
2050 })
2051 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2052 ctx, _ := testApex(t, `
2053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 certificate: ":myapex.certificate",
2057 }
2058 apex_key {
2059 name: "myapex.key",
2060 public_key: "testkey.avbpubkey",
2061 private_key: "testkey.pem",
2062 }
2063 android_app_certificate {
2064 name: "myapex.certificate",
2065 certificate: "testkey",
2066 }`)
2067 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2068 expected := "testkey.x509.pem testkey.pk8"
2069 if actual := rule.Args["certificates"]; actual != expected {
2070 t.Errorf("certificates should be %q, not %q", expected, actual)
2071 }
2072 })
2073 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2074 ctx, _ := testApex(t, `
2075 apex {
2076 name: "myapex_keytest",
2077 key: "myapex.key",
2078 file_contexts: ":myapex-file_contexts",
2079 certificate: ":myapex.certificate",
2080 }
2081 apex_key {
2082 name: "myapex.key",
2083 public_key: "testkey.avbpubkey",
2084 private_key: "testkey.pem",
2085 }
2086 android_app_certificate {
2087 name: "myapex.certificate.override",
2088 certificate: "testkey.override",
2089 }`)
2090 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2091 expected := "testkey.override.x509.pem testkey.override.pk8"
2092 if actual := rule.Args["certificates"]; actual != expected {
2093 t.Errorf("certificates should be %q, not %q", expected, actual)
2094 }
2095 })
2096 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2097 ctx, _ := testApex(t, `
2098 apex {
2099 name: "myapex",
2100 key: "myapex.key",
2101 certificate: "testkey",
2102 }
2103 apex_key {
2104 name: "myapex.key",
2105 public_key: "testkey.avbpubkey",
2106 private_key: "testkey.pem",
2107 }`)
2108 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2109 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2110 if actual := rule.Args["certificates"]; actual != expected {
2111 t.Errorf("certificates should be %q, not %q", expected, actual)
2112 }
2113 })
2114 t.Run("override when specified as <name>", func(t *testing.T) {
2115 ctx, _ := testApex(t, `
2116 apex {
2117 name: "myapex_keytest",
2118 key: "myapex.key",
2119 file_contexts: ":myapex-file_contexts",
2120 certificate: "testkey",
2121 }
2122 apex_key {
2123 name: "myapex.key",
2124 public_key: "testkey.avbpubkey",
2125 private_key: "testkey.pem",
2126 }
2127 android_app_certificate {
2128 name: "myapex.certificate.override",
2129 certificate: "testkey.override",
2130 }`)
2131 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2132 expected := "testkey.override.x509.pem testkey.override.pk8"
2133 if actual := rule.Args["certificates"]; actual != expected {
2134 t.Errorf("certificates should be %q, not %q", expected, actual)
2135 }
2136 })
2137}
2138
Jiyong Park58e364a2019-01-19 19:24:06 +09002139func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002140 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002141 apex {
2142 name: "myapex",
2143 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002144 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002145 }
2146
2147 apex {
2148 name: "otherapex",
2149 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002150 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002151 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002152 }
2153
2154 apex_key {
2155 name: "myapex.key",
2156 public_key: "testkey.avbpubkey",
2157 private_key: "testkey.pem",
2158 }
2159
2160 cc_library {
2161 name: "mylib",
2162 srcs: ["mylib.cpp"],
2163 system_shared_libs: [],
2164 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002165 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002166 "myapex",
2167 "otherapex",
2168 ],
Jooyung Han24282772020-03-21 23:20:55 +09002169 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002170 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002171 cc_library {
2172 name: "mylib2",
2173 srcs: ["mylib.cpp"],
2174 system_shared_libs: [],
2175 stl: "none",
2176 apex_available: [
2177 "myapex",
2178 "otherapex",
2179 ],
2180 use_apex_name_macro: true,
2181 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002182 `)
2183
Jooyung Hanc87a0592020-03-02 17:44:33 +09002184 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002185 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002186 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002187 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002188
Jooyung Hanccce2f22020-03-07 03:45:53 +09002189 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002190 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2191 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002192 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002193 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002194
Jooyung Hanccce2f22020-03-07 03:45:53 +09002195 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002196 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2197 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002198 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002199 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002200
Jooyung Hanc87a0592020-03-02 17:44:33 +09002201 // When cc_library sets use_apex_name_macro: true
2202 // apex variants define additional macro to distinguish which apex variant it is built for
2203
2204 // non-APEX variant does not have __ANDROID_APEX__ defined
2205 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2206 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2207
2208 // APEX variant has __ANDROID_APEX__ defined
2209 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002210 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002211 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2212 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002213
Jooyung Hanc87a0592020-03-02 17:44:33 +09002214 // APEX variant has __ANDROID_APEX__ defined
2215 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002216 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002217 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2218 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002219
2220 // recovery variant does not set __ANDROID_SDK_VERSION__
2221 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2222 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2223 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002224}
Jiyong Park7e636d02019-01-28 16:16:54 +09002225
2226func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002227 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002228 apex {
2229 name: "myapex",
2230 key: "myapex.key",
2231 native_shared_libs: ["mylib"],
2232 }
2233
2234 apex_key {
2235 name: "myapex.key",
2236 public_key: "testkey.avbpubkey",
2237 private_key: "testkey.pem",
2238 }
2239
2240 cc_library_headers {
2241 name: "mylib_headers",
2242 export_include_dirs: ["my_include"],
2243 system_shared_libs: [],
2244 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002245 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002246 }
2247
2248 cc_library {
2249 name: "mylib",
2250 srcs: ["mylib.cpp"],
2251 system_shared_libs: [],
2252 stl: "none",
2253 header_libs: ["mylib_headers"],
2254 export_header_lib_headers: ["mylib_headers"],
2255 stubs: {
2256 versions: ["1", "2", "3"],
2257 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002258 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002259 }
2260
2261 cc_library {
2262 name: "otherlib",
2263 srcs: ["mylib.cpp"],
2264 system_shared_libs: [],
2265 stl: "none",
2266 shared_libs: ["mylib"],
2267 }
2268 `)
2269
Colin Cross7113d202019-11-20 16:39:12 -08002270 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002271
2272 // Ensure that the include path of the header lib is exported to 'otherlib'
2273 ensureContains(t, cFlags, "-Imy_include")
2274}
Alex Light9670d332019-01-29 18:07:33 -08002275
Jiyong Park7cd10e32020-01-14 09:22:18 +09002276type fileInApex struct {
2277 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002278 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002279 isLink bool
2280}
2281
Jooyung Hana57af4a2020-01-23 05:36:59 +00002282func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002283 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002284 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002285 copyCmds := apexRule.Args["copy_commands"]
2286 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002287 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002288 for _, cmd := range strings.Split(copyCmds, "&&") {
2289 cmd = strings.TrimSpace(cmd)
2290 if cmd == "" {
2291 continue
2292 }
2293 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002294 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002295 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002296 switch terms[0] {
2297 case "mkdir":
2298 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002299 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002300 t.Fatal("copyCmds contains invalid cp command", cmd)
2301 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002302 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002303 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002304 isLink = false
2305 case "ln":
2306 if len(terms) != 3 && len(terms) != 4 {
2307 // ln LINK TARGET or ln -s LINK TARGET
2308 t.Fatal("copyCmds contains invalid ln command", cmd)
2309 }
2310 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002311 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002312 isLink = true
2313 default:
2314 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2315 }
2316 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002317 index := strings.Index(dst, imageApexDir)
2318 if index == -1 {
2319 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2320 }
2321 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002322 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002323 }
2324 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002325 return ret
2326}
2327
Jooyung Hana57af4a2020-01-23 05:36:59 +00002328func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2329 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002330 var failed bool
2331 var surplus []string
2332 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002333 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002334 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002335 for _, expected := range files {
2336 if matched, _ := path.Match(expected, file.path); matched {
2337 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002338 mactchFound = true
2339 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002340 }
2341 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002342 if !mactchFound {
2343 surplus = append(surplus, file.path)
2344 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002345 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002346
Jooyung Han31c470b2019-10-18 16:26:59 +09002347 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002348 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002349 t.Log("surplus files", surplus)
2350 failed = true
2351 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002352
2353 if len(files) > len(filesMatched) {
2354 var missing []string
2355 for _, expected := range files {
2356 if !filesMatched[expected] {
2357 missing = append(missing, expected)
2358 }
2359 }
2360 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002361 t.Log("missing files", missing)
2362 failed = true
2363 }
2364 if failed {
2365 t.Fail()
2366 }
2367}
2368
Jooyung Han344d5432019-08-23 11:17:39 +09002369func TestVndkApexCurrent(t *testing.T) {
2370 ctx, _ := testApex(t, `
2371 apex_vndk {
2372 name: "myapex",
2373 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002374 }
2375
2376 apex_key {
2377 name: "myapex.key",
2378 public_key: "testkey.avbpubkey",
2379 private_key: "testkey.pem",
2380 }
2381
2382 cc_library {
2383 name: "libvndk",
2384 srcs: ["mylib.cpp"],
2385 vendor_available: true,
2386 vndk: {
2387 enabled: true,
2388 },
2389 system_shared_libs: [],
2390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002391 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002392 }
2393
2394 cc_library {
2395 name: "libvndksp",
2396 srcs: ["mylib.cpp"],
2397 vendor_available: true,
2398 vndk: {
2399 enabled: true,
2400 support_system_process: true,
2401 },
2402 system_shared_libs: [],
2403 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002404 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002405 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002406 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002407
Jooyung Hana57af4a2020-01-23 05:36:59 +00002408 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002409 "lib/libvndk.so",
2410 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002411 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002412 "lib64/libvndk.so",
2413 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002414 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002415 "etc/llndk.libraries.VER.txt",
2416 "etc/vndkcore.libraries.VER.txt",
2417 "etc/vndksp.libraries.VER.txt",
2418 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002419 })
Jooyung Han344d5432019-08-23 11:17:39 +09002420}
2421
2422func TestVndkApexWithPrebuilt(t *testing.T) {
2423 ctx, _ := testApex(t, `
2424 apex_vndk {
2425 name: "myapex",
2426 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002427 }
2428
2429 apex_key {
2430 name: "myapex.key",
2431 public_key: "testkey.avbpubkey",
2432 private_key: "testkey.pem",
2433 }
2434
2435 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002436 name: "libvndk",
2437 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002438 vendor_available: true,
2439 vndk: {
2440 enabled: true,
2441 },
2442 system_shared_libs: [],
2443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002444 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002445 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002446
2447 cc_prebuilt_library_shared {
2448 name: "libvndk.arm",
2449 srcs: ["libvndk.arm.so"],
2450 vendor_available: true,
2451 vndk: {
2452 enabled: true,
2453 },
2454 enabled: false,
2455 arch: {
2456 arm: {
2457 enabled: true,
2458 },
2459 },
2460 system_shared_libs: [],
2461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002462 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002463 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002464 `+vndkLibrariesTxtFiles("current"),
2465 withFiles(map[string][]byte{
2466 "libvndk.so": nil,
2467 "libvndk.arm.so": nil,
2468 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002469
Jooyung Hana57af4a2020-01-23 05:36:59 +00002470 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002471 "lib/libvndk.so",
2472 "lib/libvndk.arm.so",
2473 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002474 "lib/libc++.so",
2475 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002476 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002477 })
Jooyung Han344d5432019-08-23 11:17:39 +09002478}
2479
Jooyung Han39edb6c2019-11-06 16:53:07 +09002480func vndkLibrariesTxtFiles(vers ...string) (result string) {
2481 for _, v := range vers {
2482 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002483 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002484 result += `
2485 vndk_libraries_txt {
2486 name: "` + txt + `.libraries.txt",
2487 }
2488 `
2489 }
2490 } else {
2491 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2492 result += `
2493 prebuilt_etc {
2494 name: "` + txt + `.libraries.` + v + `.txt",
2495 src: "dummy.txt",
2496 }
2497 `
2498 }
2499 }
2500 }
2501 return
2502}
2503
Jooyung Han344d5432019-08-23 11:17:39 +09002504func TestVndkApexVersion(t *testing.T) {
2505 ctx, _ := testApex(t, `
2506 apex_vndk {
2507 name: "myapex_v27",
2508 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002509 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002510 vndk_version: "27",
2511 }
2512
2513 apex_key {
2514 name: "myapex.key",
2515 public_key: "testkey.avbpubkey",
2516 private_key: "testkey.pem",
2517 }
2518
Jooyung Han31c470b2019-10-18 16:26:59 +09002519 vndk_prebuilt_shared {
2520 name: "libvndk27",
2521 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002522 vendor_available: true,
2523 vndk: {
2524 enabled: true,
2525 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002526 target_arch: "arm64",
2527 arch: {
2528 arm: {
2529 srcs: ["libvndk27_arm.so"],
2530 },
2531 arm64: {
2532 srcs: ["libvndk27_arm64.so"],
2533 },
2534 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002535 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002536 }
2537
2538 vndk_prebuilt_shared {
2539 name: "libvndk27",
2540 version: "27",
2541 vendor_available: true,
2542 vndk: {
2543 enabled: true,
2544 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002545 target_arch: "x86_64",
2546 arch: {
2547 x86: {
2548 srcs: ["libvndk27_x86.so"],
2549 },
2550 x86_64: {
2551 srcs: ["libvndk27_x86_64.so"],
2552 },
2553 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002554 }
2555 `+vndkLibrariesTxtFiles("27"),
2556 withFiles(map[string][]byte{
2557 "libvndk27_arm.so": nil,
2558 "libvndk27_arm64.so": nil,
2559 "libvndk27_x86.so": nil,
2560 "libvndk27_x86_64.so": nil,
2561 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002562
Jooyung Hana57af4a2020-01-23 05:36:59 +00002563 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002564 "lib/libvndk27_arm.so",
2565 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002566 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002567 })
Jooyung Han344d5432019-08-23 11:17:39 +09002568}
2569
2570func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2571 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2572 apex_vndk {
2573 name: "myapex_v27",
2574 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002575 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002576 vndk_version: "27",
2577 }
2578 apex_vndk {
2579 name: "myapex_v27_other",
2580 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002581 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002582 vndk_version: "27",
2583 }
2584
2585 apex_key {
2586 name: "myapex.key",
2587 public_key: "testkey.avbpubkey",
2588 private_key: "testkey.pem",
2589 }
2590
2591 cc_library {
2592 name: "libvndk",
2593 srcs: ["mylib.cpp"],
2594 vendor_available: true,
2595 vndk: {
2596 enabled: true,
2597 },
2598 system_shared_libs: [],
2599 stl: "none",
2600 }
2601
2602 vndk_prebuilt_shared {
2603 name: "libvndk",
2604 version: "27",
2605 vendor_available: true,
2606 vndk: {
2607 enabled: true,
2608 },
2609 srcs: ["libvndk.so"],
2610 }
2611 `, withFiles(map[string][]byte{
2612 "libvndk.so": nil,
2613 }))
2614}
2615
Jooyung Han90eee022019-10-01 20:02:42 +09002616func TestVndkApexNameRule(t *testing.T) {
2617 ctx, _ := testApex(t, `
2618 apex_vndk {
2619 name: "myapex",
2620 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002621 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002622 }
2623 apex_vndk {
2624 name: "myapex_v28",
2625 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002626 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002627 vndk_version: "28",
2628 }
2629 apex_key {
2630 name: "myapex.key",
2631 public_key: "testkey.avbpubkey",
2632 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002633 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002634
2635 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002636 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002637 actual := proptools.String(bundle.properties.Apex_name)
2638 if !reflect.DeepEqual(actual, expected) {
2639 t.Errorf("Got '%v', expected '%v'", actual, expected)
2640 }
2641 }
2642
2643 assertApexName("com.android.vndk.vVER", "myapex")
2644 assertApexName("com.android.vndk.v28", "myapex_v28")
2645}
2646
Jooyung Han344d5432019-08-23 11:17:39 +09002647func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2648 ctx, _ := testApex(t, `
2649 apex_vndk {
2650 name: "myapex",
2651 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002652 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002653 }
2654
2655 apex_key {
2656 name: "myapex.key",
2657 public_key: "testkey.avbpubkey",
2658 private_key: "testkey.pem",
2659 }
2660
2661 cc_library {
2662 name: "libvndk",
2663 srcs: ["mylib.cpp"],
2664 vendor_available: true,
2665 native_bridge_supported: true,
2666 host_supported: true,
2667 vndk: {
2668 enabled: true,
2669 },
2670 system_shared_libs: [],
2671 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002672 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002673 }
Jooyung Han35155c42020-02-06 17:33:20 +09002674 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002675
Jooyung Hana57af4a2020-01-23 05:36:59 +00002676 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002677 "lib/libvndk.so",
2678 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002679 "lib/libc++.so",
2680 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002681 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002682 })
Jooyung Han344d5432019-08-23 11:17:39 +09002683}
2684
2685func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2686 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2687 apex_vndk {
2688 name: "myapex",
2689 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002690 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002691 native_bridge_supported: true,
2692 }
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",
2711 }
2712 `)
2713}
2714
Jooyung Han31c470b2019-10-18 16:26:59 +09002715func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002716 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002717 apex_vndk {
2718 name: "myapex_v27",
2719 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002720 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002721 vndk_version: "27",
2722 }
2723
2724 apex_key {
2725 name: "myapex.key",
2726 public_key: "testkey.avbpubkey",
2727 private_key: "testkey.pem",
2728 }
2729
2730 vndk_prebuilt_shared {
2731 name: "libvndk27",
2732 version: "27",
2733 target_arch: "arm",
2734 vendor_available: true,
2735 vndk: {
2736 enabled: true,
2737 },
2738 arch: {
2739 arm: {
2740 srcs: ["libvndk27.so"],
2741 }
2742 },
2743 }
2744
2745 vndk_prebuilt_shared {
2746 name: "libvndk27",
2747 version: "27",
2748 target_arch: "arm",
2749 binder32bit: true,
2750 vendor_available: true,
2751 vndk: {
2752 enabled: true,
2753 },
2754 arch: {
2755 arm: {
2756 srcs: ["libvndk27binder32.so"],
2757 }
2758 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002759 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002760 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002761 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002762 withFiles(map[string][]byte{
2763 "libvndk27.so": nil,
2764 "libvndk27binder32.so": nil,
2765 }),
2766 withBinder32bit,
2767 withTargets(map[android.OsType][]android.Target{
2768 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002769 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2770 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002771 },
2772 }),
2773 )
2774
Jooyung Hana57af4a2020-01-23 05:36:59 +00002775 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002776 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002777 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002778 })
2779}
2780
Jooyung Hane1633032019-08-01 17:41:43 +09002781func TestDependenciesInApexManifest(t *testing.T) {
2782 ctx, _ := testApex(t, `
2783 apex {
2784 name: "myapex_nodep",
2785 key: "myapex.key",
2786 native_shared_libs: ["lib_nodep"],
2787 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002788 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002789 }
2790
2791 apex {
2792 name: "myapex_dep",
2793 key: "myapex.key",
2794 native_shared_libs: ["lib_dep"],
2795 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002796 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002797 }
2798
2799 apex {
2800 name: "myapex_provider",
2801 key: "myapex.key",
2802 native_shared_libs: ["libfoo"],
2803 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002804 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002805 }
2806
2807 apex {
2808 name: "myapex_selfcontained",
2809 key: "myapex.key",
2810 native_shared_libs: ["lib_dep", "libfoo"],
2811 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002812 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002813 }
2814
2815 apex_key {
2816 name: "myapex.key",
2817 public_key: "testkey.avbpubkey",
2818 private_key: "testkey.pem",
2819 }
2820
2821 cc_library {
2822 name: "lib_nodep",
2823 srcs: ["mylib.cpp"],
2824 system_shared_libs: [],
2825 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002826 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002827 }
2828
2829 cc_library {
2830 name: "lib_dep",
2831 srcs: ["mylib.cpp"],
2832 shared_libs: ["libfoo"],
2833 system_shared_libs: [],
2834 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002835 apex_available: [
2836 "myapex_dep",
2837 "myapex_provider",
2838 "myapex_selfcontained",
2839 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002840 }
2841
2842 cc_library {
2843 name: "libfoo",
2844 srcs: ["mytest.cpp"],
2845 stubs: {
2846 versions: ["1"],
2847 },
2848 system_shared_libs: [],
2849 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002850 apex_available: [
2851 "myapex_provider",
2852 "myapex_selfcontained",
2853 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002854 }
2855 `)
2856
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002857 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002858 var provideNativeLibs, requireNativeLibs []string
2859
Sundong Ahnabb64432019-10-22 13:58:29 +09002860 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002861 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2862 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002863 ensureListEmpty(t, provideNativeLibs)
2864 ensureListEmpty(t, requireNativeLibs)
2865
Sundong Ahnabb64432019-10-22 13:58:29 +09002866 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002867 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2868 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002869 ensureListEmpty(t, provideNativeLibs)
2870 ensureListContains(t, requireNativeLibs, "libfoo.so")
2871
Sundong Ahnabb64432019-10-22 13:58:29 +09002872 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002873 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2874 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002875 ensureListContains(t, provideNativeLibs, "libfoo.so")
2876 ensureListEmpty(t, requireNativeLibs)
2877
Sundong Ahnabb64432019-10-22 13:58:29 +09002878 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002879 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2880 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002881 ensureListContains(t, provideNativeLibs, "libfoo.so")
2882 ensureListEmpty(t, requireNativeLibs)
2883}
2884
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002885func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002886 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002887 apex {
2888 name: "myapex",
2889 key: "myapex.key",
2890 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002891 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002892 }
2893
2894 apex_key {
2895 name: "myapex.key",
2896 public_key: "testkey.avbpubkey",
2897 private_key: "testkey.pem",
2898 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002899
2900 cc_library {
2901 name: "mylib",
2902 srcs: ["mylib.cpp"],
2903 system_shared_libs: [],
2904 stl: "none",
2905 apex_available: [
2906 "//apex_available:platform",
2907 "myapex",
2908 ],
2909 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002910 `)
2911
Sundong Ahnabb64432019-10-22 13:58:29 +09002912 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002913 apexManifestRule := module.Rule("apexManifestRule")
2914 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2915 apexRule := module.Rule("apexRule")
2916 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002917
2918 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2919 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2920 name := apexBundle.BaseModuleName()
2921 prefix := "TARGET_"
2922 var builder strings.Builder
2923 data.Custom(&builder, name, prefix, "", data)
2924 androidMk := builder.String()
2925 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2926 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002927}
2928
Alex Light0851b882019-02-07 13:20:53 -08002929func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002930 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002931 apex {
2932 name: "myapex",
2933 key: "myapex.key",
2934 native_shared_libs: ["mylib_common"],
2935 }
2936
2937 apex_key {
2938 name: "myapex.key",
2939 public_key: "testkey.avbpubkey",
2940 private_key: "testkey.pem",
2941 }
2942
2943 cc_library {
2944 name: "mylib_common",
2945 srcs: ["mylib.cpp"],
2946 system_shared_libs: [],
2947 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002948 apex_available: [
2949 "//apex_available:platform",
2950 "myapex",
2951 ],
Alex Light0851b882019-02-07 13:20:53 -08002952 }
2953 `)
2954
Sundong Ahnabb64432019-10-22 13:58:29 +09002955 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002956 apexRule := module.Rule("apexRule")
2957 copyCmds := apexRule.Args["copy_commands"]
2958
2959 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2960 t.Log("Apex was a test apex!")
2961 t.Fail()
2962 }
2963 // Ensure that main rule creates an output
2964 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2965
2966 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002967 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002968
2969 // Ensure that both direct and indirect deps are copied into apex
2970 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2971
Colin Cross7113d202019-11-20 16:39:12 -08002972 // Ensure that the platform variant ends with _shared
2973 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002974
2975 if !android.InAnyApex("mylib_common") {
2976 t.Log("Found mylib_common not in any apex!")
2977 t.Fail()
2978 }
2979}
2980
2981func TestTestApex(t *testing.T) {
2982 if android.InAnyApex("mylib_common_test") {
2983 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!")
2984 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002985 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002986 apex_test {
2987 name: "myapex",
2988 key: "myapex.key",
2989 native_shared_libs: ["mylib_common_test"],
2990 }
2991
2992 apex_key {
2993 name: "myapex.key",
2994 public_key: "testkey.avbpubkey",
2995 private_key: "testkey.pem",
2996 }
2997
2998 cc_library {
2999 name: "mylib_common_test",
3000 srcs: ["mylib.cpp"],
3001 system_shared_libs: [],
3002 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003003 // TODO: remove //apex_available:platform
3004 apex_available: [
3005 "//apex_available:platform",
3006 "myapex",
3007 ],
Alex Light0851b882019-02-07 13:20:53 -08003008 }
3009 `)
3010
Sundong Ahnabb64432019-10-22 13:58:29 +09003011 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003012 apexRule := module.Rule("apexRule")
3013 copyCmds := apexRule.Args["copy_commands"]
3014
3015 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3016 t.Log("Apex was not a test apex!")
3017 t.Fail()
3018 }
3019 // Ensure that main rule creates an output
3020 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3021
3022 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003023 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003024
3025 // Ensure that both direct and indirect deps are copied into apex
3026 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3027
Colin Cross7113d202019-11-20 16:39:12 -08003028 // Ensure that the platform variant ends with _shared
3029 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003030}
3031
Alex Light9670d332019-01-29 18:07:33 -08003032func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003033 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 multilib: {
3038 first: {
3039 native_shared_libs: ["mylib_common"],
3040 }
3041 },
3042 target: {
3043 android: {
3044 multilib: {
3045 first: {
3046 native_shared_libs: ["mylib"],
3047 }
3048 }
3049 },
3050 host: {
3051 multilib: {
3052 first: {
3053 native_shared_libs: ["mylib2"],
3054 }
3055 }
3056 }
3057 }
3058 }
3059
3060 apex_key {
3061 name: "myapex.key",
3062 public_key: "testkey.avbpubkey",
3063 private_key: "testkey.pem",
3064 }
3065
3066 cc_library {
3067 name: "mylib",
3068 srcs: ["mylib.cpp"],
3069 system_shared_libs: [],
3070 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003071 // TODO: remove //apex_available:platform
3072 apex_available: [
3073 "//apex_available:platform",
3074 "myapex",
3075 ],
Alex Light9670d332019-01-29 18:07:33 -08003076 }
3077
3078 cc_library {
3079 name: "mylib_common",
3080 srcs: ["mylib.cpp"],
3081 system_shared_libs: [],
3082 stl: "none",
3083 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003084 // TODO: remove //apex_available:platform
3085 apex_available: [
3086 "//apex_available:platform",
3087 "myapex",
3088 ],
Alex Light9670d332019-01-29 18:07:33 -08003089 }
3090
3091 cc_library {
3092 name: "mylib2",
3093 srcs: ["mylib.cpp"],
3094 system_shared_libs: [],
3095 stl: "none",
3096 compile_multilib: "first",
3097 }
3098 `)
3099
Sundong Ahnabb64432019-10-22 13:58:29 +09003100 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003101 copyCmds := apexRule.Args["copy_commands"]
3102
3103 // Ensure that main rule creates an output
3104 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3105
3106 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003107 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3108 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3109 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003110
3111 // Ensure that both direct and indirect deps are copied into apex
3112 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3113 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3114 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3115
Colin Cross7113d202019-11-20 16:39:12 -08003116 // Ensure that the platform variant ends with _shared
3117 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3118 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3119 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003120}
Jiyong Park04480cf2019-02-06 00:16:29 +09003121
3122func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003123 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003124 apex {
3125 name: "myapex",
3126 key: "myapex.key",
3127 binaries: ["myscript"],
3128 }
3129
3130 apex_key {
3131 name: "myapex.key",
3132 public_key: "testkey.avbpubkey",
3133 private_key: "testkey.pem",
3134 }
3135
3136 sh_binary {
3137 name: "myscript",
3138 src: "mylib.cpp",
3139 filename: "myscript.sh",
3140 sub_dir: "script",
3141 }
3142 `)
3143
Sundong Ahnabb64432019-10-22 13:58:29 +09003144 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003145 copyCmds := apexRule.Args["copy_commands"]
3146
3147 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3148}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003149
Jooyung Han91df2082019-11-20 01:49:42 +09003150func TestApexInVariousPartition(t *testing.T) {
3151 testcases := []struct {
3152 propName, parition, flattenedPartition string
3153 }{
3154 {"", "system", "system_ext"},
3155 {"product_specific: true", "product", "product"},
3156 {"soc_specific: true", "vendor", "vendor"},
3157 {"proprietary: true", "vendor", "vendor"},
3158 {"vendor: true", "vendor", "vendor"},
3159 {"system_ext_specific: true", "system_ext", "system_ext"},
3160 }
3161 for _, tc := range testcases {
3162 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3163 ctx, _ := testApex(t, `
3164 apex {
3165 name: "myapex",
3166 key: "myapex.key",
3167 `+tc.propName+`
3168 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003169
Jooyung Han91df2082019-11-20 01:49:42 +09003170 apex_key {
3171 name: "myapex.key",
3172 public_key: "testkey.avbpubkey",
3173 private_key: "testkey.pem",
3174 }
3175 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003176
Jooyung Han91df2082019-11-20 01:49:42 +09003177 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3178 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3179 actual := apex.installDir.String()
3180 if actual != expected {
3181 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3182 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003183
Jooyung Han91df2082019-11-20 01:49:42 +09003184 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3185 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3186 actual = flattened.installDir.String()
3187 if actual != expected {
3188 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3189 }
3190 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003191 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003192}
Jiyong Park67882562019-03-21 01:11:21 +09003193
Jooyung Han54aca7b2019-11-20 02:26:02 +09003194func TestFileContexts(t *testing.T) {
3195 ctx, _ := testApex(t, `
3196 apex {
3197 name: "myapex",
3198 key: "myapex.key",
3199 }
3200
3201 apex_key {
3202 name: "myapex.key",
3203 public_key: "testkey.avbpubkey",
3204 private_key: "testkey.pem",
3205 }
3206 `)
3207 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3208 apexRule := module.Rule("apexRule")
3209 actual := apexRule.Args["file_contexts"]
3210 expected := "system/sepolicy/apex/myapex-file_contexts"
3211 if actual != expected {
3212 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3213 }
3214
3215 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3216 apex {
3217 name: "myapex",
3218 key: "myapex.key",
3219 file_contexts: "my_own_file_contexts",
3220 }
3221
3222 apex_key {
3223 name: "myapex.key",
3224 public_key: "testkey.avbpubkey",
3225 private_key: "testkey.pem",
3226 }
3227 `, withFiles(map[string][]byte{
3228 "my_own_file_contexts": nil,
3229 }))
3230
3231 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3232 apex {
3233 name: "myapex",
3234 key: "myapex.key",
3235 product_specific: true,
3236 file_contexts: "product_specific_file_contexts",
3237 }
3238
3239 apex_key {
3240 name: "myapex.key",
3241 public_key: "testkey.avbpubkey",
3242 private_key: "testkey.pem",
3243 }
3244 `)
3245
3246 ctx, _ = testApex(t, `
3247 apex {
3248 name: "myapex",
3249 key: "myapex.key",
3250 product_specific: true,
3251 file_contexts: "product_specific_file_contexts",
3252 }
3253
3254 apex_key {
3255 name: "myapex.key",
3256 public_key: "testkey.avbpubkey",
3257 private_key: "testkey.pem",
3258 }
3259 `, withFiles(map[string][]byte{
3260 "product_specific_file_contexts": nil,
3261 }))
3262 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3263 apexRule = module.Rule("apexRule")
3264 actual = apexRule.Args["file_contexts"]
3265 expected = "product_specific_file_contexts"
3266 if actual != expected {
3267 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3268 }
3269
3270 ctx, _ = testApex(t, `
3271 apex {
3272 name: "myapex",
3273 key: "myapex.key",
3274 product_specific: true,
3275 file_contexts: ":my-file-contexts",
3276 }
3277
3278 apex_key {
3279 name: "myapex.key",
3280 public_key: "testkey.avbpubkey",
3281 private_key: "testkey.pem",
3282 }
3283
3284 filegroup {
3285 name: "my-file-contexts",
3286 srcs: ["product_specific_file_contexts"],
3287 }
3288 `, withFiles(map[string][]byte{
3289 "product_specific_file_contexts": nil,
3290 }))
3291 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3292 apexRule = module.Rule("apexRule")
3293 actual = apexRule.Args["file_contexts"]
3294 expected = "product_specific_file_contexts"
3295 if actual != expected {
3296 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3297 }
3298}
3299
Jiyong Park67882562019-03-21 01:11:21 +09003300func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003301 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003302 apex_key {
3303 name: "myapex.key",
3304 public_key: ":my.avbpubkey",
3305 private_key: ":my.pem",
3306 product_specific: true,
3307 }
3308
3309 filegroup {
3310 name: "my.avbpubkey",
3311 srcs: ["testkey2.avbpubkey"],
3312 }
3313
3314 filegroup {
3315 name: "my.pem",
3316 srcs: ["testkey2.pem"],
3317 }
3318 `)
3319
3320 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3321 expected_pubkey := "testkey2.avbpubkey"
3322 actual_pubkey := apex_key.public_key_file.String()
3323 if actual_pubkey != expected_pubkey {
3324 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3325 }
3326 expected_privkey := "testkey2.pem"
3327 actual_privkey := apex_key.private_key_file.String()
3328 if actual_privkey != expected_privkey {
3329 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3330 }
3331}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003332
3333func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003334 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003335 prebuilt_apex {
3336 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003337 arch: {
3338 arm64: {
3339 src: "myapex-arm64.apex",
3340 },
3341 arm: {
3342 src: "myapex-arm.apex",
3343 },
3344 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003345 }
3346 `)
3347
3348 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3349
Jiyong Parkc95714e2019-03-29 14:23:10 +09003350 expectedInput := "myapex-arm64.apex"
3351 if prebuilt.inputApex.String() != expectedInput {
3352 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3353 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003354}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003355
3356func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003357 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003358 prebuilt_apex {
3359 name: "myapex",
3360 src: "myapex-arm.apex",
3361 filename: "notmyapex.apex",
3362 }
3363 `)
3364
3365 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3366
3367 expected := "notmyapex.apex"
3368 if p.installFilename != expected {
3369 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3370 }
3371}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003372
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003373func TestPrebuiltOverrides(t *testing.T) {
3374 ctx, config := testApex(t, `
3375 prebuilt_apex {
3376 name: "myapex.prebuilt",
3377 src: "myapex-arm.apex",
3378 overrides: [
3379 "myapex",
3380 ],
3381 }
3382 `)
3383
3384 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3385
3386 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003387 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003388 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003389 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003390 }
3391}
3392
Roland Levillain630846d2019-06-26 12:48:34 +01003393func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003394 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003395 apex_test {
3396 name: "myapex",
3397 key: "myapex.key",
3398 tests: [
3399 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003400 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003401 ],
3402 }
3403
3404 apex_key {
3405 name: "myapex.key",
3406 public_key: "testkey.avbpubkey",
3407 private_key: "testkey.pem",
3408 }
3409
Liz Kammer1c14a212020-05-12 15:26:55 -07003410 filegroup {
3411 name: "fg",
3412 srcs: [
3413 "baz",
3414 "bar/baz"
3415 ],
3416 }
3417
Roland Levillain630846d2019-06-26 12:48:34 +01003418 cc_test {
3419 name: "mytest",
3420 gtest: false,
3421 srcs: ["mytest.cpp"],
3422 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003423 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003424 system_shared_libs: [],
3425 static_executable: true,
3426 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003427 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003428 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003429
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003430 cc_library {
3431 name: "mylib",
3432 srcs: ["mylib.cpp"],
3433 system_shared_libs: [],
3434 stl: "none",
3435 }
3436
Liz Kammer5bd365f2020-05-27 15:15:11 -07003437 filegroup {
3438 name: "fg2",
3439 srcs: [
3440 "testdata/baz"
3441 ],
3442 }
3443
Roland Levillain9b5fde92019-06-28 15:41:19 +01003444 cc_test {
3445 name: "mytests",
3446 gtest: false,
3447 srcs: [
3448 "mytest1.cpp",
3449 "mytest2.cpp",
3450 "mytest3.cpp",
3451 ],
3452 test_per_src: true,
3453 relative_install_path: "test",
3454 system_shared_libs: [],
3455 static_executable: true,
3456 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003457 data: [
3458 ":fg",
3459 ":fg2",
3460 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003461 }
Roland Levillain630846d2019-06-26 12:48:34 +01003462 `)
3463
Sundong Ahnabb64432019-10-22 13:58:29 +09003464 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003465 copyCmds := apexRule.Args["copy_commands"]
3466
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003467 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003468 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003469 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003470
Liz Kammer1c14a212020-05-12 15:26:55 -07003471 //Ensure that test data are copied into apex.
3472 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3473 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3474
Roland Levillain9b5fde92019-06-28 15:41:19 +01003475 // Ensure that test deps built with `test_per_src` are copied into apex.
3476 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3477 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3478 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003479
3480 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003481 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3482 data := android.AndroidMkDataForTest(t, config, "", bundle)
3483 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003484 prefix := "TARGET_"
3485 var builder strings.Builder
3486 data.Custom(&builder, name, prefix, "", data)
3487 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003488 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3489 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3490 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3491 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003492 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003493 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003494 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003495
3496 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3497 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3498 data.Custom(&builder, name, prefix, "", data)
3499 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003500 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3501 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003502}
3503
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003504func TestInstallExtraFlattenedApexes(t *testing.T) {
3505 ctx, config := testApex(t, `
3506 apex {
3507 name: "myapex",
3508 key: "myapex.key",
3509 }
3510 apex_key {
3511 name: "myapex.key",
3512 public_key: "testkey.avbpubkey",
3513 private_key: "testkey.pem",
3514 }
3515 `, func(fs map[string][]byte, config android.Config) {
3516 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3517 })
3518 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003519 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003520 mk := android.AndroidMkDataForTest(t, config, "", ab)
3521 var builder strings.Builder
3522 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3523 androidMk := builder.String()
3524 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3525}
3526
Jooyung Han5c998b92019-06-27 11:30:33 +09003527func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003528 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 native_shared_libs: ["mylib"],
3533 uses: ["commonapex"],
3534 }
3535
3536 apex {
3537 name: "commonapex",
3538 key: "myapex.key",
3539 native_shared_libs: ["libcommon"],
3540 provide_cpp_shared_libs: true,
3541 }
3542
3543 apex_key {
3544 name: "myapex.key",
3545 public_key: "testkey.avbpubkey",
3546 private_key: "testkey.pem",
3547 }
3548
3549 cc_library {
3550 name: "mylib",
3551 srcs: ["mylib.cpp"],
3552 shared_libs: ["libcommon"],
3553 system_shared_libs: [],
3554 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003555 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003556 }
3557
3558 cc_library {
3559 name: "libcommon",
3560 srcs: ["mylib_common.cpp"],
3561 system_shared_libs: [],
3562 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003563 // TODO: remove //apex_available:platform
3564 apex_available: [
3565 "//apex_available:platform",
3566 "commonapex",
3567 "myapex",
3568 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003569 }
3570 `)
3571
Sundong Ahnabb64432019-10-22 13:58:29 +09003572 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003573 apexRule1 := module1.Rule("apexRule")
3574 copyCmds1 := apexRule1.Args["copy_commands"]
3575
Sundong Ahnabb64432019-10-22 13:58:29 +09003576 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003577 apexRule2 := module2.Rule("apexRule")
3578 copyCmds2 := apexRule2.Args["copy_commands"]
3579
Colin Cross7113d202019-11-20 16:39:12 -08003580 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3581 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003582 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3583 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3584 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3585}
3586
3587func TestApexUsesFailsIfNotProvided(t *testing.T) {
3588 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3589 apex {
3590 name: "myapex",
3591 key: "myapex.key",
3592 uses: ["commonapex"],
3593 }
3594
3595 apex {
3596 name: "commonapex",
3597 key: "myapex.key",
3598 }
3599
3600 apex_key {
3601 name: "myapex.key",
3602 public_key: "testkey.avbpubkey",
3603 private_key: "testkey.pem",
3604 }
3605 `)
3606 testApexError(t, `uses: "commonapex" is not a provider`, `
3607 apex {
3608 name: "myapex",
3609 key: "myapex.key",
3610 uses: ["commonapex"],
3611 }
3612
3613 cc_library {
3614 name: "commonapex",
3615 system_shared_libs: [],
3616 stl: "none",
3617 }
3618
3619 apex_key {
3620 name: "myapex.key",
3621 public_key: "testkey.avbpubkey",
3622 private_key: "testkey.pem",
3623 }
3624 `)
3625}
3626
3627func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3628 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3629 apex {
3630 name: "myapex",
3631 key: "myapex.key",
3632 use_vendor: true,
3633 uses: ["commonapex"],
3634 }
3635
3636 apex {
3637 name: "commonapex",
3638 key: "myapex.key",
3639 provide_cpp_shared_libs: true,
3640 }
3641
3642 apex_key {
3643 name: "myapex.key",
3644 public_key: "testkey.avbpubkey",
3645 private_key: "testkey.pem",
3646 }
Jooyung Handc782442019-11-01 03:14:38 +09003647 `, func(fs map[string][]byte, config android.Config) {
3648 setUseVendorWhitelistForTest(config, []string{"myapex"})
3649 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003650}
3651
Jooyung Hand48f3c32019-08-23 11:18:57 +09003652func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3653 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3654 apex {
3655 name: "myapex",
3656 key: "myapex.key",
3657 native_shared_libs: ["libfoo"],
3658 }
3659
3660 apex_key {
3661 name: "myapex.key",
3662 public_key: "testkey.avbpubkey",
3663 private_key: "testkey.pem",
3664 }
3665
3666 cc_library {
3667 name: "libfoo",
3668 stl: "none",
3669 system_shared_libs: [],
3670 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003671 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003672 }
3673 `)
3674 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3675 apex {
3676 name: "myapex",
3677 key: "myapex.key",
3678 java_libs: ["myjar"],
3679 }
3680
3681 apex_key {
3682 name: "myapex.key",
3683 public_key: "testkey.avbpubkey",
3684 private_key: "testkey.pem",
3685 }
3686
3687 java_library {
3688 name: "myjar",
3689 srcs: ["foo/bar/MyClass.java"],
3690 sdk_version: "none",
3691 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003692 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003693 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003694 }
3695 `)
3696}
3697
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003698func TestApexWithApps(t *testing.T) {
3699 ctx, _ := testApex(t, `
3700 apex {
3701 name: "myapex",
3702 key: "myapex.key",
3703 apps: [
3704 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003705 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003706 ],
3707 }
3708
3709 apex_key {
3710 name: "myapex.key",
3711 public_key: "testkey.avbpubkey",
3712 private_key: "testkey.pem",
3713 }
3714
3715 android_app {
3716 name: "AppFoo",
3717 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003718 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003719 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003720 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003721 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003722 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003723 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003724
3725 android_app {
3726 name: "AppFooPriv",
3727 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003728 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003729 system_modules: "none",
3730 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003731 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003732 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003733 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003734
3735 cc_library_shared {
3736 name: "libjni",
3737 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003738 shared_libs: ["libfoo"],
3739 stl: "none",
3740 system_shared_libs: [],
3741 apex_available: [ "myapex" ],
3742 sdk_version: "current",
3743 }
3744
3745 cc_library_shared {
3746 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003747 stl: "none",
3748 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003749 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003750 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003751 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003752 `)
3753
Sundong Ahnabb64432019-10-22 13:58:29 +09003754 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003755 apexRule := module.Rule("apexRule")
3756 copyCmds := apexRule.Args["copy_commands"]
3757
3758 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003759 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003760
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003761 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3762 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003763 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003764 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003765 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003766 // JNI libraries including transitive deps are
3767 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003768 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003769 // ... embedded inside APK (jnilibs.zip)
3770 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3771 // ... and not directly inside the APEX
3772 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3773 }
Dario Frenicde2a032019-10-27 00:29:22 +01003774}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003775
Dario Frenicde2a032019-10-27 00:29:22 +01003776func TestApexWithAppImports(t *testing.T) {
3777 ctx, _ := testApex(t, `
3778 apex {
3779 name: "myapex",
3780 key: "myapex.key",
3781 apps: [
3782 "AppFooPrebuilt",
3783 "AppFooPrivPrebuilt",
3784 ],
3785 }
3786
3787 apex_key {
3788 name: "myapex.key",
3789 public_key: "testkey.avbpubkey",
3790 private_key: "testkey.pem",
3791 }
3792
3793 android_app_import {
3794 name: "AppFooPrebuilt",
3795 apk: "PrebuiltAppFoo.apk",
3796 presigned: true,
3797 dex_preopt: {
3798 enabled: false,
3799 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003800 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003801 }
3802
3803 android_app_import {
3804 name: "AppFooPrivPrebuilt",
3805 apk: "PrebuiltAppFooPriv.apk",
3806 privileged: true,
3807 presigned: true,
3808 dex_preopt: {
3809 enabled: false,
3810 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003811 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003812 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003813 }
3814 `)
3815
Sundong Ahnabb64432019-10-22 13:58:29 +09003816 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003817 apexRule := module.Rule("apexRule")
3818 copyCmds := apexRule.Args["copy_commands"]
3819
3820 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003821 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3822}
3823
3824func TestApexWithAppImportsPrefer(t *testing.T) {
3825 ctx, _ := testApex(t, `
3826 apex {
3827 name: "myapex",
3828 key: "myapex.key",
3829 apps: [
3830 "AppFoo",
3831 ],
3832 }
3833
3834 apex_key {
3835 name: "myapex.key",
3836 public_key: "testkey.avbpubkey",
3837 private_key: "testkey.pem",
3838 }
3839
3840 android_app {
3841 name: "AppFoo",
3842 srcs: ["foo/bar/MyClass.java"],
3843 sdk_version: "none",
3844 system_modules: "none",
3845 apex_available: [ "myapex" ],
3846 }
3847
3848 android_app_import {
3849 name: "AppFoo",
3850 apk: "AppFooPrebuilt.apk",
3851 filename: "AppFooPrebuilt.apk",
3852 presigned: true,
3853 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003854 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003855 }
3856 `, withFiles(map[string][]byte{
3857 "AppFooPrebuilt.apk": nil,
3858 }))
3859
3860 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3861 "app/AppFoo/AppFooPrebuilt.apk",
3862 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003863}
3864
Dario Freni6f3937c2019-12-20 22:58:03 +00003865func TestApexWithTestHelperApp(t *testing.T) {
3866 ctx, _ := testApex(t, `
3867 apex {
3868 name: "myapex",
3869 key: "myapex.key",
3870 apps: [
3871 "TesterHelpAppFoo",
3872 ],
3873 }
3874
3875 apex_key {
3876 name: "myapex.key",
3877 public_key: "testkey.avbpubkey",
3878 private_key: "testkey.pem",
3879 }
3880
3881 android_test_helper_app {
3882 name: "TesterHelpAppFoo",
3883 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003884 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003885 }
3886
3887 `)
3888
3889 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3890 apexRule := module.Rule("apexRule")
3891 copyCmds := apexRule.Args["copy_commands"]
3892
3893 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3894}
3895
Jooyung Han18020ea2019-11-13 10:50:48 +09003896func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3897 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003898 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003899 apex {
3900 name: "myapex",
3901 key: "myapex.key",
3902 native_shared_libs: ["libfoo"],
3903 }
3904
3905 apex_key {
3906 name: "myapex.key",
3907 public_key: "testkey.avbpubkey",
3908 private_key: "testkey.pem",
3909 }
3910
3911 apex {
3912 name: "otherapex",
3913 key: "myapex.key",
3914 native_shared_libs: ["libfoo"],
3915 }
3916
3917 cc_defaults {
3918 name: "libfoo-defaults",
3919 apex_available: ["otherapex"],
3920 }
3921
3922 cc_library {
3923 name: "libfoo",
3924 defaults: ["libfoo-defaults"],
3925 stl: "none",
3926 system_shared_libs: [],
3927 }`)
3928}
3929
Paul Duffine52e66f2020-03-30 17:54:29 +01003930func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003931 // libfoo is not available to myapex, but only to otherapex
3932 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3933 apex {
3934 name: "myapex",
3935 key: "myapex.key",
3936 native_shared_libs: ["libfoo"],
3937 }
3938
3939 apex_key {
3940 name: "myapex.key",
3941 public_key: "testkey.avbpubkey",
3942 private_key: "testkey.pem",
3943 }
3944
3945 apex {
3946 name: "otherapex",
3947 key: "otherapex.key",
3948 native_shared_libs: ["libfoo"],
3949 }
3950
3951 apex_key {
3952 name: "otherapex.key",
3953 public_key: "testkey.avbpubkey",
3954 private_key: "testkey.pem",
3955 }
3956
3957 cc_library {
3958 name: "libfoo",
3959 stl: "none",
3960 system_shared_libs: [],
3961 apex_available: ["otherapex"],
3962 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003963}
Jiyong Park127b40b2019-09-30 16:04:35 +09003964
Paul Duffine52e66f2020-03-30 17:54:29 +01003965func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003966 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003967 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003968.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003969.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003970.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003971.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003972.*via tag cc\.DependencyTag.*"shared".*
3973.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003974 apex {
3975 name: "myapex",
3976 key: "myapex.key",
3977 native_shared_libs: ["libfoo"],
3978 }
3979
3980 apex_key {
3981 name: "myapex.key",
3982 public_key: "testkey.avbpubkey",
3983 private_key: "testkey.pem",
3984 }
3985
Jiyong Park127b40b2019-09-30 16:04:35 +09003986 cc_library {
3987 name: "libfoo",
3988 stl: "none",
3989 shared_libs: ["libbar"],
3990 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003991 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003992 }
3993
3994 cc_library {
3995 name: "libbar",
3996 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003997 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003998 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003999 apex_available: ["myapex"],
4000 }
4001
4002 cc_library {
4003 name: "libbaz",
4004 stl: "none",
4005 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004006 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004007}
Jiyong Park127b40b2019-09-30 16:04:35 +09004008
Paul Duffine52e66f2020-03-30 17:54:29 +01004009func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004010 testApexError(t, "\"otherapex\" is not a valid module name", `
4011 apex {
4012 name: "myapex",
4013 key: "myapex.key",
4014 native_shared_libs: ["libfoo"],
4015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "libfoo",
4025 stl: "none",
4026 system_shared_libs: [],
4027 apex_available: ["otherapex"],
4028 }`)
4029
Paul Duffine52e66f2020-03-30 17:54:29 +01004030 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004031 apex {
4032 name: "myapex",
4033 key: "myapex.key",
4034 native_shared_libs: ["libfoo", "libbar"],
4035 }
4036
4037 apex_key {
4038 name: "myapex.key",
4039 public_key: "testkey.avbpubkey",
4040 private_key: "testkey.pem",
4041 }
4042
4043 cc_library {
4044 name: "libfoo",
4045 stl: "none",
4046 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004047 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004048 apex_available: ["myapex"],
4049 }
4050
4051 cc_library {
4052 name: "libbar",
4053 stl: "none",
4054 system_shared_libs: [],
4055 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004056 }
4057
4058 cc_library {
4059 name: "libbaz",
4060 stl: "none",
4061 system_shared_libs: [],
4062 stubs: {
4063 versions: ["10", "20", "30"],
4064 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004065 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004066}
Jiyong Park127b40b2019-09-30 16:04:35 +09004067
Jiyong Park89e850a2020-04-07 16:37:39 +09004068func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004069 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004070 apex {
4071 name: "myapex",
4072 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004073 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004074 }
4075
4076 apex_key {
4077 name: "myapex.key",
4078 public_key: "testkey.avbpubkey",
4079 private_key: "testkey.pem",
4080 }
4081
4082 cc_library {
4083 name: "libfoo",
4084 stl: "none",
4085 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004086 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004087 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004088 }
4089
4090 cc_library {
4091 name: "libfoo2",
4092 stl: "none",
4093 system_shared_libs: [],
4094 shared_libs: ["libbaz"],
4095 apex_available: ["//apex_available:platform"],
4096 }
4097
4098 cc_library {
4099 name: "libbar",
4100 stl: "none",
4101 system_shared_libs: [],
4102 apex_available: ["myapex"],
4103 }
4104
4105 cc_library {
4106 name: "libbaz",
4107 stl: "none",
4108 system_shared_libs: [],
4109 apex_available: ["myapex"],
4110 stubs: {
4111 versions: ["1"],
4112 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004113 }`)
4114
Jiyong Park89e850a2020-04-07 16:37:39 +09004115 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4116 // because it depends on libbar which isn't available to platform
4117 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4118 if libfoo.NotAvailableForPlatform() != true {
4119 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4120 }
4121
4122 // libfoo2 however can be available to platform because it depends on libbaz which provides
4123 // stubs
4124 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4125 if libfoo2.NotAvailableForPlatform() == true {
4126 t.Errorf("%q should be available to platform", libfoo2.String())
4127 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004128}
Jiyong Parka90ca002019-10-07 15:47:24 +09004129
Paul Duffine52e66f2020-03-30 17:54:29 +01004130func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004131 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004132 apex {
4133 name: "myapex",
4134 key: "myapex.key",
4135 native_shared_libs: ["libfoo"],
4136 }
4137
4138 apex_key {
4139 name: "myapex.key",
4140 public_key: "testkey.avbpubkey",
4141 private_key: "testkey.pem",
4142 }
4143
4144 cc_library {
4145 name: "libfoo",
4146 stl: "none",
4147 system_shared_libs: [],
4148 apex_available: ["myapex"],
4149 static: {
4150 apex_available: ["//apex_available:platform"],
4151 },
4152 }`)
4153
Jiyong Park89e850a2020-04-07 16:37:39 +09004154 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4155 if libfooShared.NotAvailableForPlatform() != true {
4156 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4157 }
4158 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4159 if libfooStatic.NotAvailableForPlatform() != false {
4160 t.Errorf("%q should be available to platform", libfooStatic.String())
4161 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004162}
4163
Jiyong Park5d790c32019-11-15 18:40:32 +09004164func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004165 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004166 apex {
4167 name: "myapex",
4168 key: "myapex.key",
4169 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004170 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004171 }
4172
4173 override_apex {
4174 name: "override_myapex",
4175 base: "myapex",
4176 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004177 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004178 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004179 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004180 }
4181
4182 apex_key {
4183 name: "myapex.key",
4184 public_key: "testkey.avbpubkey",
4185 private_key: "testkey.pem",
4186 }
4187
4188 android_app {
4189 name: "app",
4190 srcs: ["foo/bar/MyClass.java"],
4191 package_name: "foo",
4192 sdk_version: "none",
4193 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004194 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004195 }
4196
4197 override_android_app {
4198 name: "override_app",
4199 base: "app",
4200 package_name: "bar",
4201 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004202 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004203
Jiyong Park317645e2019-12-05 13:20:58 +09004204 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4205 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4206 if originalVariant.GetOverriddenBy() != "" {
4207 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4208 }
4209 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4210 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4211 }
4212
Jiyong Park5d790c32019-11-15 18:40:32 +09004213 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4214 apexRule := module.Rule("apexRule")
4215 copyCmds := apexRule.Args["copy_commands"]
4216
4217 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004218 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004219
4220 apexBundle := module.Module().(*apexBundle)
4221 name := apexBundle.Name()
4222 if name != "override_myapex" {
4223 t.Errorf("name should be \"override_myapex\", but was %q", name)
4224 }
4225
Baligh Uddin004d7172020-02-19 21:29:28 -08004226 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4227 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4228 }
4229
Jiyong Park20bacab2020-03-03 11:45:41 +09004230 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004231 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004232
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004233 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4234 var builder strings.Builder
4235 data.Custom(&builder, name, "TARGET_", "", data)
4236 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004237 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004238 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4239 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004240 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004241 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004242 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004243 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4244 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004245}
4246
Jooyung Han214bf372019-11-12 13:03:50 +09004247func TestLegacyAndroid10Support(t *testing.T) {
4248 ctx, _ := testApex(t, `
4249 apex {
4250 name: "myapex",
4251 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004252 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004253 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004254 }
4255
4256 apex_key {
4257 name: "myapex.key",
4258 public_key: "testkey.avbpubkey",
4259 private_key: "testkey.pem",
4260 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004261
4262 cc_library {
4263 name: "mylib",
4264 srcs: ["mylib.cpp"],
4265 stl: "libc++",
4266 system_shared_libs: [],
4267 apex_available: [ "myapex" ],
4268 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004269 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004270
4271 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4272 args := module.Rule("apexRule").Args
4273 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004274 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004275
4276 // The copies of the libraries in the apex should have one more dependency than
4277 // the ones outside the apex, namely the unwinder. Ideally we should check
4278 // the dependency names directly here but for some reason the names are blank in
4279 // this test.
4280 for _, lib := range []string{"libc++", "mylib"} {
4281 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4282 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4283 if len(apexImplicits) != len(nonApexImplicits)+1 {
4284 t.Errorf("%q missing unwinder dep", lib)
4285 }
4286 }
Jooyung Han214bf372019-11-12 13:03:50 +09004287}
4288
Paul Duffin9b879592020-05-26 13:21:35 +01004289var filesForSdkLibrary = map[string][]byte{
4290 "api/current.txt": nil,
4291 "api/removed.txt": nil,
4292 "api/system-current.txt": nil,
4293 "api/system-removed.txt": nil,
4294 "api/test-current.txt": nil,
4295 "api/test-removed.txt": nil,
4296}
4297
Jooyung Han58f26ab2019-12-18 15:34:32 +09004298func TestJavaSDKLibrary(t *testing.T) {
4299 ctx, _ := testApex(t, `
4300 apex {
4301 name: "myapex",
4302 key: "myapex.key",
4303 java_libs: ["foo"],
4304 }
4305
4306 apex_key {
4307 name: "myapex.key",
4308 public_key: "testkey.avbpubkey",
4309 private_key: "testkey.pem",
4310 }
4311
4312 java_sdk_library {
4313 name: "foo",
4314 srcs: ["a.java"],
4315 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004316 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004317 }
Paul Duffin9b879592020-05-26 13:21:35 +01004318 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004319
4320 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004321 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004322 "javalib/foo.jar",
4323 "etc/permissions/foo.xml",
4324 })
4325 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004326 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4327 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004328}
4329
Paul Duffin9b879592020-05-26 13:21:35 +01004330func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4331 ctx, _ := testApex(t, `
4332 apex {
4333 name: "myapex",
4334 key: "myapex.key",
4335 java_libs: ["foo", "bar"],
4336 }
4337
4338 apex_key {
4339 name: "myapex.key",
4340 public_key: "testkey.avbpubkey",
4341 private_key: "testkey.pem",
4342 }
4343
4344 java_sdk_library {
4345 name: "foo",
4346 srcs: ["a.java"],
4347 api_packages: ["foo"],
4348 apex_available: ["myapex"],
4349 sdk_version: "none",
4350 system_modules: "none",
4351 }
4352
4353 java_library {
4354 name: "bar",
4355 srcs: ["a.java"],
4356 libs: ["foo"],
4357 apex_available: ["myapex"],
4358 sdk_version: "none",
4359 system_modules: "none",
4360 }
4361 `, withFiles(filesForSdkLibrary))
4362
4363 // java_sdk_library installs both impl jar and permission XML
4364 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4365 "javalib/bar.jar",
4366 "javalib/foo.jar",
4367 "etc/permissions/foo.xml",
4368 })
4369
4370 // The bar library should depend on the implementation jar.
4371 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4372 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4373 t.Errorf("expected %q, found %#q", expected, actual)
4374 }
4375}
4376
4377func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4378 ctx, _ := testApex(t, `
4379 apex {
4380 name: "myapex",
4381 key: "myapex.key",
4382 java_libs: ["foo"],
4383 }
4384
4385 apex_key {
4386 name: "myapex.key",
4387 public_key: "testkey.avbpubkey",
4388 private_key: "testkey.pem",
4389 }
4390
4391 java_sdk_library {
4392 name: "foo",
4393 srcs: ["a.java"],
4394 api_packages: ["foo"],
4395 apex_available: ["myapex"],
4396 sdk_version: "none",
4397 system_modules: "none",
4398 }
4399
4400 java_library {
4401 name: "bar",
4402 srcs: ["a.java"],
4403 libs: ["foo"],
4404 sdk_version: "none",
4405 system_modules: "none",
4406 }
4407 `, withFiles(filesForSdkLibrary))
4408
4409 // java_sdk_library installs both impl jar and permission XML
4410 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4411 "javalib/foo.jar",
4412 "etc/permissions/foo.xml",
4413 })
4414
4415 // The bar library should depend on the stubs jar.
4416 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4417 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4418 t.Errorf("expected %q, found %#q", expected, actual)
4419 }
4420}
4421
atrost6e126252020-01-27 17:01:16 +00004422func TestCompatConfig(t *testing.T) {
4423 ctx, _ := testApex(t, `
4424 apex {
4425 name: "myapex",
4426 key: "myapex.key",
4427 prebuilts: ["myjar-platform-compat-config"],
4428 java_libs: ["myjar"],
4429 }
4430
4431 apex_key {
4432 name: "myapex.key",
4433 public_key: "testkey.avbpubkey",
4434 private_key: "testkey.pem",
4435 }
4436
4437 platform_compat_config {
4438 name: "myjar-platform-compat-config",
4439 src: ":myjar",
4440 }
4441
4442 java_library {
4443 name: "myjar",
4444 srcs: ["foo/bar/MyClass.java"],
4445 sdk_version: "none",
4446 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004447 apex_available: [ "myapex" ],
4448 }
4449 `)
4450 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4451 "etc/compatconfig/myjar-platform-compat-config.xml",
4452 "javalib/myjar.jar",
4453 })
4454}
4455
Jiyong Park479321d2019-12-16 11:47:12 +09004456func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4457 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4458 apex {
4459 name: "myapex",
4460 key: "myapex.key",
4461 java_libs: ["myjar"],
4462 }
4463
4464 apex_key {
4465 name: "myapex.key",
4466 public_key: "testkey.avbpubkey",
4467 private_key: "testkey.pem",
4468 }
4469
4470 java_library {
4471 name: "myjar",
4472 srcs: ["foo/bar/MyClass.java"],
4473 sdk_version: "none",
4474 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004475 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004476 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004477 }
4478 `)
4479}
4480
Jiyong Park7afd1072019-12-30 16:56:33 +09004481func TestCarryRequiredModuleNames(t *testing.T) {
4482 ctx, config := testApex(t, `
4483 apex {
4484 name: "myapex",
4485 key: "myapex.key",
4486 native_shared_libs: ["mylib"],
4487 }
4488
4489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
4494
4495 cc_library {
4496 name: "mylib",
4497 srcs: ["mylib.cpp"],
4498 system_shared_libs: [],
4499 stl: "none",
4500 required: ["a", "b"],
4501 host_required: ["c", "d"],
4502 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004503 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004504 }
4505 `)
4506
4507 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4508 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4509 name := apexBundle.BaseModuleName()
4510 prefix := "TARGET_"
4511 var builder strings.Builder
4512 data.Custom(&builder, name, prefix, "", data)
4513 androidMk := builder.String()
4514 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4515 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4516 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4517}
4518
Jiyong Park7cd10e32020-01-14 09:22:18 +09004519func TestSymlinksFromApexToSystem(t *testing.T) {
4520 bp := `
4521 apex {
4522 name: "myapex",
4523 key: "myapex.key",
4524 native_shared_libs: ["mylib"],
4525 java_libs: ["myjar"],
4526 }
4527
Jiyong Park9d677202020-02-19 16:29:35 +09004528 apex {
4529 name: "myapex.updatable",
4530 key: "myapex.key",
4531 native_shared_libs: ["mylib"],
4532 java_libs: ["myjar"],
4533 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004534 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004535 }
4536
Jiyong Park7cd10e32020-01-14 09:22:18 +09004537 apex_key {
4538 name: "myapex.key",
4539 public_key: "testkey.avbpubkey",
4540 private_key: "testkey.pem",
4541 }
4542
4543 cc_library {
4544 name: "mylib",
4545 srcs: ["mylib.cpp"],
4546 shared_libs: ["myotherlib"],
4547 system_shared_libs: [],
4548 stl: "none",
4549 apex_available: [
4550 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004551 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004552 "//apex_available:platform",
4553 ],
4554 }
4555
4556 cc_library {
4557 name: "myotherlib",
4558 srcs: ["mylib.cpp"],
4559 system_shared_libs: [],
4560 stl: "none",
4561 apex_available: [
4562 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004563 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004564 "//apex_available:platform",
4565 ],
4566 }
4567
4568 java_library {
4569 name: "myjar",
4570 srcs: ["foo/bar/MyClass.java"],
4571 sdk_version: "none",
4572 system_modules: "none",
4573 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004574 apex_available: [
4575 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004576 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004577 "//apex_available:platform",
4578 ],
4579 }
4580
4581 java_library {
4582 name: "myotherjar",
4583 srcs: ["foo/bar/MyClass.java"],
4584 sdk_version: "none",
4585 system_modules: "none",
4586 apex_available: [
4587 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004588 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004589 "//apex_available:platform",
4590 ],
4591 }
4592 `
4593
4594 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4595 for _, f := range files {
4596 if f.path == file {
4597 if f.isLink {
4598 t.Errorf("%q is not a real file", file)
4599 }
4600 return
4601 }
4602 }
4603 t.Errorf("%q is not found", file)
4604 }
4605
4606 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4607 for _, f := range files {
4608 if f.path == file {
4609 if !f.isLink {
4610 t.Errorf("%q is not a symlink", file)
4611 }
4612 return
4613 }
4614 }
4615 t.Errorf("%q is not found", file)
4616 }
4617
Jiyong Park9d677202020-02-19 16:29:35 +09004618 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4619 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004620 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004621 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004622 ensureRealfileExists(t, files, "javalib/myjar.jar")
4623 ensureRealfileExists(t, files, "lib64/mylib.so")
4624 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4625
Jiyong Park9d677202020-02-19 16:29:35 +09004626 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4627 ensureRealfileExists(t, files, "javalib/myjar.jar")
4628 ensureRealfileExists(t, files, "lib64/mylib.so")
4629 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4630
4631 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004632 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004633 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004634 ensureRealfileExists(t, files, "javalib/myjar.jar")
4635 ensureRealfileExists(t, files, "lib64/mylib.so")
4636 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004637
4638 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4639 ensureRealfileExists(t, files, "javalib/myjar.jar")
4640 ensureRealfileExists(t, files, "lib64/mylib.so")
4641 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004642}
4643
Jooyung Han643adc42020-02-27 13:50:06 +09004644func TestApexWithJniLibs(t *testing.T) {
4645 ctx, _ := testApex(t, `
4646 apex {
4647 name: "myapex",
4648 key: "myapex.key",
4649 jni_libs: ["mylib"],
4650 }
4651
4652 apex_key {
4653 name: "myapex.key",
4654 public_key: "testkey.avbpubkey",
4655 private_key: "testkey.pem",
4656 }
4657
4658 cc_library {
4659 name: "mylib",
4660 srcs: ["mylib.cpp"],
4661 shared_libs: ["mylib2"],
4662 system_shared_libs: [],
4663 stl: "none",
4664 apex_available: [ "myapex" ],
4665 }
4666
4667 cc_library {
4668 name: "mylib2",
4669 srcs: ["mylib.cpp"],
4670 system_shared_libs: [],
4671 stl: "none",
4672 apex_available: [ "myapex" ],
4673 }
4674 `)
4675
4676 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4677 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4678 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4679 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4680 "lib64/mylib.so",
4681 "lib64/mylib2.so",
4682 })
4683}
4684
Jooyung Han49f67012020-04-17 13:43:10 +09004685func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4686 ctx, _ := testApex(t, `
4687 apex {
4688 name: "myapex",
4689 key: "myapex.key",
4690 }
4691 apex_key {
4692 name: "myapex.key",
4693 public_key: "testkey.avbpubkey",
4694 private_key: "testkey.pem",
4695 }
4696 `, func(fs map[string][]byte, config android.Config) {
4697 delete(config.Targets, android.Android)
4698 config.AndroidCommonTarget = android.Target{}
4699 })
4700
4701 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4702 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4703 }
4704}
4705
Jooyung Han643adc42020-02-27 13:50:06 +09004706func TestApexWithJniLibs_Errors(t *testing.T) {
4707 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4708 apex {
4709 name: "myapex",
4710 key: "myapex.key",
4711 jni_libs: ["xxx"],
4712 }
4713
4714 apex_key {
4715 name: "myapex.key",
4716 public_key: "testkey.avbpubkey",
4717 private_key: "testkey.pem",
4718 }
4719
4720 prebuilt_etc {
4721 name: "xxx",
4722 src: "xxx",
4723 }
4724 `, withFiles(map[string][]byte{
4725 "xxx": nil,
4726 }))
4727}
4728
Jiyong Parkbd159612020-02-28 15:22:21 +09004729func TestAppBundle(t *testing.T) {
4730 ctx, _ := testApex(t, `
4731 apex {
4732 name: "myapex",
4733 key: "myapex.key",
4734 apps: ["AppFoo"],
4735 }
4736
4737 apex_key {
4738 name: "myapex.key",
4739 public_key: "testkey.avbpubkey",
4740 private_key: "testkey.pem",
4741 }
4742
4743 android_app {
4744 name: "AppFoo",
4745 srcs: ["foo/bar/MyClass.java"],
4746 sdk_version: "none",
4747 system_modules: "none",
4748 apex_available: [ "myapex" ],
4749 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004750 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004751
4752 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4753 content := bundleConfigRule.Args["content"]
4754
4755 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004756 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 +09004757}
4758
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004759func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004760 t.Helper()
4761
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004762 bp := `
4763 java_library {
4764 name: "some-updatable-apex-lib",
4765 srcs: ["a.java"],
4766 sdk_version: "current",
4767 apex_available: [
4768 "some-updatable-apex",
4769 ],
4770 }
4771
4772 java_library {
4773 name: "some-non-updatable-apex-lib",
4774 srcs: ["a.java"],
4775 apex_available: [
4776 "some-non-updatable-apex",
4777 ],
4778 }
4779
4780 java_library {
4781 name: "some-platform-lib",
4782 srcs: ["a.java"],
4783 sdk_version: "current",
4784 installable: true,
4785 }
4786
4787 java_library {
4788 name: "some-art-lib",
4789 srcs: ["a.java"],
4790 sdk_version: "current",
4791 apex_available: [
4792 "com.android.art.something",
4793 ],
4794 hostdex: true,
4795 }
4796
4797 apex {
4798 name: "some-updatable-apex",
4799 key: "some-updatable-apex.key",
4800 java_libs: ["some-updatable-apex-lib"],
4801 updatable: true,
4802 min_sdk_version: "current",
4803 }
4804
4805 apex {
4806 name: "some-non-updatable-apex",
4807 key: "some-non-updatable-apex.key",
4808 java_libs: ["some-non-updatable-apex-lib"],
4809 }
4810
4811 apex_key {
4812 name: "some-updatable-apex.key",
4813 }
4814
4815 apex_key {
4816 name: "some-non-updatable-apex.key",
4817 }
4818
4819 apex {
4820 name: "com.android.art.something",
4821 key: "com.android.art.something.key",
4822 java_libs: ["some-art-lib"],
4823 updatable: true,
4824 min_sdk_version: "current",
4825 }
4826
4827 apex_key {
4828 name: "com.android.art.something.key",
4829 }
4830
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004831 filegroup {
4832 name: "some-updatable-apex-file_contexts",
4833 srcs: [
4834 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4835 ],
4836 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004837
4838 filegroup {
4839 name: "some-non-updatable-apex-file_contexts",
4840 srcs: [
4841 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4842 ],
4843 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004844 `
4845 bp += cc.GatherRequiredDepsForTest(android.Android)
4846 bp += java.GatherRequiredDepsForTest()
4847 bp += dexpreopt.BpToolModulesForTest()
4848
4849 fs := map[string][]byte{
4850 "a.java": nil,
4851 "a.jar": nil,
4852 "build/make/target/product/security": nil,
4853 "apex_manifest.json": nil,
4854 "AndroidManifest.xml": nil,
4855 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004856 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004857 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4858 "framework/aidl/a.aidl": nil,
4859 }
4860 cc.GatherRequiredFilesForTest(fs)
4861
4862 ctx := android.NewTestArchContext()
4863 ctx.RegisterModuleType("apex", BundleFactory)
4864 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4865 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004866 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004867 cc.RegisterRequiredBuildComponentsForTest(ctx)
4868 java.RegisterJavaBuildComponents(ctx)
4869 java.RegisterSystemModulesBuildComponents(ctx)
4870 java.RegisterAppBuildComponents(ctx)
4871 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004872 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4873 ctx.PreDepsMutators(RegisterPreDepsMutators)
4874 ctx.PostDepsMutators(RegisterPostDepsMutators)
4875
4876 config := android.TestArchConfig(buildDir, nil, bp, fs)
4877 ctx.Register(config)
4878
4879 _ = dexpreopt.GlobalSoongConfigForTests(config)
4880 dexpreopt.RegisterToolModulesForTest(ctx)
4881 pathCtx := android.PathContextForTesting(config)
4882 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4883 transformDexpreoptConfig(dexpreoptConfig)
4884 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4885
4886 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4887 android.FailIfErrored(t, errs)
4888
4889 _, errs = ctx.PrepareBuildActions(config)
4890 if errmsg == "" {
4891 android.FailIfErrored(t, errs)
4892 } else if len(errs) > 0 {
4893 android.FailIfNoMatchingErrors(t, errmsg, errs)
4894 return
4895 } else {
4896 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4897 }
4898}
4899
Jooyung Han548640b2020-04-27 12:10:30 +09004900func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4901 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4902 apex {
4903 name: "myapex",
4904 key: "myapex.key",
4905 updatable: true,
4906 }
4907
4908 apex_key {
4909 name: "myapex.key",
4910 public_key: "testkey.avbpubkey",
4911 private_key: "testkey.pem",
4912 }
4913 `)
4914}
4915
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004916func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004917
4918 var error string
4919 var transform func(*dexpreopt.GlobalConfig)
4920
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004921 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
4922 transform = func(config *dexpreopt.GlobalConfig) {
4923 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
4924 }
4925 testNoUpdatableJarsInBootImage(t, "", transform)
4926 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004927
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004928 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
4929 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4930 transform = func(config *dexpreopt.GlobalConfig) {
4931 config.BootJars = []string{"com.android.art.something:some-art-lib"}
4932 }
4933 testNoUpdatableJarsInBootImage(t, error, transform)
4934 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004935
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004936 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4937 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4938 transform = func(config *dexpreopt.GlobalConfig) {
4939 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4940 }
4941 testNoUpdatableJarsInBootImage(t, error, transform)
4942 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004943
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004944 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4945 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4946 transform = func(config *dexpreopt.GlobalConfig) {
4947 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4948 }
4949 testNoUpdatableJarsInBootImage(t, error, transform)
4950 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004951
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004952 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
4953 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4954 transform = func(config *dexpreopt.GlobalConfig) {
4955 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4956 }
4957 testNoUpdatableJarsInBootImage(t, error, transform)
4958 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004959
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004960 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
4961 transform = func(config *dexpreopt.GlobalConfig) {
4962 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4963 }
4964 testNoUpdatableJarsInBootImage(t, "", transform)
4965 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004966
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004967 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
4968 error = "failed to find a dex jar path for module 'nonexistent'"
4969 transform = func(config *dexpreopt.GlobalConfig) {
4970 config.ArtApexJars = []string{"platform:nonexistent"}
4971 }
4972 testNoUpdatableJarsInBootImage(t, error, transform)
4973 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004974
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004975 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
4976 error = "failed to find a dex jar path for module 'nonexistent'"
4977 transform = func(config *dexpreopt.GlobalConfig) {
4978 config.BootJars = []string{"platform:nonexistent"}
4979 }
4980 testNoUpdatableJarsInBootImage(t, error, transform)
4981 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004982
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004983 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
4984 error = "module 'some-platform-lib' is not allowed in the ART boot image"
4985 transform = func(config *dexpreopt.GlobalConfig) {
4986 config.ArtApexJars = []string{"platform:some-platform-lib"}
4987 }
4988 testNoUpdatableJarsInBootImage(t, error, transform)
4989 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004990
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004991 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
4992 transform = func(config *dexpreopt.GlobalConfig) {
4993 config.BootJars = []string{"platform:some-platform-lib"}
4994 }
4995 testNoUpdatableJarsInBootImage(t, "", transform)
4996 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004997}
4998
Jiyong Park62304bb2020-04-13 16:19:48 +09004999func TestTestFor(t *testing.T) {
5000 ctx, _ := testApex(t, `
5001 apex {
5002 name: "myapex",
5003 key: "myapex.key",
5004 native_shared_libs: ["mylib", "myprivlib"],
5005 }
5006
5007 apex_key {
5008 name: "myapex.key",
5009 public_key: "testkey.avbpubkey",
5010 private_key: "testkey.pem",
5011 }
5012
5013 cc_library {
5014 name: "mylib",
5015 srcs: ["mylib.cpp"],
5016 system_shared_libs: [],
5017 stl: "none",
5018 stubs: {
5019 versions: ["1"],
5020 },
5021 apex_available: ["myapex"],
5022 }
5023
5024 cc_library {
5025 name: "myprivlib",
5026 srcs: ["mylib.cpp"],
5027 system_shared_libs: [],
5028 stl: "none",
5029 apex_available: ["myapex"],
5030 }
5031
5032
5033 cc_test {
5034 name: "mytest",
5035 gtest: false,
5036 srcs: ["mylib.cpp"],
5037 system_shared_libs: [],
5038 stl: "none",
5039 shared_libs: ["mylib", "myprivlib"],
5040 test_for: ["myapex"]
5041 }
5042 `)
5043
5044 // the test 'mytest' is a test for the apex, therefore is linked to the
5045 // actual implementation of mylib instead of its stub.
5046 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5047 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5048 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5049}
5050
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005051// TODO(jungjw): Move this to proptools
5052func intPtr(i int) *int {
5053 return &i
5054}
5055
5056func TestApexSet(t *testing.T) {
5057 ctx, config := testApex(t, `
5058 apex_set {
5059 name: "myapex",
5060 set: "myapex.apks",
5061 filename: "foo_v2.apex",
5062 overrides: ["foo"],
5063 }
5064 `, func(fs map[string][]byte, config android.Config) {
5065 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5066 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5067 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5068 })
5069
5070 m := ctx.ModuleForTests("myapex", "android_common")
5071
5072 // Check extract_apks tool parameters.
5073 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5074 actual := extractedApex.Args["abis"]
5075 expected := "ARMEABI_V7A,ARM64_V8A"
5076 if actual != expected {
5077 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5078 }
5079 actual = extractedApex.Args["sdk-version"]
5080 expected = "30"
5081 if actual != expected {
5082 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5083 }
5084
5085 a := m.Module().(*ApexSet)
5086 expectedOverrides := []string{"foo"}
5087 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5088 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5089 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5090 }
5091}
5092
Jiyong Park7d95a512020-05-10 15:16:24 +09005093func TestNoStaticLinkingToStubsLib(t *testing.T) {
5094 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5095 apex {
5096 name: "myapex",
5097 key: "myapex.key",
5098 native_shared_libs: ["mylib"],
5099 }
5100
5101 apex_key {
5102 name: "myapex.key",
5103 public_key: "testkey.avbpubkey",
5104 private_key: "testkey.pem",
5105 }
5106
5107 cc_library {
5108 name: "mylib",
5109 srcs: ["mylib.cpp"],
5110 static_libs: ["otherlib"],
5111 system_shared_libs: [],
5112 stl: "none",
5113 apex_available: [ "myapex" ],
5114 }
5115
5116 cc_library {
5117 name: "otherlib",
5118 srcs: ["mylib.cpp"],
5119 system_shared_libs: [],
5120 stl: "none",
5121 stubs: {
5122 versions: ["1", "2", "3"],
5123 },
5124 apex_available: [ "myapex" ],
5125 }
5126 `)
5127}
5128
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005129func TestMain(m *testing.M) {
5130 run := func() int {
5131 setUp()
5132 defer tearDown()
5133
5134 return m.Run()
5135 }
5136
5137 os.Exit(run())
5138}