blob: 1142cbcc9c7a4391092ccd5c40a2ffdc4fe0ed6b [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 },
Jiyong Park77acec62020-06-01 21:39:15 +0900330 java_libs: [
331 "myjar",
332 "myjar_dex",
333 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 }
335
Jiyong Park30ca9372019-02-07 16:27:23 +0900336 apex {
337 name: "myapex",
338 defaults: ["myapex-defaults"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 apex_key {
342 name: "myapex.key",
343 public_key: "testkey.avbpubkey",
344 private_key: "testkey.pem",
345 }
346
Jiyong Park809bb722019-02-13 21:33:49 +0900347 filegroup {
348 name: "myapex.manifest",
349 srcs: ["apex_manifest.json"],
350 }
351
352 filegroup {
353 name: "myapex.androidmanifest",
354 srcs: ["AndroidManifest.xml"],
355 }
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 cc_library {
358 name: "mylib",
359 srcs: ["mylib.cpp"],
360 shared_libs: ["mylib2"],
361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
385 static_executable: true,
386 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000387 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800388 }
389
Paul Duffindddd5462020-04-07 15:25:44 +0100390 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900391 name: "mylib2",
392 srcs: ["mylib.cpp"],
393 system_shared_libs: [],
394 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900395 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900396 static_libs: ["libstatic"],
397 // TODO: remove //apex_available:platform
398 apex_available: [
399 "//apex_available:platform",
400 "myapex",
401 ],
402 }
403
Paul Duffindddd5462020-04-07 15:25:44 +0100404 cc_prebuilt_library_shared {
405 name: "mylib2",
406 srcs: ["prebuilt.so"],
407 // TODO: remove //apex_available:platform
408 apex_available: [
409 "//apex_available:platform",
410 "myapex",
411 ],
412 }
413
Jiyong Park9918e1a2020-03-17 19:16:40 +0900414 cc_library_static {
415 name: "libstatic",
416 srcs: ["mylib.cpp"],
417 system_shared_libs: [],
418 stl: "none",
419 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000420 // TODO: remove //apex_available:platform
421 apex_available: [
422 "//apex_available:platform",
423 "myapex",
424 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900425 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900426
427 java_library {
428 name: "myjar",
429 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900430 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900431 sdk_version: "none",
432 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900433 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900434 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000435 // TODO: remove //apex_available:platform
436 apex_available: [
437 "//apex_available:platform",
438 "myapex",
439 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900440 }
441
Jiyong Park77acec62020-06-01 21:39:15 +0900442 dex_import {
443 name: "myjar_dex",
444 jars: ["prebuilt.jar"],
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
449 }
450
Jiyong Park7f7766d2019-07-25 22:02:35 +0900451 java_library {
452 name: "myotherjar",
453 srcs: ["foo/bar/MyClass.java"],
454 sdk_version: "none",
455 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900462
463 java_library {
464 name: "mysharedjar",
465 srcs: ["foo/bar/MyClass.java"],
466 sdk_version: "none",
467 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900468 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900469 `)
470
Sundong Ahnabb64432019-10-22 13:58:29 +0900471 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900472
473 optFlags := apexRule.Args["opt_flags"]
474 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700475 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900476 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900477
Jiyong Park25fc6a92018-11-18 18:02:45 +0900478 copyCmds := apexRule.Args["copy_commands"]
479
480 // Ensure that main rule creates an output
481 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
482
483 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800484 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900486 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900487
488 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800489 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900491
492 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800493 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
494 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900495 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900496 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497 // .. but not for java libs
498 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900499 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800500
Colin Cross7113d202019-11-20 16:39:12 -0800501 // Ensure that the platform variant ends with _shared or _common
502 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
503 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
505 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900506 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
507
508 // Ensure that dynamic dependency to java libs are not included
509 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800510
511 // Ensure that all symlinks are present.
512 found_foo_link_64 := false
513 found_foo := false
514 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900515 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800516 if strings.HasSuffix(cmd, "bin/foo") {
517 found_foo = true
518 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
519 found_foo_link_64 = true
520 }
521 }
522 }
523 good := found_foo && found_foo_link_64
524 if !good {
525 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
526 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900527
Sundong Ahnabb64432019-10-22 13:58:29 +0900528 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700529 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900530 if len(noticeInputs) != 3 {
531 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900532 }
533 ensureListContains(t, noticeInputs, "NOTICE")
534 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900535 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900536
Artur Satayeva8bd1132020-04-27 18:07:06 +0100537 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100538 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
539 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
540 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
541 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
542 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100543
544 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100545 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
546 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
547 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
548 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
549 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800550}
551
Jooyung Hanf21c7972019-12-16 22:32:06 +0900552func TestDefaults(t *testing.T) {
553 ctx, _ := testApex(t, `
554 apex_defaults {
555 name: "myapex-defaults",
556 key: "myapex.key",
557 prebuilts: ["myetc"],
558 native_shared_libs: ["mylib"],
559 java_libs: ["myjar"],
560 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900561 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900562 }
563
564 prebuilt_etc {
565 name: "myetc",
566 src: "myprebuilt",
567 }
568
569 apex {
570 name: "myapex",
571 defaults: ["myapex-defaults"],
572 }
573
574 apex_key {
575 name: "myapex.key",
576 public_key: "testkey.avbpubkey",
577 private_key: "testkey.pem",
578 }
579
580 cc_library {
581 name: "mylib",
582 system_shared_libs: [],
583 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000584 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900585 }
586
587 java_library {
588 name: "myjar",
589 srcs: ["foo/bar/MyClass.java"],
590 sdk_version: "none",
591 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000592 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900593 }
594
595 android_app {
596 name: "AppFoo",
597 srcs: ["foo/bar/MyClass.java"],
598 sdk_version: "none",
599 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000600 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900601 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900602
603 runtime_resource_overlay {
604 name: "rro",
605 theme: "blue",
606 }
607
Jooyung Hanf21c7972019-12-16 22:32:06 +0900608 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000609 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610 "etc/myetc",
611 "javalib/myjar.jar",
612 "lib64/mylib.so",
613 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 })
616}
617
Jooyung Han01a3ee22019-11-02 02:52:25 +0900618func TestApexManifest(t *testing.T) {
619 ctx, _ := testApex(t, `
620 apex {
621 name: "myapex",
622 key: "myapex.key",
623 }
624
625 apex_key {
626 name: "myapex.key",
627 public_key: "testkey.avbpubkey",
628 private_key: "testkey.pem",
629 }
630 `)
631
632 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900633 args := module.Rule("apexRule").Args
634 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
635 t.Error("manifest should be apex_manifest.pb, but " + manifest)
636 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900637}
638
Alex Light5098a612018-11-29 17:12:15 -0800639func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700640 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800641 apex {
642 name: "myapex",
643 key: "myapex.key",
644 payload_type: "zip",
645 native_shared_libs: ["mylib"],
646 }
647
648 apex_key {
649 name: "myapex.key",
650 public_key: "testkey.avbpubkey",
651 private_key: "testkey.pem",
652 }
653
654 cc_library {
655 name: "mylib",
656 srcs: ["mylib.cpp"],
657 shared_libs: ["mylib2"],
658 system_shared_libs: [],
659 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800661 }
662
663 cc_library {
664 name: "mylib2",
665 srcs: ["mylib.cpp"],
666 system_shared_libs: [],
667 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000668 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800669 }
670 `)
671
Sundong Ahnabb64432019-10-22 13:58:29 +0900672 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800673 copyCmds := zipApexRule.Args["copy_commands"]
674
675 // Ensure that main rule creates an output
676 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
677
678 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800679 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800680
681 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800682 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800683
684 // Ensure that both direct and indirect deps are copied into apex
685 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
686 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900687}
688
689func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700690 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
694 native_shared_libs: ["mylib", "mylib3"],
695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702
703 cc_library {
704 name: "mylib",
705 srcs: ["mylib.cpp"],
706 shared_libs: ["mylib2", "mylib3"],
707 system_shared_libs: [],
708 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000709 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900710 }
711
712 cc_library {
713 name: "mylib2",
714 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900715 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900716 system_shared_libs: [],
717 stl: "none",
718 stubs: {
719 versions: ["1", "2", "3"],
720 },
721 }
722
723 cc_library {
724 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900725 srcs: ["mylib.cpp"],
726 shared_libs: ["mylib4"],
727 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728 stl: "none",
729 stubs: {
730 versions: ["10", "11", "12"],
731 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000732 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900733 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900734
735 cc_library {
736 name: "mylib4",
737 srcs: ["mylib.cpp"],
738 system_shared_libs: [],
739 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000740 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900741 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900742 `)
743
Sundong Ahnabb64432019-10-22 13:58:29 +0900744 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900745 copyCmds := apexRule.Args["copy_commands"]
746
747 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800748 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900749
750 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800751 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900752
753 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800754 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900755
Colin Cross7113d202019-11-20 16:39:12 -0800756 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900757
758 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900759 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900760 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900761 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900762
763 // 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 -0800764 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900765 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800766 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900767
768 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900769 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900770 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900771
772 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900773 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900774
Jooyung Hana57af4a2020-01-23 05:36:59 +0000775 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900776 "lib64/mylib.so",
777 "lib64/mylib3.so",
778 "lib64/mylib4.so",
779 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780}
781
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900782func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700783 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900784 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900785 name: "myapex2",
786 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900787 native_shared_libs: ["mylib"],
788 }
789
790 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900791 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900792 public_key: "testkey.avbpubkey",
793 private_key: "testkey.pem",
794 }
795
796 cc_library {
797 name: "mylib",
798 srcs: ["mylib.cpp"],
799 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900800 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900801 system_shared_libs: [],
802 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000803 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900804 }
805
806 cc_library {
807 name: "libfoo",
808 srcs: ["mylib.cpp"],
809 shared_libs: ["libbar"],
810 system_shared_libs: [],
811 stl: "none",
812 stubs: {
813 versions: ["10", "20", "30"],
814 },
815 }
816
817 cc_library {
818 name: "libbar",
819 srcs: ["mylib.cpp"],
820 system_shared_libs: [],
821 stl: "none",
822 }
823
Jiyong Park678c8812020-02-07 17:25:49 +0900824 cc_library_static {
825 name: "libbaz",
826 srcs: ["mylib.cpp"],
827 system_shared_libs: [],
828 stl: "none",
829 apex_available: [ "myapex2" ],
830 }
831
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900832 `)
833
Jiyong Park83dc74b2020-01-14 18:38:44 +0900834 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900835 copyCmds := apexRule.Args["copy_commands"]
836
837 // Ensure that direct non-stubs dep is always included
838 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
839
840 // Ensure that indirect stubs dep is not included
841 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
842
843 // Ensure that dependency of stubs is not included
844 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
845
Jiyong Park83dc74b2020-01-14 18:38:44 +0900846 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900847
848 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900849 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900850 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900851 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900852
Jiyong Park3ff16992019-12-27 14:11:47 +0900853 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900854
855 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
856 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900857
Artur Satayeva8bd1132020-04-27 18:07:06 +0100858 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100859 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
860 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
861 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900862
Artur Satayeva8bd1132020-04-27 18:07:06 +0100863 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100864 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
865 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
866 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900867}
868
Jooyung Hand3639552019-08-09 12:57:43 +0900869func TestApexWithRuntimeLibsDependency(t *testing.T) {
870 /*
871 myapex
872 |
873 v (runtime_libs)
874 mylib ------+------> libfoo [provides stub]
875 |
876 `------> libbar
877 */
878 ctx, _ := testApex(t, `
879 apex {
880 name: "myapex",
881 key: "myapex.key",
882 native_shared_libs: ["mylib"],
883 }
884
885 apex_key {
886 name: "myapex.key",
887 public_key: "testkey.avbpubkey",
888 private_key: "testkey.pem",
889 }
890
891 cc_library {
892 name: "mylib",
893 srcs: ["mylib.cpp"],
894 runtime_libs: ["libfoo", "libbar"],
895 system_shared_libs: [],
896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000897 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900898 }
899
900 cc_library {
901 name: "libfoo",
902 srcs: ["mylib.cpp"],
903 system_shared_libs: [],
904 stl: "none",
905 stubs: {
906 versions: ["10", "20", "30"],
907 },
908 }
909
910 cc_library {
911 name: "libbar",
912 srcs: ["mylib.cpp"],
913 system_shared_libs: [],
914 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000915 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900916 }
917
918 `)
919
Sundong Ahnabb64432019-10-22 13:58:29 +0900920 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900921 copyCmds := apexRule.Args["copy_commands"]
922
923 // Ensure that direct non-stubs dep is always included
924 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
925
926 // Ensure that indirect stubs dep is not included
927 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
928
929 // Ensure that runtime_libs dep in included
930 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
931
Sundong Ahnabb64432019-10-22 13:58:29 +0900932 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900933 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
934 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900935
936}
937
Jooyung Han8ce8db92020-05-15 19:05:05 +0900938func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
939 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
940 bp := `
941 apex {
942 name: "com.android.runtime",
943 key: "com.android.runtime.key",
944 native_shared_libs: ["libc"],
945 }
946
947 apex_key {
948 name: "com.android.runtime.key",
949 public_key: "testkey.avbpubkey",
950 private_key: "testkey.pem",
951 }
952
953 cc_library {
954 name: "libc",
955 no_libcrt: true,
956 nocrt: true,
957 stl: "none",
958 system_shared_libs: [],
959 stubs: { versions: ["1"] },
960 apex_available: ["com.android.runtime"],
961
962 sanitize: {
963 hwaddress: true,
964 }
965 }
966
967 cc_prebuilt_library_shared {
968 name: "libclang_rt.hwasan-aarch64-android",
969 no_libcrt: true,
970 nocrt: true,
971 stl: "none",
972 system_shared_libs: [],
973 srcs: [""],
974 stubs: { versions: ["1"] },
975
976 sanitize: {
977 never: true,
978 },
979 }
980 `
981 // override bp to use hard-coded names: com.android.runtime and libc
982 fs["Android.bp"] = []byte(bp)
983 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
984 })
985
986 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
987 "lib64/bionic/libc.so",
988 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
989 })
990
991 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
992
993 installed := hwasan.Description("install libclang_rt.hwasan")
994 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
995
996 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
997 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
998 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
999}
1000
1001func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1002 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1003 bp := `
1004 apex {
1005 name: "com.android.runtime",
1006 key: "com.android.runtime.key",
1007 native_shared_libs: ["libc"],
1008 }
1009
1010 apex_key {
1011 name: "com.android.runtime.key",
1012 public_key: "testkey.avbpubkey",
1013 private_key: "testkey.pem",
1014 }
1015
1016 cc_library {
1017 name: "libc",
1018 no_libcrt: true,
1019 nocrt: true,
1020 stl: "none",
1021 system_shared_libs: [],
1022 stubs: { versions: ["1"] },
1023 apex_available: ["com.android.runtime"],
1024 }
1025
1026 cc_prebuilt_library_shared {
1027 name: "libclang_rt.hwasan-aarch64-android",
1028 no_libcrt: true,
1029 nocrt: true,
1030 stl: "none",
1031 system_shared_libs: [],
1032 srcs: [""],
1033 stubs: { versions: ["1"] },
1034
1035 sanitize: {
1036 never: true,
1037 },
1038 }
1039 `
1040 // override bp to use hard-coded names: com.android.runtime and libc
1041 fs["Android.bp"] = []byte(bp)
1042 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1043
1044 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1045 })
1046
1047 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1048 "lib64/bionic/libc.so",
1049 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1050 })
1051
1052 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1053
1054 installed := hwasan.Description("install libclang_rt.hwasan")
1055 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1056
1057 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1058 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1059 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1060}
1061
Jooyung Han61b66e92020-03-21 14:21:46 +00001062func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1063 testcases := []struct {
1064 name string
1065 minSdkVersion string
1066 shouldLink string
1067 shouldNotLink []string
1068 }{
1069 {
Jooyung Han75568392020-03-20 04:29:24 +09001070 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001071 minSdkVersion: "current",
1072 shouldLink: "30",
1073 shouldNotLink: []string{"29"},
1074 },
1075 {
1076 name: "should link to llndk#29",
1077 minSdkVersion: "29",
1078 shouldLink: "29",
1079 shouldNotLink: []string{"30"},
1080 },
1081 }
1082 for _, tc := range testcases {
1083 t.Run(tc.name, func(t *testing.T) {
1084 ctx, _ := testApex(t, `
1085 apex {
1086 name: "myapex",
1087 key: "myapex.key",
1088 use_vendor: true,
1089 native_shared_libs: ["mylib"],
1090 min_sdk_version: "`+tc.minSdkVersion+`",
1091 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001092
Jooyung Han61b66e92020-03-21 14:21:46 +00001093 apex_key {
1094 name: "myapex.key",
1095 public_key: "testkey.avbpubkey",
1096 private_key: "testkey.pem",
1097 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001098
Jooyung Han61b66e92020-03-21 14:21:46 +00001099 cc_library {
1100 name: "mylib",
1101 srcs: ["mylib.cpp"],
1102 vendor_available: true,
1103 shared_libs: ["libbar"],
1104 system_shared_libs: [],
1105 stl: "none",
1106 apex_available: [ "myapex" ],
1107 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001108
Jooyung Han61b66e92020-03-21 14:21:46 +00001109 cc_library {
1110 name: "libbar",
1111 srcs: ["mylib.cpp"],
1112 system_shared_libs: [],
1113 stl: "none",
1114 stubs: { versions: ["29","30"] },
1115 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001116
Jooyung Han61b66e92020-03-21 14:21:46 +00001117 llndk_library {
1118 name: "libbar",
1119 symbol_file: "",
1120 }
1121 `, func(fs map[string][]byte, config android.Config) {
1122 setUseVendorWhitelistForTest(config, []string{"myapex"})
1123 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001124
Jooyung Han61b66e92020-03-21 14:21:46 +00001125 // Ensure that LLNDK dep is not included
1126 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1127 "lib64/mylib.so",
1128 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001129
Jooyung Han61b66e92020-03-21 14:21:46 +00001130 // Ensure that LLNDK dep is required
1131 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1132 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1133 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001134
Jooyung Han61b66e92020-03-21 14:21:46 +00001135 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1136 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1137 for _, ver := range tc.shouldNotLink {
1138 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1139 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001140
Jooyung Han61b66e92020-03-21 14:21:46 +00001141 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1142 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1143 })
1144 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001145}
1146
Jiyong Park25fc6a92018-11-18 18:02:45 +09001147func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001148 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001149 apex {
1150 name: "myapex",
1151 key: "myapex.key",
1152 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1153 }
1154
1155 apex_key {
1156 name: "myapex.key",
1157 public_key: "testkey.avbpubkey",
1158 private_key: "testkey.pem",
1159 }
1160
1161 cc_library {
1162 name: "mylib",
1163 srcs: ["mylib.cpp"],
1164 shared_libs: ["libdl#27"],
1165 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001166 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001167 }
1168
1169 cc_library_shared {
1170 name: "mylib_shared",
1171 srcs: ["mylib.cpp"],
1172 shared_libs: ["libdl#27"],
1173 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001174 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001175 }
1176
1177 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001178 name: "libBootstrap",
1179 srcs: ["mylib.cpp"],
1180 stl: "none",
1181 bootstrap: true,
1182 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001183 `)
1184
Sundong Ahnabb64432019-10-22 13:58:29 +09001185 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001186 copyCmds := apexRule.Args["copy_commands"]
1187
1188 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001189 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001190 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1191 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001192
1193 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001194 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001195
Colin Cross7113d202019-11-20 16:39:12 -08001196 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1197 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1198 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001199
1200 // For dependency to libc
1201 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001202 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001203 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001204 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001205 // ... Cflags from stub is correctly exported to mylib
1206 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1207 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1208
1209 // For dependency to libm
1210 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001211 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001212 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001213 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001214 // ... and is not compiling with the stub
1215 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1216 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1217
1218 // For dependency to libdl
1219 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001220 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001221 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001222 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1223 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001224 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001225 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001226 // ... Cflags from stub is correctly exported to mylib
1227 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1228 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001229
1230 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001231 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1232 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1233 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1234 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001235}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001236
Jooyung Han03b51852020-02-26 22:45:42 +09001237func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1238 // there are three links between liba --> libz
1239 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1240 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1241 // 3) (platform) -> liba -> libz : this should be non-stub link
1242 ctx, _ := testApex(t, `
1243 apex {
1244 name: "myapex",
1245 key: "myapex.key",
1246 native_shared_libs: ["libx"],
1247 min_sdk_version: "2",
1248 }
1249
1250 apex {
1251 name: "otherapex",
1252 key: "myapex.key",
1253 native_shared_libs: ["liby"],
1254 min_sdk_version: "3",
1255 }
1256
1257 apex_key {
1258 name: "myapex.key",
1259 public_key: "testkey.avbpubkey",
1260 private_key: "testkey.pem",
1261 }
1262
1263 cc_library {
1264 name: "libx",
1265 shared_libs: ["liba"],
1266 system_shared_libs: [],
1267 stl: "none",
1268 apex_available: [ "myapex" ],
1269 }
1270
1271 cc_library {
1272 name: "liby",
1273 shared_libs: ["liba"],
1274 system_shared_libs: [],
1275 stl: "none",
1276 apex_available: [ "otherapex" ],
1277 }
1278
1279 cc_library {
1280 name: "liba",
1281 shared_libs: ["libz"],
1282 system_shared_libs: [],
1283 stl: "none",
1284 apex_available: [
1285 "//apex_available:anyapex",
1286 "//apex_available:platform",
1287 ],
1288 }
1289
1290 cc_library {
1291 name: "libz",
1292 system_shared_libs: [],
1293 stl: "none",
1294 stubs: {
1295 versions: ["1", "3"],
1296 },
1297 }
1298 `, withUnbundledBuild)
1299
1300 expectLink := func(from, from_variant, to, to_variant string) {
1301 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1302 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1303 }
1304 expectNoLink := func(from, from_variant, to, to_variant string) {
1305 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1306 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1307 }
1308 // platform liba is linked to non-stub version
1309 expectLink("liba", "shared", "libz", "shared")
1310 // liba in myapex is linked to #1
1311 expectLink("liba", "shared_myapex", "libz", "shared_1")
1312 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1313 expectNoLink("liba", "shared_myapex", "libz", "shared")
1314 // liba in otherapex is linked to #3
1315 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1316 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1317 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1318}
1319
Jooyung Hanaed150d2020-04-02 01:41:41 +09001320func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1321 ctx, _ := testApex(t, `
1322 apex {
1323 name: "myapex",
1324 key: "myapex.key",
1325 native_shared_libs: ["libx"],
1326 min_sdk_version: "R",
1327 }
1328
1329 apex_key {
1330 name: "myapex.key",
1331 public_key: "testkey.avbpubkey",
1332 private_key: "testkey.pem",
1333 }
1334
1335 cc_library {
1336 name: "libx",
1337 shared_libs: ["libz"],
1338 system_shared_libs: [],
1339 stl: "none",
1340 apex_available: [ "myapex" ],
1341 }
1342
1343 cc_library {
1344 name: "libz",
1345 system_shared_libs: [],
1346 stl: "none",
1347 stubs: {
1348 versions: ["29", "R"],
1349 },
1350 }
1351 `, func(fs map[string][]byte, config android.Config) {
1352 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1353 })
1354
1355 expectLink := func(from, from_variant, to, to_variant string) {
1356 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1357 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1358 }
1359 expectNoLink := func(from, from_variant, to, to_variant string) {
1360 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1361 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1362 }
1363 // 9000 is quite a magic number.
1364 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1365 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1366 // to distinguish them from finalized and future_api(10000)
1367 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1368 // (refer android/api_levels.go)
1369 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1370 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1371 expectNoLink("libx", "shared_myapex", "libz", "shared")
1372}
1373
Jooyung Han03b51852020-02-26 22:45:42 +09001374func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1375 ctx, _ := testApex(t, `
1376 apex {
1377 name: "myapex",
1378 key: "myapex.key",
1379 native_shared_libs: ["libx"],
1380 }
1381
1382 apex_key {
1383 name: "myapex.key",
1384 public_key: "testkey.avbpubkey",
1385 private_key: "testkey.pem",
1386 }
1387
1388 cc_library {
1389 name: "libx",
1390 shared_libs: ["libz"],
1391 system_shared_libs: [],
1392 stl: "none",
1393 apex_available: [ "myapex" ],
1394 }
1395
1396 cc_library {
1397 name: "libz",
1398 system_shared_libs: [],
1399 stl: "none",
1400 stubs: {
1401 versions: ["1", "2"],
1402 },
1403 }
1404 `)
1405
1406 expectLink := func(from, from_variant, to, to_variant string) {
1407 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1408 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1409 }
1410 expectNoLink := func(from, from_variant, to, to_variant string) {
1411 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1412 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1413 }
1414 expectLink("libx", "shared_myapex", "libz", "shared_2")
1415 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1416 expectNoLink("libx", "shared_myapex", "libz", "shared")
1417}
1418
1419func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1420 ctx, _ := testApex(t, `
1421 apex {
1422 name: "myapex",
1423 key: "myapex.key",
1424 native_shared_libs: ["libx"],
1425 }
1426
1427 apex_key {
1428 name: "myapex.key",
1429 public_key: "testkey.avbpubkey",
1430 private_key: "testkey.pem",
1431 }
1432
1433 cc_library {
1434 name: "libx",
1435 system_shared_libs: [],
1436 stl: "none",
1437 apex_available: [ "myapex" ],
1438 stubs: {
1439 versions: ["1", "2"],
1440 },
1441 }
1442
1443 cc_library {
1444 name: "libz",
1445 shared_libs: ["libx"],
1446 system_shared_libs: [],
1447 stl: "none",
1448 }
1449 `)
1450
1451 expectLink := func(from, from_variant, to, to_variant string) {
1452 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1453 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1454 }
1455 expectNoLink := func(from, from_variant, to, to_variant string) {
1456 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1457 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1458 }
1459 expectLink("libz", "shared", "libx", "shared_2")
1460 expectNoLink("libz", "shared", "libz", "shared_1")
1461 expectNoLink("libz", "shared", "libz", "shared")
1462}
1463
Jooyung Han75568392020-03-20 04:29:24 +09001464func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001465 ctx, _ := testApex(t, `
1466 apex {
1467 name: "myapex",
1468 key: "myapex.key",
1469 native_shared_libs: ["libx"],
1470 min_sdk_version: "29",
1471 }
1472
1473 apex_key {
1474 name: "myapex.key",
1475 public_key: "testkey.avbpubkey",
1476 private_key: "testkey.pem",
1477 }
1478
1479 cc_library {
1480 name: "libx",
1481 shared_libs: ["libbar"],
1482 apex_available: [ "myapex" ],
1483 }
1484
1485 cc_library {
1486 name: "libbar",
1487 stubs: {
1488 versions: ["29", "30"],
1489 },
1490 }
Jooyung Han75568392020-03-20 04:29:24 +09001491 `, func(fs map[string][]byte, config android.Config) {
1492 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1493 })
Jooyung Han03b51852020-02-26 22:45:42 +09001494 expectLink := func(from, from_variant, to, to_variant string) {
1495 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1496 libFlags := ld.Args["libFlags"]
1497 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1498 }
Jooyung Han75568392020-03-20 04:29:24 +09001499 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001500}
1501
Jooyung Han75568392020-03-20 04:29:24 +09001502func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001503 ctx, _ := testApex(t, `
1504 apex {
1505 name: "myapex",
1506 key: "myapex.key",
1507 native_shared_libs: ["libx"],
1508 min_sdk_version: "29",
1509 }
1510
1511 apex_key {
1512 name: "myapex.key",
1513 public_key: "testkey.avbpubkey",
1514 private_key: "testkey.pem",
1515 }
1516
1517 cc_library {
1518 name: "libx",
1519 apex_available: [ "myapex" ],
1520 }
Jooyung Han75568392020-03-20 04:29:24 +09001521 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001522
1523 // ensure apex variant of c++ is linked with static unwinder
1524 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1525 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1526 // note that platform variant is not.
1527 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1528 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001529}
1530
1531func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001532 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001533 apex {
1534 name: "myapex",
1535 key: "myapex.key",
1536 native_shared_libs: ["libx"],
1537 min_sdk_version: "29",
1538 }
1539
1540 apex_key {
1541 name: "myapex.key",
1542 public_key: "testkey.avbpubkey",
1543 private_key: "testkey.pem",
1544 }
1545
1546 cc_library {
1547 name: "libx",
1548 shared_libs: ["libz"],
1549 system_shared_libs: [],
1550 stl: "none",
1551 apex_available: [ "myapex" ],
1552 }
1553
1554 cc_library {
1555 name: "libz",
1556 system_shared_libs: [],
1557 stl: "none",
1558 stubs: {
1559 versions: ["30"],
1560 },
1561 }
Jooyung Han75568392020-03-20 04:29:24 +09001562 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001563
Jooyung Hanaed150d2020-04-02 01:41:41 +09001564 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001565 apex {
1566 name: "myapex",
1567 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001568 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001569 }
1570
1571 apex_key {
1572 name: "myapex.key",
1573 public_key: "testkey.avbpubkey",
1574 private_key: "testkey.pem",
1575 }
1576 `)
1577}
1578
Artur Satayev8cf899a2020-04-15 17:29:42 +01001579func TestJavaStableSdkVersion(t *testing.T) {
1580 testCases := []struct {
1581 name string
1582 expectedError string
1583 bp string
1584 }{
1585 {
1586 name: "Non-updatable apex with non-stable dep",
1587 bp: `
1588 apex {
1589 name: "myapex",
1590 java_libs: ["myjar"],
1591 key: "myapex.key",
1592 }
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598 java_library {
1599 name: "myjar",
1600 srcs: ["foo/bar/MyClass.java"],
1601 sdk_version: "core_platform",
1602 apex_available: ["myapex"],
1603 }
1604 `,
1605 },
1606 {
1607 name: "Updatable apex with stable dep",
1608 bp: `
1609 apex {
1610 name: "myapex",
1611 java_libs: ["myjar"],
1612 key: "myapex.key",
1613 updatable: true,
1614 min_sdk_version: "29",
1615 }
1616 apex_key {
1617 name: "myapex.key",
1618 public_key: "testkey.avbpubkey",
1619 private_key: "testkey.pem",
1620 }
1621 java_library {
1622 name: "myjar",
1623 srcs: ["foo/bar/MyClass.java"],
1624 sdk_version: "current",
1625 apex_available: ["myapex"],
1626 }
1627 `,
1628 },
1629 {
1630 name: "Updatable apex with non-stable dep",
1631 expectedError: "cannot depend on \"myjar\"",
1632 bp: `
1633 apex {
1634 name: "myapex",
1635 java_libs: ["myjar"],
1636 key: "myapex.key",
1637 updatable: true,
1638 }
1639 apex_key {
1640 name: "myapex.key",
1641 public_key: "testkey.avbpubkey",
1642 private_key: "testkey.pem",
1643 }
1644 java_library {
1645 name: "myjar",
1646 srcs: ["foo/bar/MyClass.java"],
1647 sdk_version: "core_platform",
1648 apex_available: ["myapex"],
1649 }
1650 `,
1651 },
1652 {
1653 name: "Updatable apex with non-stable transitive dep",
1654 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1655 bp: `
1656 apex {
1657 name: "myapex",
1658 java_libs: ["myjar"],
1659 key: "myapex.key",
1660 updatable: true,
1661 }
1662 apex_key {
1663 name: "myapex.key",
1664 public_key: "testkey.avbpubkey",
1665 private_key: "testkey.pem",
1666 }
1667 java_library {
1668 name: "myjar",
1669 srcs: ["foo/bar/MyClass.java"],
1670 sdk_version: "current",
1671 apex_available: ["myapex"],
1672 static_libs: ["transitive-jar"],
1673 }
1674 java_library {
1675 name: "transitive-jar",
1676 srcs: ["foo/bar/MyClass.java"],
1677 sdk_version: "core_platform",
1678 apex_available: ["myapex"],
1679 }
1680 `,
1681 },
1682 }
1683
1684 for _, test := range testCases {
1685 t.Run(test.name, func(t *testing.T) {
1686 if test.expectedError == "" {
1687 testApex(t, test.bp)
1688 } else {
1689 testApexError(t, test.expectedError, test.bp)
1690 }
1691 })
1692 }
1693}
1694
Jiyong Park7c2ee712018-12-07 00:42:25 +09001695func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001696 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001697 apex {
1698 name: "myapex",
1699 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001700 native_shared_libs: ["mylib"],
1701 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001702 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001703 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001704 }
1705
1706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
1711
1712 prebuilt_etc {
1713 name: "myetc",
1714 src: "myprebuilt",
1715 sub_dir: "foo/bar",
1716 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001717
1718 cc_library {
1719 name: "mylib",
1720 srcs: ["mylib.cpp"],
1721 relative_install_path: "foo/bar",
1722 system_shared_libs: [],
1723 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001724 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001725 }
1726
1727 cc_binary {
1728 name: "mybin",
1729 srcs: ["mylib.cpp"],
1730 relative_install_path: "foo/bar",
1731 system_shared_libs: [],
1732 static_executable: true,
1733 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001734 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001735 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001736 `)
1737
Sundong Ahnabb64432019-10-22 13:58:29 +09001738 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001739 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1740
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001741 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001742 ensureListContains(t, dirs, "etc")
1743 ensureListContains(t, dirs, "etc/foo")
1744 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001745 ensureListContains(t, dirs, "lib64")
1746 ensureListContains(t, dirs, "lib64/foo")
1747 ensureListContains(t, dirs, "lib64/foo/bar")
1748 ensureListContains(t, dirs, "lib")
1749 ensureListContains(t, dirs, "lib/foo")
1750 ensureListContains(t, dirs, "lib/foo/bar")
1751
Jiyong Parkbd13e442019-03-15 18:10:35 +09001752 ensureListContains(t, dirs, "bin")
1753 ensureListContains(t, dirs, "bin/foo")
1754 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001755}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001756
Jooyung Han35155c42020-02-06 17:33:20 +09001757func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1758 ctx, _ := testApex(t, `
1759 apex {
1760 name: "myapex",
1761 key: "myapex.key",
1762 multilib: {
1763 both: {
1764 native_shared_libs: ["mylib"],
1765 binaries: ["mybin"],
1766 },
1767 },
1768 compile_multilib: "both",
1769 native_bridge_supported: true,
1770 }
1771
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777
1778 cc_library {
1779 name: "mylib",
1780 relative_install_path: "foo/bar",
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "myapex" ],
1784 native_bridge_supported: true,
1785 }
1786
1787 cc_binary {
1788 name: "mybin",
1789 relative_install_path: "foo/bar",
1790 system_shared_libs: [],
1791 static_executable: true,
1792 stl: "none",
1793 apex_available: [ "myapex" ],
1794 native_bridge_supported: true,
1795 compile_multilib: "both", // default is "first" for binary
1796 multilib: {
1797 lib64: {
1798 suffix: "64",
1799 },
1800 },
1801 }
1802 `, withNativeBridgeEnabled)
1803 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1804 "bin/foo/bar/mybin",
1805 "bin/foo/bar/mybin64",
1806 "bin/arm/foo/bar/mybin",
1807 "bin/arm64/foo/bar/mybin64",
1808 "lib/foo/bar/mylib.so",
1809 "lib/arm/foo/bar/mylib.so",
1810 "lib64/foo/bar/mylib.so",
1811 "lib64/arm64/foo/bar/mylib.so",
1812 })
1813}
1814
Jiyong Parkda6eb592018-12-19 17:12:36 +09001815func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001816 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 native_shared_libs: ["mylib"],
1821 use_vendor: true,
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 cc_library {
1831 name: "mylib",
1832 srcs: ["mylib.cpp"],
1833 shared_libs: ["mylib2"],
1834 system_shared_libs: [],
1835 vendor_available: true,
1836 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001837 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001838 }
1839
1840 cc_library {
1841 name: "mylib2",
1842 srcs: ["mylib.cpp"],
1843 system_shared_libs: [],
1844 vendor_available: true,
1845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001846 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001847 }
Jooyung Handc782442019-11-01 03:14:38 +09001848 `, func(fs map[string][]byte, config android.Config) {
1849 setUseVendorWhitelistForTest(config, []string{"myapex"})
1850 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001851
1852 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001853 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001854 for _, implicit := range i.Implicits {
1855 inputsList = append(inputsList, implicit.String())
1856 }
1857 }
1858 inputsString := strings.Join(inputsList, " ")
1859
1860 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001861 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1862 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001863
1864 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001865 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1866 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001867}
Jiyong Park16e91a02018-12-20 18:18:08 +09001868
Jooyung Handc782442019-11-01 03:14:38 +09001869func TestUseVendorRestriction(t *testing.T) {
1870 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
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{""})
1883 })
1884 // no error with whitelist
1885 testApex(t, `
1886 apex {
1887 name: "myapex",
1888 key: "myapex.key",
1889 use_vendor: true,
1890 }
1891 apex_key {
1892 name: "myapex.key",
1893 public_key: "testkey.avbpubkey",
1894 private_key: "testkey.pem",
1895 }
1896 `, func(fs map[string][]byte, config android.Config) {
1897 setUseVendorWhitelistForTest(config, []string{"myapex"})
1898 })
1899}
1900
Jooyung Han5c998b92019-06-27 11:30:33 +09001901func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1902 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1903 apex {
1904 name: "myapex",
1905 key: "myapex.key",
1906 native_shared_libs: ["mylib"],
1907 use_vendor: true,
1908 }
1909
1910 apex_key {
1911 name: "myapex.key",
1912 public_key: "testkey.avbpubkey",
1913 private_key: "testkey.pem",
1914 }
1915
1916 cc_library {
1917 name: "mylib",
1918 srcs: ["mylib.cpp"],
1919 system_shared_libs: [],
1920 stl: "none",
1921 }
1922 `)
1923}
1924
Jiyong Park16e91a02018-12-20 18:18:08 +09001925func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001926 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001927 apex {
1928 name: "myapex",
1929 key: "myapex.key",
1930 native_shared_libs: ["mylib"],
1931 }
1932
1933 apex_key {
1934 name: "myapex.key",
1935 public_key: "testkey.avbpubkey",
1936 private_key: "testkey.pem",
1937 }
1938
1939 cc_library {
1940 name: "mylib",
1941 srcs: ["mylib.cpp"],
1942 system_shared_libs: [],
1943 stl: "none",
1944 stubs: {
1945 versions: ["1", "2", "3"],
1946 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001947 apex_available: [
1948 "//apex_available:platform",
1949 "myapex",
1950 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001951 }
1952
1953 cc_binary {
1954 name: "not_in_apex",
1955 srcs: ["mylib.cpp"],
1956 static_libs: ["mylib"],
1957 static_executable: true,
1958 system_shared_libs: [],
1959 stl: "none",
1960 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001961 `)
1962
Colin Cross7113d202019-11-20 16:39:12 -08001963 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001964
1965 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001966 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001967}
Jiyong Park9335a262018-12-24 11:31:58 +09001968
1969func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001970 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001971 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001972 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001973 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001974 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001975 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001976 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001977 }
1978
1979 cc_library {
1980 name: "mylib",
1981 srcs: ["mylib.cpp"],
1982 system_shared_libs: [],
1983 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001984 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001985 }
1986
1987 apex_key {
1988 name: "myapex.key",
1989 public_key: "testkey.avbpubkey",
1990 private_key: "testkey.pem",
1991 }
1992
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001993 android_app_certificate {
1994 name: "myapex.certificate",
1995 certificate: "testkey",
1996 }
1997
1998 android_app_certificate {
1999 name: "myapex.certificate.override",
2000 certificate: "testkey.override",
2001 }
2002
Jiyong Park9335a262018-12-24 11:31:58 +09002003 `)
2004
2005 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002006 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002007
2008 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2009 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2010 "vendor/foo/devkeys/testkey.avbpubkey")
2011 }
2012 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2013 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2014 "vendor/foo/devkeys/testkey.pem")
2015 }
2016
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002017 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002018 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002019 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002020 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002021 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002022 }
2023}
Jiyong Park58e364a2019-01-19 19:24:06 +09002024
Jooyung Hanf121a652019-12-17 14:30:11 +09002025func TestCertificate(t *testing.T) {
2026 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2027 ctx, _ := testApex(t, `
2028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 }
2032 apex_key {
2033 name: "myapex.key",
2034 public_key: "testkey.avbpubkey",
2035 private_key: "testkey.pem",
2036 }`)
2037 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2038 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2039 if actual := rule.Args["certificates"]; actual != expected {
2040 t.Errorf("certificates should be %q, not %q", expected, actual)
2041 }
2042 })
2043 t.Run("override when unspecified", func(t *testing.T) {
2044 ctx, _ := testApex(t, `
2045 apex {
2046 name: "myapex_keytest",
2047 key: "myapex.key",
2048 file_contexts: ":myapex-file_contexts",
2049 }
2050 apex_key {
2051 name: "myapex.key",
2052 public_key: "testkey.avbpubkey",
2053 private_key: "testkey.pem",
2054 }
2055 android_app_certificate {
2056 name: "myapex.certificate.override",
2057 certificate: "testkey.override",
2058 }`)
2059 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2060 expected := "testkey.override.x509.pem testkey.override.pk8"
2061 if actual := rule.Args["certificates"]; actual != expected {
2062 t.Errorf("certificates should be %q, not %q", expected, actual)
2063 }
2064 })
2065 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2066 ctx, _ := testApex(t, `
2067 apex {
2068 name: "myapex",
2069 key: "myapex.key",
2070 certificate: ":myapex.certificate",
2071 }
2072 apex_key {
2073 name: "myapex.key",
2074 public_key: "testkey.avbpubkey",
2075 private_key: "testkey.pem",
2076 }
2077 android_app_certificate {
2078 name: "myapex.certificate",
2079 certificate: "testkey",
2080 }`)
2081 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2082 expected := "testkey.x509.pem testkey.pk8"
2083 if actual := rule.Args["certificates"]; actual != expected {
2084 t.Errorf("certificates should be %q, not %q", expected, actual)
2085 }
2086 })
2087 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2088 ctx, _ := testApex(t, `
2089 apex {
2090 name: "myapex_keytest",
2091 key: "myapex.key",
2092 file_contexts: ":myapex-file_contexts",
2093 certificate: ":myapex.certificate",
2094 }
2095 apex_key {
2096 name: "myapex.key",
2097 public_key: "testkey.avbpubkey",
2098 private_key: "testkey.pem",
2099 }
2100 android_app_certificate {
2101 name: "myapex.certificate.override",
2102 certificate: "testkey.override",
2103 }`)
2104 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2105 expected := "testkey.override.x509.pem testkey.override.pk8"
2106 if actual := rule.Args["certificates"]; actual != expected {
2107 t.Errorf("certificates should be %q, not %q", expected, actual)
2108 }
2109 })
2110 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2111 ctx, _ := testApex(t, `
2112 apex {
2113 name: "myapex",
2114 key: "myapex.key",
2115 certificate: "testkey",
2116 }
2117 apex_key {
2118 name: "myapex.key",
2119 public_key: "testkey.avbpubkey",
2120 private_key: "testkey.pem",
2121 }`)
2122 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2123 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2124 if actual := rule.Args["certificates"]; actual != expected {
2125 t.Errorf("certificates should be %q, not %q", expected, actual)
2126 }
2127 })
2128 t.Run("override when specified as <name>", func(t *testing.T) {
2129 ctx, _ := testApex(t, `
2130 apex {
2131 name: "myapex_keytest",
2132 key: "myapex.key",
2133 file_contexts: ":myapex-file_contexts",
2134 certificate: "testkey",
2135 }
2136 apex_key {
2137 name: "myapex.key",
2138 public_key: "testkey.avbpubkey",
2139 private_key: "testkey.pem",
2140 }
2141 android_app_certificate {
2142 name: "myapex.certificate.override",
2143 certificate: "testkey.override",
2144 }`)
2145 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2146 expected := "testkey.override.x509.pem testkey.override.pk8"
2147 if actual := rule.Args["certificates"]; actual != expected {
2148 t.Errorf("certificates should be %q, not %q", expected, actual)
2149 }
2150 })
2151}
2152
Jiyong Park58e364a2019-01-19 19:24:06 +09002153func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002154 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002158 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002159 }
2160
2161 apex {
2162 name: "otherapex",
2163 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002164 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002165 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002166 }
2167
2168 apex_key {
2169 name: "myapex.key",
2170 public_key: "testkey.avbpubkey",
2171 private_key: "testkey.pem",
2172 }
2173
2174 cc_library {
2175 name: "mylib",
2176 srcs: ["mylib.cpp"],
2177 system_shared_libs: [],
2178 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002179 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002180 "myapex",
2181 "otherapex",
2182 ],
Jooyung Han24282772020-03-21 23:20:55 +09002183 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002184 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002185 cc_library {
2186 name: "mylib2",
2187 srcs: ["mylib.cpp"],
2188 system_shared_libs: [],
2189 stl: "none",
2190 apex_available: [
2191 "myapex",
2192 "otherapex",
2193 ],
2194 use_apex_name_macro: true,
2195 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002196 `)
2197
Jooyung Hanc87a0592020-03-02 17:44:33 +09002198 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002199 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002200 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002201 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002202
Jooyung Hanccce2f22020-03-07 03:45:53 +09002203 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002204 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2205 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002206 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002207 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002208
Jooyung Hanccce2f22020-03-07 03:45:53 +09002209 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002210 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2211 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002212 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002213 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002214
Jooyung Hanc87a0592020-03-02 17:44:33 +09002215 // When cc_library sets use_apex_name_macro: true
2216 // apex variants define additional macro to distinguish which apex variant it is built for
2217
2218 // non-APEX variant does not have __ANDROID_APEX__ defined
2219 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2220 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2221
2222 // APEX variant has __ANDROID_APEX__ defined
2223 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002224 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002225 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2226 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002227
Jooyung Hanc87a0592020-03-02 17:44:33 +09002228 // APEX variant has __ANDROID_APEX__ defined
2229 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002230 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002231 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2232 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002233
2234 // recovery variant does not set __ANDROID_SDK_VERSION__
2235 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2236 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2237 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002238}
Jiyong Park7e636d02019-01-28 16:16:54 +09002239
2240func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002241 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002242 apex {
2243 name: "myapex",
2244 key: "myapex.key",
2245 native_shared_libs: ["mylib"],
2246 }
2247
2248 apex_key {
2249 name: "myapex.key",
2250 public_key: "testkey.avbpubkey",
2251 private_key: "testkey.pem",
2252 }
2253
2254 cc_library_headers {
2255 name: "mylib_headers",
2256 export_include_dirs: ["my_include"],
2257 system_shared_libs: [],
2258 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002259 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002260 }
2261
2262 cc_library {
2263 name: "mylib",
2264 srcs: ["mylib.cpp"],
2265 system_shared_libs: [],
2266 stl: "none",
2267 header_libs: ["mylib_headers"],
2268 export_header_lib_headers: ["mylib_headers"],
2269 stubs: {
2270 versions: ["1", "2", "3"],
2271 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002272 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002273 }
2274
2275 cc_library {
2276 name: "otherlib",
2277 srcs: ["mylib.cpp"],
2278 system_shared_libs: [],
2279 stl: "none",
2280 shared_libs: ["mylib"],
2281 }
2282 `)
2283
Colin Cross7113d202019-11-20 16:39:12 -08002284 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002285
2286 // Ensure that the include path of the header lib is exported to 'otherlib'
2287 ensureContains(t, cFlags, "-Imy_include")
2288}
Alex Light9670d332019-01-29 18:07:33 -08002289
Jiyong Park7cd10e32020-01-14 09:22:18 +09002290type fileInApex struct {
2291 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002292 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002293 isLink bool
2294}
2295
Jooyung Hana57af4a2020-01-23 05:36:59 +00002296func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002297 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002298 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002299 copyCmds := apexRule.Args["copy_commands"]
2300 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002301 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002302 for _, cmd := range strings.Split(copyCmds, "&&") {
2303 cmd = strings.TrimSpace(cmd)
2304 if cmd == "" {
2305 continue
2306 }
2307 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002308 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002309 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002310 switch terms[0] {
2311 case "mkdir":
2312 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002313 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002314 t.Fatal("copyCmds contains invalid cp command", cmd)
2315 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002316 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002317 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002318 isLink = false
2319 case "ln":
2320 if len(terms) != 3 && len(terms) != 4 {
2321 // ln LINK TARGET or ln -s LINK TARGET
2322 t.Fatal("copyCmds contains invalid ln command", cmd)
2323 }
2324 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002325 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002326 isLink = true
2327 default:
2328 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2329 }
2330 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002331 index := strings.Index(dst, imageApexDir)
2332 if index == -1 {
2333 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2334 }
2335 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002336 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002337 }
2338 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002339 return ret
2340}
2341
Jooyung Hana57af4a2020-01-23 05:36:59 +00002342func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2343 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002344 var failed bool
2345 var surplus []string
2346 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002347 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002348 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002349 for _, expected := range files {
2350 if matched, _ := path.Match(expected, file.path); matched {
2351 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002352 mactchFound = true
2353 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002354 }
2355 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002356 if !mactchFound {
2357 surplus = append(surplus, file.path)
2358 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002359 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002360
Jooyung Han31c470b2019-10-18 16:26:59 +09002361 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002362 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002363 t.Log("surplus files", surplus)
2364 failed = true
2365 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002366
2367 if len(files) > len(filesMatched) {
2368 var missing []string
2369 for _, expected := range files {
2370 if !filesMatched[expected] {
2371 missing = append(missing, expected)
2372 }
2373 }
2374 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002375 t.Log("missing files", missing)
2376 failed = true
2377 }
2378 if failed {
2379 t.Fail()
2380 }
2381}
2382
Jooyung Han344d5432019-08-23 11:17:39 +09002383func TestVndkApexCurrent(t *testing.T) {
2384 ctx, _ := testApex(t, `
2385 apex_vndk {
2386 name: "myapex",
2387 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "libvndk",
2398 srcs: ["mylib.cpp"],
2399 vendor_available: true,
2400 vndk: {
2401 enabled: true,
2402 },
2403 system_shared_libs: [],
2404 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002405 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002406 }
2407
2408 cc_library {
2409 name: "libvndksp",
2410 srcs: ["mylib.cpp"],
2411 vendor_available: true,
2412 vndk: {
2413 enabled: true,
2414 support_system_process: true,
2415 },
2416 system_shared_libs: [],
2417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002418 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002419 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002420 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002421
Jooyung Hana57af4a2020-01-23 05:36:59 +00002422 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002423 "lib/libvndk.so",
2424 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002425 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002426 "lib64/libvndk.so",
2427 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002428 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002429 "etc/llndk.libraries.VER.txt",
2430 "etc/vndkcore.libraries.VER.txt",
2431 "etc/vndksp.libraries.VER.txt",
2432 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002433 })
Jooyung Han344d5432019-08-23 11:17:39 +09002434}
2435
2436func TestVndkApexWithPrebuilt(t *testing.T) {
2437 ctx, _ := testApex(t, `
2438 apex_vndk {
2439 name: "myapex",
2440 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002441 }
2442
2443 apex_key {
2444 name: "myapex.key",
2445 public_key: "testkey.avbpubkey",
2446 private_key: "testkey.pem",
2447 }
2448
2449 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002450 name: "libvndk",
2451 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002452 vendor_available: true,
2453 vndk: {
2454 enabled: true,
2455 },
2456 system_shared_libs: [],
2457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002458 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002459 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002460
2461 cc_prebuilt_library_shared {
2462 name: "libvndk.arm",
2463 srcs: ["libvndk.arm.so"],
2464 vendor_available: true,
2465 vndk: {
2466 enabled: true,
2467 },
2468 enabled: false,
2469 arch: {
2470 arm: {
2471 enabled: true,
2472 },
2473 },
2474 system_shared_libs: [],
2475 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002476 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002477 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002478 `+vndkLibrariesTxtFiles("current"),
2479 withFiles(map[string][]byte{
2480 "libvndk.so": nil,
2481 "libvndk.arm.so": nil,
2482 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002483
Jooyung Hana57af4a2020-01-23 05:36:59 +00002484 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002485 "lib/libvndk.so",
2486 "lib/libvndk.arm.so",
2487 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002488 "lib/libc++.so",
2489 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002490 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002491 })
Jooyung Han344d5432019-08-23 11:17:39 +09002492}
2493
Jooyung Han39edb6c2019-11-06 16:53:07 +09002494func vndkLibrariesTxtFiles(vers ...string) (result string) {
2495 for _, v := range vers {
2496 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002497 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002498 result += `
2499 vndk_libraries_txt {
2500 name: "` + txt + `.libraries.txt",
2501 }
2502 `
2503 }
2504 } else {
2505 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2506 result += `
2507 prebuilt_etc {
2508 name: "` + txt + `.libraries.` + v + `.txt",
2509 src: "dummy.txt",
2510 }
2511 `
2512 }
2513 }
2514 }
2515 return
2516}
2517
Jooyung Han344d5432019-08-23 11:17:39 +09002518func TestVndkApexVersion(t *testing.T) {
2519 ctx, _ := testApex(t, `
2520 apex_vndk {
2521 name: "myapex_v27",
2522 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002523 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002524 vndk_version: "27",
2525 }
2526
2527 apex_key {
2528 name: "myapex.key",
2529 public_key: "testkey.avbpubkey",
2530 private_key: "testkey.pem",
2531 }
2532
Jooyung Han31c470b2019-10-18 16:26:59 +09002533 vndk_prebuilt_shared {
2534 name: "libvndk27",
2535 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002536 vendor_available: true,
2537 vndk: {
2538 enabled: true,
2539 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002540 target_arch: "arm64",
2541 arch: {
2542 arm: {
2543 srcs: ["libvndk27_arm.so"],
2544 },
2545 arm64: {
2546 srcs: ["libvndk27_arm64.so"],
2547 },
2548 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002549 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002550 }
2551
2552 vndk_prebuilt_shared {
2553 name: "libvndk27",
2554 version: "27",
2555 vendor_available: true,
2556 vndk: {
2557 enabled: true,
2558 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002559 target_arch: "x86_64",
2560 arch: {
2561 x86: {
2562 srcs: ["libvndk27_x86.so"],
2563 },
2564 x86_64: {
2565 srcs: ["libvndk27_x86_64.so"],
2566 },
2567 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002568 }
2569 `+vndkLibrariesTxtFiles("27"),
2570 withFiles(map[string][]byte{
2571 "libvndk27_arm.so": nil,
2572 "libvndk27_arm64.so": nil,
2573 "libvndk27_x86.so": nil,
2574 "libvndk27_x86_64.so": nil,
2575 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002576
Jooyung Hana57af4a2020-01-23 05:36:59 +00002577 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002578 "lib/libvndk27_arm.so",
2579 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002580 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002581 })
Jooyung Han344d5432019-08-23 11:17:39 +09002582}
2583
2584func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2585 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2586 apex_vndk {
2587 name: "myapex_v27",
2588 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002589 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002590 vndk_version: "27",
2591 }
2592 apex_vndk {
2593 name: "myapex_v27_other",
2594 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002595 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002596 vndk_version: "27",
2597 }
2598
2599 apex_key {
2600 name: "myapex.key",
2601 public_key: "testkey.avbpubkey",
2602 private_key: "testkey.pem",
2603 }
2604
2605 cc_library {
2606 name: "libvndk",
2607 srcs: ["mylib.cpp"],
2608 vendor_available: true,
2609 vndk: {
2610 enabled: true,
2611 },
2612 system_shared_libs: [],
2613 stl: "none",
2614 }
2615
2616 vndk_prebuilt_shared {
2617 name: "libvndk",
2618 version: "27",
2619 vendor_available: true,
2620 vndk: {
2621 enabled: true,
2622 },
2623 srcs: ["libvndk.so"],
2624 }
2625 `, withFiles(map[string][]byte{
2626 "libvndk.so": nil,
2627 }))
2628}
2629
Jooyung Han90eee022019-10-01 20:02:42 +09002630func TestVndkApexNameRule(t *testing.T) {
2631 ctx, _ := testApex(t, `
2632 apex_vndk {
2633 name: "myapex",
2634 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002635 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002636 }
2637 apex_vndk {
2638 name: "myapex_v28",
2639 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002640 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002641 vndk_version: "28",
2642 }
2643 apex_key {
2644 name: "myapex.key",
2645 public_key: "testkey.avbpubkey",
2646 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002647 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002648
2649 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002650 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002651 actual := proptools.String(bundle.properties.Apex_name)
2652 if !reflect.DeepEqual(actual, expected) {
2653 t.Errorf("Got '%v', expected '%v'", actual, expected)
2654 }
2655 }
2656
2657 assertApexName("com.android.vndk.vVER", "myapex")
2658 assertApexName("com.android.vndk.v28", "myapex_v28")
2659}
2660
Jooyung Han344d5432019-08-23 11:17:39 +09002661func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2662 ctx, _ := testApex(t, `
2663 apex_vndk {
2664 name: "myapex",
2665 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002666 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002667 }
2668
2669 apex_key {
2670 name: "myapex.key",
2671 public_key: "testkey.avbpubkey",
2672 private_key: "testkey.pem",
2673 }
2674
2675 cc_library {
2676 name: "libvndk",
2677 srcs: ["mylib.cpp"],
2678 vendor_available: true,
2679 native_bridge_supported: true,
2680 host_supported: true,
2681 vndk: {
2682 enabled: true,
2683 },
2684 system_shared_libs: [],
2685 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002686 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002687 }
Jooyung Han35155c42020-02-06 17:33:20 +09002688 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002689
Jooyung Hana57af4a2020-01-23 05:36:59 +00002690 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002691 "lib/libvndk.so",
2692 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002693 "lib/libc++.so",
2694 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002695 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002696 })
Jooyung Han344d5432019-08-23 11:17:39 +09002697}
2698
2699func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2700 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2701 apex_vndk {
2702 name: "myapex",
2703 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002704 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002705 native_bridge_supported: true,
2706 }
2707
2708 apex_key {
2709 name: "myapex.key",
2710 public_key: "testkey.avbpubkey",
2711 private_key: "testkey.pem",
2712 }
2713
2714 cc_library {
2715 name: "libvndk",
2716 srcs: ["mylib.cpp"],
2717 vendor_available: true,
2718 native_bridge_supported: true,
2719 host_supported: true,
2720 vndk: {
2721 enabled: true,
2722 },
2723 system_shared_libs: [],
2724 stl: "none",
2725 }
2726 `)
2727}
2728
Jooyung Han31c470b2019-10-18 16:26:59 +09002729func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002730 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002731 apex_vndk {
2732 name: "myapex_v27",
2733 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002734 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002735 vndk_version: "27",
2736 }
2737
2738 apex_key {
2739 name: "myapex.key",
2740 public_key: "testkey.avbpubkey",
2741 private_key: "testkey.pem",
2742 }
2743
2744 vndk_prebuilt_shared {
2745 name: "libvndk27",
2746 version: "27",
2747 target_arch: "arm",
2748 vendor_available: true,
2749 vndk: {
2750 enabled: true,
2751 },
2752 arch: {
2753 arm: {
2754 srcs: ["libvndk27.so"],
2755 }
2756 },
2757 }
2758
2759 vndk_prebuilt_shared {
2760 name: "libvndk27",
2761 version: "27",
2762 target_arch: "arm",
2763 binder32bit: true,
2764 vendor_available: true,
2765 vndk: {
2766 enabled: true,
2767 },
2768 arch: {
2769 arm: {
2770 srcs: ["libvndk27binder32.so"],
2771 }
2772 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002773 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002774 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002775 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002776 withFiles(map[string][]byte{
2777 "libvndk27.so": nil,
2778 "libvndk27binder32.so": nil,
2779 }),
2780 withBinder32bit,
2781 withTargets(map[android.OsType][]android.Target{
2782 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002783 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2784 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002785 },
2786 }),
2787 )
2788
Jooyung Hana57af4a2020-01-23 05:36:59 +00002789 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002790 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002791 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002792 })
2793}
2794
Jooyung Hane1633032019-08-01 17:41:43 +09002795func TestDependenciesInApexManifest(t *testing.T) {
2796 ctx, _ := testApex(t, `
2797 apex {
2798 name: "myapex_nodep",
2799 key: "myapex.key",
2800 native_shared_libs: ["lib_nodep"],
2801 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002802 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002803 }
2804
2805 apex {
2806 name: "myapex_dep",
2807 key: "myapex.key",
2808 native_shared_libs: ["lib_dep"],
2809 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002810 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002811 }
2812
2813 apex {
2814 name: "myapex_provider",
2815 key: "myapex.key",
2816 native_shared_libs: ["libfoo"],
2817 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002818 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002819 }
2820
2821 apex {
2822 name: "myapex_selfcontained",
2823 key: "myapex.key",
2824 native_shared_libs: ["lib_dep", "libfoo"],
2825 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002826 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002827 }
2828
2829 apex_key {
2830 name: "myapex.key",
2831 public_key: "testkey.avbpubkey",
2832 private_key: "testkey.pem",
2833 }
2834
2835 cc_library {
2836 name: "lib_nodep",
2837 srcs: ["mylib.cpp"],
2838 system_shared_libs: [],
2839 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002840 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002841 }
2842
2843 cc_library {
2844 name: "lib_dep",
2845 srcs: ["mylib.cpp"],
2846 shared_libs: ["libfoo"],
2847 system_shared_libs: [],
2848 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002849 apex_available: [
2850 "myapex_dep",
2851 "myapex_provider",
2852 "myapex_selfcontained",
2853 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002854 }
2855
2856 cc_library {
2857 name: "libfoo",
2858 srcs: ["mytest.cpp"],
2859 stubs: {
2860 versions: ["1"],
2861 },
2862 system_shared_libs: [],
2863 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002864 apex_available: [
2865 "myapex_provider",
2866 "myapex_selfcontained",
2867 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002868 }
2869 `)
2870
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002871 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002872 var provideNativeLibs, requireNativeLibs []string
2873
Sundong Ahnabb64432019-10-22 13:58:29 +09002874 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002875 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2876 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002877 ensureListEmpty(t, provideNativeLibs)
2878 ensureListEmpty(t, requireNativeLibs)
2879
Sundong Ahnabb64432019-10-22 13:58:29 +09002880 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002881 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2882 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002883 ensureListEmpty(t, provideNativeLibs)
2884 ensureListContains(t, requireNativeLibs, "libfoo.so")
2885
Sundong Ahnabb64432019-10-22 13:58:29 +09002886 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002887 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2888 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002889 ensureListContains(t, provideNativeLibs, "libfoo.so")
2890 ensureListEmpty(t, requireNativeLibs)
2891
Sundong Ahnabb64432019-10-22 13:58:29 +09002892 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002893 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2894 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002895 ensureListContains(t, provideNativeLibs, "libfoo.so")
2896 ensureListEmpty(t, requireNativeLibs)
2897}
2898
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002899func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002900 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002901 apex {
2902 name: "myapex",
2903 key: "myapex.key",
2904 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002905 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002913
2914 cc_library {
2915 name: "mylib",
2916 srcs: ["mylib.cpp"],
2917 system_shared_libs: [],
2918 stl: "none",
2919 apex_available: [
2920 "//apex_available:platform",
2921 "myapex",
2922 ],
2923 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002924 `)
2925
Sundong Ahnabb64432019-10-22 13:58:29 +09002926 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002927 apexManifestRule := module.Rule("apexManifestRule")
2928 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2929 apexRule := module.Rule("apexRule")
2930 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002931
2932 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2933 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2934 name := apexBundle.BaseModuleName()
2935 prefix := "TARGET_"
2936 var builder strings.Builder
2937 data.Custom(&builder, name, prefix, "", data)
2938 androidMk := builder.String()
2939 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2940 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002941}
2942
Alex Light0851b882019-02-07 13:20:53 -08002943func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002944 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 native_shared_libs: ["mylib_common"],
2949 }
2950
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956
2957 cc_library {
2958 name: "mylib_common",
2959 srcs: ["mylib.cpp"],
2960 system_shared_libs: [],
2961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002962 apex_available: [
2963 "//apex_available:platform",
2964 "myapex",
2965 ],
Alex Light0851b882019-02-07 13:20:53 -08002966 }
2967 `)
2968
Sundong Ahnabb64432019-10-22 13:58:29 +09002969 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002970 apexRule := module.Rule("apexRule")
2971 copyCmds := apexRule.Args["copy_commands"]
2972
2973 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2974 t.Log("Apex was a test apex!")
2975 t.Fail()
2976 }
2977 // Ensure that main rule creates an output
2978 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2979
2980 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002981 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002982
2983 // Ensure that both direct and indirect deps are copied into apex
2984 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2985
Colin Cross7113d202019-11-20 16:39:12 -08002986 // Ensure that the platform variant ends with _shared
2987 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002988
2989 if !android.InAnyApex("mylib_common") {
2990 t.Log("Found mylib_common not in any apex!")
2991 t.Fail()
2992 }
2993}
2994
2995func TestTestApex(t *testing.T) {
2996 if android.InAnyApex("mylib_common_test") {
2997 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!")
2998 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002999 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003000 apex_test {
3001 name: "myapex",
3002 key: "myapex.key",
3003 native_shared_libs: ["mylib_common_test"],
3004 }
3005
3006 apex_key {
3007 name: "myapex.key",
3008 public_key: "testkey.avbpubkey",
3009 private_key: "testkey.pem",
3010 }
3011
3012 cc_library {
3013 name: "mylib_common_test",
3014 srcs: ["mylib.cpp"],
3015 system_shared_libs: [],
3016 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003017 // TODO: remove //apex_available:platform
3018 apex_available: [
3019 "//apex_available:platform",
3020 "myapex",
3021 ],
Alex Light0851b882019-02-07 13:20:53 -08003022 }
3023 `)
3024
Sundong Ahnabb64432019-10-22 13:58:29 +09003025 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003026 apexRule := module.Rule("apexRule")
3027 copyCmds := apexRule.Args["copy_commands"]
3028
3029 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3030 t.Log("Apex was not a test apex!")
3031 t.Fail()
3032 }
3033 // Ensure that main rule creates an output
3034 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3035
3036 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003037 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003038
3039 // Ensure that both direct and indirect deps are copied into apex
3040 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3041
Colin Cross7113d202019-11-20 16:39:12 -08003042 // Ensure that the platform variant ends with _shared
3043 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003044}
3045
Alex Light9670d332019-01-29 18:07:33 -08003046func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003047 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003048 apex {
3049 name: "myapex",
3050 key: "myapex.key",
3051 multilib: {
3052 first: {
3053 native_shared_libs: ["mylib_common"],
3054 }
3055 },
3056 target: {
3057 android: {
3058 multilib: {
3059 first: {
3060 native_shared_libs: ["mylib"],
3061 }
3062 }
3063 },
3064 host: {
3065 multilib: {
3066 first: {
3067 native_shared_libs: ["mylib2"],
3068 }
3069 }
3070 }
3071 }
3072 }
3073
3074 apex_key {
3075 name: "myapex.key",
3076 public_key: "testkey.avbpubkey",
3077 private_key: "testkey.pem",
3078 }
3079
3080 cc_library {
3081 name: "mylib",
3082 srcs: ["mylib.cpp"],
3083 system_shared_libs: [],
3084 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003085 // TODO: remove //apex_available:platform
3086 apex_available: [
3087 "//apex_available:platform",
3088 "myapex",
3089 ],
Alex Light9670d332019-01-29 18:07:33 -08003090 }
3091
3092 cc_library {
3093 name: "mylib_common",
3094 srcs: ["mylib.cpp"],
3095 system_shared_libs: [],
3096 stl: "none",
3097 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003098 // TODO: remove //apex_available:platform
3099 apex_available: [
3100 "//apex_available:platform",
3101 "myapex",
3102 ],
Alex Light9670d332019-01-29 18:07:33 -08003103 }
3104
3105 cc_library {
3106 name: "mylib2",
3107 srcs: ["mylib.cpp"],
3108 system_shared_libs: [],
3109 stl: "none",
3110 compile_multilib: "first",
3111 }
3112 `)
3113
Sundong Ahnabb64432019-10-22 13:58:29 +09003114 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003115 copyCmds := apexRule.Args["copy_commands"]
3116
3117 // Ensure that main rule creates an output
3118 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3119
3120 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003121 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3122 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3123 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003124
3125 // Ensure that both direct and indirect deps are copied into apex
3126 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3127 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3128 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3129
Colin Cross7113d202019-11-20 16:39:12 -08003130 // Ensure that the platform variant ends with _shared
3131 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3132 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3133 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003134}
Jiyong Park04480cf2019-02-06 00:16:29 +09003135
3136func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003137 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
3141 binaries: ["myscript"],
3142 }
3143
3144 apex_key {
3145 name: "myapex.key",
3146 public_key: "testkey.avbpubkey",
3147 private_key: "testkey.pem",
3148 }
3149
3150 sh_binary {
3151 name: "myscript",
3152 src: "mylib.cpp",
3153 filename: "myscript.sh",
3154 sub_dir: "script",
3155 }
3156 `)
3157
Sundong Ahnabb64432019-10-22 13:58:29 +09003158 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003159 copyCmds := apexRule.Args["copy_commands"]
3160
3161 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3162}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003163
Jooyung Han91df2082019-11-20 01:49:42 +09003164func TestApexInVariousPartition(t *testing.T) {
3165 testcases := []struct {
3166 propName, parition, flattenedPartition string
3167 }{
3168 {"", "system", "system_ext"},
3169 {"product_specific: true", "product", "product"},
3170 {"soc_specific: true", "vendor", "vendor"},
3171 {"proprietary: true", "vendor", "vendor"},
3172 {"vendor: true", "vendor", "vendor"},
3173 {"system_ext_specific: true", "system_ext", "system_ext"},
3174 }
3175 for _, tc := range testcases {
3176 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3177 ctx, _ := testApex(t, `
3178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 `+tc.propName+`
3182 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003183
Jooyung Han91df2082019-11-20 01:49:42 +09003184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003190
Jooyung Han91df2082019-11-20 01:49:42 +09003191 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3192 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3193 actual := apex.installDir.String()
3194 if actual != expected {
3195 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3196 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003197
Jooyung Han91df2082019-11-20 01:49:42 +09003198 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3199 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3200 actual = flattened.installDir.String()
3201 if actual != expected {
3202 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3203 }
3204 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003205 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003206}
Jiyong Park67882562019-03-21 01:11:21 +09003207
Jooyung Han54aca7b2019-11-20 02:26:02 +09003208func TestFileContexts(t *testing.T) {
3209 ctx, _ := testApex(t, `
3210 apex {
3211 name: "myapex",
3212 key: "myapex.key",
3213 }
3214
3215 apex_key {
3216 name: "myapex.key",
3217 public_key: "testkey.avbpubkey",
3218 private_key: "testkey.pem",
3219 }
3220 `)
3221 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3222 apexRule := module.Rule("apexRule")
3223 actual := apexRule.Args["file_contexts"]
3224 expected := "system/sepolicy/apex/myapex-file_contexts"
3225 if actual != expected {
3226 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3227 }
3228
3229 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3230 apex {
3231 name: "myapex",
3232 key: "myapex.key",
3233 file_contexts: "my_own_file_contexts",
3234 }
3235
3236 apex_key {
3237 name: "myapex.key",
3238 public_key: "testkey.avbpubkey",
3239 private_key: "testkey.pem",
3240 }
3241 `, withFiles(map[string][]byte{
3242 "my_own_file_contexts": nil,
3243 }))
3244
3245 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
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 `)
3259
3260 ctx, _ = testApex(t, `
3261 apex {
3262 name: "myapex",
3263 key: "myapex.key",
3264 product_specific: true,
3265 file_contexts: "product_specific_file_contexts",
3266 }
3267
3268 apex_key {
3269 name: "myapex.key",
3270 public_key: "testkey.avbpubkey",
3271 private_key: "testkey.pem",
3272 }
3273 `, withFiles(map[string][]byte{
3274 "product_specific_file_contexts": nil,
3275 }))
3276 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3277 apexRule = module.Rule("apexRule")
3278 actual = apexRule.Args["file_contexts"]
3279 expected = "product_specific_file_contexts"
3280 if actual != expected {
3281 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3282 }
3283
3284 ctx, _ = testApex(t, `
3285 apex {
3286 name: "myapex",
3287 key: "myapex.key",
3288 product_specific: true,
3289 file_contexts: ":my-file-contexts",
3290 }
3291
3292 apex_key {
3293 name: "myapex.key",
3294 public_key: "testkey.avbpubkey",
3295 private_key: "testkey.pem",
3296 }
3297
3298 filegroup {
3299 name: "my-file-contexts",
3300 srcs: ["product_specific_file_contexts"],
3301 }
3302 `, withFiles(map[string][]byte{
3303 "product_specific_file_contexts": nil,
3304 }))
3305 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3306 apexRule = module.Rule("apexRule")
3307 actual = apexRule.Args["file_contexts"]
3308 expected = "product_specific_file_contexts"
3309 if actual != expected {
3310 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3311 }
3312}
3313
Jiyong Park67882562019-03-21 01:11:21 +09003314func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003315 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003316 apex_key {
3317 name: "myapex.key",
3318 public_key: ":my.avbpubkey",
3319 private_key: ":my.pem",
3320 product_specific: true,
3321 }
3322
3323 filegroup {
3324 name: "my.avbpubkey",
3325 srcs: ["testkey2.avbpubkey"],
3326 }
3327
3328 filegroup {
3329 name: "my.pem",
3330 srcs: ["testkey2.pem"],
3331 }
3332 `)
3333
3334 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3335 expected_pubkey := "testkey2.avbpubkey"
3336 actual_pubkey := apex_key.public_key_file.String()
3337 if actual_pubkey != expected_pubkey {
3338 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3339 }
3340 expected_privkey := "testkey2.pem"
3341 actual_privkey := apex_key.private_key_file.String()
3342 if actual_privkey != expected_privkey {
3343 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3344 }
3345}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003346
3347func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003348 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003349 prebuilt_apex {
3350 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003351 arch: {
3352 arm64: {
3353 src: "myapex-arm64.apex",
3354 },
3355 arm: {
3356 src: "myapex-arm.apex",
3357 },
3358 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003359 }
3360 `)
3361
3362 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3363
Jiyong Parkc95714e2019-03-29 14:23:10 +09003364 expectedInput := "myapex-arm64.apex"
3365 if prebuilt.inputApex.String() != expectedInput {
3366 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3367 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003368}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003369
3370func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003371 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003372 prebuilt_apex {
3373 name: "myapex",
3374 src: "myapex-arm.apex",
3375 filename: "notmyapex.apex",
3376 }
3377 `)
3378
3379 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3380
3381 expected := "notmyapex.apex"
3382 if p.installFilename != expected {
3383 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3384 }
3385}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003386
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003387func TestPrebuiltOverrides(t *testing.T) {
3388 ctx, config := testApex(t, `
3389 prebuilt_apex {
3390 name: "myapex.prebuilt",
3391 src: "myapex-arm.apex",
3392 overrides: [
3393 "myapex",
3394 ],
3395 }
3396 `)
3397
3398 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3399
3400 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003401 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003402 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003403 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003404 }
3405}
3406
Roland Levillain630846d2019-06-26 12:48:34 +01003407func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003408 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003409 apex_test {
3410 name: "myapex",
3411 key: "myapex.key",
3412 tests: [
3413 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003414 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003415 ],
3416 }
3417
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423
Liz Kammer1c14a212020-05-12 15:26:55 -07003424 filegroup {
3425 name: "fg",
3426 srcs: [
3427 "baz",
3428 "bar/baz"
3429 ],
3430 }
3431
Roland Levillain630846d2019-06-26 12:48:34 +01003432 cc_test {
3433 name: "mytest",
3434 gtest: false,
3435 srcs: ["mytest.cpp"],
3436 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003437 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003438 system_shared_libs: [],
3439 static_executable: true,
3440 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003441 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003442 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003443
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003444 cc_library {
3445 name: "mylib",
3446 srcs: ["mylib.cpp"],
3447 system_shared_libs: [],
3448 stl: "none",
3449 }
3450
Liz Kammer5bd365f2020-05-27 15:15:11 -07003451 filegroup {
3452 name: "fg2",
3453 srcs: [
3454 "testdata/baz"
3455 ],
3456 }
3457
Roland Levillain9b5fde92019-06-28 15:41:19 +01003458 cc_test {
3459 name: "mytests",
3460 gtest: false,
3461 srcs: [
3462 "mytest1.cpp",
3463 "mytest2.cpp",
3464 "mytest3.cpp",
3465 ],
3466 test_per_src: true,
3467 relative_install_path: "test",
3468 system_shared_libs: [],
3469 static_executable: true,
3470 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003471 data: [
3472 ":fg",
3473 ":fg2",
3474 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003475 }
Roland Levillain630846d2019-06-26 12:48:34 +01003476 `)
3477
Sundong Ahnabb64432019-10-22 13:58:29 +09003478 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003479 copyCmds := apexRule.Args["copy_commands"]
3480
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003481 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003482 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003483 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003484
Liz Kammer1c14a212020-05-12 15:26:55 -07003485 //Ensure that test data are copied into apex.
3486 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3487 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3488
Roland Levillain9b5fde92019-06-28 15:41:19 +01003489 // Ensure that test deps built with `test_per_src` are copied into apex.
3490 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3491 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3492 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003493
3494 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003495 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3496 data := android.AndroidMkDataForTest(t, config, "", bundle)
3497 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003498 prefix := "TARGET_"
3499 var builder strings.Builder
3500 data.Custom(&builder, name, prefix, "", data)
3501 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3503 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3504 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3505 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003506 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003507 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003508 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003509
3510 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3511 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3512 data.Custom(&builder, name, prefix, "", data)
3513 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003514 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3515 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003516}
3517
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003518func TestInstallExtraFlattenedApexes(t *testing.T) {
3519 ctx, config := testApex(t, `
3520 apex {
3521 name: "myapex",
3522 key: "myapex.key",
3523 }
3524 apex_key {
3525 name: "myapex.key",
3526 public_key: "testkey.avbpubkey",
3527 private_key: "testkey.pem",
3528 }
3529 `, func(fs map[string][]byte, config android.Config) {
3530 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3531 })
3532 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003533 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003534 mk := android.AndroidMkDataForTest(t, config, "", ab)
3535 var builder strings.Builder
3536 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3537 androidMk := builder.String()
3538 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3539}
3540
Jooyung Han5c998b92019-06-27 11:30:33 +09003541func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003542 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003543 apex {
3544 name: "myapex",
3545 key: "myapex.key",
3546 native_shared_libs: ["mylib"],
3547 uses: ["commonapex"],
3548 }
3549
3550 apex {
3551 name: "commonapex",
3552 key: "myapex.key",
3553 native_shared_libs: ["libcommon"],
3554 provide_cpp_shared_libs: true,
3555 }
3556
3557 apex_key {
3558 name: "myapex.key",
3559 public_key: "testkey.avbpubkey",
3560 private_key: "testkey.pem",
3561 }
3562
3563 cc_library {
3564 name: "mylib",
3565 srcs: ["mylib.cpp"],
3566 shared_libs: ["libcommon"],
3567 system_shared_libs: [],
3568 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003569 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003570 }
3571
3572 cc_library {
3573 name: "libcommon",
3574 srcs: ["mylib_common.cpp"],
3575 system_shared_libs: [],
3576 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003577 // TODO: remove //apex_available:platform
3578 apex_available: [
3579 "//apex_available:platform",
3580 "commonapex",
3581 "myapex",
3582 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003583 }
3584 `)
3585
Sundong Ahnabb64432019-10-22 13:58:29 +09003586 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003587 apexRule1 := module1.Rule("apexRule")
3588 copyCmds1 := apexRule1.Args["copy_commands"]
3589
Sundong Ahnabb64432019-10-22 13:58:29 +09003590 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003591 apexRule2 := module2.Rule("apexRule")
3592 copyCmds2 := apexRule2.Args["copy_commands"]
3593
Colin Cross7113d202019-11-20 16:39:12 -08003594 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3595 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003596 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3597 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3598 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3599}
3600
3601func TestApexUsesFailsIfNotProvided(t *testing.T) {
3602 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3603 apex {
3604 name: "myapex",
3605 key: "myapex.key",
3606 uses: ["commonapex"],
3607 }
3608
3609 apex {
3610 name: "commonapex",
3611 key: "myapex.key",
3612 }
3613
3614 apex_key {
3615 name: "myapex.key",
3616 public_key: "testkey.avbpubkey",
3617 private_key: "testkey.pem",
3618 }
3619 `)
3620 testApexError(t, `uses: "commonapex" is not a provider`, `
3621 apex {
3622 name: "myapex",
3623 key: "myapex.key",
3624 uses: ["commonapex"],
3625 }
3626
3627 cc_library {
3628 name: "commonapex",
3629 system_shared_libs: [],
3630 stl: "none",
3631 }
3632
3633 apex_key {
3634 name: "myapex.key",
3635 public_key: "testkey.avbpubkey",
3636 private_key: "testkey.pem",
3637 }
3638 `)
3639}
3640
3641func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3642 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3643 apex {
3644 name: "myapex",
3645 key: "myapex.key",
3646 use_vendor: true,
3647 uses: ["commonapex"],
3648 }
3649
3650 apex {
3651 name: "commonapex",
3652 key: "myapex.key",
3653 provide_cpp_shared_libs: true,
3654 }
3655
3656 apex_key {
3657 name: "myapex.key",
3658 public_key: "testkey.avbpubkey",
3659 private_key: "testkey.pem",
3660 }
Jooyung Handc782442019-11-01 03:14:38 +09003661 `, func(fs map[string][]byte, config android.Config) {
3662 setUseVendorWhitelistForTest(config, []string{"myapex"})
3663 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003664}
3665
Jooyung Hand48f3c32019-08-23 11:18:57 +09003666func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3667 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3668 apex {
3669 name: "myapex",
3670 key: "myapex.key",
3671 native_shared_libs: ["libfoo"],
3672 }
3673
3674 apex_key {
3675 name: "myapex.key",
3676 public_key: "testkey.avbpubkey",
3677 private_key: "testkey.pem",
3678 }
3679
3680 cc_library {
3681 name: "libfoo",
3682 stl: "none",
3683 system_shared_libs: [],
3684 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003685 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003686 }
3687 `)
3688 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3689 apex {
3690 name: "myapex",
3691 key: "myapex.key",
3692 java_libs: ["myjar"],
3693 }
3694
3695 apex_key {
3696 name: "myapex.key",
3697 public_key: "testkey.avbpubkey",
3698 private_key: "testkey.pem",
3699 }
3700
3701 java_library {
3702 name: "myjar",
3703 srcs: ["foo/bar/MyClass.java"],
3704 sdk_version: "none",
3705 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003706 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003707 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003708 }
3709 `)
3710}
3711
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003712func TestApexWithApps(t *testing.T) {
3713 ctx, _ := testApex(t, `
3714 apex {
3715 name: "myapex",
3716 key: "myapex.key",
3717 apps: [
3718 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003719 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003720 ],
3721 }
3722
3723 apex_key {
3724 name: "myapex.key",
3725 public_key: "testkey.avbpubkey",
3726 private_key: "testkey.pem",
3727 }
3728
3729 android_app {
3730 name: "AppFoo",
3731 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003732 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003733 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003734 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003735 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003736 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003737 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003738
3739 android_app {
3740 name: "AppFooPriv",
3741 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003742 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003743 system_modules: "none",
3744 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003746 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003747 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003748
3749 cc_library_shared {
3750 name: "libjni",
3751 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003752 shared_libs: ["libfoo"],
3753 stl: "none",
3754 system_shared_libs: [],
3755 apex_available: [ "myapex" ],
3756 sdk_version: "current",
3757 }
3758
3759 cc_library_shared {
3760 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003761 stl: "none",
3762 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003763 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003764 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003765 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003766 `)
3767
Sundong Ahnabb64432019-10-22 13:58:29 +09003768 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003769 apexRule := module.Rule("apexRule")
3770 copyCmds := apexRule.Args["copy_commands"]
3771
3772 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003773 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003774
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003775 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3776 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003777 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003778 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003779 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003780 // JNI libraries including transitive deps are
3781 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003782 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003783 // ... embedded inside APK (jnilibs.zip)
3784 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3785 // ... and not directly inside the APEX
3786 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3787 }
Dario Frenicde2a032019-10-27 00:29:22 +01003788}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003789
Dario Frenicde2a032019-10-27 00:29:22 +01003790func TestApexWithAppImports(t *testing.T) {
3791 ctx, _ := testApex(t, `
3792 apex {
3793 name: "myapex",
3794 key: "myapex.key",
3795 apps: [
3796 "AppFooPrebuilt",
3797 "AppFooPrivPrebuilt",
3798 ],
3799 }
3800
3801 apex_key {
3802 name: "myapex.key",
3803 public_key: "testkey.avbpubkey",
3804 private_key: "testkey.pem",
3805 }
3806
3807 android_app_import {
3808 name: "AppFooPrebuilt",
3809 apk: "PrebuiltAppFoo.apk",
3810 presigned: true,
3811 dex_preopt: {
3812 enabled: false,
3813 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003814 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003815 }
3816
3817 android_app_import {
3818 name: "AppFooPrivPrebuilt",
3819 apk: "PrebuiltAppFooPriv.apk",
3820 privileged: true,
3821 presigned: true,
3822 dex_preopt: {
3823 enabled: false,
3824 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003825 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003826 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003827 }
3828 `)
3829
Sundong Ahnabb64432019-10-22 13:58:29 +09003830 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003831 apexRule := module.Rule("apexRule")
3832 copyCmds := apexRule.Args["copy_commands"]
3833
3834 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003835 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3836}
3837
3838func TestApexWithAppImportsPrefer(t *testing.T) {
3839 ctx, _ := testApex(t, `
3840 apex {
3841 name: "myapex",
3842 key: "myapex.key",
3843 apps: [
3844 "AppFoo",
3845 ],
3846 }
3847
3848 apex_key {
3849 name: "myapex.key",
3850 public_key: "testkey.avbpubkey",
3851 private_key: "testkey.pem",
3852 }
3853
3854 android_app {
3855 name: "AppFoo",
3856 srcs: ["foo/bar/MyClass.java"],
3857 sdk_version: "none",
3858 system_modules: "none",
3859 apex_available: [ "myapex" ],
3860 }
3861
3862 android_app_import {
3863 name: "AppFoo",
3864 apk: "AppFooPrebuilt.apk",
3865 filename: "AppFooPrebuilt.apk",
3866 presigned: true,
3867 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003868 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003869 }
3870 `, withFiles(map[string][]byte{
3871 "AppFooPrebuilt.apk": nil,
3872 }))
3873
3874 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3875 "app/AppFoo/AppFooPrebuilt.apk",
3876 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003877}
3878
Dario Freni6f3937c2019-12-20 22:58:03 +00003879func TestApexWithTestHelperApp(t *testing.T) {
3880 ctx, _ := testApex(t, `
3881 apex {
3882 name: "myapex",
3883 key: "myapex.key",
3884 apps: [
3885 "TesterHelpAppFoo",
3886 ],
3887 }
3888
3889 apex_key {
3890 name: "myapex.key",
3891 public_key: "testkey.avbpubkey",
3892 private_key: "testkey.pem",
3893 }
3894
3895 android_test_helper_app {
3896 name: "TesterHelpAppFoo",
3897 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003898 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003899 }
3900
3901 `)
3902
3903 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3904 apexRule := module.Rule("apexRule")
3905 copyCmds := apexRule.Args["copy_commands"]
3906
3907 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3908}
3909
Jooyung Han18020ea2019-11-13 10:50:48 +09003910func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3911 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003912 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003913 apex {
3914 name: "myapex",
3915 key: "myapex.key",
3916 native_shared_libs: ["libfoo"],
3917 }
3918
3919 apex_key {
3920 name: "myapex.key",
3921 public_key: "testkey.avbpubkey",
3922 private_key: "testkey.pem",
3923 }
3924
3925 apex {
3926 name: "otherapex",
3927 key: "myapex.key",
3928 native_shared_libs: ["libfoo"],
3929 }
3930
3931 cc_defaults {
3932 name: "libfoo-defaults",
3933 apex_available: ["otherapex"],
3934 }
3935
3936 cc_library {
3937 name: "libfoo",
3938 defaults: ["libfoo-defaults"],
3939 stl: "none",
3940 system_shared_libs: [],
3941 }`)
3942}
3943
Paul Duffine52e66f2020-03-30 17:54:29 +01003944func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003945 // libfoo is not available to myapex, but only to otherapex
3946 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3947 apex {
3948 name: "myapex",
3949 key: "myapex.key",
3950 native_shared_libs: ["libfoo"],
3951 }
3952
3953 apex_key {
3954 name: "myapex.key",
3955 public_key: "testkey.avbpubkey",
3956 private_key: "testkey.pem",
3957 }
3958
3959 apex {
3960 name: "otherapex",
3961 key: "otherapex.key",
3962 native_shared_libs: ["libfoo"],
3963 }
3964
3965 apex_key {
3966 name: "otherapex.key",
3967 public_key: "testkey.avbpubkey",
3968 private_key: "testkey.pem",
3969 }
3970
3971 cc_library {
3972 name: "libfoo",
3973 stl: "none",
3974 system_shared_libs: [],
3975 apex_available: ["otherapex"],
3976 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003977}
Jiyong Park127b40b2019-09-30 16:04:35 +09003978
Paul Duffine52e66f2020-03-30 17:54:29 +01003979func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003980 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003981 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003982.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003983.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003984.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003985.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003986.*via tag cc\.DependencyTag.*"shared".*
3987.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003988 apex {
3989 name: "myapex",
3990 key: "myapex.key",
3991 native_shared_libs: ["libfoo"],
3992 }
3993
3994 apex_key {
3995 name: "myapex.key",
3996 public_key: "testkey.avbpubkey",
3997 private_key: "testkey.pem",
3998 }
3999
Jiyong Park127b40b2019-09-30 16:04:35 +09004000 cc_library {
4001 name: "libfoo",
4002 stl: "none",
4003 shared_libs: ["libbar"],
4004 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004005 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004006 }
4007
4008 cc_library {
4009 name: "libbar",
4010 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004011 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004012 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004013 apex_available: ["myapex"],
4014 }
4015
4016 cc_library {
4017 name: "libbaz",
4018 stl: "none",
4019 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004020 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004021}
Jiyong Park127b40b2019-09-30 16:04:35 +09004022
Paul Duffine52e66f2020-03-30 17:54:29 +01004023func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004024 testApexError(t, "\"otherapex\" is not a valid module name", `
4025 apex {
4026 name: "myapex",
4027 key: "myapex.key",
4028 native_shared_libs: ["libfoo"],
4029 }
4030
4031 apex_key {
4032 name: "myapex.key",
4033 public_key: "testkey.avbpubkey",
4034 private_key: "testkey.pem",
4035 }
4036
4037 cc_library {
4038 name: "libfoo",
4039 stl: "none",
4040 system_shared_libs: [],
4041 apex_available: ["otherapex"],
4042 }`)
4043
Paul Duffine52e66f2020-03-30 17:54:29 +01004044 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004045 apex {
4046 name: "myapex",
4047 key: "myapex.key",
4048 native_shared_libs: ["libfoo", "libbar"],
4049 }
4050
4051 apex_key {
4052 name: "myapex.key",
4053 public_key: "testkey.avbpubkey",
4054 private_key: "testkey.pem",
4055 }
4056
4057 cc_library {
4058 name: "libfoo",
4059 stl: "none",
4060 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004061 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004062 apex_available: ["myapex"],
4063 }
4064
4065 cc_library {
4066 name: "libbar",
4067 stl: "none",
4068 system_shared_libs: [],
4069 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004070 }
4071
4072 cc_library {
4073 name: "libbaz",
4074 stl: "none",
4075 system_shared_libs: [],
4076 stubs: {
4077 versions: ["10", "20", "30"],
4078 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004079 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004080}
Jiyong Park127b40b2019-09-30 16:04:35 +09004081
Jiyong Park89e850a2020-04-07 16:37:39 +09004082func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004083 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004084 apex {
4085 name: "myapex",
4086 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004087 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004088 }
4089
4090 apex_key {
4091 name: "myapex.key",
4092 public_key: "testkey.avbpubkey",
4093 private_key: "testkey.pem",
4094 }
4095
4096 cc_library {
4097 name: "libfoo",
4098 stl: "none",
4099 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004100 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004101 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004102 }
4103
4104 cc_library {
4105 name: "libfoo2",
4106 stl: "none",
4107 system_shared_libs: [],
4108 shared_libs: ["libbaz"],
4109 apex_available: ["//apex_available:platform"],
4110 }
4111
4112 cc_library {
4113 name: "libbar",
4114 stl: "none",
4115 system_shared_libs: [],
4116 apex_available: ["myapex"],
4117 }
4118
4119 cc_library {
4120 name: "libbaz",
4121 stl: "none",
4122 system_shared_libs: [],
4123 apex_available: ["myapex"],
4124 stubs: {
4125 versions: ["1"],
4126 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004127 }`)
4128
Jiyong Park89e850a2020-04-07 16:37:39 +09004129 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4130 // because it depends on libbar which isn't available to platform
4131 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4132 if libfoo.NotAvailableForPlatform() != true {
4133 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4134 }
4135
4136 // libfoo2 however can be available to platform because it depends on libbaz which provides
4137 // stubs
4138 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4139 if libfoo2.NotAvailableForPlatform() == true {
4140 t.Errorf("%q should be available to platform", libfoo2.String())
4141 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004142}
Jiyong Parka90ca002019-10-07 15:47:24 +09004143
Paul Duffine52e66f2020-03-30 17:54:29 +01004144func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004145 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004146 apex {
4147 name: "myapex",
4148 key: "myapex.key",
4149 native_shared_libs: ["libfoo"],
4150 }
4151
4152 apex_key {
4153 name: "myapex.key",
4154 public_key: "testkey.avbpubkey",
4155 private_key: "testkey.pem",
4156 }
4157
4158 cc_library {
4159 name: "libfoo",
4160 stl: "none",
4161 system_shared_libs: [],
4162 apex_available: ["myapex"],
4163 static: {
4164 apex_available: ["//apex_available:platform"],
4165 },
4166 }`)
4167
Jiyong Park89e850a2020-04-07 16:37:39 +09004168 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4169 if libfooShared.NotAvailableForPlatform() != true {
4170 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4171 }
4172 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4173 if libfooStatic.NotAvailableForPlatform() != false {
4174 t.Errorf("%q should be available to platform", libfooStatic.String())
4175 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004176}
4177
Jiyong Park5d790c32019-11-15 18:40:32 +09004178func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004179 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004180 apex {
4181 name: "myapex",
4182 key: "myapex.key",
4183 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004184 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004185 }
4186
4187 override_apex {
4188 name: "override_myapex",
4189 base: "myapex",
4190 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004191 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004192 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004193 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004194 }
4195
4196 apex_key {
4197 name: "myapex.key",
4198 public_key: "testkey.avbpubkey",
4199 private_key: "testkey.pem",
4200 }
4201
4202 android_app {
4203 name: "app",
4204 srcs: ["foo/bar/MyClass.java"],
4205 package_name: "foo",
4206 sdk_version: "none",
4207 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004208 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004209 }
4210
4211 override_android_app {
4212 name: "override_app",
4213 base: "app",
4214 package_name: "bar",
4215 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004216 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004217
Jiyong Park317645e2019-12-05 13:20:58 +09004218 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4219 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4220 if originalVariant.GetOverriddenBy() != "" {
4221 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4222 }
4223 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4224 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4225 }
4226
Jiyong Park5d790c32019-11-15 18:40:32 +09004227 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4228 apexRule := module.Rule("apexRule")
4229 copyCmds := apexRule.Args["copy_commands"]
4230
4231 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004232 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004233
4234 apexBundle := module.Module().(*apexBundle)
4235 name := apexBundle.Name()
4236 if name != "override_myapex" {
4237 t.Errorf("name should be \"override_myapex\", but was %q", name)
4238 }
4239
Baligh Uddin004d7172020-02-19 21:29:28 -08004240 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4241 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4242 }
4243
Jiyong Park20bacab2020-03-03 11:45:41 +09004244 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004245 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004246
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004247 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4248 var builder strings.Builder
4249 data.Custom(&builder, name, "TARGET_", "", data)
4250 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004251 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004252 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4253 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004254 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004255 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004256 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004257 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4258 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004259}
4260
Jooyung Han214bf372019-11-12 13:03:50 +09004261func TestLegacyAndroid10Support(t *testing.T) {
4262 ctx, _ := testApex(t, `
4263 apex {
4264 name: "myapex",
4265 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004266 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004267 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004268 }
4269
4270 apex_key {
4271 name: "myapex.key",
4272 public_key: "testkey.avbpubkey",
4273 private_key: "testkey.pem",
4274 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004275
4276 cc_library {
4277 name: "mylib",
4278 srcs: ["mylib.cpp"],
4279 stl: "libc++",
4280 system_shared_libs: [],
4281 apex_available: [ "myapex" ],
4282 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004283 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004284
4285 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4286 args := module.Rule("apexRule").Args
4287 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004288 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004289
4290 // The copies of the libraries in the apex should have one more dependency than
4291 // the ones outside the apex, namely the unwinder. Ideally we should check
4292 // the dependency names directly here but for some reason the names are blank in
4293 // this test.
4294 for _, lib := range []string{"libc++", "mylib"} {
4295 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4296 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4297 if len(apexImplicits) != len(nonApexImplicits)+1 {
4298 t.Errorf("%q missing unwinder dep", lib)
4299 }
4300 }
Jooyung Han214bf372019-11-12 13:03:50 +09004301}
4302
Paul Duffin9b879592020-05-26 13:21:35 +01004303var filesForSdkLibrary = map[string][]byte{
4304 "api/current.txt": nil,
4305 "api/removed.txt": nil,
4306 "api/system-current.txt": nil,
4307 "api/system-removed.txt": nil,
4308 "api/test-current.txt": nil,
4309 "api/test-removed.txt": nil,
4310}
4311
Jooyung Han58f26ab2019-12-18 15:34:32 +09004312func TestJavaSDKLibrary(t *testing.T) {
4313 ctx, _ := testApex(t, `
4314 apex {
4315 name: "myapex",
4316 key: "myapex.key",
4317 java_libs: ["foo"],
4318 }
4319
4320 apex_key {
4321 name: "myapex.key",
4322 public_key: "testkey.avbpubkey",
4323 private_key: "testkey.pem",
4324 }
4325
4326 java_sdk_library {
4327 name: "foo",
4328 srcs: ["a.java"],
4329 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004330 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004331 }
Paul Duffin9b879592020-05-26 13:21:35 +01004332 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004333
4334 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004335 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004336 "javalib/foo.jar",
4337 "etc/permissions/foo.xml",
4338 })
4339 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004340 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4341 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004342}
4343
Paul Duffin9b879592020-05-26 13:21:35 +01004344func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4345 ctx, _ := testApex(t, `
4346 apex {
4347 name: "myapex",
4348 key: "myapex.key",
4349 java_libs: ["foo", "bar"],
4350 }
4351
4352 apex_key {
4353 name: "myapex.key",
4354 public_key: "testkey.avbpubkey",
4355 private_key: "testkey.pem",
4356 }
4357
4358 java_sdk_library {
4359 name: "foo",
4360 srcs: ["a.java"],
4361 api_packages: ["foo"],
4362 apex_available: ["myapex"],
4363 sdk_version: "none",
4364 system_modules: "none",
4365 }
4366
4367 java_library {
4368 name: "bar",
4369 srcs: ["a.java"],
4370 libs: ["foo"],
4371 apex_available: ["myapex"],
4372 sdk_version: "none",
4373 system_modules: "none",
4374 }
4375 `, withFiles(filesForSdkLibrary))
4376
4377 // java_sdk_library installs both impl jar and permission XML
4378 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4379 "javalib/bar.jar",
4380 "javalib/foo.jar",
4381 "etc/permissions/foo.xml",
4382 })
4383
4384 // The bar library should depend on the implementation jar.
4385 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4386 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4387 t.Errorf("expected %q, found %#q", expected, actual)
4388 }
4389}
4390
4391func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4392 ctx, _ := testApex(t, `
4393 apex {
4394 name: "myapex",
4395 key: "myapex.key",
4396 java_libs: ["foo"],
4397 }
4398
4399 apex_key {
4400 name: "myapex.key",
4401 public_key: "testkey.avbpubkey",
4402 private_key: "testkey.pem",
4403 }
4404
4405 java_sdk_library {
4406 name: "foo",
4407 srcs: ["a.java"],
4408 api_packages: ["foo"],
4409 apex_available: ["myapex"],
4410 sdk_version: "none",
4411 system_modules: "none",
4412 }
4413
4414 java_library {
4415 name: "bar",
4416 srcs: ["a.java"],
4417 libs: ["foo"],
4418 sdk_version: "none",
4419 system_modules: "none",
4420 }
4421 `, withFiles(filesForSdkLibrary))
4422
4423 // java_sdk_library installs both impl jar and permission XML
4424 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4425 "javalib/foo.jar",
4426 "etc/permissions/foo.xml",
4427 })
4428
4429 // The bar library should depend on the stubs jar.
4430 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4431 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4432 t.Errorf("expected %q, found %#q", expected, actual)
4433 }
4434}
4435
atrost6e126252020-01-27 17:01:16 +00004436func TestCompatConfig(t *testing.T) {
4437 ctx, _ := testApex(t, `
4438 apex {
4439 name: "myapex",
4440 key: "myapex.key",
4441 prebuilts: ["myjar-platform-compat-config"],
4442 java_libs: ["myjar"],
4443 }
4444
4445 apex_key {
4446 name: "myapex.key",
4447 public_key: "testkey.avbpubkey",
4448 private_key: "testkey.pem",
4449 }
4450
4451 platform_compat_config {
4452 name: "myjar-platform-compat-config",
4453 src: ":myjar",
4454 }
4455
4456 java_library {
4457 name: "myjar",
4458 srcs: ["foo/bar/MyClass.java"],
4459 sdk_version: "none",
4460 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004461 apex_available: [ "myapex" ],
4462 }
4463 `)
4464 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4465 "etc/compatconfig/myjar-platform-compat-config.xml",
4466 "javalib/myjar.jar",
4467 })
4468}
4469
Jiyong Park479321d2019-12-16 11:47:12 +09004470func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4471 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4472 apex {
4473 name: "myapex",
4474 key: "myapex.key",
4475 java_libs: ["myjar"],
4476 }
4477
4478 apex_key {
4479 name: "myapex.key",
4480 public_key: "testkey.avbpubkey",
4481 private_key: "testkey.pem",
4482 }
4483
4484 java_library {
4485 name: "myjar",
4486 srcs: ["foo/bar/MyClass.java"],
4487 sdk_version: "none",
4488 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004489 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004490 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004491 }
4492 `)
4493}
4494
Jiyong Park7afd1072019-12-30 16:56:33 +09004495func TestCarryRequiredModuleNames(t *testing.T) {
4496 ctx, config := testApex(t, `
4497 apex {
4498 name: "myapex",
4499 key: "myapex.key",
4500 native_shared_libs: ["mylib"],
4501 }
4502
4503 apex_key {
4504 name: "myapex.key",
4505 public_key: "testkey.avbpubkey",
4506 private_key: "testkey.pem",
4507 }
4508
4509 cc_library {
4510 name: "mylib",
4511 srcs: ["mylib.cpp"],
4512 system_shared_libs: [],
4513 stl: "none",
4514 required: ["a", "b"],
4515 host_required: ["c", "d"],
4516 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004517 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004518 }
4519 `)
4520
4521 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4522 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4523 name := apexBundle.BaseModuleName()
4524 prefix := "TARGET_"
4525 var builder strings.Builder
4526 data.Custom(&builder, name, prefix, "", data)
4527 androidMk := builder.String()
4528 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4529 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4530 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4531}
4532
Jiyong Park7cd10e32020-01-14 09:22:18 +09004533func TestSymlinksFromApexToSystem(t *testing.T) {
4534 bp := `
4535 apex {
4536 name: "myapex",
4537 key: "myapex.key",
4538 native_shared_libs: ["mylib"],
4539 java_libs: ["myjar"],
4540 }
4541
Jiyong Park9d677202020-02-19 16:29:35 +09004542 apex {
4543 name: "myapex.updatable",
4544 key: "myapex.key",
4545 native_shared_libs: ["mylib"],
4546 java_libs: ["myjar"],
4547 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004548 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004549 }
4550
Jiyong Park7cd10e32020-01-14 09:22:18 +09004551 apex_key {
4552 name: "myapex.key",
4553 public_key: "testkey.avbpubkey",
4554 private_key: "testkey.pem",
4555 }
4556
4557 cc_library {
4558 name: "mylib",
4559 srcs: ["mylib.cpp"],
4560 shared_libs: ["myotherlib"],
4561 system_shared_libs: [],
4562 stl: "none",
4563 apex_available: [
4564 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004565 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004566 "//apex_available:platform",
4567 ],
4568 }
4569
4570 cc_library {
4571 name: "myotherlib",
4572 srcs: ["mylib.cpp"],
4573 system_shared_libs: [],
4574 stl: "none",
4575 apex_available: [
4576 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004577 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004578 "//apex_available:platform",
4579 ],
4580 }
4581
4582 java_library {
4583 name: "myjar",
4584 srcs: ["foo/bar/MyClass.java"],
4585 sdk_version: "none",
4586 system_modules: "none",
4587 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004588 apex_available: [
4589 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004590 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004591 "//apex_available:platform",
4592 ],
4593 }
4594
4595 java_library {
4596 name: "myotherjar",
4597 srcs: ["foo/bar/MyClass.java"],
4598 sdk_version: "none",
4599 system_modules: "none",
4600 apex_available: [
4601 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004602 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004603 "//apex_available:platform",
4604 ],
4605 }
4606 `
4607
4608 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4609 for _, f := range files {
4610 if f.path == file {
4611 if f.isLink {
4612 t.Errorf("%q is not a real file", file)
4613 }
4614 return
4615 }
4616 }
4617 t.Errorf("%q is not found", file)
4618 }
4619
4620 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4621 for _, f := range files {
4622 if f.path == file {
4623 if !f.isLink {
4624 t.Errorf("%q is not a symlink", file)
4625 }
4626 return
4627 }
4628 }
4629 t.Errorf("%q is not found", file)
4630 }
4631
Jiyong Park9d677202020-02-19 16:29:35 +09004632 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4633 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004634 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004635 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004636 ensureRealfileExists(t, files, "javalib/myjar.jar")
4637 ensureRealfileExists(t, files, "lib64/mylib.so")
4638 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4639
Jiyong Park9d677202020-02-19 16:29:35 +09004640 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4641 ensureRealfileExists(t, files, "javalib/myjar.jar")
4642 ensureRealfileExists(t, files, "lib64/mylib.so")
4643 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4644
4645 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004646 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004647 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004648 ensureRealfileExists(t, files, "javalib/myjar.jar")
4649 ensureRealfileExists(t, files, "lib64/mylib.so")
4650 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004651
4652 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4653 ensureRealfileExists(t, files, "javalib/myjar.jar")
4654 ensureRealfileExists(t, files, "lib64/mylib.so")
4655 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004656}
4657
Jooyung Han643adc42020-02-27 13:50:06 +09004658func TestApexWithJniLibs(t *testing.T) {
4659 ctx, _ := testApex(t, `
4660 apex {
4661 name: "myapex",
4662 key: "myapex.key",
4663 jni_libs: ["mylib"],
4664 }
4665
4666 apex_key {
4667 name: "myapex.key",
4668 public_key: "testkey.avbpubkey",
4669 private_key: "testkey.pem",
4670 }
4671
4672 cc_library {
4673 name: "mylib",
4674 srcs: ["mylib.cpp"],
4675 shared_libs: ["mylib2"],
4676 system_shared_libs: [],
4677 stl: "none",
4678 apex_available: [ "myapex" ],
4679 }
4680
4681 cc_library {
4682 name: "mylib2",
4683 srcs: ["mylib.cpp"],
4684 system_shared_libs: [],
4685 stl: "none",
4686 apex_available: [ "myapex" ],
4687 }
4688 `)
4689
4690 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4691 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4692 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4693 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4694 "lib64/mylib.so",
4695 "lib64/mylib2.so",
4696 })
4697}
4698
Jooyung Han49f67012020-04-17 13:43:10 +09004699func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4700 ctx, _ := testApex(t, `
4701 apex {
4702 name: "myapex",
4703 key: "myapex.key",
4704 }
4705 apex_key {
4706 name: "myapex.key",
4707 public_key: "testkey.avbpubkey",
4708 private_key: "testkey.pem",
4709 }
4710 `, func(fs map[string][]byte, config android.Config) {
4711 delete(config.Targets, android.Android)
4712 config.AndroidCommonTarget = android.Target{}
4713 })
4714
4715 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4716 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4717 }
4718}
4719
Jooyung Han643adc42020-02-27 13:50:06 +09004720func TestApexWithJniLibs_Errors(t *testing.T) {
4721 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4722 apex {
4723 name: "myapex",
4724 key: "myapex.key",
4725 jni_libs: ["xxx"],
4726 }
4727
4728 apex_key {
4729 name: "myapex.key",
4730 public_key: "testkey.avbpubkey",
4731 private_key: "testkey.pem",
4732 }
4733
4734 prebuilt_etc {
4735 name: "xxx",
4736 src: "xxx",
4737 }
4738 `, withFiles(map[string][]byte{
4739 "xxx": nil,
4740 }))
4741}
4742
Jiyong Parkbd159612020-02-28 15:22:21 +09004743func TestAppBundle(t *testing.T) {
4744 ctx, _ := testApex(t, `
4745 apex {
4746 name: "myapex",
4747 key: "myapex.key",
4748 apps: ["AppFoo"],
4749 }
4750
4751 apex_key {
4752 name: "myapex.key",
4753 public_key: "testkey.avbpubkey",
4754 private_key: "testkey.pem",
4755 }
4756
4757 android_app {
4758 name: "AppFoo",
4759 srcs: ["foo/bar/MyClass.java"],
4760 sdk_version: "none",
4761 system_modules: "none",
4762 apex_available: [ "myapex" ],
4763 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004764 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004765
4766 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4767 content := bundleConfigRule.Args["content"]
4768
4769 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004770 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 +09004771}
4772
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004773func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004774 t.Helper()
4775
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004776 bp := `
4777 java_library {
4778 name: "some-updatable-apex-lib",
4779 srcs: ["a.java"],
4780 sdk_version: "current",
4781 apex_available: [
4782 "some-updatable-apex",
4783 ],
4784 }
4785
4786 java_library {
4787 name: "some-non-updatable-apex-lib",
4788 srcs: ["a.java"],
4789 apex_available: [
4790 "some-non-updatable-apex",
4791 ],
4792 }
4793
4794 java_library {
4795 name: "some-platform-lib",
4796 srcs: ["a.java"],
4797 sdk_version: "current",
4798 installable: true,
4799 }
4800
4801 java_library {
4802 name: "some-art-lib",
4803 srcs: ["a.java"],
4804 sdk_version: "current",
4805 apex_available: [
4806 "com.android.art.something",
4807 ],
4808 hostdex: true,
4809 }
4810
4811 apex {
4812 name: "some-updatable-apex",
4813 key: "some-updatable-apex.key",
4814 java_libs: ["some-updatable-apex-lib"],
4815 updatable: true,
4816 min_sdk_version: "current",
4817 }
4818
4819 apex {
4820 name: "some-non-updatable-apex",
4821 key: "some-non-updatable-apex.key",
4822 java_libs: ["some-non-updatable-apex-lib"],
4823 }
4824
4825 apex_key {
4826 name: "some-updatable-apex.key",
4827 }
4828
4829 apex_key {
4830 name: "some-non-updatable-apex.key",
4831 }
4832
4833 apex {
4834 name: "com.android.art.something",
4835 key: "com.android.art.something.key",
4836 java_libs: ["some-art-lib"],
4837 updatable: true,
4838 min_sdk_version: "current",
4839 }
4840
4841 apex_key {
4842 name: "com.android.art.something.key",
4843 }
4844
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004845 filegroup {
4846 name: "some-updatable-apex-file_contexts",
4847 srcs: [
4848 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4849 ],
4850 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004851
4852 filegroup {
4853 name: "some-non-updatable-apex-file_contexts",
4854 srcs: [
4855 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4856 ],
4857 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004858 `
4859 bp += cc.GatherRequiredDepsForTest(android.Android)
4860 bp += java.GatherRequiredDepsForTest()
4861 bp += dexpreopt.BpToolModulesForTest()
4862
4863 fs := map[string][]byte{
4864 "a.java": nil,
4865 "a.jar": nil,
4866 "build/make/target/product/security": nil,
4867 "apex_manifest.json": nil,
4868 "AndroidManifest.xml": nil,
4869 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004870 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004871 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4872 "framework/aidl/a.aidl": nil,
4873 }
4874 cc.GatherRequiredFilesForTest(fs)
4875
4876 ctx := android.NewTestArchContext()
4877 ctx.RegisterModuleType("apex", BundleFactory)
4878 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4879 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004880 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004881 cc.RegisterRequiredBuildComponentsForTest(ctx)
4882 java.RegisterJavaBuildComponents(ctx)
4883 java.RegisterSystemModulesBuildComponents(ctx)
4884 java.RegisterAppBuildComponents(ctx)
4885 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004886 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4887 ctx.PreDepsMutators(RegisterPreDepsMutators)
4888 ctx.PostDepsMutators(RegisterPostDepsMutators)
4889
4890 config := android.TestArchConfig(buildDir, nil, bp, fs)
4891 ctx.Register(config)
4892
4893 _ = dexpreopt.GlobalSoongConfigForTests(config)
4894 dexpreopt.RegisterToolModulesForTest(ctx)
4895 pathCtx := android.PathContextForTesting(config)
4896 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4897 transformDexpreoptConfig(dexpreoptConfig)
4898 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4899
4900 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4901 android.FailIfErrored(t, errs)
4902
4903 _, errs = ctx.PrepareBuildActions(config)
4904 if errmsg == "" {
4905 android.FailIfErrored(t, errs)
4906 } else if len(errs) > 0 {
4907 android.FailIfNoMatchingErrors(t, errmsg, errs)
4908 return
4909 } else {
4910 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4911 }
4912}
4913
Jooyung Han548640b2020-04-27 12:10:30 +09004914func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4915 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4916 apex {
4917 name: "myapex",
4918 key: "myapex.key",
4919 updatable: true,
4920 }
4921
4922 apex_key {
4923 name: "myapex.key",
4924 public_key: "testkey.avbpubkey",
4925 private_key: "testkey.pem",
4926 }
4927 `)
4928}
4929
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004930func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004931
4932 var error string
4933 var transform func(*dexpreopt.GlobalConfig)
4934
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004935 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
4936 transform = func(config *dexpreopt.GlobalConfig) {
4937 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
4938 }
4939 testNoUpdatableJarsInBootImage(t, "", transform)
4940 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004941
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004942 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
4943 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4944 transform = func(config *dexpreopt.GlobalConfig) {
4945 config.BootJars = []string{"com.android.art.something:some-art-lib"}
4946 }
4947 testNoUpdatableJarsInBootImage(t, error, transform)
4948 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004949
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004950 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4951 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4952 transform = func(config *dexpreopt.GlobalConfig) {
4953 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4954 }
4955 testNoUpdatableJarsInBootImage(t, error, transform)
4956 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004957
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004958 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4959 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4960 transform = func(config *dexpreopt.GlobalConfig) {
4961 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4962 }
4963 testNoUpdatableJarsInBootImage(t, error, transform)
4964 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004965
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004966 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
4967 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4968 transform = func(config *dexpreopt.GlobalConfig) {
4969 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
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("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
4975 transform = func(config *dexpreopt.GlobalConfig) {
4976 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4977 }
4978 testNoUpdatableJarsInBootImage(t, "", transform)
4979 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004980
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004981 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
4982 error = "failed to find a dex jar path for module 'nonexistent'"
4983 transform = func(config *dexpreopt.GlobalConfig) {
4984 config.ArtApexJars = []string{"platform:nonexistent"}
4985 }
4986 testNoUpdatableJarsInBootImage(t, error, transform)
4987 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004988
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004989 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
4990 error = "failed to find a dex jar path for module 'nonexistent'"
4991 transform = func(config *dexpreopt.GlobalConfig) {
4992 config.BootJars = []string{"platform:nonexistent"}
4993 }
4994 testNoUpdatableJarsInBootImage(t, error, transform)
4995 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004996
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004997 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
4998 error = "module 'some-platform-lib' is not allowed in the ART boot image"
4999 transform = func(config *dexpreopt.GlobalConfig) {
5000 config.ArtApexJars = []string{"platform:some-platform-lib"}
5001 }
5002 testNoUpdatableJarsInBootImage(t, error, transform)
5003 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005004
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005005 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5006 transform = func(config *dexpreopt.GlobalConfig) {
5007 config.BootJars = []string{"platform:some-platform-lib"}
5008 }
5009 testNoUpdatableJarsInBootImage(t, "", transform)
5010 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005011}
5012
Jiyong Park62304bb2020-04-13 16:19:48 +09005013func TestTestFor(t *testing.T) {
5014 ctx, _ := testApex(t, `
5015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
5018 native_shared_libs: ["mylib", "myprivlib"],
5019 }
5020
5021 apex_key {
5022 name: "myapex.key",
5023 public_key: "testkey.avbpubkey",
5024 private_key: "testkey.pem",
5025 }
5026
5027 cc_library {
5028 name: "mylib",
5029 srcs: ["mylib.cpp"],
5030 system_shared_libs: [],
5031 stl: "none",
5032 stubs: {
5033 versions: ["1"],
5034 },
5035 apex_available: ["myapex"],
5036 }
5037
5038 cc_library {
5039 name: "myprivlib",
5040 srcs: ["mylib.cpp"],
5041 system_shared_libs: [],
5042 stl: "none",
5043 apex_available: ["myapex"],
5044 }
5045
5046
5047 cc_test {
5048 name: "mytest",
5049 gtest: false,
5050 srcs: ["mylib.cpp"],
5051 system_shared_libs: [],
5052 stl: "none",
5053 shared_libs: ["mylib", "myprivlib"],
5054 test_for: ["myapex"]
5055 }
5056 `)
5057
5058 // the test 'mytest' is a test for the apex, therefore is linked to the
5059 // actual implementation of mylib instead of its stub.
5060 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5061 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5062 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5063}
5064
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005065// TODO(jungjw): Move this to proptools
5066func intPtr(i int) *int {
5067 return &i
5068}
5069
5070func TestApexSet(t *testing.T) {
5071 ctx, config := testApex(t, `
5072 apex_set {
5073 name: "myapex",
5074 set: "myapex.apks",
5075 filename: "foo_v2.apex",
5076 overrides: ["foo"],
5077 }
5078 `, func(fs map[string][]byte, config android.Config) {
5079 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5080 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5081 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5082 })
5083
5084 m := ctx.ModuleForTests("myapex", "android_common")
5085
5086 // Check extract_apks tool parameters.
5087 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5088 actual := extractedApex.Args["abis"]
5089 expected := "ARMEABI_V7A,ARM64_V8A"
5090 if actual != expected {
5091 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5092 }
5093 actual = extractedApex.Args["sdk-version"]
5094 expected = "30"
5095 if actual != expected {
5096 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5097 }
5098
5099 a := m.Module().(*ApexSet)
5100 expectedOverrides := []string{"foo"}
5101 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5102 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5103 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5104 }
5105}
5106
Jiyong Park7d95a512020-05-10 15:16:24 +09005107func TestNoStaticLinkingToStubsLib(t *testing.T) {
5108 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5109 apex {
5110 name: "myapex",
5111 key: "myapex.key",
5112 native_shared_libs: ["mylib"],
5113 }
5114
5115 apex_key {
5116 name: "myapex.key",
5117 public_key: "testkey.avbpubkey",
5118 private_key: "testkey.pem",
5119 }
5120
5121 cc_library {
5122 name: "mylib",
5123 srcs: ["mylib.cpp"],
5124 static_libs: ["otherlib"],
5125 system_shared_libs: [],
5126 stl: "none",
5127 apex_available: [ "myapex" ],
5128 }
5129
5130 cc_library {
5131 name: "otherlib",
5132 srcs: ["mylib.cpp"],
5133 system_shared_libs: [],
5134 stl: "none",
5135 stubs: {
5136 versions: ["1", "2", "3"],
5137 },
5138 apex_available: [ "myapex" ],
5139 }
5140 `)
5141}
5142
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005143func TestMain(m *testing.M) {
5144 run := func() int {
5145 setUp()
5146 defer tearDown()
5147
5148 return m.Run()
5149 }
5150
5151 os.Exit(run())
5152}