blob: ced113f2f9693d9c0004176b4827fe32c1c91013 [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"],
427 sdk_version: "none",
428 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900429 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900430 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000431 // TODO: remove //apex_available:platform
432 apex_available: [
433 "//apex_available:platform",
434 "myapex",
435 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900436 }
437
438 java_library {
439 name: "myotherjar",
440 srcs: ["foo/bar/MyClass.java"],
441 sdk_version: "none",
442 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900443 // TODO: remove //apex_available:platform
444 apex_available: [
445 "//apex_available:platform",
446 "myapex",
447 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900448 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900449
450 java_library {
451 name: "mysharedjar",
452 srcs: ["foo/bar/MyClass.java"],
453 sdk_version: "none",
454 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900455 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900456 `)
457
Sundong Ahnabb64432019-10-22 13:58:29 +0900458 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900459
460 optFlags := apexRule.Args["opt_flags"]
461 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700462 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900463 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900464
Jiyong Park25fc6a92018-11-18 18:02:45 +0900465 copyCmds := apexRule.Args["copy_commands"]
466
467 // Ensure that main rule creates an output
468 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
469
470 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800471 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900473
474 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800475 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477
478 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800479 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
480 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
482 // .. but not for java libs
483 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800485
Colin Cross7113d202019-11-20 16:39:12 -0800486 // Ensure that the platform variant ends with _shared or _common
487 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
488 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
490 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900491 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
492
493 // Ensure that dynamic dependency to java libs are not included
494 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800495
496 // Ensure that all symlinks are present.
497 found_foo_link_64 := false
498 found_foo := false
499 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900500 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800501 if strings.HasSuffix(cmd, "bin/foo") {
502 found_foo = true
503 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
504 found_foo_link_64 = true
505 }
506 }
507 }
508 good := found_foo && found_foo_link_64
509 if !good {
510 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
511 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900512
Sundong Ahnabb64432019-10-22 13:58:29 +0900513 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700514 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900515 if len(noticeInputs) != 3 {
516 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900517 }
518 ensureListContains(t, noticeInputs, "NOTICE")
519 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900520 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900521
Artur Satayeva8bd1132020-04-27 18:07:06 +0100522 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100523 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
524 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
525 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
526 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
527 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100528
529 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100530 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
531 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
532 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
533 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
534 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800535}
536
Jooyung Hanf21c7972019-12-16 22:32:06 +0900537func TestDefaults(t *testing.T) {
538 ctx, _ := testApex(t, `
539 apex_defaults {
540 name: "myapex-defaults",
541 key: "myapex.key",
542 prebuilts: ["myetc"],
543 native_shared_libs: ["mylib"],
544 java_libs: ["myjar"],
545 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900546 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900547 }
548
549 prebuilt_etc {
550 name: "myetc",
551 src: "myprebuilt",
552 }
553
554 apex {
555 name: "myapex",
556 defaults: ["myapex-defaults"],
557 }
558
559 apex_key {
560 name: "myapex.key",
561 public_key: "testkey.avbpubkey",
562 private_key: "testkey.pem",
563 }
564
565 cc_library {
566 name: "mylib",
567 system_shared_libs: [],
568 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000569 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900570 }
571
572 java_library {
573 name: "myjar",
574 srcs: ["foo/bar/MyClass.java"],
575 sdk_version: "none",
576 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000577 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900578 }
579
580 android_app {
581 name: "AppFoo",
582 srcs: ["foo/bar/MyClass.java"],
583 sdk_version: "none",
584 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000585 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900586 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900587
588 runtime_resource_overlay {
589 name: "rro",
590 theme: "blue",
591 }
592
Jooyung Hanf21c7972019-12-16 22:32:06 +0900593 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000594 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900595 "etc/myetc",
596 "javalib/myjar.jar",
597 "lib64/mylib.so",
598 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900599 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900600 })
601}
602
Jooyung Han01a3ee22019-11-02 02:52:25 +0900603func TestApexManifest(t *testing.T) {
604 ctx, _ := testApex(t, `
605 apex {
606 name: "myapex",
607 key: "myapex.key",
608 }
609
610 apex_key {
611 name: "myapex.key",
612 public_key: "testkey.avbpubkey",
613 private_key: "testkey.pem",
614 }
615 `)
616
617 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900618 args := module.Rule("apexRule").Args
619 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
620 t.Error("manifest should be apex_manifest.pb, but " + manifest)
621 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900622}
623
Alex Light5098a612018-11-29 17:12:15 -0800624func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700625 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800626 apex {
627 name: "myapex",
628 key: "myapex.key",
629 payload_type: "zip",
630 native_shared_libs: ["mylib"],
631 }
632
633 apex_key {
634 name: "myapex.key",
635 public_key: "testkey.avbpubkey",
636 private_key: "testkey.pem",
637 }
638
639 cc_library {
640 name: "mylib",
641 srcs: ["mylib.cpp"],
642 shared_libs: ["mylib2"],
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800646 }
647
648 cc_library {
649 name: "mylib2",
650 srcs: ["mylib.cpp"],
651 system_shared_libs: [],
652 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800654 }
655 `)
656
Sundong Ahnabb64432019-10-22 13:58:29 +0900657 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800658 copyCmds := zipApexRule.Args["copy_commands"]
659
660 // Ensure that main rule creates an output
661 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
662
663 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800664 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800665
666 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800667 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800668
669 // Ensure that both direct and indirect deps are copied into apex
670 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
671 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900672}
673
674func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700675 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900676 apex {
677 name: "myapex",
678 key: "myapex.key",
679 native_shared_libs: ["mylib", "mylib3"],
680 }
681
682 apex_key {
683 name: "myapex.key",
684 public_key: "testkey.avbpubkey",
685 private_key: "testkey.pem",
686 }
687
688 cc_library {
689 name: "mylib",
690 srcs: ["mylib.cpp"],
691 shared_libs: ["mylib2", "mylib3"],
692 system_shared_libs: [],
693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000694 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900695 }
696
697 cc_library {
698 name: "mylib2",
699 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900700 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900701 system_shared_libs: [],
702 stl: "none",
703 stubs: {
704 versions: ["1", "2", "3"],
705 },
706 }
707
708 cc_library {
709 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900710 srcs: ["mylib.cpp"],
711 shared_libs: ["mylib4"],
712 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900713 stl: "none",
714 stubs: {
715 versions: ["10", "11", "12"],
716 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000717 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900718 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900719
720 cc_library {
721 name: "mylib4",
722 srcs: ["mylib.cpp"],
723 system_shared_libs: [],
724 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000725 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900726 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900727 `)
728
Sundong Ahnabb64432019-10-22 13:58:29 +0900729 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900730 copyCmds := apexRule.Args["copy_commands"]
731
732 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800733 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900734
735 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800736 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900737
738 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800739 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900740
Colin Cross7113d202019-11-20 16:39:12 -0800741 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900742
743 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900744 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900745 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900746 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900747
748 // 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 -0800749 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900750 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800751 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900752
753 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900754 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900755 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900756
757 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900758 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900759
Jooyung Hana57af4a2020-01-23 05:36:59 +0000760 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900761 "lib64/mylib.so",
762 "lib64/mylib3.so",
763 "lib64/mylib4.so",
764 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900765}
766
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900767func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700768 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900769 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900770 name: "myapex2",
771 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900772 native_shared_libs: ["mylib"],
773 }
774
775 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900776 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900777 public_key: "testkey.avbpubkey",
778 private_key: "testkey.pem",
779 }
780
781 cc_library {
782 name: "mylib",
783 srcs: ["mylib.cpp"],
784 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900785 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900786 system_shared_libs: [],
787 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000788 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900789 }
790
791 cc_library {
792 name: "libfoo",
793 srcs: ["mylib.cpp"],
794 shared_libs: ["libbar"],
795 system_shared_libs: [],
796 stl: "none",
797 stubs: {
798 versions: ["10", "20", "30"],
799 },
800 }
801
802 cc_library {
803 name: "libbar",
804 srcs: ["mylib.cpp"],
805 system_shared_libs: [],
806 stl: "none",
807 }
808
Jiyong Park678c8812020-02-07 17:25:49 +0900809 cc_library_static {
810 name: "libbaz",
811 srcs: ["mylib.cpp"],
812 system_shared_libs: [],
813 stl: "none",
814 apex_available: [ "myapex2" ],
815 }
816
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900817 `)
818
Jiyong Park83dc74b2020-01-14 18:38:44 +0900819 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900820 copyCmds := apexRule.Args["copy_commands"]
821
822 // Ensure that direct non-stubs dep is always included
823 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
824
825 // Ensure that indirect stubs dep is not included
826 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
827
828 // Ensure that dependency of stubs is not included
829 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
830
Jiyong Park83dc74b2020-01-14 18:38:44 +0900831 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900832
833 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900834 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900835 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900836 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900837
Jiyong Park3ff16992019-12-27 14:11:47 +0900838 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839
840 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
841 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900842
Artur Satayeva8bd1132020-04-27 18:07:06 +0100843 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100844 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
845 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
846 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900847
Artur Satayeva8bd1132020-04-27 18:07:06 +0100848 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100849 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
850 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
851 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900852}
853
Jooyung Hand3639552019-08-09 12:57:43 +0900854func TestApexWithRuntimeLibsDependency(t *testing.T) {
855 /*
856 myapex
857 |
858 v (runtime_libs)
859 mylib ------+------> libfoo [provides stub]
860 |
861 `------> libbar
862 */
863 ctx, _ := testApex(t, `
864 apex {
865 name: "myapex",
866 key: "myapex.key",
867 native_shared_libs: ["mylib"],
868 }
869
870 apex_key {
871 name: "myapex.key",
872 public_key: "testkey.avbpubkey",
873 private_key: "testkey.pem",
874 }
875
876 cc_library {
877 name: "mylib",
878 srcs: ["mylib.cpp"],
879 runtime_libs: ["libfoo", "libbar"],
880 system_shared_libs: [],
881 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000882 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900883 }
884
885 cc_library {
886 name: "libfoo",
887 srcs: ["mylib.cpp"],
888 system_shared_libs: [],
889 stl: "none",
890 stubs: {
891 versions: ["10", "20", "30"],
892 },
893 }
894
895 cc_library {
896 name: "libbar",
897 srcs: ["mylib.cpp"],
898 system_shared_libs: [],
899 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000900 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900901 }
902
903 `)
904
Sundong Ahnabb64432019-10-22 13:58:29 +0900905 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900906 copyCmds := apexRule.Args["copy_commands"]
907
908 // Ensure that direct non-stubs dep is always included
909 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
910
911 // Ensure that indirect stubs dep is not included
912 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
913
914 // Ensure that runtime_libs dep in included
915 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
916
Sundong Ahnabb64432019-10-22 13:58:29 +0900917 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900918 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
919 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900920
921}
922
Jooyung Han8ce8db92020-05-15 19:05:05 +0900923func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
924 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
925 bp := `
926 apex {
927 name: "com.android.runtime",
928 key: "com.android.runtime.key",
929 native_shared_libs: ["libc"],
930 }
931
932 apex_key {
933 name: "com.android.runtime.key",
934 public_key: "testkey.avbpubkey",
935 private_key: "testkey.pem",
936 }
937
938 cc_library {
939 name: "libc",
940 no_libcrt: true,
941 nocrt: true,
942 stl: "none",
943 system_shared_libs: [],
944 stubs: { versions: ["1"] },
945 apex_available: ["com.android.runtime"],
946
947 sanitize: {
948 hwaddress: true,
949 }
950 }
951
952 cc_prebuilt_library_shared {
953 name: "libclang_rt.hwasan-aarch64-android",
954 no_libcrt: true,
955 nocrt: true,
956 stl: "none",
957 system_shared_libs: [],
958 srcs: [""],
959 stubs: { versions: ["1"] },
960
961 sanitize: {
962 never: true,
963 },
964 }
965 `
966 // override bp to use hard-coded names: com.android.runtime and libc
967 fs["Android.bp"] = []byte(bp)
968 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
969 })
970
971 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
972 "lib64/bionic/libc.so",
973 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
974 })
975
976 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
977
978 installed := hwasan.Description("install libclang_rt.hwasan")
979 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
980
981 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
982 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
983 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
984}
985
986func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
987 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
988 bp := `
989 apex {
990 name: "com.android.runtime",
991 key: "com.android.runtime.key",
992 native_shared_libs: ["libc"],
993 }
994
995 apex_key {
996 name: "com.android.runtime.key",
997 public_key: "testkey.avbpubkey",
998 private_key: "testkey.pem",
999 }
1000
1001 cc_library {
1002 name: "libc",
1003 no_libcrt: true,
1004 nocrt: true,
1005 stl: "none",
1006 system_shared_libs: [],
1007 stubs: { versions: ["1"] },
1008 apex_available: ["com.android.runtime"],
1009 }
1010
1011 cc_prebuilt_library_shared {
1012 name: "libclang_rt.hwasan-aarch64-android",
1013 no_libcrt: true,
1014 nocrt: true,
1015 stl: "none",
1016 system_shared_libs: [],
1017 srcs: [""],
1018 stubs: { versions: ["1"] },
1019
1020 sanitize: {
1021 never: true,
1022 },
1023 }
1024 `
1025 // override bp to use hard-coded names: com.android.runtime and libc
1026 fs["Android.bp"] = []byte(bp)
1027 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1028
1029 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1030 })
1031
1032 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1033 "lib64/bionic/libc.so",
1034 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1035 })
1036
1037 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1038
1039 installed := hwasan.Description("install libclang_rt.hwasan")
1040 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1041
1042 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1043 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1044 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1045}
1046
Jooyung Han61b66e92020-03-21 14:21:46 +00001047func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1048 testcases := []struct {
1049 name string
1050 minSdkVersion string
1051 shouldLink string
1052 shouldNotLink []string
1053 }{
1054 {
Jooyung Han75568392020-03-20 04:29:24 +09001055 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001056 minSdkVersion: "current",
1057 shouldLink: "30",
1058 shouldNotLink: []string{"29"},
1059 },
1060 {
1061 name: "should link to llndk#29",
1062 minSdkVersion: "29",
1063 shouldLink: "29",
1064 shouldNotLink: []string{"30"},
1065 },
1066 }
1067 for _, tc := range testcases {
1068 t.Run(tc.name, func(t *testing.T) {
1069 ctx, _ := testApex(t, `
1070 apex {
1071 name: "myapex",
1072 key: "myapex.key",
1073 use_vendor: true,
1074 native_shared_libs: ["mylib"],
1075 min_sdk_version: "`+tc.minSdkVersion+`",
1076 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001077
Jooyung Han61b66e92020-03-21 14:21:46 +00001078 apex_key {
1079 name: "myapex.key",
1080 public_key: "testkey.avbpubkey",
1081 private_key: "testkey.pem",
1082 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001083
Jooyung Han61b66e92020-03-21 14:21:46 +00001084 cc_library {
1085 name: "mylib",
1086 srcs: ["mylib.cpp"],
1087 vendor_available: true,
1088 shared_libs: ["libbar"],
1089 system_shared_libs: [],
1090 stl: "none",
1091 apex_available: [ "myapex" ],
1092 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001093
Jooyung Han61b66e92020-03-21 14:21:46 +00001094 cc_library {
1095 name: "libbar",
1096 srcs: ["mylib.cpp"],
1097 system_shared_libs: [],
1098 stl: "none",
1099 stubs: { versions: ["29","30"] },
1100 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001101
Jooyung Han61b66e92020-03-21 14:21:46 +00001102 llndk_library {
1103 name: "libbar",
1104 symbol_file: "",
1105 }
1106 `, func(fs map[string][]byte, config android.Config) {
1107 setUseVendorWhitelistForTest(config, []string{"myapex"})
1108 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001109
Jooyung Han61b66e92020-03-21 14:21:46 +00001110 // Ensure that LLNDK dep is not included
1111 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1112 "lib64/mylib.so",
1113 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001114
Jooyung Han61b66e92020-03-21 14:21:46 +00001115 // Ensure that LLNDK dep is required
1116 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1117 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1118 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001119
Jooyung Han61b66e92020-03-21 14:21:46 +00001120 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1121 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1122 for _, ver := range tc.shouldNotLink {
1123 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1124 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001125
Jooyung Han61b66e92020-03-21 14:21:46 +00001126 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1127 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1128 })
1129 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001130}
1131
Jiyong Park25fc6a92018-11-18 18:02:45 +09001132func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001133 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001134 apex {
1135 name: "myapex",
1136 key: "myapex.key",
1137 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1138 }
1139
1140 apex_key {
1141 name: "myapex.key",
1142 public_key: "testkey.avbpubkey",
1143 private_key: "testkey.pem",
1144 }
1145
1146 cc_library {
1147 name: "mylib",
1148 srcs: ["mylib.cpp"],
1149 shared_libs: ["libdl#27"],
1150 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001151 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001152 }
1153
1154 cc_library_shared {
1155 name: "mylib_shared",
1156 srcs: ["mylib.cpp"],
1157 shared_libs: ["libdl#27"],
1158 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001159 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001160 }
1161
1162 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001163 name: "libBootstrap",
1164 srcs: ["mylib.cpp"],
1165 stl: "none",
1166 bootstrap: true,
1167 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001168 `)
1169
Sundong Ahnabb64432019-10-22 13:58:29 +09001170 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001171 copyCmds := apexRule.Args["copy_commands"]
1172
1173 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001174 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001175 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1176 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001177
1178 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001179 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001180
Colin Cross7113d202019-11-20 16:39:12 -08001181 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1182 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1183 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001184
1185 // For dependency to libc
1186 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001187 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001188 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001189 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001190 // ... Cflags from stub is correctly exported to mylib
1191 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1192 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1193
1194 // For dependency to libm
1195 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001196 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001197 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001198 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001199 // ... and is not compiling with the stub
1200 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1201 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1202
1203 // For dependency to libdl
1204 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001205 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001206 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001207 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1208 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001209 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001210 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001211 // ... Cflags from stub is correctly exported to mylib
1212 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1213 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001214
1215 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001216 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1217 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1218 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1219 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001220}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001221
Jooyung Han03b51852020-02-26 22:45:42 +09001222func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1223 // there are three links between liba --> libz
1224 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1225 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1226 // 3) (platform) -> liba -> libz : this should be non-stub link
1227 ctx, _ := testApex(t, `
1228 apex {
1229 name: "myapex",
1230 key: "myapex.key",
1231 native_shared_libs: ["libx"],
1232 min_sdk_version: "2",
1233 }
1234
1235 apex {
1236 name: "otherapex",
1237 key: "myapex.key",
1238 native_shared_libs: ["liby"],
1239 min_sdk_version: "3",
1240 }
1241
1242 apex_key {
1243 name: "myapex.key",
1244 public_key: "testkey.avbpubkey",
1245 private_key: "testkey.pem",
1246 }
1247
1248 cc_library {
1249 name: "libx",
1250 shared_libs: ["liba"],
1251 system_shared_libs: [],
1252 stl: "none",
1253 apex_available: [ "myapex" ],
1254 }
1255
1256 cc_library {
1257 name: "liby",
1258 shared_libs: ["liba"],
1259 system_shared_libs: [],
1260 stl: "none",
1261 apex_available: [ "otherapex" ],
1262 }
1263
1264 cc_library {
1265 name: "liba",
1266 shared_libs: ["libz"],
1267 system_shared_libs: [],
1268 stl: "none",
1269 apex_available: [
1270 "//apex_available:anyapex",
1271 "//apex_available:platform",
1272 ],
1273 }
1274
1275 cc_library {
1276 name: "libz",
1277 system_shared_libs: [],
1278 stl: "none",
1279 stubs: {
1280 versions: ["1", "3"],
1281 },
1282 }
1283 `, withUnbundledBuild)
1284
1285 expectLink := func(from, from_variant, to, to_variant string) {
1286 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1287 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1288 }
1289 expectNoLink := func(from, from_variant, to, to_variant string) {
1290 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1291 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1292 }
1293 // platform liba is linked to non-stub version
1294 expectLink("liba", "shared", "libz", "shared")
1295 // liba in myapex is linked to #1
1296 expectLink("liba", "shared_myapex", "libz", "shared_1")
1297 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1298 expectNoLink("liba", "shared_myapex", "libz", "shared")
1299 // liba in otherapex is linked to #3
1300 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1301 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1302 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1303}
1304
Jooyung Hanaed150d2020-04-02 01:41:41 +09001305func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1306 ctx, _ := testApex(t, `
1307 apex {
1308 name: "myapex",
1309 key: "myapex.key",
1310 native_shared_libs: ["libx"],
1311 min_sdk_version: "R",
1312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 cc_library {
1321 name: "libx",
1322 shared_libs: ["libz"],
1323 system_shared_libs: [],
1324 stl: "none",
1325 apex_available: [ "myapex" ],
1326 }
1327
1328 cc_library {
1329 name: "libz",
1330 system_shared_libs: [],
1331 stl: "none",
1332 stubs: {
1333 versions: ["29", "R"],
1334 },
1335 }
1336 `, func(fs map[string][]byte, config android.Config) {
1337 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1338 })
1339
1340 expectLink := func(from, from_variant, to, to_variant string) {
1341 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1342 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1343 }
1344 expectNoLink := func(from, from_variant, to, to_variant string) {
1345 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1346 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1347 }
1348 // 9000 is quite a magic number.
1349 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1350 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1351 // to distinguish them from finalized and future_api(10000)
1352 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1353 // (refer android/api_levels.go)
1354 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1355 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1356 expectNoLink("libx", "shared_myapex", "libz", "shared")
1357}
1358
Jooyung Han03b51852020-02-26 22:45:42 +09001359func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1360 ctx, _ := testApex(t, `
1361 apex {
1362 name: "myapex",
1363 key: "myapex.key",
1364 native_shared_libs: ["libx"],
1365 }
1366
1367 apex_key {
1368 name: "myapex.key",
1369 public_key: "testkey.avbpubkey",
1370 private_key: "testkey.pem",
1371 }
1372
1373 cc_library {
1374 name: "libx",
1375 shared_libs: ["libz"],
1376 system_shared_libs: [],
1377 stl: "none",
1378 apex_available: [ "myapex" ],
1379 }
1380
1381 cc_library {
1382 name: "libz",
1383 system_shared_libs: [],
1384 stl: "none",
1385 stubs: {
1386 versions: ["1", "2"],
1387 },
1388 }
1389 `)
1390
1391 expectLink := func(from, from_variant, to, to_variant string) {
1392 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1393 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1394 }
1395 expectNoLink := func(from, from_variant, to, to_variant string) {
1396 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1397 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1398 }
1399 expectLink("libx", "shared_myapex", "libz", "shared_2")
1400 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1401 expectNoLink("libx", "shared_myapex", "libz", "shared")
1402}
1403
1404func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1405 ctx, _ := testApex(t, `
1406 apex {
1407 name: "myapex",
1408 key: "myapex.key",
1409 native_shared_libs: ["libx"],
1410 }
1411
1412 apex_key {
1413 name: "myapex.key",
1414 public_key: "testkey.avbpubkey",
1415 private_key: "testkey.pem",
1416 }
1417
1418 cc_library {
1419 name: "libx",
1420 system_shared_libs: [],
1421 stl: "none",
1422 apex_available: [ "myapex" ],
1423 stubs: {
1424 versions: ["1", "2"],
1425 },
1426 }
1427
1428 cc_library {
1429 name: "libz",
1430 shared_libs: ["libx"],
1431 system_shared_libs: [],
1432 stl: "none",
1433 }
1434 `)
1435
1436 expectLink := func(from, from_variant, to, to_variant string) {
1437 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1438 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1439 }
1440 expectNoLink := func(from, from_variant, to, to_variant string) {
1441 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1442 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1443 }
1444 expectLink("libz", "shared", "libx", "shared_2")
1445 expectNoLink("libz", "shared", "libz", "shared_1")
1446 expectNoLink("libz", "shared", "libz", "shared")
1447}
1448
Jooyung Han75568392020-03-20 04:29:24 +09001449func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001450 ctx, _ := testApex(t, `
1451 apex {
1452 name: "myapex",
1453 key: "myapex.key",
1454 native_shared_libs: ["libx"],
1455 min_sdk_version: "29",
1456 }
1457
1458 apex_key {
1459 name: "myapex.key",
1460 public_key: "testkey.avbpubkey",
1461 private_key: "testkey.pem",
1462 }
1463
1464 cc_library {
1465 name: "libx",
1466 shared_libs: ["libbar"],
1467 apex_available: [ "myapex" ],
1468 }
1469
1470 cc_library {
1471 name: "libbar",
1472 stubs: {
1473 versions: ["29", "30"],
1474 },
1475 }
Jooyung Han75568392020-03-20 04:29:24 +09001476 `, func(fs map[string][]byte, config android.Config) {
1477 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1478 })
Jooyung Han03b51852020-02-26 22:45:42 +09001479 expectLink := func(from, from_variant, to, to_variant string) {
1480 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1481 libFlags := ld.Args["libFlags"]
1482 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1483 }
Jooyung Han75568392020-03-20 04:29:24 +09001484 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001485}
1486
Jooyung Han75568392020-03-20 04:29:24 +09001487func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001488 ctx, _ := testApex(t, `
1489 apex {
1490 name: "myapex",
1491 key: "myapex.key",
1492 native_shared_libs: ["libx"],
1493 min_sdk_version: "29",
1494 }
1495
1496 apex_key {
1497 name: "myapex.key",
1498 public_key: "testkey.avbpubkey",
1499 private_key: "testkey.pem",
1500 }
1501
1502 cc_library {
1503 name: "libx",
1504 apex_available: [ "myapex" ],
1505 }
Jooyung Han75568392020-03-20 04:29:24 +09001506 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001507
1508 // ensure apex variant of c++ is linked with static unwinder
1509 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1510 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1511 // note that platform variant is not.
1512 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1513 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001514}
1515
1516func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001517 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001518 apex {
1519 name: "myapex",
1520 key: "myapex.key",
1521 native_shared_libs: ["libx"],
1522 min_sdk_version: "29",
1523 }
1524
1525 apex_key {
1526 name: "myapex.key",
1527 public_key: "testkey.avbpubkey",
1528 private_key: "testkey.pem",
1529 }
1530
1531 cc_library {
1532 name: "libx",
1533 shared_libs: ["libz"],
1534 system_shared_libs: [],
1535 stl: "none",
1536 apex_available: [ "myapex" ],
1537 }
1538
1539 cc_library {
1540 name: "libz",
1541 system_shared_libs: [],
1542 stl: "none",
1543 stubs: {
1544 versions: ["30"],
1545 },
1546 }
Jooyung Han75568392020-03-20 04:29:24 +09001547 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001548
Jooyung Hanaed150d2020-04-02 01:41:41 +09001549 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001550 apex {
1551 name: "myapex",
1552 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001553 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001554 }
1555
1556 apex_key {
1557 name: "myapex.key",
1558 public_key: "testkey.avbpubkey",
1559 private_key: "testkey.pem",
1560 }
1561 `)
1562}
1563
Artur Satayev8cf899a2020-04-15 17:29:42 +01001564func TestJavaStableSdkVersion(t *testing.T) {
1565 testCases := []struct {
1566 name string
1567 expectedError string
1568 bp string
1569 }{
1570 {
1571 name: "Non-updatable apex with non-stable dep",
1572 bp: `
1573 apex {
1574 name: "myapex",
1575 java_libs: ["myjar"],
1576 key: "myapex.key",
1577 }
1578 apex_key {
1579 name: "myapex.key",
1580 public_key: "testkey.avbpubkey",
1581 private_key: "testkey.pem",
1582 }
1583 java_library {
1584 name: "myjar",
1585 srcs: ["foo/bar/MyClass.java"],
1586 sdk_version: "core_platform",
1587 apex_available: ["myapex"],
1588 }
1589 `,
1590 },
1591 {
1592 name: "Updatable apex with stable dep",
1593 bp: `
1594 apex {
1595 name: "myapex",
1596 java_libs: ["myjar"],
1597 key: "myapex.key",
1598 updatable: true,
1599 min_sdk_version: "29",
1600 }
1601 apex_key {
1602 name: "myapex.key",
1603 public_key: "testkey.avbpubkey",
1604 private_key: "testkey.pem",
1605 }
1606 java_library {
1607 name: "myjar",
1608 srcs: ["foo/bar/MyClass.java"],
1609 sdk_version: "current",
1610 apex_available: ["myapex"],
1611 }
1612 `,
1613 },
1614 {
1615 name: "Updatable apex with non-stable dep",
1616 expectedError: "cannot depend on \"myjar\"",
1617 bp: `
1618 apex {
1619 name: "myapex",
1620 java_libs: ["myjar"],
1621 key: "myapex.key",
1622 updatable: true,
1623 }
1624 apex_key {
1625 name: "myapex.key",
1626 public_key: "testkey.avbpubkey",
1627 private_key: "testkey.pem",
1628 }
1629 java_library {
1630 name: "myjar",
1631 srcs: ["foo/bar/MyClass.java"],
1632 sdk_version: "core_platform",
1633 apex_available: ["myapex"],
1634 }
1635 `,
1636 },
1637 {
1638 name: "Updatable apex with non-stable transitive dep",
1639 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1640 bp: `
1641 apex {
1642 name: "myapex",
1643 java_libs: ["myjar"],
1644 key: "myapex.key",
1645 updatable: true,
1646 }
1647 apex_key {
1648 name: "myapex.key",
1649 public_key: "testkey.avbpubkey",
1650 private_key: "testkey.pem",
1651 }
1652 java_library {
1653 name: "myjar",
1654 srcs: ["foo/bar/MyClass.java"],
1655 sdk_version: "current",
1656 apex_available: ["myapex"],
1657 static_libs: ["transitive-jar"],
1658 }
1659 java_library {
1660 name: "transitive-jar",
1661 srcs: ["foo/bar/MyClass.java"],
1662 sdk_version: "core_platform",
1663 apex_available: ["myapex"],
1664 }
1665 `,
1666 },
1667 }
1668
1669 for _, test := range testCases {
1670 t.Run(test.name, func(t *testing.T) {
1671 if test.expectedError == "" {
1672 testApex(t, test.bp)
1673 } else {
1674 testApexError(t, test.expectedError, test.bp)
1675 }
1676 })
1677 }
1678}
1679
Jiyong Park7c2ee712018-12-07 00:42:25 +09001680func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001681 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001685 native_shared_libs: ["mylib"],
1686 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001687 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001688 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001689 }
1690
1691 apex_key {
1692 name: "myapex.key",
1693 public_key: "testkey.avbpubkey",
1694 private_key: "testkey.pem",
1695 }
1696
1697 prebuilt_etc {
1698 name: "myetc",
1699 src: "myprebuilt",
1700 sub_dir: "foo/bar",
1701 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001702
1703 cc_library {
1704 name: "mylib",
1705 srcs: ["mylib.cpp"],
1706 relative_install_path: "foo/bar",
1707 system_shared_libs: [],
1708 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001709 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001710 }
1711
1712 cc_binary {
1713 name: "mybin",
1714 srcs: ["mylib.cpp"],
1715 relative_install_path: "foo/bar",
1716 system_shared_libs: [],
1717 static_executable: true,
1718 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001719 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001720 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001721 `)
1722
Sundong Ahnabb64432019-10-22 13:58:29 +09001723 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001724 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1725
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001726 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001727 ensureListContains(t, dirs, "etc")
1728 ensureListContains(t, dirs, "etc/foo")
1729 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001730 ensureListContains(t, dirs, "lib64")
1731 ensureListContains(t, dirs, "lib64/foo")
1732 ensureListContains(t, dirs, "lib64/foo/bar")
1733 ensureListContains(t, dirs, "lib")
1734 ensureListContains(t, dirs, "lib/foo")
1735 ensureListContains(t, dirs, "lib/foo/bar")
1736
Jiyong Parkbd13e442019-03-15 18:10:35 +09001737 ensureListContains(t, dirs, "bin")
1738 ensureListContains(t, dirs, "bin/foo")
1739 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001740}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001741
Jooyung Han35155c42020-02-06 17:33:20 +09001742func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1743 ctx, _ := testApex(t, `
1744 apex {
1745 name: "myapex",
1746 key: "myapex.key",
1747 multilib: {
1748 both: {
1749 native_shared_libs: ["mylib"],
1750 binaries: ["mybin"],
1751 },
1752 },
1753 compile_multilib: "both",
1754 native_bridge_supported: true,
1755 }
1756
1757 apex_key {
1758 name: "myapex.key",
1759 public_key: "testkey.avbpubkey",
1760 private_key: "testkey.pem",
1761 }
1762
1763 cc_library {
1764 name: "mylib",
1765 relative_install_path: "foo/bar",
1766 system_shared_libs: [],
1767 stl: "none",
1768 apex_available: [ "myapex" ],
1769 native_bridge_supported: true,
1770 }
1771
1772 cc_binary {
1773 name: "mybin",
1774 relative_install_path: "foo/bar",
1775 system_shared_libs: [],
1776 static_executable: true,
1777 stl: "none",
1778 apex_available: [ "myapex" ],
1779 native_bridge_supported: true,
1780 compile_multilib: "both", // default is "first" for binary
1781 multilib: {
1782 lib64: {
1783 suffix: "64",
1784 },
1785 },
1786 }
1787 `, withNativeBridgeEnabled)
1788 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1789 "bin/foo/bar/mybin",
1790 "bin/foo/bar/mybin64",
1791 "bin/arm/foo/bar/mybin",
1792 "bin/arm64/foo/bar/mybin64",
1793 "lib/foo/bar/mylib.so",
1794 "lib/arm/foo/bar/mylib.so",
1795 "lib64/foo/bar/mylib.so",
1796 "lib64/arm64/foo/bar/mylib.so",
1797 })
1798}
1799
Jiyong Parkda6eb592018-12-19 17:12:36 +09001800func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001801 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001802 apex {
1803 name: "myapex",
1804 key: "myapex.key",
1805 native_shared_libs: ["mylib"],
1806 use_vendor: true,
1807 }
1808
1809 apex_key {
1810 name: "myapex.key",
1811 public_key: "testkey.avbpubkey",
1812 private_key: "testkey.pem",
1813 }
1814
1815 cc_library {
1816 name: "mylib",
1817 srcs: ["mylib.cpp"],
1818 shared_libs: ["mylib2"],
1819 system_shared_libs: [],
1820 vendor_available: true,
1821 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001822 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001823 }
1824
1825 cc_library {
1826 name: "mylib2",
1827 srcs: ["mylib.cpp"],
1828 system_shared_libs: [],
1829 vendor_available: true,
1830 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001831 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001832 }
Jooyung Handc782442019-11-01 03:14:38 +09001833 `, func(fs map[string][]byte, config android.Config) {
1834 setUseVendorWhitelistForTest(config, []string{"myapex"})
1835 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001836
1837 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001838 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001839 for _, implicit := range i.Implicits {
1840 inputsList = append(inputsList, implicit.String())
1841 }
1842 }
1843 inputsString := strings.Join(inputsList, " ")
1844
1845 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001846 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1847 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001848
1849 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001850 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1851 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001852}
Jiyong Park16e91a02018-12-20 18:18:08 +09001853
Jooyung Handc782442019-11-01 03:14:38 +09001854func TestUseVendorRestriction(t *testing.T) {
1855 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1856 apex {
1857 name: "myapex",
1858 key: "myapex.key",
1859 use_vendor: true,
1860 }
1861 apex_key {
1862 name: "myapex.key",
1863 public_key: "testkey.avbpubkey",
1864 private_key: "testkey.pem",
1865 }
1866 `, func(fs map[string][]byte, config android.Config) {
1867 setUseVendorWhitelistForTest(config, []string{""})
1868 })
1869 // no error with whitelist
1870 testApex(t, `
1871 apex {
1872 name: "myapex",
1873 key: "myapex.key",
1874 use_vendor: true,
1875 }
1876 apex_key {
1877 name: "myapex.key",
1878 public_key: "testkey.avbpubkey",
1879 private_key: "testkey.pem",
1880 }
1881 `, func(fs map[string][]byte, config android.Config) {
1882 setUseVendorWhitelistForTest(config, []string{"myapex"})
1883 })
1884}
1885
Jooyung Han5c998b92019-06-27 11:30:33 +09001886func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1887 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1888 apex {
1889 name: "myapex",
1890 key: "myapex.key",
1891 native_shared_libs: ["mylib"],
1892 use_vendor: true,
1893 }
1894
1895 apex_key {
1896 name: "myapex.key",
1897 public_key: "testkey.avbpubkey",
1898 private_key: "testkey.pem",
1899 }
1900
1901 cc_library {
1902 name: "mylib",
1903 srcs: ["mylib.cpp"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 }
1907 `)
1908}
1909
Jiyong Park16e91a02018-12-20 18:18:08 +09001910func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001911 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001912 apex {
1913 name: "myapex",
1914 key: "myapex.key",
1915 native_shared_libs: ["mylib"],
1916 }
1917
1918 apex_key {
1919 name: "myapex.key",
1920 public_key: "testkey.avbpubkey",
1921 private_key: "testkey.pem",
1922 }
1923
1924 cc_library {
1925 name: "mylib",
1926 srcs: ["mylib.cpp"],
1927 system_shared_libs: [],
1928 stl: "none",
1929 stubs: {
1930 versions: ["1", "2", "3"],
1931 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001932 apex_available: [
1933 "//apex_available:platform",
1934 "myapex",
1935 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001936 }
1937
1938 cc_binary {
1939 name: "not_in_apex",
1940 srcs: ["mylib.cpp"],
1941 static_libs: ["mylib"],
1942 static_executable: true,
1943 system_shared_libs: [],
1944 stl: "none",
1945 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001946 `)
1947
Colin Cross7113d202019-11-20 16:39:12 -08001948 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001949
1950 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001951 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001952}
Jiyong Park9335a262018-12-24 11:31:58 +09001953
1954func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001955 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001956 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001957 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001958 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001959 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001960 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001961 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001962 }
1963
1964 cc_library {
1965 name: "mylib",
1966 srcs: ["mylib.cpp"],
1967 system_shared_libs: [],
1968 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001969 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001970 }
1971
1972 apex_key {
1973 name: "myapex.key",
1974 public_key: "testkey.avbpubkey",
1975 private_key: "testkey.pem",
1976 }
1977
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001978 android_app_certificate {
1979 name: "myapex.certificate",
1980 certificate: "testkey",
1981 }
1982
1983 android_app_certificate {
1984 name: "myapex.certificate.override",
1985 certificate: "testkey.override",
1986 }
1987
Jiyong Park9335a262018-12-24 11:31:58 +09001988 `)
1989
1990 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001991 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001992
1993 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1994 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1995 "vendor/foo/devkeys/testkey.avbpubkey")
1996 }
1997 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1998 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1999 "vendor/foo/devkeys/testkey.pem")
2000 }
2001
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002002 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002003 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002004 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002005 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002006 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002007 }
2008}
Jiyong Park58e364a2019-01-19 19:24:06 +09002009
Jooyung Hanf121a652019-12-17 14:30:11 +09002010func TestCertificate(t *testing.T) {
2011 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2012 ctx, _ := testApex(t, `
2013 apex {
2014 name: "myapex",
2015 key: "myapex.key",
2016 }
2017 apex_key {
2018 name: "myapex.key",
2019 public_key: "testkey.avbpubkey",
2020 private_key: "testkey.pem",
2021 }`)
2022 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2023 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2024 if actual := rule.Args["certificates"]; actual != expected {
2025 t.Errorf("certificates should be %q, not %q", expected, actual)
2026 }
2027 })
2028 t.Run("override when unspecified", func(t *testing.T) {
2029 ctx, _ := testApex(t, `
2030 apex {
2031 name: "myapex_keytest",
2032 key: "myapex.key",
2033 file_contexts: ":myapex-file_contexts",
2034 }
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040 android_app_certificate {
2041 name: "myapex.certificate.override",
2042 certificate: "testkey.override",
2043 }`)
2044 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2045 expected := "testkey.override.x509.pem testkey.override.pk8"
2046 if actual := rule.Args["certificates"]; actual != expected {
2047 t.Errorf("certificates should be %q, not %q", expected, actual)
2048 }
2049 })
2050 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2051 ctx, _ := testApex(t, `
2052 apex {
2053 name: "myapex",
2054 key: "myapex.key",
2055 certificate: ":myapex.certificate",
2056 }
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }
2062 android_app_certificate {
2063 name: "myapex.certificate",
2064 certificate: "testkey",
2065 }`)
2066 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2067 expected := "testkey.x509.pem testkey.pk8"
2068 if actual := rule.Args["certificates"]; actual != expected {
2069 t.Errorf("certificates should be %q, not %q", expected, actual)
2070 }
2071 })
2072 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2073 ctx, _ := testApex(t, `
2074 apex {
2075 name: "myapex_keytest",
2076 key: "myapex.key",
2077 file_contexts: ":myapex-file_contexts",
2078 certificate: ":myapex.certificate",
2079 }
2080 apex_key {
2081 name: "myapex.key",
2082 public_key: "testkey.avbpubkey",
2083 private_key: "testkey.pem",
2084 }
2085 android_app_certificate {
2086 name: "myapex.certificate.override",
2087 certificate: "testkey.override",
2088 }`)
2089 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2090 expected := "testkey.override.x509.pem testkey.override.pk8"
2091 if actual := rule.Args["certificates"]; actual != expected {
2092 t.Errorf("certificates should be %q, not %q", expected, actual)
2093 }
2094 })
2095 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2096 ctx, _ := testApex(t, `
2097 apex {
2098 name: "myapex",
2099 key: "myapex.key",
2100 certificate: "testkey",
2101 }
2102 apex_key {
2103 name: "myapex.key",
2104 public_key: "testkey.avbpubkey",
2105 private_key: "testkey.pem",
2106 }`)
2107 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2108 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2109 if actual := rule.Args["certificates"]; actual != expected {
2110 t.Errorf("certificates should be %q, not %q", expected, actual)
2111 }
2112 })
2113 t.Run("override when specified as <name>", func(t *testing.T) {
2114 ctx, _ := testApex(t, `
2115 apex {
2116 name: "myapex_keytest",
2117 key: "myapex.key",
2118 file_contexts: ":myapex-file_contexts",
2119 certificate: "testkey",
2120 }
2121 apex_key {
2122 name: "myapex.key",
2123 public_key: "testkey.avbpubkey",
2124 private_key: "testkey.pem",
2125 }
2126 android_app_certificate {
2127 name: "myapex.certificate.override",
2128 certificate: "testkey.override",
2129 }`)
2130 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2131 expected := "testkey.override.x509.pem testkey.override.pk8"
2132 if actual := rule.Args["certificates"]; actual != expected {
2133 t.Errorf("certificates should be %q, not %q", expected, actual)
2134 }
2135 })
2136}
2137
Jiyong Park58e364a2019-01-19 19:24:06 +09002138func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002139 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002140 apex {
2141 name: "myapex",
2142 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002143 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002144 }
2145
2146 apex {
2147 name: "otherapex",
2148 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002149 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002150 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 system_shared_libs: [],
2163 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002164 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002165 "myapex",
2166 "otherapex",
2167 ],
Jooyung Han24282772020-03-21 23:20:55 +09002168 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002169 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002170 cc_library {
2171 name: "mylib2",
2172 srcs: ["mylib.cpp"],
2173 system_shared_libs: [],
2174 stl: "none",
2175 apex_available: [
2176 "myapex",
2177 "otherapex",
2178 ],
2179 use_apex_name_macro: true,
2180 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002181 `)
2182
Jooyung Hanc87a0592020-03-02 17:44:33 +09002183 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002184 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002185 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002186 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002187
Jooyung Hanccce2f22020-03-07 03:45:53 +09002188 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002189 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2190 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002191 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002192 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002193
Jooyung Hanccce2f22020-03-07 03:45:53 +09002194 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002195 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2196 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002197 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002198 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002199
Jooyung Hanc87a0592020-03-02 17:44:33 +09002200 // When cc_library sets use_apex_name_macro: true
2201 // apex variants define additional macro to distinguish which apex variant it is built for
2202
2203 // non-APEX variant does not have __ANDROID_APEX__ defined
2204 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2205 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2206
2207 // APEX variant has __ANDROID_APEX__ defined
2208 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002209 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002210 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2211 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002212
Jooyung Hanc87a0592020-03-02 17:44:33 +09002213 // APEX variant has __ANDROID_APEX__ defined
2214 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002215 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002216 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2217 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002218
2219 // recovery variant does not set __ANDROID_SDK_VERSION__
2220 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2221 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2222 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002223}
Jiyong Park7e636d02019-01-28 16:16:54 +09002224
2225func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002226 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002227 apex {
2228 name: "myapex",
2229 key: "myapex.key",
2230 native_shared_libs: ["mylib"],
2231 }
2232
2233 apex_key {
2234 name: "myapex.key",
2235 public_key: "testkey.avbpubkey",
2236 private_key: "testkey.pem",
2237 }
2238
2239 cc_library_headers {
2240 name: "mylib_headers",
2241 export_include_dirs: ["my_include"],
2242 system_shared_libs: [],
2243 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002244 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002245 }
2246
2247 cc_library {
2248 name: "mylib",
2249 srcs: ["mylib.cpp"],
2250 system_shared_libs: [],
2251 stl: "none",
2252 header_libs: ["mylib_headers"],
2253 export_header_lib_headers: ["mylib_headers"],
2254 stubs: {
2255 versions: ["1", "2", "3"],
2256 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002257 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002258 }
2259
2260 cc_library {
2261 name: "otherlib",
2262 srcs: ["mylib.cpp"],
2263 system_shared_libs: [],
2264 stl: "none",
2265 shared_libs: ["mylib"],
2266 }
2267 `)
2268
Colin Cross7113d202019-11-20 16:39:12 -08002269 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002270
2271 // Ensure that the include path of the header lib is exported to 'otherlib'
2272 ensureContains(t, cFlags, "-Imy_include")
2273}
Alex Light9670d332019-01-29 18:07:33 -08002274
Jiyong Park7cd10e32020-01-14 09:22:18 +09002275type fileInApex struct {
2276 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002277 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002278 isLink bool
2279}
2280
Jooyung Hana57af4a2020-01-23 05:36:59 +00002281func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002282 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002283 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002284 copyCmds := apexRule.Args["copy_commands"]
2285 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002286 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002287 for _, cmd := range strings.Split(copyCmds, "&&") {
2288 cmd = strings.TrimSpace(cmd)
2289 if cmd == "" {
2290 continue
2291 }
2292 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002293 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002294 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002295 switch terms[0] {
2296 case "mkdir":
2297 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002298 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002299 t.Fatal("copyCmds contains invalid cp command", cmd)
2300 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002301 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002302 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002303 isLink = false
2304 case "ln":
2305 if len(terms) != 3 && len(terms) != 4 {
2306 // ln LINK TARGET or ln -s LINK TARGET
2307 t.Fatal("copyCmds contains invalid ln command", cmd)
2308 }
2309 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002310 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002311 isLink = true
2312 default:
2313 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2314 }
2315 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002316 index := strings.Index(dst, imageApexDir)
2317 if index == -1 {
2318 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2319 }
2320 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002321 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002322 }
2323 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002324 return ret
2325}
2326
Jooyung Hana57af4a2020-01-23 05:36:59 +00002327func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2328 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002329 var failed bool
2330 var surplus []string
2331 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002332 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002333 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002334 for _, expected := range files {
2335 if matched, _ := path.Match(expected, file.path); matched {
2336 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002337 mactchFound = true
2338 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002339 }
2340 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002341 if !mactchFound {
2342 surplus = append(surplus, file.path)
2343 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002344 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002345
Jooyung Han31c470b2019-10-18 16:26:59 +09002346 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002347 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002348 t.Log("surplus files", surplus)
2349 failed = true
2350 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002351
2352 if len(files) > len(filesMatched) {
2353 var missing []string
2354 for _, expected := range files {
2355 if !filesMatched[expected] {
2356 missing = append(missing, expected)
2357 }
2358 }
2359 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002360 t.Log("missing files", missing)
2361 failed = true
2362 }
2363 if failed {
2364 t.Fail()
2365 }
2366}
2367
Jooyung Han344d5432019-08-23 11:17:39 +09002368func TestVndkApexCurrent(t *testing.T) {
2369 ctx, _ := testApex(t, `
2370 apex_vndk {
2371 name: "myapex",
2372 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002373 }
2374
2375 apex_key {
2376 name: "myapex.key",
2377 public_key: "testkey.avbpubkey",
2378 private_key: "testkey.pem",
2379 }
2380
2381 cc_library {
2382 name: "libvndk",
2383 srcs: ["mylib.cpp"],
2384 vendor_available: true,
2385 vndk: {
2386 enabled: true,
2387 },
2388 system_shared_libs: [],
2389 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002390 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002391 }
2392
2393 cc_library {
2394 name: "libvndksp",
2395 srcs: ["mylib.cpp"],
2396 vendor_available: true,
2397 vndk: {
2398 enabled: true,
2399 support_system_process: true,
2400 },
2401 system_shared_libs: [],
2402 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002403 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002404 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002405 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002406
Jooyung Hana57af4a2020-01-23 05:36:59 +00002407 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002408 "lib/libvndk.so",
2409 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002410 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002411 "lib64/libvndk.so",
2412 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002413 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002414 "etc/llndk.libraries.VER.txt",
2415 "etc/vndkcore.libraries.VER.txt",
2416 "etc/vndksp.libraries.VER.txt",
2417 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002418 })
Jooyung Han344d5432019-08-23 11:17:39 +09002419}
2420
2421func TestVndkApexWithPrebuilt(t *testing.T) {
2422 ctx, _ := testApex(t, `
2423 apex_vndk {
2424 name: "myapex",
2425 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002426 }
2427
2428 apex_key {
2429 name: "myapex.key",
2430 public_key: "testkey.avbpubkey",
2431 private_key: "testkey.pem",
2432 }
2433
2434 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002435 name: "libvndk",
2436 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002437 vendor_available: true,
2438 vndk: {
2439 enabled: true,
2440 },
2441 system_shared_libs: [],
2442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002443 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002444 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002445
2446 cc_prebuilt_library_shared {
2447 name: "libvndk.arm",
2448 srcs: ["libvndk.arm.so"],
2449 vendor_available: true,
2450 vndk: {
2451 enabled: true,
2452 },
2453 enabled: false,
2454 arch: {
2455 arm: {
2456 enabled: true,
2457 },
2458 },
2459 system_shared_libs: [],
2460 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002461 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002462 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002463 `+vndkLibrariesTxtFiles("current"),
2464 withFiles(map[string][]byte{
2465 "libvndk.so": nil,
2466 "libvndk.arm.so": nil,
2467 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002468
Jooyung Hana57af4a2020-01-23 05:36:59 +00002469 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002470 "lib/libvndk.so",
2471 "lib/libvndk.arm.so",
2472 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002473 "lib/libc++.so",
2474 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002475 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002476 })
Jooyung Han344d5432019-08-23 11:17:39 +09002477}
2478
Jooyung Han39edb6c2019-11-06 16:53:07 +09002479func vndkLibrariesTxtFiles(vers ...string) (result string) {
2480 for _, v := range vers {
2481 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002482 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002483 result += `
2484 vndk_libraries_txt {
2485 name: "` + txt + `.libraries.txt",
2486 }
2487 `
2488 }
2489 } else {
2490 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2491 result += `
2492 prebuilt_etc {
2493 name: "` + txt + `.libraries.` + v + `.txt",
2494 src: "dummy.txt",
2495 }
2496 `
2497 }
2498 }
2499 }
2500 return
2501}
2502
Jooyung Han344d5432019-08-23 11:17:39 +09002503func TestVndkApexVersion(t *testing.T) {
2504 ctx, _ := testApex(t, `
2505 apex_vndk {
2506 name: "myapex_v27",
2507 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002508 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002509 vndk_version: "27",
2510 }
2511
2512 apex_key {
2513 name: "myapex.key",
2514 public_key: "testkey.avbpubkey",
2515 private_key: "testkey.pem",
2516 }
2517
Jooyung Han31c470b2019-10-18 16:26:59 +09002518 vndk_prebuilt_shared {
2519 name: "libvndk27",
2520 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002521 vendor_available: true,
2522 vndk: {
2523 enabled: true,
2524 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002525 target_arch: "arm64",
2526 arch: {
2527 arm: {
2528 srcs: ["libvndk27_arm.so"],
2529 },
2530 arm64: {
2531 srcs: ["libvndk27_arm64.so"],
2532 },
2533 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002534 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002535 }
2536
2537 vndk_prebuilt_shared {
2538 name: "libvndk27",
2539 version: "27",
2540 vendor_available: true,
2541 vndk: {
2542 enabled: true,
2543 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002544 target_arch: "x86_64",
2545 arch: {
2546 x86: {
2547 srcs: ["libvndk27_x86.so"],
2548 },
2549 x86_64: {
2550 srcs: ["libvndk27_x86_64.so"],
2551 },
2552 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002553 }
2554 `+vndkLibrariesTxtFiles("27"),
2555 withFiles(map[string][]byte{
2556 "libvndk27_arm.so": nil,
2557 "libvndk27_arm64.so": nil,
2558 "libvndk27_x86.so": nil,
2559 "libvndk27_x86_64.so": nil,
2560 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002561
Jooyung Hana57af4a2020-01-23 05:36:59 +00002562 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002563 "lib/libvndk27_arm.so",
2564 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002565 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002566 })
Jooyung Han344d5432019-08-23 11:17:39 +09002567}
2568
2569func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2570 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2571 apex_vndk {
2572 name: "myapex_v27",
2573 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002574 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002575 vndk_version: "27",
2576 }
2577 apex_vndk {
2578 name: "myapex_v27_other",
2579 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002580 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002581 vndk_version: "27",
2582 }
2583
2584 apex_key {
2585 name: "myapex.key",
2586 public_key: "testkey.avbpubkey",
2587 private_key: "testkey.pem",
2588 }
2589
2590 cc_library {
2591 name: "libvndk",
2592 srcs: ["mylib.cpp"],
2593 vendor_available: true,
2594 vndk: {
2595 enabled: true,
2596 },
2597 system_shared_libs: [],
2598 stl: "none",
2599 }
2600
2601 vndk_prebuilt_shared {
2602 name: "libvndk",
2603 version: "27",
2604 vendor_available: true,
2605 vndk: {
2606 enabled: true,
2607 },
2608 srcs: ["libvndk.so"],
2609 }
2610 `, withFiles(map[string][]byte{
2611 "libvndk.so": nil,
2612 }))
2613}
2614
Jooyung Han90eee022019-10-01 20:02:42 +09002615func TestVndkApexNameRule(t *testing.T) {
2616 ctx, _ := testApex(t, `
2617 apex_vndk {
2618 name: "myapex",
2619 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002620 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002621 }
2622 apex_vndk {
2623 name: "myapex_v28",
2624 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002625 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002626 vndk_version: "28",
2627 }
2628 apex_key {
2629 name: "myapex.key",
2630 public_key: "testkey.avbpubkey",
2631 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002632 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002633
2634 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002635 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002636 actual := proptools.String(bundle.properties.Apex_name)
2637 if !reflect.DeepEqual(actual, expected) {
2638 t.Errorf("Got '%v', expected '%v'", actual, expected)
2639 }
2640 }
2641
2642 assertApexName("com.android.vndk.vVER", "myapex")
2643 assertApexName("com.android.vndk.v28", "myapex_v28")
2644}
2645
Jooyung Han344d5432019-08-23 11:17:39 +09002646func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2647 ctx, _ := testApex(t, `
2648 apex_vndk {
2649 name: "myapex",
2650 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002651 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002652 }
2653
2654 apex_key {
2655 name: "myapex.key",
2656 public_key: "testkey.avbpubkey",
2657 private_key: "testkey.pem",
2658 }
2659
2660 cc_library {
2661 name: "libvndk",
2662 srcs: ["mylib.cpp"],
2663 vendor_available: true,
2664 native_bridge_supported: true,
2665 host_supported: true,
2666 vndk: {
2667 enabled: true,
2668 },
2669 system_shared_libs: [],
2670 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002671 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002672 }
Jooyung Han35155c42020-02-06 17:33:20 +09002673 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002674
Jooyung Hana57af4a2020-01-23 05:36:59 +00002675 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002676 "lib/libvndk.so",
2677 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002678 "lib/libc++.so",
2679 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002680 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002681 })
Jooyung Han344d5432019-08-23 11:17:39 +09002682}
2683
2684func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2685 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2686 apex_vndk {
2687 name: "myapex",
2688 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002689 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002690 native_bridge_supported: true,
2691 }
2692
2693 apex_key {
2694 name: "myapex.key",
2695 public_key: "testkey.avbpubkey",
2696 private_key: "testkey.pem",
2697 }
2698
2699 cc_library {
2700 name: "libvndk",
2701 srcs: ["mylib.cpp"],
2702 vendor_available: true,
2703 native_bridge_supported: true,
2704 host_supported: true,
2705 vndk: {
2706 enabled: true,
2707 },
2708 system_shared_libs: [],
2709 stl: "none",
2710 }
2711 `)
2712}
2713
Jooyung Han31c470b2019-10-18 16:26:59 +09002714func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002715 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002716 apex_vndk {
2717 name: "myapex_v27",
2718 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002719 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002720 vndk_version: "27",
2721 }
2722
2723 apex_key {
2724 name: "myapex.key",
2725 public_key: "testkey.avbpubkey",
2726 private_key: "testkey.pem",
2727 }
2728
2729 vndk_prebuilt_shared {
2730 name: "libvndk27",
2731 version: "27",
2732 target_arch: "arm",
2733 vendor_available: true,
2734 vndk: {
2735 enabled: true,
2736 },
2737 arch: {
2738 arm: {
2739 srcs: ["libvndk27.so"],
2740 }
2741 },
2742 }
2743
2744 vndk_prebuilt_shared {
2745 name: "libvndk27",
2746 version: "27",
2747 target_arch: "arm",
2748 binder32bit: true,
2749 vendor_available: true,
2750 vndk: {
2751 enabled: true,
2752 },
2753 arch: {
2754 arm: {
2755 srcs: ["libvndk27binder32.so"],
2756 }
2757 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002758 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002759 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002760 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002761 withFiles(map[string][]byte{
2762 "libvndk27.so": nil,
2763 "libvndk27binder32.so": nil,
2764 }),
2765 withBinder32bit,
2766 withTargets(map[android.OsType][]android.Target{
2767 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002768 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2769 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002770 },
2771 }),
2772 )
2773
Jooyung Hana57af4a2020-01-23 05:36:59 +00002774 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002775 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002776 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002777 })
2778}
2779
Jooyung Hane1633032019-08-01 17:41:43 +09002780func TestDependenciesInApexManifest(t *testing.T) {
2781 ctx, _ := testApex(t, `
2782 apex {
2783 name: "myapex_nodep",
2784 key: "myapex.key",
2785 native_shared_libs: ["lib_nodep"],
2786 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002787 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002788 }
2789
2790 apex {
2791 name: "myapex_dep",
2792 key: "myapex.key",
2793 native_shared_libs: ["lib_dep"],
2794 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002795 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002796 }
2797
2798 apex {
2799 name: "myapex_provider",
2800 key: "myapex.key",
2801 native_shared_libs: ["libfoo"],
2802 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002803 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002804 }
2805
2806 apex {
2807 name: "myapex_selfcontained",
2808 key: "myapex.key",
2809 native_shared_libs: ["lib_dep", "libfoo"],
2810 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002811 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002812 }
2813
2814 apex_key {
2815 name: "myapex.key",
2816 public_key: "testkey.avbpubkey",
2817 private_key: "testkey.pem",
2818 }
2819
2820 cc_library {
2821 name: "lib_nodep",
2822 srcs: ["mylib.cpp"],
2823 system_shared_libs: [],
2824 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002825 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002826 }
2827
2828 cc_library {
2829 name: "lib_dep",
2830 srcs: ["mylib.cpp"],
2831 shared_libs: ["libfoo"],
2832 system_shared_libs: [],
2833 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002834 apex_available: [
2835 "myapex_dep",
2836 "myapex_provider",
2837 "myapex_selfcontained",
2838 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002839 }
2840
2841 cc_library {
2842 name: "libfoo",
2843 srcs: ["mytest.cpp"],
2844 stubs: {
2845 versions: ["1"],
2846 },
2847 system_shared_libs: [],
2848 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002849 apex_available: [
2850 "myapex_provider",
2851 "myapex_selfcontained",
2852 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002853 }
2854 `)
2855
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002856 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002857 var provideNativeLibs, requireNativeLibs []string
2858
Sundong Ahnabb64432019-10-22 13:58:29 +09002859 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002860 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2861 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002862 ensureListEmpty(t, provideNativeLibs)
2863 ensureListEmpty(t, requireNativeLibs)
2864
Sundong Ahnabb64432019-10-22 13:58:29 +09002865 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002866 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2867 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002868 ensureListEmpty(t, provideNativeLibs)
2869 ensureListContains(t, requireNativeLibs, "libfoo.so")
2870
Sundong Ahnabb64432019-10-22 13:58:29 +09002871 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002872 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2873 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002874 ensureListContains(t, provideNativeLibs, "libfoo.so")
2875 ensureListEmpty(t, requireNativeLibs)
2876
Sundong Ahnabb64432019-10-22 13:58:29 +09002877 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002878 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2879 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002880 ensureListContains(t, provideNativeLibs, "libfoo.so")
2881 ensureListEmpty(t, requireNativeLibs)
2882}
2883
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002884func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002885 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002886 apex {
2887 name: "myapex",
2888 key: "myapex.key",
2889 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002890 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002891 }
2892
2893 apex_key {
2894 name: "myapex.key",
2895 public_key: "testkey.avbpubkey",
2896 private_key: "testkey.pem",
2897 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002898
2899 cc_library {
2900 name: "mylib",
2901 srcs: ["mylib.cpp"],
2902 system_shared_libs: [],
2903 stl: "none",
2904 apex_available: [
2905 "//apex_available:platform",
2906 "myapex",
2907 ],
2908 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002909 `)
2910
Sundong Ahnabb64432019-10-22 13:58:29 +09002911 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002912 apexManifestRule := module.Rule("apexManifestRule")
2913 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2914 apexRule := module.Rule("apexRule")
2915 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002916
2917 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2918 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2919 name := apexBundle.BaseModuleName()
2920 prefix := "TARGET_"
2921 var builder strings.Builder
2922 data.Custom(&builder, name, prefix, "", data)
2923 androidMk := builder.String()
2924 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2925 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002926}
2927
Alex Light0851b882019-02-07 13:20:53 -08002928func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002929 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002930 apex {
2931 name: "myapex",
2932 key: "myapex.key",
2933 native_shared_libs: ["mylib_common"],
2934 }
2935
2936 apex_key {
2937 name: "myapex.key",
2938 public_key: "testkey.avbpubkey",
2939 private_key: "testkey.pem",
2940 }
2941
2942 cc_library {
2943 name: "mylib_common",
2944 srcs: ["mylib.cpp"],
2945 system_shared_libs: [],
2946 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002947 apex_available: [
2948 "//apex_available:platform",
2949 "myapex",
2950 ],
Alex Light0851b882019-02-07 13:20:53 -08002951 }
2952 `)
2953
Sundong Ahnabb64432019-10-22 13:58:29 +09002954 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002955 apexRule := module.Rule("apexRule")
2956 copyCmds := apexRule.Args["copy_commands"]
2957
2958 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2959 t.Log("Apex was a test apex!")
2960 t.Fail()
2961 }
2962 // Ensure that main rule creates an output
2963 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2964
2965 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002966 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002967
2968 // Ensure that both direct and indirect deps are copied into apex
2969 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2970
Colin Cross7113d202019-11-20 16:39:12 -08002971 // Ensure that the platform variant ends with _shared
2972 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002973
2974 if !android.InAnyApex("mylib_common") {
2975 t.Log("Found mylib_common not in any apex!")
2976 t.Fail()
2977 }
2978}
2979
2980func TestTestApex(t *testing.T) {
2981 if android.InAnyApex("mylib_common_test") {
2982 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!")
2983 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002984 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002985 apex_test {
2986 name: "myapex",
2987 key: "myapex.key",
2988 native_shared_libs: ["mylib_common_test"],
2989 }
2990
2991 apex_key {
2992 name: "myapex.key",
2993 public_key: "testkey.avbpubkey",
2994 private_key: "testkey.pem",
2995 }
2996
2997 cc_library {
2998 name: "mylib_common_test",
2999 srcs: ["mylib.cpp"],
3000 system_shared_libs: [],
3001 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003002 // TODO: remove //apex_available:platform
3003 apex_available: [
3004 "//apex_available:platform",
3005 "myapex",
3006 ],
Alex Light0851b882019-02-07 13:20:53 -08003007 }
3008 `)
3009
Sundong Ahnabb64432019-10-22 13:58:29 +09003010 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003011 apexRule := module.Rule("apexRule")
3012 copyCmds := apexRule.Args["copy_commands"]
3013
3014 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3015 t.Log("Apex was not a test apex!")
3016 t.Fail()
3017 }
3018 // Ensure that main rule creates an output
3019 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3020
3021 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003022 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003023
3024 // Ensure that both direct and indirect deps are copied into apex
3025 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3026
Colin Cross7113d202019-11-20 16:39:12 -08003027 // Ensure that the platform variant ends with _shared
3028 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003029}
3030
Alex Light9670d332019-01-29 18:07:33 -08003031func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003032 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003033 apex {
3034 name: "myapex",
3035 key: "myapex.key",
3036 multilib: {
3037 first: {
3038 native_shared_libs: ["mylib_common"],
3039 }
3040 },
3041 target: {
3042 android: {
3043 multilib: {
3044 first: {
3045 native_shared_libs: ["mylib"],
3046 }
3047 }
3048 },
3049 host: {
3050 multilib: {
3051 first: {
3052 native_shared_libs: ["mylib2"],
3053 }
3054 }
3055 }
3056 }
3057 }
3058
3059 apex_key {
3060 name: "myapex.key",
3061 public_key: "testkey.avbpubkey",
3062 private_key: "testkey.pem",
3063 }
3064
3065 cc_library {
3066 name: "mylib",
3067 srcs: ["mylib.cpp"],
3068 system_shared_libs: [],
3069 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003070 // TODO: remove //apex_available:platform
3071 apex_available: [
3072 "//apex_available:platform",
3073 "myapex",
3074 ],
Alex Light9670d332019-01-29 18:07:33 -08003075 }
3076
3077 cc_library {
3078 name: "mylib_common",
3079 srcs: ["mylib.cpp"],
3080 system_shared_libs: [],
3081 stl: "none",
3082 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003083 // TODO: remove //apex_available:platform
3084 apex_available: [
3085 "//apex_available:platform",
3086 "myapex",
3087 ],
Alex Light9670d332019-01-29 18:07:33 -08003088 }
3089
3090 cc_library {
3091 name: "mylib2",
3092 srcs: ["mylib.cpp"],
3093 system_shared_libs: [],
3094 stl: "none",
3095 compile_multilib: "first",
3096 }
3097 `)
3098
Sundong Ahnabb64432019-10-22 13:58:29 +09003099 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003100 copyCmds := apexRule.Args["copy_commands"]
3101
3102 // Ensure that main rule creates an output
3103 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3104
3105 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003106 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3107 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3108 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003109
3110 // Ensure that both direct and indirect deps are copied into apex
3111 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3112 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3113 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3114
Colin Cross7113d202019-11-20 16:39:12 -08003115 // Ensure that the platform variant ends with _shared
3116 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3117 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3118 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003119}
Jiyong Park04480cf2019-02-06 00:16:29 +09003120
3121func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003122 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003123 apex {
3124 name: "myapex",
3125 key: "myapex.key",
3126 binaries: ["myscript"],
3127 }
3128
3129 apex_key {
3130 name: "myapex.key",
3131 public_key: "testkey.avbpubkey",
3132 private_key: "testkey.pem",
3133 }
3134
3135 sh_binary {
3136 name: "myscript",
3137 src: "mylib.cpp",
3138 filename: "myscript.sh",
3139 sub_dir: "script",
3140 }
3141 `)
3142
Sundong Ahnabb64432019-10-22 13:58:29 +09003143 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003144 copyCmds := apexRule.Args["copy_commands"]
3145
3146 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3147}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003148
Jooyung Han91df2082019-11-20 01:49:42 +09003149func TestApexInVariousPartition(t *testing.T) {
3150 testcases := []struct {
3151 propName, parition, flattenedPartition string
3152 }{
3153 {"", "system", "system_ext"},
3154 {"product_specific: true", "product", "product"},
3155 {"soc_specific: true", "vendor", "vendor"},
3156 {"proprietary: true", "vendor", "vendor"},
3157 {"vendor: true", "vendor", "vendor"},
3158 {"system_ext_specific: true", "system_ext", "system_ext"},
3159 }
3160 for _, tc := range testcases {
3161 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3162 ctx, _ := testApex(t, `
3163 apex {
3164 name: "myapex",
3165 key: "myapex.key",
3166 `+tc.propName+`
3167 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003168
Jooyung Han91df2082019-11-20 01:49:42 +09003169 apex_key {
3170 name: "myapex.key",
3171 public_key: "testkey.avbpubkey",
3172 private_key: "testkey.pem",
3173 }
3174 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003175
Jooyung Han91df2082019-11-20 01:49:42 +09003176 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3177 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3178 actual := apex.installDir.String()
3179 if actual != expected {
3180 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3181 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003182
Jooyung Han91df2082019-11-20 01:49:42 +09003183 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3184 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3185 actual = flattened.installDir.String()
3186 if actual != expected {
3187 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3188 }
3189 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003190 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003191}
Jiyong Park67882562019-03-21 01:11:21 +09003192
Jooyung Han54aca7b2019-11-20 02:26:02 +09003193func TestFileContexts(t *testing.T) {
3194 ctx, _ := testApex(t, `
3195 apex {
3196 name: "myapex",
3197 key: "myapex.key",
3198 }
3199
3200 apex_key {
3201 name: "myapex.key",
3202 public_key: "testkey.avbpubkey",
3203 private_key: "testkey.pem",
3204 }
3205 `)
3206 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3207 apexRule := module.Rule("apexRule")
3208 actual := apexRule.Args["file_contexts"]
3209 expected := "system/sepolicy/apex/myapex-file_contexts"
3210 if actual != expected {
3211 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3212 }
3213
3214 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3215 apex {
3216 name: "myapex",
3217 key: "myapex.key",
3218 file_contexts: "my_own_file_contexts",
3219 }
3220
3221 apex_key {
3222 name: "myapex.key",
3223 public_key: "testkey.avbpubkey",
3224 private_key: "testkey.pem",
3225 }
3226 `, withFiles(map[string][]byte{
3227 "my_own_file_contexts": nil,
3228 }))
3229
3230 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3231 apex {
3232 name: "myapex",
3233 key: "myapex.key",
3234 product_specific: true,
3235 file_contexts: "product_specific_file_contexts",
3236 }
3237
3238 apex_key {
3239 name: "myapex.key",
3240 public_key: "testkey.avbpubkey",
3241 private_key: "testkey.pem",
3242 }
3243 `)
3244
3245 ctx, _ = testApex(t, `
3246 apex {
3247 name: "myapex",
3248 key: "myapex.key",
3249 product_specific: true,
3250 file_contexts: "product_specific_file_contexts",
3251 }
3252
3253 apex_key {
3254 name: "myapex.key",
3255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
3258 `, withFiles(map[string][]byte{
3259 "product_specific_file_contexts": nil,
3260 }))
3261 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3262 apexRule = module.Rule("apexRule")
3263 actual = apexRule.Args["file_contexts"]
3264 expected = "product_specific_file_contexts"
3265 if actual != expected {
3266 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3267 }
3268
3269 ctx, _ = testApex(t, `
3270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
3273 product_specific: true,
3274 file_contexts: ":my-file-contexts",
3275 }
3276
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282
3283 filegroup {
3284 name: "my-file-contexts",
3285 srcs: ["product_specific_file_contexts"],
3286 }
3287 `, withFiles(map[string][]byte{
3288 "product_specific_file_contexts": nil,
3289 }))
3290 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3291 apexRule = module.Rule("apexRule")
3292 actual = apexRule.Args["file_contexts"]
3293 expected = "product_specific_file_contexts"
3294 if actual != expected {
3295 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3296 }
3297}
3298
Jiyong Park67882562019-03-21 01:11:21 +09003299func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003300 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003301 apex_key {
3302 name: "myapex.key",
3303 public_key: ":my.avbpubkey",
3304 private_key: ":my.pem",
3305 product_specific: true,
3306 }
3307
3308 filegroup {
3309 name: "my.avbpubkey",
3310 srcs: ["testkey2.avbpubkey"],
3311 }
3312
3313 filegroup {
3314 name: "my.pem",
3315 srcs: ["testkey2.pem"],
3316 }
3317 `)
3318
3319 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3320 expected_pubkey := "testkey2.avbpubkey"
3321 actual_pubkey := apex_key.public_key_file.String()
3322 if actual_pubkey != expected_pubkey {
3323 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3324 }
3325 expected_privkey := "testkey2.pem"
3326 actual_privkey := apex_key.private_key_file.String()
3327 if actual_privkey != expected_privkey {
3328 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3329 }
3330}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003331
3332func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003333 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003334 prebuilt_apex {
3335 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003336 arch: {
3337 arm64: {
3338 src: "myapex-arm64.apex",
3339 },
3340 arm: {
3341 src: "myapex-arm.apex",
3342 },
3343 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003344 }
3345 `)
3346
3347 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3348
Jiyong Parkc95714e2019-03-29 14:23:10 +09003349 expectedInput := "myapex-arm64.apex"
3350 if prebuilt.inputApex.String() != expectedInput {
3351 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3352 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003353}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003354
3355func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003356 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003357 prebuilt_apex {
3358 name: "myapex",
3359 src: "myapex-arm.apex",
3360 filename: "notmyapex.apex",
3361 }
3362 `)
3363
3364 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3365
3366 expected := "notmyapex.apex"
3367 if p.installFilename != expected {
3368 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3369 }
3370}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003371
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003372func TestPrebuiltOverrides(t *testing.T) {
3373 ctx, config := testApex(t, `
3374 prebuilt_apex {
3375 name: "myapex.prebuilt",
3376 src: "myapex-arm.apex",
3377 overrides: [
3378 "myapex",
3379 ],
3380 }
3381 `)
3382
3383 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3384
3385 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003386 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003387 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003388 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003389 }
3390}
3391
Roland Levillain630846d2019-06-26 12:48:34 +01003392func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003393 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003394 apex_test {
3395 name: "myapex",
3396 key: "myapex.key",
3397 tests: [
3398 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003399 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003400 ],
3401 }
3402
3403 apex_key {
3404 name: "myapex.key",
3405 public_key: "testkey.avbpubkey",
3406 private_key: "testkey.pem",
3407 }
3408
Liz Kammer1c14a212020-05-12 15:26:55 -07003409 filegroup {
3410 name: "fg",
3411 srcs: [
3412 "baz",
3413 "bar/baz"
3414 ],
3415 }
3416
Roland Levillain630846d2019-06-26 12:48:34 +01003417 cc_test {
3418 name: "mytest",
3419 gtest: false,
3420 srcs: ["mytest.cpp"],
3421 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003422 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003423 system_shared_libs: [],
3424 static_executable: true,
3425 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003426 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003427 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003428
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003429 cc_library {
3430 name: "mylib",
3431 srcs: ["mylib.cpp"],
3432 system_shared_libs: [],
3433 stl: "none",
3434 }
3435
Liz Kammer5bd365f2020-05-27 15:15:11 -07003436 filegroup {
3437 name: "fg2",
3438 srcs: [
3439 "testdata/baz"
3440 ],
3441 }
3442
Roland Levillain9b5fde92019-06-28 15:41:19 +01003443 cc_test {
3444 name: "mytests",
3445 gtest: false,
3446 srcs: [
3447 "mytest1.cpp",
3448 "mytest2.cpp",
3449 "mytest3.cpp",
3450 ],
3451 test_per_src: true,
3452 relative_install_path: "test",
3453 system_shared_libs: [],
3454 static_executable: true,
3455 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003456 data: [
3457 ":fg",
3458 ":fg2",
3459 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003460 }
Roland Levillain630846d2019-06-26 12:48:34 +01003461 `)
3462
Sundong Ahnabb64432019-10-22 13:58:29 +09003463 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003464 copyCmds := apexRule.Args["copy_commands"]
3465
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003466 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003467 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003468 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003469
Liz Kammer1c14a212020-05-12 15:26:55 -07003470 //Ensure that test data are copied into apex.
3471 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3472 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3473
Roland Levillain9b5fde92019-06-28 15:41:19 +01003474 // Ensure that test deps built with `test_per_src` are copied into apex.
3475 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3476 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3477 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003478
3479 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003480 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3481 data := android.AndroidMkDataForTest(t, config, "", bundle)
3482 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003483 prefix := "TARGET_"
3484 var builder strings.Builder
3485 data.Custom(&builder, name, prefix, "", data)
3486 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003487 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3488 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3489 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3490 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003491 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003492 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003493 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003494
3495 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3496 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3497 data.Custom(&builder, name, prefix, "", data)
3498 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003499 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3500 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003501}
3502
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003503func TestInstallExtraFlattenedApexes(t *testing.T) {
3504 ctx, config := testApex(t, `
3505 apex {
3506 name: "myapex",
3507 key: "myapex.key",
3508 }
3509 apex_key {
3510 name: "myapex.key",
3511 public_key: "testkey.avbpubkey",
3512 private_key: "testkey.pem",
3513 }
3514 `, func(fs map[string][]byte, config android.Config) {
3515 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3516 })
3517 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003518 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003519 mk := android.AndroidMkDataForTest(t, config, "", ab)
3520 var builder strings.Builder
3521 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3522 androidMk := builder.String()
3523 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3524}
3525
Jooyung Han5c998b92019-06-27 11:30:33 +09003526func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003527 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003528 apex {
3529 name: "myapex",
3530 key: "myapex.key",
3531 native_shared_libs: ["mylib"],
3532 uses: ["commonapex"],
3533 }
3534
3535 apex {
3536 name: "commonapex",
3537 key: "myapex.key",
3538 native_shared_libs: ["libcommon"],
3539 provide_cpp_shared_libs: true,
3540 }
3541
3542 apex_key {
3543 name: "myapex.key",
3544 public_key: "testkey.avbpubkey",
3545 private_key: "testkey.pem",
3546 }
3547
3548 cc_library {
3549 name: "mylib",
3550 srcs: ["mylib.cpp"],
3551 shared_libs: ["libcommon"],
3552 system_shared_libs: [],
3553 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003554 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003555 }
3556
3557 cc_library {
3558 name: "libcommon",
3559 srcs: ["mylib_common.cpp"],
3560 system_shared_libs: [],
3561 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003562 // TODO: remove //apex_available:platform
3563 apex_available: [
3564 "//apex_available:platform",
3565 "commonapex",
3566 "myapex",
3567 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003568 }
3569 `)
3570
Sundong Ahnabb64432019-10-22 13:58:29 +09003571 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003572 apexRule1 := module1.Rule("apexRule")
3573 copyCmds1 := apexRule1.Args["copy_commands"]
3574
Sundong Ahnabb64432019-10-22 13:58:29 +09003575 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003576 apexRule2 := module2.Rule("apexRule")
3577 copyCmds2 := apexRule2.Args["copy_commands"]
3578
Colin Cross7113d202019-11-20 16:39:12 -08003579 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3580 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003581 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3582 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3583 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3584}
3585
3586func TestApexUsesFailsIfNotProvided(t *testing.T) {
3587 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3588 apex {
3589 name: "myapex",
3590 key: "myapex.key",
3591 uses: ["commonapex"],
3592 }
3593
3594 apex {
3595 name: "commonapex",
3596 key: "myapex.key",
3597 }
3598
3599 apex_key {
3600 name: "myapex.key",
3601 public_key: "testkey.avbpubkey",
3602 private_key: "testkey.pem",
3603 }
3604 `)
3605 testApexError(t, `uses: "commonapex" is not a provider`, `
3606 apex {
3607 name: "myapex",
3608 key: "myapex.key",
3609 uses: ["commonapex"],
3610 }
3611
3612 cc_library {
3613 name: "commonapex",
3614 system_shared_libs: [],
3615 stl: "none",
3616 }
3617
3618 apex_key {
3619 name: "myapex.key",
3620 public_key: "testkey.avbpubkey",
3621 private_key: "testkey.pem",
3622 }
3623 `)
3624}
3625
3626func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3627 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3628 apex {
3629 name: "myapex",
3630 key: "myapex.key",
3631 use_vendor: true,
3632 uses: ["commonapex"],
3633 }
3634
3635 apex {
3636 name: "commonapex",
3637 key: "myapex.key",
3638 provide_cpp_shared_libs: true,
3639 }
3640
3641 apex_key {
3642 name: "myapex.key",
3643 public_key: "testkey.avbpubkey",
3644 private_key: "testkey.pem",
3645 }
Jooyung Handc782442019-11-01 03:14:38 +09003646 `, func(fs map[string][]byte, config android.Config) {
3647 setUseVendorWhitelistForTest(config, []string{"myapex"})
3648 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003649}
3650
Jooyung Hand48f3c32019-08-23 11:18:57 +09003651func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3652 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3653 apex {
3654 name: "myapex",
3655 key: "myapex.key",
3656 native_shared_libs: ["libfoo"],
3657 }
3658
3659 apex_key {
3660 name: "myapex.key",
3661 public_key: "testkey.avbpubkey",
3662 private_key: "testkey.pem",
3663 }
3664
3665 cc_library {
3666 name: "libfoo",
3667 stl: "none",
3668 system_shared_libs: [],
3669 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003670 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003671 }
3672 `)
3673 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3674 apex {
3675 name: "myapex",
3676 key: "myapex.key",
3677 java_libs: ["myjar"],
3678 }
3679
3680 apex_key {
3681 name: "myapex.key",
3682 public_key: "testkey.avbpubkey",
3683 private_key: "testkey.pem",
3684 }
3685
3686 java_library {
3687 name: "myjar",
3688 srcs: ["foo/bar/MyClass.java"],
3689 sdk_version: "none",
3690 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003691 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003692 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003693 }
3694 `)
3695}
3696
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003697func TestApexWithApps(t *testing.T) {
3698 ctx, _ := testApex(t, `
3699 apex {
3700 name: "myapex",
3701 key: "myapex.key",
3702 apps: [
3703 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003704 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003705 ],
3706 }
3707
3708 apex_key {
3709 name: "myapex.key",
3710 public_key: "testkey.avbpubkey",
3711 private_key: "testkey.pem",
3712 }
3713
3714 android_app {
3715 name: "AppFoo",
3716 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003717 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003718 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003719 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003720 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003721 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003722 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003723
3724 android_app {
3725 name: "AppFooPriv",
3726 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003727 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003728 system_modules: "none",
3729 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003730 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003731 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003732 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003733
3734 cc_library_shared {
3735 name: "libjni",
3736 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003737 shared_libs: ["libfoo"],
3738 stl: "none",
3739 system_shared_libs: [],
3740 apex_available: [ "myapex" ],
3741 sdk_version: "current",
3742 }
3743
3744 cc_library_shared {
3745 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003746 stl: "none",
3747 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003748 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003749 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003750 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003751 `)
3752
Sundong Ahnabb64432019-10-22 13:58:29 +09003753 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003754 apexRule := module.Rule("apexRule")
3755 copyCmds := apexRule.Args["copy_commands"]
3756
3757 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003758 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003759
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003760 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3761 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003762 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003763 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003764 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003765 // JNI libraries including transitive deps are
3766 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003767 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003768 // ... embedded inside APK (jnilibs.zip)
3769 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3770 // ... and not directly inside the APEX
3771 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3772 }
Dario Frenicde2a032019-10-27 00:29:22 +01003773}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003774
Dario Frenicde2a032019-10-27 00:29:22 +01003775func TestApexWithAppImports(t *testing.T) {
3776 ctx, _ := testApex(t, `
3777 apex {
3778 name: "myapex",
3779 key: "myapex.key",
3780 apps: [
3781 "AppFooPrebuilt",
3782 "AppFooPrivPrebuilt",
3783 ],
3784 }
3785
3786 apex_key {
3787 name: "myapex.key",
3788 public_key: "testkey.avbpubkey",
3789 private_key: "testkey.pem",
3790 }
3791
3792 android_app_import {
3793 name: "AppFooPrebuilt",
3794 apk: "PrebuiltAppFoo.apk",
3795 presigned: true,
3796 dex_preopt: {
3797 enabled: false,
3798 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003799 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003800 }
3801
3802 android_app_import {
3803 name: "AppFooPrivPrebuilt",
3804 apk: "PrebuiltAppFooPriv.apk",
3805 privileged: true,
3806 presigned: true,
3807 dex_preopt: {
3808 enabled: false,
3809 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003810 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003811 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003812 }
3813 `)
3814
Sundong Ahnabb64432019-10-22 13:58:29 +09003815 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003816 apexRule := module.Rule("apexRule")
3817 copyCmds := apexRule.Args["copy_commands"]
3818
3819 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003820 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3821}
3822
3823func TestApexWithAppImportsPrefer(t *testing.T) {
3824 ctx, _ := testApex(t, `
3825 apex {
3826 name: "myapex",
3827 key: "myapex.key",
3828 apps: [
3829 "AppFoo",
3830 ],
3831 }
3832
3833 apex_key {
3834 name: "myapex.key",
3835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
3839 android_app {
3840 name: "AppFoo",
3841 srcs: ["foo/bar/MyClass.java"],
3842 sdk_version: "none",
3843 system_modules: "none",
3844 apex_available: [ "myapex" ],
3845 }
3846
3847 android_app_import {
3848 name: "AppFoo",
3849 apk: "AppFooPrebuilt.apk",
3850 filename: "AppFooPrebuilt.apk",
3851 presigned: true,
3852 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003853 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003854 }
3855 `, withFiles(map[string][]byte{
3856 "AppFooPrebuilt.apk": nil,
3857 }))
3858
3859 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3860 "app/AppFoo/AppFooPrebuilt.apk",
3861 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003862}
3863
Dario Freni6f3937c2019-12-20 22:58:03 +00003864func TestApexWithTestHelperApp(t *testing.T) {
3865 ctx, _ := testApex(t, `
3866 apex {
3867 name: "myapex",
3868 key: "myapex.key",
3869 apps: [
3870 "TesterHelpAppFoo",
3871 ],
3872 }
3873
3874 apex_key {
3875 name: "myapex.key",
3876 public_key: "testkey.avbpubkey",
3877 private_key: "testkey.pem",
3878 }
3879
3880 android_test_helper_app {
3881 name: "TesterHelpAppFoo",
3882 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003883 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003884 }
3885
3886 `)
3887
3888 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3889 apexRule := module.Rule("apexRule")
3890 copyCmds := apexRule.Args["copy_commands"]
3891
3892 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3893}
3894
Jooyung Han18020ea2019-11-13 10:50:48 +09003895func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3896 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003897 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003898 apex {
3899 name: "myapex",
3900 key: "myapex.key",
3901 native_shared_libs: ["libfoo"],
3902 }
3903
3904 apex_key {
3905 name: "myapex.key",
3906 public_key: "testkey.avbpubkey",
3907 private_key: "testkey.pem",
3908 }
3909
3910 apex {
3911 name: "otherapex",
3912 key: "myapex.key",
3913 native_shared_libs: ["libfoo"],
3914 }
3915
3916 cc_defaults {
3917 name: "libfoo-defaults",
3918 apex_available: ["otherapex"],
3919 }
3920
3921 cc_library {
3922 name: "libfoo",
3923 defaults: ["libfoo-defaults"],
3924 stl: "none",
3925 system_shared_libs: [],
3926 }`)
3927}
3928
Paul Duffine52e66f2020-03-30 17:54:29 +01003929func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003930 // libfoo is not available to myapex, but only to otherapex
3931 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3932 apex {
3933 name: "myapex",
3934 key: "myapex.key",
3935 native_shared_libs: ["libfoo"],
3936 }
3937
3938 apex_key {
3939 name: "myapex.key",
3940 public_key: "testkey.avbpubkey",
3941 private_key: "testkey.pem",
3942 }
3943
3944 apex {
3945 name: "otherapex",
3946 key: "otherapex.key",
3947 native_shared_libs: ["libfoo"],
3948 }
3949
3950 apex_key {
3951 name: "otherapex.key",
3952 public_key: "testkey.avbpubkey",
3953 private_key: "testkey.pem",
3954 }
3955
3956 cc_library {
3957 name: "libfoo",
3958 stl: "none",
3959 system_shared_libs: [],
3960 apex_available: ["otherapex"],
3961 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003962}
Jiyong Park127b40b2019-09-30 16:04:35 +09003963
Paul Duffine52e66f2020-03-30 17:54:29 +01003964func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003965 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003966 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003967.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003968.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003969.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003970.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003971.*via tag cc\.DependencyTag.*"shared".*
3972.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003973 apex {
3974 name: "myapex",
3975 key: "myapex.key",
3976 native_shared_libs: ["libfoo"],
3977 }
3978
3979 apex_key {
3980 name: "myapex.key",
3981 public_key: "testkey.avbpubkey",
3982 private_key: "testkey.pem",
3983 }
3984
Jiyong Park127b40b2019-09-30 16:04:35 +09003985 cc_library {
3986 name: "libfoo",
3987 stl: "none",
3988 shared_libs: ["libbar"],
3989 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003990 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003991 }
3992
3993 cc_library {
3994 name: "libbar",
3995 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003996 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003997 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003998 apex_available: ["myapex"],
3999 }
4000
4001 cc_library {
4002 name: "libbaz",
4003 stl: "none",
4004 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004005 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004006}
Jiyong Park127b40b2019-09-30 16:04:35 +09004007
Paul Duffine52e66f2020-03-30 17:54:29 +01004008func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004009 testApexError(t, "\"otherapex\" is not a valid module name", `
4010 apex {
4011 name: "myapex",
4012 key: "myapex.key",
4013 native_shared_libs: ["libfoo"],
4014 }
4015
4016 apex_key {
4017 name: "myapex.key",
4018 public_key: "testkey.avbpubkey",
4019 private_key: "testkey.pem",
4020 }
4021
4022 cc_library {
4023 name: "libfoo",
4024 stl: "none",
4025 system_shared_libs: [],
4026 apex_available: ["otherapex"],
4027 }`)
4028
Paul Duffine52e66f2020-03-30 17:54:29 +01004029 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004030 apex {
4031 name: "myapex",
4032 key: "myapex.key",
4033 native_shared_libs: ["libfoo", "libbar"],
4034 }
4035
4036 apex_key {
4037 name: "myapex.key",
4038 public_key: "testkey.avbpubkey",
4039 private_key: "testkey.pem",
4040 }
4041
4042 cc_library {
4043 name: "libfoo",
4044 stl: "none",
4045 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004046 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004047 apex_available: ["myapex"],
4048 }
4049
4050 cc_library {
4051 name: "libbar",
4052 stl: "none",
4053 system_shared_libs: [],
4054 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004055 }
4056
4057 cc_library {
4058 name: "libbaz",
4059 stl: "none",
4060 system_shared_libs: [],
4061 stubs: {
4062 versions: ["10", "20", "30"],
4063 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004064 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004065}
Jiyong Park127b40b2019-09-30 16:04:35 +09004066
Jiyong Park89e850a2020-04-07 16:37:39 +09004067func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004068 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004069 apex {
4070 name: "myapex",
4071 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004072 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004073 }
4074
4075 apex_key {
4076 name: "myapex.key",
4077 public_key: "testkey.avbpubkey",
4078 private_key: "testkey.pem",
4079 }
4080
4081 cc_library {
4082 name: "libfoo",
4083 stl: "none",
4084 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004085 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004086 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004087 }
4088
4089 cc_library {
4090 name: "libfoo2",
4091 stl: "none",
4092 system_shared_libs: [],
4093 shared_libs: ["libbaz"],
4094 apex_available: ["//apex_available:platform"],
4095 }
4096
4097 cc_library {
4098 name: "libbar",
4099 stl: "none",
4100 system_shared_libs: [],
4101 apex_available: ["myapex"],
4102 }
4103
4104 cc_library {
4105 name: "libbaz",
4106 stl: "none",
4107 system_shared_libs: [],
4108 apex_available: ["myapex"],
4109 stubs: {
4110 versions: ["1"],
4111 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004112 }`)
4113
Jiyong Park89e850a2020-04-07 16:37:39 +09004114 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4115 // because it depends on libbar which isn't available to platform
4116 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4117 if libfoo.NotAvailableForPlatform() != true {
4118 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4119 }
4120
4121 // libfoo2 however can be available to platform because it depends on libbaz which provides
4122 // stubs
4123 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4124 if libfoo2.NotAvailableForPlatform() == true {
4125 t.Errorf("%q should be available to platform", libfoo2.String())
4126 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004127}
Jiyong Parka90ca002019-10-07 15:47:24 +09004128
Paul Duffine52e66f2020-03-30 17:54:29 +01004129func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004130 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004131 apex {
4132 name: "myapex",
4133 key: "myapex.key",
4134 native_shared_libs: ["libfoo"],
4135 }
4136
4137 apex_key {
4138 name: "myapex.key",
4139 public_key: "testkey.avbpubkey",
4140 private_key: "testkey.pem",
4141 }
4142
4143 cc_library {
4144 name: "libfoo",
4145 stl: "none",
4146 system_shared_libs: [],
4147 apex_available: ["myapex"],
4148 static: {
4149 apex_available: ["//apex_available:platform"],
4150 },
4151 }`)
4152
Jiyong Park89e850a2020-04-07 16:37:39 +09004153 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4154 if libfooShared.NotAvailableForPlatform() != true {
4155 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4156 }
4157 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4158 if libfooStatic.NotAvailableForPlatform() != false {
4159 t.Errorf("%q should be available to platform", libfooStatic.String())
4160 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004161}
4162
Jiyong Park5d790c32019-11-15 18:40:32 +09004163func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004164 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004165 apex {
4166 name: "myapex",
4167 key: "myapex.key",
4168 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004169 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004170 }
4171
4172 override_apex {
4173 name: "override_myapex",
4174 base: "myapex",
4175 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004176 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004177 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004178 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004179 }
4180
4181 apex_key {
4182 name: "myapex.key",
4183 public_key: "testkey.avbpubkey",
4184 private_key: "testkey.pem",
4185 }
4186
4187 android_app {
4188 name: "app",
4189 srcs: ["foo/bar/MyClass.java"],
4190 package_name: "foo",
4191 sdk_version: "none",
4192 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004193 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004194 }
4195
4196 override_android_app {
4197 name: "override_app",
4198 base: "app",
4199 package_name: "bar",
4200 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004201 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004202
Jiyong Park317645e2019-12-05 13:20:58 +09004203 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4204 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4205 if originalVariant.GetOverriddenBy() != "" {
4206 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4207 }
4208 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4209 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4210 }
4211
Jiyong Park5d790c32019-11-15 18:40:32 +09004212 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4213 apexRule := module.Rule("apexRule")
4214 copyCmds := apexRule.Args["copy_commands"]
4215
4216 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004217 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004218
4219 apexBundle := module.Module().(*apexBundle)
4220 name := apexBundle.Name()
4221 if name != "override_myapex" {
4222 t.Errorf("name should be \"override_myapex\", but was %q", name)
4223 }
4224
Baligh Uddin004d7172020-02-19 21:29:28 -08004225 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4226 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4227 }
4228
Jiyong Park20bacab2020-03-03 11:45:41 +09004229 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004230 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004231
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004232 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4233 var builder strings.Builder
4234 data.Custom(&builder, name, "TARGET_", "", data)
4235 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004236 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004237 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4238 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004239 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004240 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004241 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004242 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4243 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004244}
4245
Jooyung Han214bf372019-11-12 13:03:50 +09004246func TestLegacyAndroid10Support(t *testing.T) {
4247 ctx, _ := testApex(t, `
4248 apex {
4249 name: "myapex",
4250 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004251 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004252 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004253 }
4254
4255 apex_key {
4256 name: "myapex.key",
4257 public_key: "testkey.avbpubkey",
4258 private_key: "testkey.pem",
4259 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004260
4261 cc_library {
4262 name: "mylib",
4263 srcs: ["mylib.cpp"],
4264 stl: "libc++",
4265 system_shared_libs: [],
4266 apex_available: [ "myapex" ],
4267 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004268 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004269
4270 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4271 args := module.Rule("apexRule").Args
4272 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004273 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004274
4275 // The copies of the libraries in the apex should have one more dependency than
4276 // the ones outside the apex, namely the unwinder. Ideally we should check
4277 // the dependency names directly here but for some reason the names are blank in
4278 // this test.
4279 for _, lib := range []string{"libc++", "mylib"} {
4280 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4281 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4282 if len(apexImplicits) != len(nonApexImplicits)+1 {
4283 t.Errorf("%q missing unwinder dep", lib)
4284 }
4285 }
Jooyung Han214bf372019-11-12 13:03:50 +09004286}
4287
Paul Duffin9b879592020-05-26 13:21:35 +01004288var filesForSdkLibrary = map[string][]byte{
4289 "api/current.txt": nil,
4290 "api/removed.txt": nil,
4291 "api/system-current.txt": nil,
4292 "api/system-removed.txt": nil,
4293 "api/test-current.txt": nil,
4294 "api/test-removed.txt": nil,
4295}
4296
Jooyung Han58f26ab2019-12-18 15:34:32 +09004297func TestJavaSDKLibrary(t *testing.T) {
4298 ctx, _ := testApex(t, `
4299 apex {
4300 name: "myapex",
4301 key: "myapex.key",
4302 java_libs: ["foo"],
4303 }
4304
4305 apex_key {
4306 name: "myapex.key",
4307 public_key: "testkey.avbpubkey",
4308 private_key: "testkey.pem",
4309 }
4310
4311 java_sdk_library {
4312 name: "foo",
4313 srcs: ["a.java"],
4314 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004315 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004316 }
Paul Duffin9b879592020-05-26 13:21:35 +01004317 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004318
4319 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004320 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004321 "javalib/foo.jar",
4322 "etc/permissions/foo.xml",
4323 })
4324 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004325 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4326 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004327}
4328
Paul Duffin9b879592020-05-26 13:21:35 +01004329func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4330 ctx, _ := testApex(t, `
4331 apex {
4332 name: "myapex",
4333 key: "myapex.key",
4334 java_libs: ["foo", "bar"],
4335 }
4336
4337 apex_key {
4338 name: "myapex.key",
4339 public_key: "testkey.avbpubkey",
4340 private_key: "testkey.pem",
4341 }
4342
4343 java_sdk_library {
4344 name: "foo",
4345 srcs: ["a.java"],
4346 api_packages: ["foo"],
4347 apex_available: ["myapex"],
4348 sdk_version: "none",
4349 system_modules: "none",
4350 }
4351
4352 java_library {
4353 name: "bar",
4354 srcs: ["a.java"],
4355 libs: ["foo"],
4356 apex_available: ["myapex"],
4357 sdk_version: "none",
4358 system_modules: "none",
4359 }
4360 `, withFiles(filesForSdkLibrary))
4361
4362 // java_sdk_library installs both impl jar and permission XML
4363 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4364 "javalib/bar.jar",
4365 "javalib/foo.jar",
4366 "etc/permissions/foo.xml",
4367 })
4368
4369 // The bar library should depend on the implementation jar.
4370 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4371 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4372 t.Errorf("expected %q, found %#q", expected, actual)
4373 }
4374}
4375
4376func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4377 ctx, _ := testApex(t, `
4378 apex {
4379 name: "myapex",
4380 key: "myapex.key",
4381 java_libs: ["foo"],
4382 }
4383
4384 apex_key {
4385 name: "myapex.key",
4386 public_key: "testkey.avbpubkey",
4387 private_key: "testkey.pem",
4388 }
4389
4390 java_sdk_library {
4391 name: "foo",
4392 srcs: ["a.java"],
4393 api_packages: ["foo"],
4394 apex_available: ["myapex"],
4395 sdk_version: "none",
4396 system_modules: "none",
4397 }
4398
4399 java_library {
4400 name: "bar",
4401 srcs: ["a.java"],
4402 libs: ["foo"],
4403 sdk_version: "none",
4404 system_modules: "none",
4405 }
4406 `, withFiles(filesForSdkLibrary))
4407
4408 // java_sdk_library installs both impl jar and permission XML
4409 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4410 "javalib/foo.jar",
4411 "etc/permissions/foo.xml",
4412 })
4413
4414 // The bar library should depend on the stubs jar.
4415 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4416 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4417 t.Errorf("expected %q, found %#q", expected, actual)
4418 }
4419}
4420
atrost6e126252020-01-27 17:01:16 +00004421func TestCompatConfig(t *testing.T) {
4422 ctx, _ := testApex(t, `
4423 apex {
4424 name: "myapex",
4425 key: "myapex.key",
4426 prebuilts: ["myjar-platform-compat-config"],
4427 java_libs: ["myjar"],
4428 }
4429
4430 apex_key {
4431 name: "myapex.key",
4432 public_key: "testkey.avbpubkey",
4433 private_key: "testkey.pem",
4434 }
4435
4436 platform_compat_config {
4437 name: "myjar-platform-compat-config",
4438 src: ":myjar",
4439 }
4440
4441 java_library {
4442 name: "myjar",
4443 srcs: ["foo/bar/MyClass.java"],
4444 sdk_version: "none",
4445 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004446 apex_available: [ "myapex" ],
4447 }
4448 `)
4449 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4450 "etc/compatconfig/myjar-platform-compat-config.xml",
4451 "javalib/myjar.jar",
4452 })
4453}
4454
Jiyong Park479321d2019-12-16 11:47:12 +09004455func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4456 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4457 apex {
4458 name: "myapex",
4459 key: "myapex.key",
4460 java_libs: ["myjar"],
4461 }
4462
4463 apex_key {
4464 name: "myapex.key",
4465 public_key: "testkey.avbpubkey",
4466 private_key: "testkey.pem",
4467 }
4468
4469 java_library {
4470 name: "myjar",
4471 srcs: ["foo/bar/MyClass.java"],
4472 sdk_version: "none",
4473 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004474 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004475 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004476 }
4477 `)
4478}
4479
Jiyong Park7afd1072019-12-30 16:56:33 +09004480func TestCarryRequiredModuleNames(t *testing.T) {
4481 ctx, config := testApex(t, `
4482 apex {
4483 name: "myapex",
4484 key: "myapex.key",
4485 native_shared_libs: ["mylib"],
4486 }
4487
4488 apex_key {
4489 name: "myapex.key",
4490 public_key: "testkey.avbpubkey",
4491 private_key: "testkey.pem",
4492 }
4493
4494 cc_library {
4495 name: "mylib",
4496 srcs: ["mylib.cpp"],
4497 system_shared_libs: [],
4498 stl: "none",
4499 required: ["a", "b"],
4500 host_required: ["c", "d"],
4501 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004502 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004503 }
4504 `)
4505
4506 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4507 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4508 name := apexBundle.BaseModuleName()
4509 prefix := "TARGET_"
4510 var builder strings.Builder
4511 data.Custom(&builder, name, prefix, "", data)
4512 androidMk := builder.String()
4513 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4514 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4515 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4516}
4517
Jiyong Park7cd10e32020-01-14 09:22:18 +09004518func TestSymlinksFromApexToSystem(t *testing.T) {
4519 bp := `
4520 apex {
4521 name: "myapex",
4522 key: "myapex.key",
4523 native_shared_libs: ["mylib"],
4524 java_libs: ["myjar"],
4525 }
4526
Jiyong Park9d677202020-02-19 16:29:35 +09004527 apex {
4528 name: "myapex.updatable",
4529 key: "myapex.key",
4530 native_shared_libs: ["mylib"],
4531 java_libs: ["myjar"],
4532 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004533 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004534 }
4535
Jiyong Park7cd10e32020-01-14 09:22:18 +09004536 apex_key {
4537 name: "myapex.key",
4538 public_key: "testkey.avbpubkey",
4539 private_key: "testkey.pem",
4540 }
4541
4542 cc_library {
4543 name: "mylib",
4544 srcs: ["mylib.cpp"],
4545 shared_libs: ["myotherlib"],
4546 system_shared_libs: [],
4547 stl: "none",
4548 apex_available: [
4549 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004550 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004551 "//apex_available:platform",
4552 ],
4553 }
4554
4555 cc_library {
4556 name: "myotherlib",
4557 srcs: ["mylib.cpp"],
4558 system_shared_libs: [],
4559 stl: "none",
4560 apex_available: [
4561 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004562 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004563 "//apex_available:platform",
4564 ],
4565 }
4566
4567 java_library {
4568 name: "myjar",
4569 srcs: ["foo/bar/MyClass.java"],
4570 sdk_version: "none",
4571 system_modules: "none",
4572 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004573 apex_available: [
4574 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004575 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004576 "//apex_available:platform",
4577 ],
4578 }
4579
4580 java_library {
4581 name: "myotherjar",
4582 srcs: ["foo/bar/MyClass.java"],
4583 sdk_version: "none",
4584 system_modules: "none",
4585 apex_available: [
4586 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004587 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004588 "//apex_available:platform",
4589 ],
4590 }
4591 `
4592
4593 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4594 for _, f := range files {
4595 if f.path == file {
4596 if f.isLink {
4597 t.Errorf("%q is not a real file", file)
4598 }
4599 return
4600 }
4601 }
4602 t.Errorf("%q is not found", file)
4603 }
4604
4605 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4606 for _, f := range files {
4607 if f.path == file {
4608 if !f.isLink {
4609 t.Errorf("%q is not a symlink", file)
4610 }
4611 return
4612 }
4613 }
4614 t.Errorf("%q is not found", file)
4615 }
4616
Jiyong Park9d677202020-02-19 16:29:35 +09004617 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4618 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004619 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004620 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004621 ensureRealfileExists(t, files, "javalib/myjar.jar")
4622 ensureRealfileExists(t, files, "lib64/mylib.so")
4623 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4624
Jiyong Park9d677202020-02-19 16:29:35 +09004625 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4626 ensureRealfileExists(t, files, "javalib/myjar.jar")
4627 ensureRealfileExists(t, files, "lib64/mylib.so")
4628 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4629
4630 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004631 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004632 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004633 ensureRealfileExists(t, files, "javalib/myjar.jar")
4634 ensureRealfileExists(t, files, "lib64/mylib.so")
4635 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004636
4637 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4638 ensureRealfileExists(t, files, "javalib/myjar.jar")
4639 ensureRealfileExists(t, files, "lib64/mylib.so")
4640 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004641}
4642
Jooyung Han643adc42020-02-27 13:50:06 +09004643func TestApexWithJniLibs(t *testing.T) {
4644 ctx, _ := testApex(t, `
4645 apex {
4646 name: "myapex",
4647 key: "myapex.key",
4648 jni_libs: ["mylib"],
4649 }
4650
4651 apex_key {
4652 name: "myapex.key",
4653 public_key: "testkey.avbpubkey",
4654 private_key: "testkey.pem",
4655 }
4656
4657 cc_library {
4658 name: "mylib",
4659 srcs: ["mylib.cpp"],
4660 shared_libs: ["mylib2"],
4661 system_shared_libs: [],
4662 stl: "none",
4663 apex_available: [ "myapex" ],
4664 }
4665
4666 cc_library {
4667 name: "mylib2",
4668 srcs: ["mylib.cpp"],
4669 system_shared_libs: [],
4670 stl: "none",
4671 apex_available: [ "myapex" ],
4672 }
4673 `)
4674
4675 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4676 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4677 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4678 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4679 "lib64/mylib.so",
4680 "lib64/mylib2.so",
4681 })
4682}
4683
Jooyung Han49f67012020-04-17 13:43:10 +09004684func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4685 ctx, _ := testApex(t, `
4686 apex {
4687 name: "myapex",
4688 key: "myapex.key",
4689 }
4690 apex_key {
4691 name: "myapex.key",
4692 public_key: "testkey.avbpubkey",
4693 private_key: "testkey.pem",
4694 }
4695 `, func(fs map[string][]byte, config android.Config) {
4696 delete(config.Targets, android.Android)
4697 config.AndroidCommonTarget = android.Target{}
4698 })
4699
4700 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4701 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4702 }
4703}
4704
Jooyung Han643adc42020-02-27 13:50:06 +09004705func TestApexWithJniLibs_Errors(t *testing.T) {
4706 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4707 apex {
4708 name: "myapex",
4709 key: "myapex.key",
4710 jni_libs: ["xxx"],
4711 }
4712
4713 apex_key {
4714 name: "myapex.key",
4715 public_key: "testkey.avbpubkey",
4716 private_key: "testkey.pem",
4717 }
4718
4719 prebuilt_etc {
4720 name: "xxx",
4721 src: "xxx",
4722 }
4723 `, withFiles(map[string][]byte{
4724 "xxx": nil,
4725 }))
4726}
4727
Jiyong Parkbd159612020-02-28 15:22:21 +09004728func TestAppBundle(t *testing.T) {
4729 ctx, _ := testApex(t, `
4730 apex {
4731 name: "myapex",
4732 key: "myapex.key",
4733 apps: ["AppFoo"],
4734 }
4735
4736 apex_key {
4737 name: "myapex.key",
4738 public_key: "testkey.avbpubkey",
4739 private_key: "testkey.pem",
4740 }
4741
4742 android_app {
4743 name: "AppFoo",
4744 srcs: ["foo/bar/MyClass.java"],
4745 sdk_version: "none",
4746 system_modules: "none",
4747 apex_available: [ "myapex" ],
4748 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004749 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004750
4751 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4752 content := bundleConfigRule.Args["content"]
4753
4754 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004755 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 +09004756}
4757
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004758func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004759 t.Helper()
4760
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004761 bp := `
4762 java_library {
4763 name: "some-updatable-apex-lib",
4764 srcs: ["a.java"],
4765 sdk_version: "current",
4766 apex_available: [
4767 "some-updatable-apex",
4768 ],
4769 }
4770
4771 java_library {
4772 name: "some-non-updatable-apex-lib",
4773 srcs: ["a.java"],
4774 apex_available: [
4775 "some-non-updatable-apex",
4776 ],
4777 }
4778
4779 java_library {
4780 name: "some-platform-lib",
4781 srcs: ["a.java"],
4782 sdk_version: "current",
4783 installable: true,
4784 }
4785
4786 java_library {
4787 name: "some-art-lib",
4788 srcs: ["a.java"],
4789 sdk_version: "current",
4790 apex_available: [
4791 "com.android.art.something",
4792 ],
4793 hostdex: true,
4794 }
4795
4796 apex {
4797 name: "some-updatable-apex",
4798 key: "some-updatable-apex.key",
4799 java_libs: ["some-updatable-apex-lib"],
4800 updatable: true,
4801 min_sdk_version: "current",
4802 }
4803
4804 apex {
4805 name: "some-non-updatable-apex",
4806 key: "some-non-updatable-apex.key",
4807 java_libs: ["some-non-updatable-apex-lib"],
4808 }
4809
4810 apex_key {
4811 name: "some-updatable-apex.key",
4812 }
4813
4814 apex_key {
4815 name: "some-non-updatable-apex.key",
4816 }
4817
4818 apex {
4819 name: "com.android.art.something",
4820 key: "com.android.art.something.key",
4821 java_libs: ["some-art-lib"],
4822 updatable: true,
4823 min_sdk_version: "current",
4824 }
4825
4826 apex_key {
4827 name: "com.android.art.something.key",
4828 }
4829
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004830 filegroup {
4831 name: "some-updatable-apex-file_contexts",
4832 srcs: [
4833 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4834 ],
4835 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004836
4837 filegroup {
4838 name: "some-non-updatable-apex-file_contexts",
4839 srcs: [
4840 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4841 ],
4842 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004843 `
4844 bp += cc.GatherRequiredDepsForTest(android.Android)
4845 bp += java.GatherRequiredDepsForTest()
4846 bp += dexpreopt.BpToolModulesForTest()
4847
4848 fs := map[string][]byte{
4849 "a.java": nil,
4850 "a.jar": nil,
4851 "build/make/target/product/security": nil,
4852 "apex_manifest.json": nil,
4853 "AndroidManifest.xml": nil,
4854 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004855 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004856 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4857 "framework/aidl/a.aidl": nil,
4858 }
4859 cc.GatherRequiredFilesForTest(fs)
4860
4861 ctx := android.NewTestArchContext()
4862 ctx.RegisterModuleType("apex", BundleFactory)
4863 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4864 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004865 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004866 cc.RegisterRequiredBuildComponentsForTest(ctx)
4867 java.RegisterJavaBuildComponents(ctx)
4868 java.RegisterSystemModulesBuildComponents(ctx)
4869 java.RegisterAppBuildComponents(ctx)
4870 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004871 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4872 ctx.PreDepsMutators(RegisterPreDepsMutators)
4873 ctx.PostDepsMutators(RegisterPostDepsMutators)
4874
4875 config := android.TestArchConfig(buildDir, nil, bp, fs)
4876 ctx.Register(config)
4877
4878 _ = dexpreopt.GlobalSoongConfigForTests(config)
4879 dexpreopt.RegisterToolModulesForTest(ctx)
4880 pathCtx := android.PathContextForTesting(config)
4881 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4882 transformDexpreoptConfig(dexpreoptConfig)
4883 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4884
4885 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4886 android.FailIfErrored(t, errs)
4887
4888 _, errs = ctx.PrepareBuildActions(config)
4889 if errmsg == "" {
4890 android.FailIfErrored(t, errs)
4891 } else if len(errs) > 0 {
4892 android.FailIfNoMatchingErrors(t, errmsg, errs)
4893 return
4894 } else {
4895 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4896 }
4897}
4898
Jooyung Han548640b2020-04-27 12:10:30 +09004899func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4900 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4901 apex {
4902 name: "myapex",
4903 key: "myapex.key",
4904 updatable: true,
4905 }
4906
4907 apex_key {
4908 name: "myapex.key",
4909 public_key: "testkey.avbpubkey",
4910 private_key: "testkey.pem",
4911 }
4912 `)
4913}
4914
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004915func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004916
4917 var error string
4918 var transform func(*dexpreopt.GlobalConfig)
4919
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004920 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
4921 transform = func(config *dexpreopt.GlobalConfig) {
4922 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
4923 }
4924 testNoUpdatableJarsInBootImage(t, "", transform)
4925 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004926
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004927 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
4928 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4929 transform = func(config *dexpreopt.GlobalConfig) {
4930 config.BootJars = []string{"com.android.art.something:some-art-lib"}
4931 }
4932 testNoUpdatableJarsInBootImage(t, error, transform)
4933 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004934
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004935 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4936 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4937 transform = func(config *dexpreopt.GlobalConfig) {
4938 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4939 }
4940 testNoUpdatableJarsInBootImage(t, error, transform)
4941 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004942
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004943 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4944 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4945 transform = func(config *dexpreopt.GlobalConfig) {
4946 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4947 }
4948 testNoUpdatableJarsInBootImage(t, error, transform)
4949 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004950
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004951 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
4952 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4953 transform = func(config *dexpreopt.GlobalConfig) {
4954 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4955 }
4956 testNoUpdatableJarsInBootImage(t, error, transform)
4957 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004958
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004959 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
4960 transform = func(config *dexpreopt.GlobalConfig) {
4961 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4962 }
4963 testNoUpdatableJarsInBootImage(t, "", transform)
4964 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004965
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004966 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
4967 error = "failed to find a dex jar path for module 'nonexistent'"
4968 transform = func(config *dexpreopt.GlobalConfig) {
4969 config.ArtApexJars = []string{"platform:nonexistent"}
4970 }
4971 testNoUpdatableJarsInBootImage(t, error, transform)
4972 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004973
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004974 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
4975 error = "failed to find a dex jar path for module 'nonexistent'"
4976 transform = func(config *dexpreopt.GlobalConfig) {
4977 config.BootJars = []string{"platform:nonexistent"}
4978 }
4979 testNoUpdatableJarsInBootImage(t, error, transform)
4980 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004981
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004982 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
4983 error = "module 'some-platform-lib' is not allowed in the ART boot image"
4984 transform = func(config *dexpreopt.GlobalConfig) {
4985 config.ArtApexJars = []string{"platform:some-platform-lib"}
4986 }
4987 testNoUpdatableJarsInBootImage(t, error, transform)
4988 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004989
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004990 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
4991 transform = func(config *dexpreopt.GlobalConfig) {
4992 config.BootJars = []string{"platform:some-platform-lib"}
4993 }
4994 testNoUpdatableJarsInBootImage(t, "", transform)
4995 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004996}
4997
Jiyong Park62304bb2020-04-13 16:19:48 +09004998func TestTestFor(t *testing.T) {
4999 ctx, _ := testApex(t, `
5000 apex {
5001 name: "myapex",
5002 key: "myapex.key",
5003 native_shared_libs: ["mylib", "myprivlib"],
5004 }
5005
5006 apex_key {
5007 name: "myapex.key",
5008 public_key: "testkey.avbpubkey",
5009 private_key: "testkey.pem",
5010 }
5011
5012 cc_library {
5013 name: "mylib",
5014 srcs: ["mylib.cpp"],
5015 system_shared_libs: [],
5016 stl: "none",
5017 stubs: {
5018 versions: ["1"],
5019 },
5020 apex_available: ["myapex"],
5021 }
5022
5023 cc_library {
5024 name: "myprivlib",
5025 srcs: ["mylib.cpp"],
5026 system_shared_libs: [],
5027 stl: "none",
5028 apex_available: ["myapex"],
5029 }
5030
5031
5032 cc_test {
5033 name: "mytest",
5034 gtest: false,
5035 srcs: ["mylib.cpp"],
5036 system_shared_libs: [],
5037 stl: "none",
5038 shared_libs: ["mylib", "myprivlib"],
5039 test_for: ["myapex"]
5040 }
5041 `)
5042
5043 // the test 'mytest' is a test for the apex, therefore is linked to the
5044 // actual implementation of mylib instead of its stub.
5045 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5046 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5047 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5048}
5049
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005050// TODO(jungjw): Move this to proptools
5051func intPtr(i int) *int {
5052 return &i
5053}
5054
5055func TestApexSet(t *testing.T) {
5056 ctx, config := testApex(t, `
5057 apex_set {
5058 name: "myapex",
5059 set: "myapex.apks",
5060 filename: "foo_v2.apex",
5061 overrides: ["foo"],
5062 }
5063 `, func(fs map[string][]byte, config android.Config) {
5064 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5065 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5066 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5067 })
5068
5069 m := ctx.ModuleForTests("myapex", "android_common")
5070
5071 // Check extract_apks tool parameters.
5072 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5073 actual := extractedApex.Args["abis"]
5074 expected := "ARMEABI_V7A,ARM64_V8A"
5075 if actual != expected {
5076 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5077 }
5078 actual = extractedApex.Args["sdk-version"]
5079 expected = "30"
5080 if actual != expected {
5081 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5082 }
5083
5084 a := m.Module().(*ApexSet)
5085 expectedOverrides := []string{"foo"}
5086 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5087 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5088 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5089 }
5090}
5091
Jiyong Park7d95a512020-05-10 15:16:24 +09005092func TestNoStaticLinkingToStubsLib(t *testing.T) {
5093 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5094 apex {
5095 name: "myapex",
5096 key: "myapex.key",
5097 native_shared_libs: ["mylib"],
5098 }
5099
5100 apex_key {
5101 name: "myapex.key",
5102 public_key: "testkey.avbpubkey",
5103 private_key: "testkey.pem",
5104 }
5105
5106 cc_library {
5107 name: "mylib",
5108 srcs: ["mylib.cpp"],
5109 static_libs: ["otherlib"],
5110 system_shared_libs: [],
5111 stl: "none",
5112 apex_available: [ "myapex" ],
5113 }
5114
5115 cc_library {
5116 name: "otherlib",
5117 srcs: ["mylib.cpp"],
5118 system_shared_libs: [],
5119 stl: "none",
5120 stubs: {
5121 versions: ["1", "2", "3"],
5122 },
5123 apex_available: [ "myapex" ],
5124 }
5125 `)
5126}
5127
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005128func TestMain(m *testing.M) {
5129 run := func() int {
5130 setUp()
5131 defer tearDown()
5132
5133 return m.Run()
5134 }
5135
5136 os.Exit(run())
5137}