blob: c00fd050ef39d8efc4ee9c0e6980bbac03251fa0 [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"
Jooyung Han31c470b2019-10-18 16:26:59 +090022 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090023 "strings"
24 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090025
26 "github.com/google/blueprint/proptools"
27
28 "android/soong/android"
29 "android/soong/cc"
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +000030 "android/soong/dexpreopt"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090031 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090032)
33
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070034var buildDir string
35
Jooyung Hand3639552019-08-09 12:57:43 +090036// names returns name list from white space separated string
37func names(s string) (ns []string) {
38 for _, n := range strings.Split(s, " ") {
39 if len(n) > 0 {
40 ns = append(ns, n)
41 }
42 }
43 return
44}
45
Jooyung Han344d5432019-08-23 11:17:39 +090046func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
47 t.Helper()
48 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090049 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
50 if len(errs) > 0 {
51 android.FailIfNoMatchingErrors(t, pattern, errs)
52 return
53 }
54 _, errs = ctx.PrepareBuildActions(config)
55 if len(errs) > 0 {
56 android.FailIfNoMatchingErrors(t, pattern, errs)
57 return
58 }
59
60 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
61}
62
Jooyung Han344d5432019-08-23 11:17:39 +090063func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
64 t.Helper()
65 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090066 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
67 android.FailIfErrored(t, errs)
68 _, errs = ctx.PrepareBuildActions(config)
69 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070070 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090071}
72
Jooyung Han344d5432019-08-23 11:17:39 +090073type testCustomizer func(fs map[string][]byte, config android.Config)
74
75func withFiles(files map[string][]byte) testCustomizer {
76 return func(fs map[string][]byte, config android.Config) {
77 for k, v := range files {
78 fs[k] = v
79 }
80 }
81}
82
83func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
84 return func(fs map[string][]byte, config android.Config) {
85 for k, v := range targets {
86 config.Targets[k] = v
87 }
88 }
89}
90
Jiyong Parkaf8998c2020-02-28 16:51:07 +090091func withManifestPackageNameOverrides(specs []string) testCustomizer {
92 return func(fs map[string][]byte, config android.Config) {
93 config.TestProductVariables.ManifestPackageNameOverrides = specs
94 }
95}
96
Jooyung Han31c470b2019-10-18 16:26:59 +090097func withBinder32bit(fs map[string][]byte, config android.Config) {
98 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
99}
100
Jiyong Park7cd10e32020-01-14 09:22:18 +0900101func withUnbundledBuild(fs map[string][]byte, config android.Config) {
102 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
103}
104
Jooyung Han344d5432019-08-23 11:17:39 +0900105func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900106 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900107
108 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900109 filegroup {
110 name: "myapex-file_contexts",
111 srcs: [
112 "system/sepolicy/apex/myapex-file_contexts",
113 ],
114 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900115 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800116
Colin Crossf9aabd72020-02-15 11:29:50 -0800117 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
118
Dario Frenicde2a032019-10-27 00:29:22 +0100119 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900120
Jooyung Han344d5432019-08-23 11:17:39 +0900121 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900122 "a.java": nil,
123 "PrebuiltAppFoo.apk": nil,
124 "PrebuiltAppFooPriv.apk": nil,
125 "build/make/target/product/security": nil,
126 "apex_manifest.json": nil,
127 "AndroidManifest.xml": nil,
128 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900129 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900130 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900131 "system/sepolicy/apex/otherapex-file_contexts": nil,
132 "system/sepolicy/apex/commonapex-file_contexts": nil,
133 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800134 "mylib.cpp": nil,
135 "mylib_common.cpp": nil,
136 "mytest.cpp": nil,
137 "mytest1.cpp": nil,
138 "mytest2.cpp": nil,
139 "mytest3.cpp": nil,
140 "myprebuilt": nil,
141 "my_include": nil,
142 "foo/bar/MyClass.java": nil,
143 "prebuilt.jar": nil,
Paul Duffin3766cb72020-04-07 15:25:44 +0100144 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800145 "vendor/foo/devkeys/test.x509.pem": nil,
146 "vendor/foo/devkeys/test.pk8": nil,
147 "testkey.x509.pem": nil,
148 "testkey.pk8": nil,
149 "testkey.override.x509.pem": nil,
150 "testkey.override.pk8": nil,
151 "vendor/foo/devkeys/testkey.avbpubkey": nil,
152 "vendor/foo/devkeys/testkey.pem": nil,
153 "NOTICE": nil,
154 "custom_notice": nil,
Jiyong Park162e8442020-03-17 19:16:40 +0900155 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800156 "testkey2.avbpubkey": nil,
157 "testkey2.pem": nil,
158 "myapex-arm64.apex": nil,
159 "myapex-arm.apex": nil,
160 "frameworks/base/api/current.txt": nil,
161 "framework/aidl/a.aidl": nil,
162 "build/make/core/proguard.flags": nil,
163 "build/make/core/proguard_basic_keeps.flags": nil,
164 "dummy.txt": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900165 }
166
Colin Crossf9aabd72020-02-15 11:29:50 -0800167 cc.GatherRequiredFilesForTest(fs)
168
Jooyung Han344d5432019-08-23 11:17:39 +0900169 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800170 // The fs now needs to be populated before creating the config, call handlers twice
171 // for now, once to get any fs changes, and later after the config was created to
172 // set product variables or targets.
173 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
174 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900175 }
176
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 config := android.TestArchConfig(buildDir, nil, bp, fs)
178 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
179 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
180 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
181 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
182 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
183 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
184
185 for _, handler := range handlers {
186 // The fs now needs to be populated before creating the config, call handlers twice
187 // for now, earlier to get any fs changes, and now after the config was created to
188 // set product variables or targets.
189 tempFS := map[string][]byte{}
190 handler(tempFS, config)
191 }
192
193 ctx := android.NewTestArchContext()
194 ctx.RegisterModuleType("apex", BundleFactory)
195 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
196 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
197 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
198 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
199 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
200 ctx.RegisterModuleType("override_apex", overrideApexFactory)
201
Jooyung Hana57af4a2020-01-23 05:36:59 +0000202 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
203 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
204
Paul Duffin77980a82019-12-19 16:01:36 +0000205 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800206 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800207 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
208 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800209 ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000210 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800211 ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800212 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000213 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000214 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000215 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900216 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800217
Colin Cross98be1bb2019-12-13 20:41:13 -0800218 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800219 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800220
221 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222
Jooyung Han5c998b92019-06-27 11:30:33 +0900223 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900224}
225
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700226func setUp() {
227 var err error
228 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900229 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700230 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900231 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900232}
233
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700234func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235 os.RemoveAll(buildDir)
236}
237
238// ensure that 'result' contains 'expected'
239func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900240 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900241 if !strings.Contains(result, expected) {
242 t.Errorf("%q is not found in %q", expected, result)
243 }
244}
245
246// ensures that 'result' does not contain 'notExpected'
247func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900248 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 if strings.Contains(result, notExpected) {
250 t.Errorf("%q is found in %q", notExpected, result)
251 }
252}
253
254func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900255 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900256 if !android.InList(expected, result) {
257 t.Errorf("%q is not found in %v", expected, result)
258 }
259}
260
261func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if android.InList(notExpected, result) {
264 t.Errorf("%q is found in %v", notExpected, result)
265 }
266}
267
Jooyung Hane1633032019-08-01 17:41:43 +0900268func ensureListEmpty(t *testing.T, result []string) {
269 t.Helper()
270 if len(result) > 0 {
271 t.Errorf("%q is expected to be empty", result)
272 }
273}
274
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275// Minimal test
276func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700277 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900278 apex_defaults {
279 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900280 manifest: ":myapex.manifest",
281 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 key: "myapex.key",
283 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800284 multilib: {
285 both: {
286 binaries: ["foo",],
287 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900288 },
Jooyung Han5a80d9f2019-12-23 15:38:34 +0900289 java_libs: ["myjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 }
291
Jiyong Park30ca9372019-02-07 16:27:23 +0900292 apex {
293 name: "myapex",
294 defaults: ["myapex-defaults"],
295 }
296
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297 apex_key {
298 name: "myapex.key",
299 public_key: "testkey.avbpubkey",
300 private_key: "testkey.pem",
301 }
302
Jiyong Park809bb722019-02-13 21:33:49 +0900303 filegroup {
304 name: "myapex.manifest",
305 srcs: ["apex_manifest.json"],
306 }
307
308 filegroup {
309 name: "myapex.androidmanifest",
310 srcs: ["AndroidManifest.xml"],
311 }
312
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 cc_library {
314 name: "mylib",
315 srcs: ["mylib.cpp"],
316 shared_libs: ["mylib2"],
317 system_shared_libs: [],
318 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000319 // TODO: remove //apex_available:platform
320 apex_available: [
321 "//apex_available:platform",
322 "myapex",
323 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900324 }
325
Alex Light3d673592019-01-18 14:37:31 -0800326 cc_binary {
327 name: "foo",
328 srcs: ["mylib.cpp"],
329 compile_multilib: "both",
330 multilib: {
331 lib32: {
332 suffix: "32",
333 },
334 lib64: {
335 suffix: "64",
336 },
337 },
338 symlinks: ["foo_link_"],
339 symlink_preferred_arch: true,
340 system_shared_libs: [],
341 static_executable: true,
342 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000343 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800344 }
345
Paul Duffin3766cb72020-04-07 15:25:44 +0100346 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900347 name: "mylib2",
348 srcs: ["mylib.cpp"],
349 system_shared_libs: [],
350 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900351 notice: "custom_notice",
Jiyong Park162e8442020-03-17 19:16:40 +0900352 static_libs: ["libstatic"],
353 // TODO: remove //apex_available:platform
354 apex_available: [
355 "//apex_available:platform",
356 "myapex",
357 ],
358 }
359
Paul Duffin3766cb72020-04-07 15:25:44 +0100360 cc_prebuilt_library_shared {
361 name: "mylib2",
362 srcs: ["prebuilt.so"],
363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
368 }
369
Jiyong Park162e8442020-03-17 19:16:40 +0900370 cc_library_static {
371 name: "libstatic",
372 srcs: ["mylib.cpp"],
373 system_shared_libs: [],
374 stl: "none",
375 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000376 // TODO: remove //apex_available:platform
377 apex_available: [
378 "//apex_available:platform",
379 "myapex",
380 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900381 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900382
383 java_library {
384 name: "myjar",
385 srcs: ["foo/bar/MyClass.java"],
386 sdk_version: "none",
387 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900388 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900389 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000390 // TODO: remove //apex_available:platform
391 apex_available: [
392 "//apex_available:platform",
393 "myapex",
394 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900395 }
396
397 java_library {
398 name: "myotherjar",
399 srcs: ["foo/bar/MyClass.java"],
400 sdk_version: "none",
401 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900402 // TODO: remove //apex_available:platform
403 apex_available: [
404 "//apex_available:platform",
405 "myapex",
406 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900407 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900408
409 java_library {
410 name: "mysharedjar",
411 srcs: ["foo/bar/MyClass.java"],
412 sdk_version: "none",
413 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900414 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900415 `)
416
Sundong Ahnabb64432019-10-22 13:58:29 +0900417 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900418
419 optFlags := apexRule.Args["opt_flags"]
420 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700421 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900422 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900423
Jiyong Park25fc6a92018-11-18 18:02:45 +0900424 copyCmds := apexRule.Args["copy_commands"]
425
426 // Ensure that main rule creates an output
427 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
428
429 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800430 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900431 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900432
433 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800434 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900435 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900436
437 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800438 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
439 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900440 ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
441 // .. but not for java libs
442 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900443 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800444
Colin Cross7113d202019-11-20 16:39:12 -0800445 // Ensure that the platform variant ends with _shared or _common
446 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
447 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900448 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
449 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900450 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
451
452 // Ensure that dynamic dependency to java libs are not included
453 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800454
455 // Ensure that all symlinks are present.
456 found_foo_link_64 := false
457 found_foo := false
458 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900459 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800460 if strings.HasSuffix(cmd, "bin/foo") {
461 found_foo = true
462 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
463 found_foo_link_64 = true
464 }
465 }
466 }
467 good := found_foo && found_foo_link_64
468 if !good {
469 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
470 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900471
Sundong Ahnabb64432019-10-22 13:58:29 +0900472 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700473 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park162e8442020-03-17 19:16:40 +0900474 if len(noticeInputs) != 3 {
475 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900476 }
477 ensureListContains(t, noticeInputs, "NOTICE")
478 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park162e8442020-03-17 19:16:40 +0900479 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900480
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100481 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
482 ensureListContains(t, fullDepsInfo, "myjar <- myapex")
483 ensureListContains(t, fullDepsInfo, "mylib <- myapex")
484 ensureListContains(t, fullDepsInfo, "mylib2 <- mylib")
485 ensureListContains(t, fullDepsInfo, "myotherjar <- myjar")
486 ensureListContains(t, fullDepsInfo, "mysharedjar (external) <- myjar")
487
488 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
489 ensureListContains(t, flatDepsInfo, " myjar")
490 ensureListContains(t, flatDepsInfo, " mylib")
491 ensureListContains(t, flatDepsInfo, " mylib2")
492 ensureListContains(t, flatDepsInfo, " myotherjar")
493 ensureListContains(t, flatDepsInfo, " mysharedjar (external)")
Alex Light5098a612018-11-29 17:12:15 -0800494}
495
Jooyung Hanf21c7972019-12-16 22:32:06 +0900496func TestDefaults(t *testing.T) {
497 ctx, _ := testApex(t, `
498 apex_defaults {
499 name: "myapex-defaults",
500 key: "myapex.key",
501 prebuilts: ["myetc"],
502 native_shared_libs: ["mylib"],
503 java_libs: ["myjar"],
504 apps: ["AppFoo"],
505 }
506
507 prebuilt_etc {
508 name: "myetc",
509 src: "myprebuilt",
510 }
511
512 apex {
513 name: "myapex",
514 defaults: ["myapex-defaults"],
515 }
516
517 apex_key {
518 name: "myapex.key",
519 public_key: "testkey.avbpubkey",
520 private_key: "testkey.pem",
521 }
522
523 cc_library {
524 name: "mylib",
525 system_shared_libs: [],
526 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000527 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900528 }
529
530 java_library {
531 name: "myjar",
532 srcs: ["foo/bar/MyClass.java"],
533 sdk_version: "none",
534 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000535 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900536 }
537
538 android_app {
539 name: "AppFoo",
540 srcs: ["foo/bar/MyClass.java"],
541 sdk_version: "none",
542 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000543 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900544 }
545 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000546 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900547 "etc/myetc",
548 "javalib/myjar.jar",
549 "lib64/mylib.so",
550 "app/AppFoo/AppFoo.apk",
551 })
552}
553
Jooyung Han01a3ee22019-11-02 02:52:25 +0900554func TestApexManifest(t *testing.T) {
555 ctx, _ := testApex(t, `
556 apex {
557 name: "myapex",
558 key: "myapex.key",
559 }
560
561 apex_key {
562 name: "myapex.key",
563 public_key: "testkey.avbpubkey",
564 private_key: "testkey.pem",
565 }
566 `)
567
568 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900569 args := module.Rule("apexRule").Args
570 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
571 t.Error("manifest should be apex_manifest.pb, but " + manifest)
572 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900573}
574
Alex Light5098a612018-11-29 17:12:15 -0800575func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700576 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800577 apex {
578 name: "myapex",
579 key: "myapex.key",
580 payload_type: "zip",
581 native_shared_libs: ["mylib"],
582 }
583
584 apex_key {
585 name: "myapex.key",
586 public_key: "testkey.avbpubkey",
587 private_key: "testkey.pem",
588 }
589
590 cc_library {
591 name: "mylib",
592 srcs: ["mylib.cpp"],
593 shared_libs: ["mylib2"],
594 system_shared_libs: [],
595 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000596 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800597 }
598
599 cc_library {
600 name: "mylib2",
601 srcs: ["mylib.cpp"],
602 system_shared_libs: [],
603 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000604 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800605 }
606 `)
607
Sundong Ahnabb64432019-10-22 13:58:29 +0900608 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800609 copyCmds := zipApexRule.Args["copy_commands"]
610
611 // Ensure that main rule creates an output
612 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
613
614 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800615 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800616
617 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800618 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800619
620 // Ensure that both direct and indirect deps are copied into apex
621 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
622 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900623}
624
625func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700626 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900627 apex {
628 name: "myapex",
629 key: "myapex.key",
630 native_shared_libs: ["mylib", "mylib3"],
631 }
632
633 apex_key {
634 name: "myapex.key",
635 public_key: "testkey.avbpubkey",
636 private_key: "testkey.pem",
637 }
638
639 cc_library {
640 name: "mylib",
641 srcs: ["mylib.cpp"],
642 shared_libs: ["mylib2", "mylib3"],
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900646 }
647
648 cc_library {
649 name: "mylib2",
650 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900651 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900652 system_shared_libs: [],
653 stl: "none",
654 stubs: {
655 versions: ["1", "2", "3"],
656 },
657 }
658
659 cc_library {
660 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900661 srcs: ["mylib.cpp"],
662 shared_libs: ["mylib4"],
663 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900664 stl: "none",
665 stubs: {
666 versions: ["10", "11", "12"],
667 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000668 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900669 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900670
671 cc_library {
672 name: "mylib4",
673 srcs: ["mylib.cpp"],
674 system_shared_libs: [],
675 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000676 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900677 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900678 `)
679
Sundong Ahnabb64432019-10-22 13:58:29 +0900680 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900681 copyCmds := apexRule.Args["copy_commands"]
682
683 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800684 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900685
686 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800687 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900688
689 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800690 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900691
Colin Cross7113d202019-11-20 16:39:12 -0800692 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900693
694 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900695 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900696 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900697 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900698
699 // 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 -0800700 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900701 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800702 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900703
704 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900705 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900706 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900707
708 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900709 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900710
Jooyung Hana57af4a2020-01-23 05:36:59 +0000711 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900712 "lib64/mylib.so",
713 "lib64/mylib3.so",
714 "lib64/mylib4.so",
715 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900716}
717
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900718func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700719 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900720 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900721 name: "myapex2",
722 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900723 native_shared_libs: ["mylib"],
724 }
725
726 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900727 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900728 public_key: "testkey.avbpubkey",
729 private_key: "testkey.pem",
730 }
731
732 cc_library {
733 name: "mylib",
734 srcs: ["mylib.cpp"],
735 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900736 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900737 system_shared_libs: [],
738 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000739 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900740 }
741
742 cc_library {
743 name: "libfoo",
744 srcs: ["mylib.cpp"],
745 shared_libs: ["libbar"],
746 system_shared_libs: [],
747 stl: "none",
748 stubs: {
749 versions: ["10", "20", "30"],
750 },
751 }
752
753 cc_library {
754 name: "libbar",
755 srcs: ["mylib.cpp"],
756 system_shared_libs: [],
757 stl: "none",
758 }
759
Jiyong Park678c8812020-02-07 17:25:49 +0900760 cc_library_static {
761 name: "libbaz",
762 srcs: ["mylib.cpp"],
763 system_shared_libs: [],
764 stl: "none",
765 apex_available: [ "myapex2" ],
766 }
767
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900768 `)
769
Jiyong Park83dc74b2020-01-14 18:38:44 +0900770 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900771 copyCmds := apexRule.Args["copy_commands"]
772
773 // Ensure that direct non-stubs dep is always included
774 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
775
776 // Ensure that indirect stubs dep is not included
777 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
778
779 // Ensure that dependency of stubs is not included
780 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
781
Jiyong Park83dc74b2020-01-14 18:38:44 +0900782 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900783
784 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900785 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900786 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900787 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900788
Jiyong Park3ff16992019-12-27 14:11:47 +0900789 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900790
791 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
792 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900793
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100794 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
795 ensureListContains(t, fullDepsInfo, "mylib <- myapex2")
796 ensureListContains(t, fullDepsInfo, "libbaz <- mylib")
797 ensureListContains(t, fullDepsInfo, "libfoo (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900798
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100799 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
800 ensureListContains(t, flatDepsInfo, " mylib")
801 ensureListContains(t, flatDepsInfo, " libbaz")
802 ensureListContains(t, flatDepsInfo, " libfoo (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900803}
804
Jooyung Hand3639552019-08-09 12:57:43 +0900805func TestApexWithRuntimeLibsDependency(t *testing.T) {
806 /*
807 myapex
808 |
809 v (runtime_libs)
810 mylib ------+------> libfoo [provides stub]
811 |
812 `------> libbar
813 */
814 ctx, _ := testApex(t, `
815 apex {
816 name: "myapex",
817 key: "myapex.key",
818 native_shared_libs: ["mylib"],
819 }
820
821 apex_key {
822 name: "myapex.key",
823 public_key: "testkey.avbpubkey",
824 private_key: "testkey.pem",
825 }
826
827 cc_library {
828 name: "mylib",
829 srcs: ["mylib.cpp"],
830 runtime_libs: ["libfoo", "libbar"],
831 system_shared_libs: [],
832 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000833 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900834 }
835
836 cc_library {
837 name: "libfoo",
838 srcs: ["mylib.cpp"],
839 system_shared_libs: [],
840 stl: "none",
841 stubs: {
842 versions: ["10", "20", "30"],
843 },
844 }
845
846 cc_library {
847 name: "libbar",
848 srcs: ["mylib.cpp"],
849 system_shared_libs: [],
850 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000851 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900852 }
853
854 `)
855
Sundong Ahnabb64432019-10-22 13:58:29 +0900856 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900857 copyCmds := apexRule.Args["copy_commands"]
858
859 // Ensure that direct non-stubs dep is always included
860 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
861
862 // Ensure that indirect stubs dep is not included
863 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
864
865 // Ensure that runtime_libs dep in included
866 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
867
Sundong Ahnabb64432019-10-22 13:58:29 +0900868 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900869 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
870 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900871
872}
873
Jooyung Han67a96cd2020-03-13 15:23:36 +0900874func TestApexDependsOnLLNDKTransitively(t *testing.T) {
875 testcases := []struct {
876 name string
877 minSdkVersion string
878 shouldLink string
879 shouldNotLink []string
880 }{
881 {
Jooyung Han74066602020-03-20 04:29:24 +0900882 name: "should link to the latest",
Jooyung Han67a96cd2020-03-13 15:23:36 +0900883 minSdkVersion: "current",
884 shouldLink: "30",
885 shouldNotLink: []string{"29"},
886 },
887 {
888 name: "should link to llndk#29",
889 minSdkVersion: "29",
890 shouldLink: "29",
891 shouldNotLink: []string{"30"},
892 },
893 }
894 for _, tc := range testcases {
895 t.Run(tc.name, func(t *testing.T) {
896 ctx, _ := testApex(t, `
897 apex {
898 name: "myapex",
899 key: "myapex.key",
900 use_vendor: true,
901 native_shared_libs: ["mylib"],
902 min_sdk_version: "`+tc.minSdkVersion+`",
903 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900904
Jooyung Han67a96cd2020-03-13 15:23:36 +0900905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900910
Jooyung Han67a96cd2020-03-13 15:23:36 +0900911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
914 vendor_available: true,
915 shared_libs: ["libbar"],
916 system_shared_libs: [],
917 stl: "none",
918 apex_available: [ "myapex" ],
919 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900920
Jooyung Han67a96cd2020-03-13 15:23:36 +0900921 cc_library {
922 name: "libbar",
923 srcs: ["mylib.cpp"],
924 system_shared_libs: [],
925 stl: "none",
926 stubs: { versions: ["29","30"] },
927 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900928
Jooyung Han67a96cd2020-03-13 15:23:36 +0900929 llndk_library {
930 name: "libbar",
931 symbol_file: "",
932 }
933 `, func(fs map[string][]byte, config android.Config) {
934 setUseVendorWhitelistForTest(config, []string{"myapex"})
935 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +0900936
Jooyung Han67a96cd2020-03-13 15:23:36 +0900937 // Ensure that LLNDK dep is not included
938 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
939 "lib64/mylib.so",
940 })
Jooyung Han9c80bae2019-08-20 17:30:57 +0900941
Jooyung Han67a96cd2020-03-13 15:23:36 +0900942 // Ensure that LLNDK dep is required
943 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
944 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
945 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +0900946
Jooyung Han67a96cd2020-03-13 15:23:36 +0900947 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
948 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
949 for _, ver := range tc.shouldNotLink {
950 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
951 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900952
Jooyung Han67a96cd2020-03-13 15:23:36 +0900953 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
954 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
955 })
956 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900957}
958
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700960 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961 apex {
962 name: "myapex",
963 key: "myapex.key",
964 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
965 }
966
967 apex_key {
968 name: "myapex.key",
969 public_key: "testkey.avbpubkey",
970 private_key: "testkey.pem",
971 }
972
973 cc_library {
974 name: "mylib",
975 srcs: ["mylib.cpp"],
976 shared_libs: ["libdl#27"],
977 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000978 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900979 }
980
981 cc_library_shared {
982 name: "mylib_shared",
983 srcs: ["mylib.cpp"],
984 shared_libs: ["libdl#27"],
985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000986 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987 }
988
989 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +0900990 name: "libBootstrap",
991 srcs: ["mylib.cpp"],
992 stl: "none",
993 bootstrap: true,
994 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900995 `)
996
Sundong Ahnabb64432019-10-22 13:58:29 +0900997 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900998 copyCmds := apexRule.Args["copy_commands"]
999
1000 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001002 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1003 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001006 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007
Colin Cross7113d202019-11-20 16:39:12 -08001008 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1009 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1010 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011
1012 // For dependency to libc
1013 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001014 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001015 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001016 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001017 // ... Cflags from stub is correctly exported to mylib
1018 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1019 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1020
1021 // For dependency to libm
1022 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001023 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001024 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001025 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001026 // ... and is not compiling with the stub
1027 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1028 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1029
1030 // For dependency to libdl
1031 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001032 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001033 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001034 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1035 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001036 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001037 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001038 // ... Cflags from stub is correctly exported to mylib
1039 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1040 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001041
1042 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001043 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1044 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1045 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1046 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001047}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001048
Jooyung Han0c4e0162020-02-26 22:45:42 +09001049func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1050 // there are three links between liba --> libz
1051 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1052 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1053 // 3) (platform) -> liba -> libz : this should be non-stub link
1054 ctx, _ := testApex(t, `
1055 apex {
1056 name: "myapex",
1057 key: "myapex.key",
1058 native_shared_libs: ["libx"],
1059 min_sdk_version: "2",
1060 }
1061
1062 apex {
1063 name: "otherapex",
1064 key: "myapex.key",
1065 native_shared_libs: ["liby"],
1066 min_sdk_version: "3",
1067 }
1068
1069 apex_key {
1070 name: "myapex.key",
1071 public_key: "testkey.avbpubkey",
1072 private_key: "testkey.pem",
1073 }
1074
1075 cc_library {
1076 name: "libx",
1077 shared_libs: ["liba"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 apex_available: [ "myapex" ],
1081 }
1082
1083 cc_library {
1084 name: "liby",
1085 shared_libs: ["liba"],
1086 system_shared_libs: [],
1087 stl: "none",
1088 apex_available: [ "otherapex" ],
1089 }
1090
1091 cc_library {
1092 name: "liba",
1093 shared_libs: ["libz"],
1094 system_shared_libs: [],
1095 stl: "none",
1096 apex_available: [
1097 "//apex_available:anyapex",
1098 "//apex_available:platform",
1099 ],
1100 }
1101
1102 cc_library {
1103 name: "libz",
1104 system_shared_libs: [],
1105 stl: "none",
1106 stubs: {
1107 versions: ["1", "3"],
1108 },
1109 }
1110 `, withUnbundledBuild)
1111
1112 expectLink := func(from, from_variant, to, to_variant string) {
1113 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1114 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1115 }
1116 expectNoLink := func(from, from_variant, to, to_variant string) {
1117 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1118 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1119 }
1120 // platform liba is linked to non-stub version
1121 expectLink("liba", "shared", "libz", "shared")
1122 // liba in myapex is linked to #1
1123 expectLink("liba", "shared_myapex", "libz", "shared_1")
1124 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1125 expectNoLink("liba", "shared_myapex", "libz", "shared")
1126 // liba in otherapex is linked to #3
1127 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1128 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1129 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1130}
1131
Jooyung Han29e91d22020-04-02 01:41:41 +09001132func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1133 ctx, _ := testApex(t, `
1134 apex {
1135 name: "myapex",
1136 key: "myapex.key",
1137 native_shared_libs: ["libx"],
1138 min_sdk_version: "R",
1139 }
1140
1141 apex_key {
1142 name: "myapex.key",
1143 public_key: "testkey.avbpubkey",
1144 private_key: "testkey.pem",
1145 }
1146
1147 cc_library {
1148 name: "libx",
1149 shared_libs: ["libz"],
1150 system_shared_libs: [],
1151 stl: "none",
1152 apex_available: [ "myapex" ],
1153 }
1154
1155 cc_library {
1156 name: "libz",
1157 system_shared_libs: [],
1158 stl: "none",
1159 stubs: {
1160 versions: ["29", "R"],
1161 },
1162 }
1163 `, func(fs map[string][]byte, config android.Config) {
1164 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1165 })
1166
1167 expectLink := func(from, from_variant, to, to_variant string) {
1168 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1169 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1170 }
1171 expectNoLink := func(from, from_variant, to, to_variant string) {
1172 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1173 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1174 }
1175 // 9000 is quite a magic number.
1176 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1177 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1178 // to distinguish them from finalized and future_api(10000)
1179 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1180 // (refer android/api_levels.go)
1181 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1182 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1183 expectNoLink("libx", "shared_myapex", "libz", "shared")
1184}
1185
Jooyung Han0c4e0162020-02-26 22:45:42 +09001186func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1187 ctx, _ := testApex(t, `
1188 apex {
1189 name: "myapex",
1190 key: "myapex.key",
1191 native_shared_libs: ["libx"],
1192 }
1193
1194 apex_key {
1195 name: "myapex.key",
1196 public_key: "testkey.avbpubkey",
1197 private_key: "testkey.pem",
1198 }
1199
1200 cc_library {
1201 name: "libx",
1202 shared_libs: ["libz"],
1203 system_shared_libs: [],
1204 stl: "none",
1205 apex_available: [ "myapex" ],
1206 }
1207
1208 cc_library {
1209 name: "libz",
1210 system_shared_libs: [],
1211 stl: "none",
1212 stubs: {
1213 versions: ["1", "2"],
1214 },
1215 }
1216 `)
1217
1218 expectLink := func(from, from_variant, to, to_variant string) {
1219 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1220 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1221 }
1222 expectNoLink := func(from, from_variant, to, to_variant string) {
1223 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1224 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1225 }
1226 expectLink("libx", "shared_myapex", "libz", "shared_2")
1227 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1228 expectNoLink("libx", "shared_myapex", "libz", "shared")
1229}
1230
1231func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1232 ctx, _ := testApex(t, `
1233 apex {
1234 name: "myapex",
1235 key: "myapex.key",
1236 native_shared_libs: ["libx"],
1237 }
1238
1239 apex_key {
1240 name: "myapex.key",
1241 public_key: "testkey.avbpubkey",
1242 private_key: "testkey.pem",
1243 }
1244
1245 cc_library {
1246 name: "libx",
1247 system_shared_libs: [],
1248 stl: "none",
1249 apex_available: [ "myapex" ],
1250 stubs: {
1251 versions: ["1", "2"],
1252 },
1253 }
1254
1255 cc_library {
1256 name: "libz",
1257 shared_libs: ["libx"],
1258 system_shared_libs: [],
1259 stl: "none",
1260 }
1261 `)
1262
1263 expectLink := func(from, from_variant, to, to_variant string) {
1264 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1265 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1266 }
1267 expectNoLink := func(from, from_variant, to, to_variant string) {
1268 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1269 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1270 }
1271 expectLink("libz", "shared", "libx", "shared_2")
1272 expectNoLink("libz", "shared", "libz", "shared_1")
1273 expectNoLink("libz", "shared", "libz", "shared")
1274}
1275
Jooyung Han74066602020-03-20 04:29:24 +09001276func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han0c4e0162020-02-26 22:45:42 +09001277 ctx, _ := testApex(t, `
1278 apex {
1279 name: "myapex",
1280 key: "myapex.key",
1281 native_shared_libs: ["libx"],
1282 min_sdk_version: "29",
1283 }
1284
1285 apex_key {
1286 name: "myapex.key",
1287 public_key: "testkey.avbpubkey",
1288 private_key: "testkey.pem",
1289 }
1290
1291 cc_library {
1292 name: "libx",
1293 shared_libs: ["libbar"],
1294 apex_available: [ "myapex" ],
1295 }
1296
1297 cc_library {
1298 name: "libbar",
1299 stubs: {
1300 versions: ["29", "30"],
1301 },
1302 }
Jooyung Han74066602020-03-20 04:29:24 +09001303 `, func(fs map[string][]byte, config android.Config) {
1304 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1305 })
Jooyung Han0c4e0162020-02-26 22:45:42 +09001306 expectLink := func(from, from_variant, to, to_variant string) {
1307 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1308 libFlags := ld.Args["libFlags"]
1309 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1310 }
Jooyung Han74066602020-03-20 04:29:24 +09001311 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han0c4e0162020-02-26 22:45:42 +09001312}
1313
Jooyung Han74066602020-03-20 04:29:24 +09001314func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han0c4e0162020-02-26 22:45:42 +09001315 ctx, _ := testApex(t, `
1316 apex {
1317 name: "myapex",
1318 key: "myapex.key",
1319 native_shared_libs: ["libx"],
1320 min_sdk_version: "29",
1321 }
1322
1323 apex_key {
1324 name: "myapex.key",
1325 public_key: "testkey.avbpubkey",
1326 private_key: "testkey.pem",
1327 }
1328
1329 cc_library {
1330 name: "libx",
1331 apex_available: [ "myapex" ],
1332 }
Jooyung Han74066602020-03-20 04:29:24 +09001333 `)
Jooyung Han0c4e0162020-02-26 22:45:42 +09001334
1335 // ensure apex variant of c++ is linked with static unwinder
1336 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1337 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1338 // note that platform variant is not.
1339 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1340 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han0c4e0162020-02-26 22:45:42 +09001341}
1342
1343func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han74066602020-03-20 04:29:24 +09001344 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han0c4e0162020-02-26 22:45:42 +09001345 apex {
1346 name: "myapex",
1347 key: "myapex.key",
1348 native_shared_libs: ["libx"],
1349 min_sdk_version: "29",
1350 }
1351
1352 apex_key {
1353 name: "myapex.key",
1354 public_key: "testkey.avbpubkey",
1355 private_key: "testkey.pem",
1356 }
1357
1358 cc_library {
1359 name: "libx",
1360 shared_libs: ["libz"],
1361 system_shared_libs: [],
1362 stl: "none",
1363 apex_available: [ "myapex" ],
1364 }
1365
1366 cc_library {
1367 name: "libz",
1368 system_shared_libs: [],
1369 stl: "none",
1370 stubs: {
1371 versions: ["30"],
1372 },
1373 }
Jooyung Han74066602020-03-20 04:29:24 +09001374 `)
Jooyung Han0c4e0162020-02-26 22:45:42 +09001375
Jooyung Han29e91d22020-04-02 01:41:41 +09001376 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han0c4e0162020-02-26 22:45:42 +09001377 apex {
1378 name: "myapex",
1379 key: "myapex.key",
Jooyung Han29e91d22020-04-02 01:41:41 +09001380 min_sdk_version: "abc",
Jooyung Han0c4e0162020-02-26 22:45:42 +09001381 }
1382
1383 apex_key {
1384 name: "myapex.key",
1385 public_key: "testkey.avbpubkey",
1386 private_key: "testkey.pem",
1387 }
1388 `)
1389}
1390
Artur Satayev2eedf622020-04-15 17:29:42 +01001391func TestJavaStableSdkVersion(t *testing.T) {
1392 testCases := []struct {
1393 name string
1394 expectedError string
1395 bp string
1396 }{
1397 {
1398 name: "Non-updatable apex with non-stable dep",
1399 bp: `
1400 apex {
1401 name: "myapex",
1402 java_libs: ["myjar"],
1403 key: "myapex.key",
1404 }
1405 apex_key {
1406 name: "myapex.key",
1407 public_key: "testkey.avbpubkey",
1408 private_key: "testkey.pem",
1409 }
1410 java_library {
1411 name: "myjar",
1412 srcs: ["foo/bar/MyClass.java"],
1413 sdk_version: "core_platform",
1414 apex_available: ["myapex"],
1415 }
1416 `,
1417 },
1418 {
1419 name: "Updatable apex with stable dep",
1420 bp: `
1421 apex {
1422 name: "myapex",
1423 java_libs: ["myjar"],
1424 key: "myapex.key",
1425 updatable: true,
1426 min_sdk_version: "29",
1427 }
1428 apex_key {
1429 name: "myapex.key",
1430 public_key: "testkey.avbpubkey",
1431 private_key: "testkey.pem",
1432 }
1433 java_library {
1434 name: "myjar",
1435 srcs: ["foo/bar/MyClass.java"],
1436 sdk_version: "current",
1437 apex_available: ["myapex"],
1438 }
1439 `,
1440 },
1441 {
1442 name: "Updatable apex with non-stable dep",
1443 expectedError: "cannot depend on \"myjar\"",
1444 bp: `
1445 apex {
1446 name: "myapex",
1447 java_libs: ["myjar"],
1448 key: "myapex.key",
1449 updatable: true,
1450 }
1451 apex_key {
1452 name: "myapex.key",
1453 public_key: "testkey.avbpubkey",
1454 private_key: "testkey.pem",
1455 }
1456 java_library {
1457 name: "myjar",
1458 srcs: ["foo/bar/MyClass.java"],
1459 sdk_version: "core_platform",
1460 apex_available: ["myapex"],
1461 }
1462 `,
1463 },
1464 {
1465 name: "Updatable apex with non-stable transitive dep",
1466 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1467 bp: `
1468 apex {
1469 name: "myapex",
1470 java_libs: ["myjar"],
1471 key: "myapex.key",
1472 updatable: true,
1473 }
1474 apex_key {
1475 name: "myapex.key",
1476 public_key: "testkey.avbpubkey",
1477 private_key: "testkey.pem",
1478 }
1479 java_library {
1480 name: "myjar",
1481 srcs: ["foo/bar/MyClass.java"],
1482 sdk_version: "current",
1483 apex_available: ["myapex"],
1484 static_libs: ["transitive-jar"],
1485 }
1486 java_library {
1487 name: "transitive-jar",
1488 srcs: ["foo/bar/MyClass.java"],
1489 sdk_version: "core_platform",
1490 apex_available: ["myapex"],
1491 }
1492 `,
1493 },
1494 }
1495
1496 for _, test := range testCases {
1497 t.Run(test.name, func(t *testing.T) {
1498 if test.expectedError == "" {
1499 testApex(t, test.bp)
1500 } else {
1501 testApexError(t, test.expectedError, test.bp)
1502 }
1503 })
1504 }
1505}
1506
Jiyong Park7c2ee712018-12-07 00:42:25 +09001507func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001508 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001509 apex {
1510 name: "myapex",
1511 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001512 native_shared_libs: ["mylib"],
1513 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001514 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001515 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001516 }
1517
1518 apex_key {
1519 name: "myapex.key",
1520 public_key: "testkey.avbpubkey",
1521 private_key: "testkey.pem",
1522 }
1523
1524 prebuilt_etc {
1525 name: "myetc",
1526 src: "myprebuilt",
1527 sub_dir: "foo/bar",
1528 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001529
1530 cc_library {
1531 name: "mylib",
1532 srcs: ["mylib.cpp"],
1533 relative_install_path: "foo/bar",
1534 system_shared_libs: [],
1535 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001536 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001537 }
1538
1539 cc_binary {
1540 name: "mybin",
1541 srcs: ["mylib.cpp"],
1542 relative_install_path: "foo/bar",
1543 system_shared_libs: [],
1544 static_executable: true,
1545 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001546 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001547 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001548 `)
1549
Sundong Ahnabb64432019-10-22 13:58:29 +09001550 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001551 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1552
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001553 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001554 ensureListContains(t, dirs, "etc")
1555 ensureListContains(t, dirs, "etc/foo")
1556 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001557 ensureListContains(t, dirs, "lib64")
1558 ensureListContains(t, dirs, "lib64/foo")
1559 ensureListContains(t, dirs, "lib64/foo/bar")
1560 ensureListContains(t, dirs, "lib")
1561 ensureListContains(t, dirs, "lib/foo")
1562 ensureListContains(t, dirs, "lib/foo/bar")
1563
Jiyong Parkbd13e442019-03-15 18:10:35 +09001564 ensureListContains(t, dirs, "bin")
1565 ensureListContains(t, dirs, "bin/foo")
1566 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001567}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001568
1569func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001570 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001571 apex {
1572 name: "myapex",
1573 key: "myapex.key",
1574 native_shared_libs: ["mylib"],
1575 use_vendor: true,
1576 }
1577
1578 apex_key {
1579 name: "myapex.key",
1580 public_key: "testkey.avbpubkey",
1581 private_key: "testkey.pem",
1582 }
1583
1584 cc_library {
1585 name: "mylib",
1586 srcs: ["mylib.cpp"],
1587 shared_libs: ["mylib2"],
1588 system_shared_libs: [],
1589 vendor_available: true,
1590 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001591 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001592 }
1593
1594 cc_library {
1595 name: "mylib2",
1596 srcs: ["mylib.cpp"],
1597 system_shared_libs: [],
1598 vendor_available: true,
1599 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001600 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001601 }
Jooyung Handc782442019-11-01 03:14:38 +09001602 `, func(fs map[string][]byte, config android.Config) {
1603 setUseVendorWhitelistForTest(config, []string{"myapex"})
1604 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001605
1606 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001607 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001608 for _, implicit := range i.Implicits {
1609 inputsList = append(inputsList, implicit.String())
1610 }
1611 }
1612 inputsString := strings.Join(inputsList, " ")
1613
1614 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001615 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1616 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001617
1618 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001619 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1620 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001621}
Jiyong Park16e91a02018-12-20 18:18:08 +09001622
Jooyung Handc782442019-11-01 03:14:38 +09001623func TestUseVendorRestriction(t *testing.T) {
1624 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1625 apex {
1626 name: "myapex",
1627 key: "myapex.key",
1628 use_vendor: true,
1629 }
1630 apex_key {
1631 name: "myapex.key",
1632 public_key: "testkey.avbpubkey",
1633 private_key: "testkey.pem",
1634 }
1635 `, func(fs map[string][]byte, config android.Config) {
1636 setUseVendorWhitelistForTest(config, []string{""})
1637 })
1638 // no error with whitelist
1639 testApex(t, `
1640 apex {
1641 name: "myapex",
1642 key: "myapex.key",
1643 use_vendor: true,
1644 }
1645 apex_key {
1646 name: "myapex.key",
1647 public_key: "testkey.avbpubkey",
1648 private_key: "testkey.pem",
1649 }
1650 `, func(fs map[string][]byte, config android.Config) {
1651 setUseVendorWhitelistForTest(config, []string{"myapex"})
1652 })
1653}
1654
Jooyung Han5c998b92019-06-27 11:30:33 +09001655func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1656 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1657 apex {
1658 name: "myapex",
1659 key: "myapex.key",
1660 native_shared_libs: ["mylib"],
1661 use_vendor: true,
1662 }
1663
1664 apex_key {
1665 name: "myapex.key",
1666 public_key: "testkey.avbpubkey",
1667 private_key: "testkey.pem",
1668 }
1669
1670 cc_library {
1671 name: "mylib",
1672 srcs: ["mylib.cpp"],
1673 system_shared_libs: [],
1674 stl: "none",
1675 }
1676 `)
1677}
1678
Jiyong Park16e91a02018-12-20 18:18:08 +09001679func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001680 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001681 apex {
1682 name: "myapex",
1683 key: "myapex.key",
1684 native_shared_libs: ["mylib"],
1685 }
1686
1687 apex_key {
1688 name: "myapex.key",
1689 public_key: "testkey.avbpubkey",
1690 private_key: "testkey.pem",
1691 }
1692
1693 cc_library {
1694 name: "mylib",
1695 srcs: ["mylib.cpp"],
1696 system_shared_libs: [],
1697 stl: "none",
1698 stubs: {
1699 versions: ["1", "2", "3"],
1700 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001701 apex_available: [
1702 "//apex_available:platform",
1703 "myapex",
1704 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001705 }
1706
1707 cc_binary {
1708 name: "not_in_apex",
1709 srcs: ["mylib.cpp"],
1710 static_libs: ["mylib"],
1711 static_executable: true,
1712 system_shared_libs: [],
1713 stl: "none",
1714 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001715 `)
1716
Colin Cross7113d202019-11-20 16:39:12 -08001717 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001718
1719 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001720 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001721}
Jiyong Park9335a262018-12-24 11:31:58 +09001722
1723func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001724 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001725 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001726 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001727 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001728 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001729 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001730 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001731 }
1732
1733 cc_library {
1734 name: "mylib",
1735 srcs: ["mylib.cpp"],
1736 system_shared_libs: [],
1737 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001738 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001739 }
1740
1741 apex_key {
1742 name: "myapex.key",
1743 public_key: "testkey.avbpubkey",
1744 private_key: "testkey.pem",
1745 }
1746
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001747 android_app_certificate {
1748 name: "myapex.certificate",
1749 certificate: "testkey",
1750 }
1751
1752 android_app_certificate {
1753 name: "myapex.certificate.override",
1754 certificate: "testkey.override",
1755 }
1756
Jiyong Park9335a262018-12-24 11:31:58 +09001757 `)
1758
1759 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001760 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001761
1762 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1763 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1764 "vendor/foo/devkeys/testkey.avbpubkey")
1765 }
1766 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1767 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1768 "vendor/foo/devkeys/testkey.pem")
1769 }
1770
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001771 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001772 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001773 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001774 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001775 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001776 }
1777}
Jiyong Park58e364a2019-01-19 19:24:06 +09001778
Jooyung Hanf121a652019-12-17 14:30:11 +09001779func TestCertificate(t *testing.T) {
1780 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
1781 ctx, _ := testApex(t, `
1782 apex {
1783 name: "myapex",
1784 key: "myapex.key",
1785 }
1786 apex_key {
1787 name: "myapex.key",
1788 public_key: "testkey.avbpubkey",
1789 private_key: "testkey.pem",
1790 }`)
1791 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1792 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
1793 if actual := rule.Args["certificates"]; actual != expected {
1794 t.Errorf("certificates should be %q, not %q", expected, actual)
1795 }
1796 })
1797 t.Run("override when unspecified", func(t *testing.T) {
1798 ctx, _ := testApex(t, `
1799 apex {
1800 name: "myapex_keytest",
1801 key: "myapex.key",
1802 file_contexts: ":myapex-file_contexts",
1803 }
1804 apex_key {
1805 name: "myapex.key",
1806 public_key: "testkey.avbpubkey",
1807 private_key: "testkey.pem",
1808 }
1809 android_app_certificate {
1810 name: "myapex.certificate.override",
1811 certificate: "testkey.override",
1812 }`)
1813 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1814 expected := "testkey.override.x509.pem testkey.override.pk8"
1815 if actual := rule.Args["certificates"]; actual != expected {
1816 t.Errorf("certificates should be %q, not %q", expected, actual)
1817 }
1818 })
1819 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
1820 ctx, _ := testApex(t, `
1821 apex {
1822 name: "myapex",
1823 key: "myapex.key",
1824 certificate: ":myapex.certificate",
1825 }
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831 android_app_certificate {
1832 name: "myapex.certificate",
1833 certificate: "testkey",
1834 }`)
1835 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1836 expected := "testkey.x509.pem testkey.pk8"
1837 if actual := rule.Args["certificates"]; actual != expected {
1838 t.Errorf("certificates should be %q, not %q", expected, actual)
1839 }
1840 })
1841 t.Run("override when specifiec as <:module>", func(t *testing.T) {
1842 ctx, _ := testApex(t, `
1843 apex {
1844 name: "myapex_keytest",
1845 key: "myapex.key",
1846 file_contexts: ":myapex-file_contexts",
1847 certificate: ":myapex.certificate",
1848 }
1849 apex_key {
1850 name: "myapex.key",
1851 public_key: "testkey.avbpubkey",
1852 private_key: "testkey.pem",
1853 }
1854 android_app_certificate {
1855 name: "myapex.certificate.override",
1856 certificate: "testkey.override",
1857 }`)
1858 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1859 expected := "testkey.override.x509.pem testkey.override.pk8"
1860 if actual := rule.Args["certificates"]; actual != expected {
1861 t.Errorf("certificates should be %q, not %q", expected, actual)
1862 }
1863 })
1864 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
1865 ctx, _ := testApex(t, `
1866 apex {
1867 name: "myapex",
1868 key: "myapex.key",
1869 certificate: "testkey",
1870 }
1871 apex_key {
1872 name: "myapex.key",
1873 public_key: "testkey.avbpubkey",
1874 private_key: "testkey.pem",
1875 }`)
1876 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1877 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
1878 if actual := rule.Args["certificates"]; actual != expected {
1879 t.Errorf("certificates should be %q, not %q", expected, actual)
1880 }
1881 })
1882 t.Run("override when specified as <name>", func(t *testing.T) {
1883 ctx, _ := testApex(t, `
1884 apex {
1885 name: "myapex_keytest",
1886 key: "myapex.key",
1887 file_contexts: ":myapex-file_contexts",
1888 certificate: "testkey",
1889 }
1890 apex_key {
1891 name: "myapex.key",
1892 public_key: "testkey.avbpubkey",
1893 private_key: "testkey.pem",
1894 }
1895 android_app_certificate {
1896 name: "myapex.certificate.override",
1897 certificate: "testkey.override",
1898 }`)
1899 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1900 expected := "testkey.override.x509.pem testkey.override.pk8"
1901 if actual := rule.Args["certificates"]; actual != expected {
1902 t.Errorf("certificates should be %q, not %q", expected, actual)
1903 }
1904 })
1905}
1906
Jiyong Park58e364a2019-01-19 19:24:06 +09001907func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001908 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001909 apex {
1910 name: "myapex",
1911 key: "myapex.key",
Jooyung Han68e511e2020-03-02 17:44:33 +09001912 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09001913 }
1914
1915 apex {
1916 name: "otherapex",
1917 key: "myapex.key",
Jooyung Han68e511e2020-03-02 17:44:33 +09001918 native_shared_libs: ["mylib", "mylib2"],
Jooyung Han61c41542020-03-07 03:45:53 +09001919 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09001920 }
1921
1922 apex_key {
1923 name: "myapex.key",
1924 public_key: "testkey.avbpubkey",
1925 private_key: "testkey.pem",
1926 }
1927
1928 cc_library {
1929 name: "mylib",
1930 srcs: ["mylib.cpp"],
1931 system_shared_libs: [],
1932 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001933 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001934 "myapex",
1935 "otherapex",
1936 ],
Jooyung Hanc3e92632020-03-21 23:20:55 +09001937 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09001938 }
Jooyung Han68e511e2020-03-02 17:44:33 +09001939 cc_library {
1940 name: "mylib2",
1941 srcs: ["mylib.cpp"],
1942 system_shared_libs: [],
1943 stl: "none",
1944 apex_available: [
1945 "myapex",
1946 "otherapex",
1947 ],
1948 use_apex_name_macro: true,
1949 }
Jiyong Park58e364a2019-01-19 19:24:06 +09001950 `)
1951
Jooyung Han68e511e2020-03-02 17:44:33 +09001952 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08001953 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001954 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han74066602020-03-20 04:29:24 +09001955 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Han68e511e2020-03-02 17:44:33 +09001956
Jooyung Han61c41542020-03-07 03:45:53 +09001957 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Han68e511e2020-03-02 17:44:33 +09001958 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1959 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han61c41542020-03-07 03:45:53 +09001960 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09001961 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han68e511e2020-03-02 17:44:33 +09001962
Jooyung Han61c41542020-03-07 03:45:53 +09001963 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Han68e511e2020-03-02 17:44:33 +09001964 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
1965 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han61c41542020-03-07 03:45:53 +09001966 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09001967 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001968
Jooyung Han68e511e2020-03-02 17:44:33 +09001969 // When cc_library sets use_apex_name_macro: true
1970 // apex variants define additional macro to distinguish which apex variant it is built for
1971
1972 // non-APEX variant does not have __ANDROID_APEX__ defined
1973 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1974 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
1975
1976 // APEX variant has __ANDROID_APEX__ defined
1977 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001978 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001979 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1980 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001981
Jooyung Han68e511e2020-03-02 17:44:33 +09001982 // APEX variant has __ANDROID_APEX__ defined
1983 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001984 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001985 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1986 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Hanc3e92632020-03-21 23:20:55 +09001987
1988 // recovery variant does not set __ANDROID_SDK_VERSION__
1989 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1990 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
1991 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001992}
Jiyong Park7e636d02019-01-28 16:16:54 +09001993
1994func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001995 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09001996 apex {
1997 name: "myapex",
1998 key: "myapex.key",
1999 native_shared_libs: ["mylib"],
2000 }
2001
2002 apex_key {
2003 name: "myapex.key",
2004 public_key: "testkey.avbpubkey",
2005 private_key: "testkey.pem",
2006 }
2007
2008 cc_library_headers {
2009 name: "mylib_headers",
2010 export_include_dirs: ["my_include"],
2011 system_shared_libs: [],
2012 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002013 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002014 }
2015
2016 cc_library {
2017 name: "mylib",
2018 srcs: ["mylib.cpp"],
2019 system_shared_libs: [],
2020 stl: "none",
2021 header_libs: ["mylib_headers"],
2022 export_header_lib_headers: ["mylib_headers"],
2023 stubs: {
2024 versions: ["1", "2", "3"],
2025 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002026 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002027 }
2028
2029 cc_library {
2030 name: "otherlib",
2031 srcs: ["mylib.cpp"],
2032 system_shared_libs: [],
2033 stl: "none",
2034 shared_libs: ["mylib"],
2035 }
2036 `)
2037
Colin Cross7113d202019-11-20 16:39:12 -08002038 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002039
2040 // Ensure that the include path of the header lib is exported to 'otherlib'
2041 ensureContains(t, cFlags, "-Imy_include")
2042}
Alex Light9670d332019-01-29 18:07:33 -08002043
Jiyong Park7cd10e32020-01-14 09:22:18 +09002044type fileInApex struct {
2045 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002046 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002047 isLink bool
2048}
2049
Jooyung Hana57af4a2020-01-23 05:36:59 +00002050func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002051 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002052 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002053 copyCmds := apexRule.Args["copy_commands"]
2054 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002055 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002056 for _, cmd := range strings.Split(copyCmds, "&&") {
2057 cmd = strings.TrimSpace(cmd)
2058 if cmd == "" {
2059 continue
2060 }
2061 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002062 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002063 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002064 switch terms[0] {
2065 case "mkdir":
2066 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002067 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002068 t.Fatal("copyCmds contains invalid cp command", cmd)
2069 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002070 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002071 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002072 isLink = false
2073 case "ln":
2074 if len(terms) != 3 && len(terms) != 4 {
2075 // ln LINK TARGET or ln -s LINK TARGET
2076 t.Fatal("copyCmds contains invalid ln command", cmd)
2077 }
2078 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002079 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002080 isLink = true
2081 default:
2082 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2083 }
2084 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002085 index := strings.Index(dst, imageApexDir)
2086 if index == -1 {
2087 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2088 }
2089 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002090 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002091 }
2092 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002093 return ret
2094}
2095
Jooyung Hana57af4a2020-01-23 05:36:59 +00002096func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2097 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002098 var failed bool
2099 var surplus []string
2100 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002101 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han8d8906c2020-02-27 13:31:56 +09002102 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002103 for _, expected := range files {
2104 if matched, _ := path.Match(expected, file.path); matched {
2105 filesMatched[expected] = true
Jooyung Han8d8906c2020-02-27 13:31:56 +09002106 mactchFound = true
2107 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002108 }
2109 }
Jooyung Han8d8906c2020-02-27 13:31:56 +09002110 if !mactchFound {
2111 surplus = append(surplus, file.path)
2112 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002113 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002114
Jooyung Han31c470b2019-10-18 16:26:59 +09002115 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002116 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002117 t.Log("surplus files", surplus)
2118 failed = true
2119 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002120
2121 if len(files) > len(filesMatched) {
2122 var missing []string
2123 for _, expected := range files {
2124 if !filesMatched[expected] {
2125 missing = append(missing, expected)
2126 }
2127 }
2128 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002129 t.Log("missing files", missing)
2130 failed = true
2131 }
2132 if failed {
2133 t.Fail()
2134 }
2135}
2136
Jooyung Han344d5432019-08-23 11:17:39 +09002137func TestVndkApexCurrent(t *testing.T) {
2138 ctx, _ := testApex(t, `
2139 apex_vndk {
2140 name: "myapex",
2141 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002142 }
2143
2144 apex_key {
2145 name: "myapex.key",
2146 public_key: "testkey.avbpubkey",
2147 private_key: "testkey.pem",
2148 }
2149
2150 cc_library {
2151 name: "libvndk",
2152 srcs: ["mylib.cpp"],
2153 vendor_available: true,
2154 vndk: {
2155 enabled: true,
2156 },
2157 system_shared_libs: [],
2158 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002159 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002160 }
2161
2162 cc_library {
2163 name: "libvndksp",
2164 srcs: ["mylib.cpp"],
2165 vendor_available: true,
2166 vndk: {
2167 enabled: true,
2168 support_system_process: true,
2169 },
2170 system_shared_libs: [],
2171 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002172 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002173 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002174 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002175
Jooyung Hana57af4a2020-01-23 05:36:59 +00002176 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002177 "lib/libvndk.so",
2178 "lib/libvndksp.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002179 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002180 "lib64/libvndk.so",
2181 "lib64/libvndksp.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002182 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002183 "etc/llndk.libraries.VER.txt",
2184 "etc/vndkcore.libraries.VER.txt",
2185 "etc/vndksp.libraries.VER.txt",
2186 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002187 })
Jooyung Han344d5432019-08-23 11:17:39 +09002188}
2189
2190func TestVndkApexWithPrebuilt(t *testing.T) {
2191 ctx, _ := testApex(t, `
2192 apex_vndk {
2193 name: "myapex",
2194 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002195 }
2196
2197 apex_key {
2198 name: "myapex.key",
2199 public_key: "testkey.avbpubkey",
2200 private_key: "testkey.pem",
2201 }
2202
2203 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002204 name: "libvndk",
2205 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002206 vendor_available: true,
2207 vndk: {
2208 enabled: true,
2209 },
2210 system_shared_libs: [],
2211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002212 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002213 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002214
2215 cc_prebuilt_library_shared {
2216 name: "libvndk.arm",
2217 srcs: ["libvndk.arm.so"],
2218 vendor_available: true,
2219 vndk: {
2220 enabled: true,
2221 },
2222 enabled: false,
2223 arch: {
2224 arm: {
2225 enabled: true,
2226 },
2227 },
2228 system_shared_libs: [],
2229 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002230 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002231 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002232 `+vndkLibrariesTxtFiles("current"),
2233 withFiles(map[string][]byte{
2234 "libvndk.so": nil,
2235 "libvndk.arm.so": nil,
2236 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002237
Jooyung Hana57af4a2020-01-23 05:36:59 +00002238 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002239 "lib/libvndk.so",
2240 "lib/libvndk.arm.so",
2241 "lib64/libvndk.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002242 "lib/libc++.so",
2243 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002244 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002245 })
Jooyung Han344d5432019-08-23 11:17:39 +09002246}
2247
Jooyung Han39edb6c2019-11-06 16:53:07 +09002248func vndkLibrariesTxtFiles(vers ...string) (result string) {
2249 for _, v := range vers {
2250 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002251 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002252 result += `
2253 vndk_libraries_txt {
2254 name: "` + txt + `.libraries.txt",
2255 }
2256 `
2257 }
2258 } else {
2259 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2260 result += `
2261 prebuilt_etc {
2262 name: "` + txt + `.libraries.` + v + `.txt",
2263 src: "dummy.txt",
2264 }
2265 `
2266 }
2267 }
2268 }
2269 return
2270}
2271
Jooyung Han344d5432019-08-23 11:17:39 +09002272func TestVndkApexVersion(t *testing.T) {
2273 ctx, _ := testApex(t, `
2274 apex_vndk {
2275 name: "myapex_v27",
2276 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002277 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002278 vndk_version: "27",
2279 }
2280
2281 apex_key {
2282 name: "myapex.key",
2283 public_key: "testkey.avbpubkey",
2284 private_key: "testkey.pem",
2285 }
2286
Jooyung Han31c470b2019-10-18 16:26:59 +09002287 vndk_prebuilt_shared {
2288 name: "libvndk27",
2289 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002290 vendor_available: true,
2291 vndk: {
2292 enabled: true,
2293 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002294 target_arch: "arm64",
2295 arch: {
2296 arm: {
2297 srcs: ["libvndk27_arm.so"],
2298 },
2299 arm64: {
2300 srcs: ["libvndk27_arm64.so"],
2301 },
2302 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002303 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002304 }
2305
2306 vndk_prebuilt_shared {
2307 name: "libvndk27",
2308 version: "27",
2309 vendor_available: true,
2310 vndk: {
2311 enabled: true,
2312 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002313 target_arch: "x86_64",
2314 arch: {
2315 x86: {
2316 srcs: ["libvndk27_x86.so"],
2317 },
2318 x86_64: {
2319 srcs: ["libvndk27_x86_64.so"],
2320 },
2321 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002322 }
2323 `+vndkLibrariesTxtFiles("27"),
2324 withFiles(map[string][]byte{
2325 "libvndk27_arm.so": nil,
2326 "libvndk27_arm64.so": nil,
2327 "libvndk27_x86.so": nil,
2328 "libvndk27_x86_64.so": nil,
2329 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002330
Jooyung Hana57af4a2020-01-23 05:36:59 +00002331 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002332 "lib/libvndk27_arm.so",
2333 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002334 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002335 })
Jooyung Han344d5432019-08-23 11:17:39 +09002336}
2337
2338func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2339 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2340 apex_vndk {
2341 name: "myapex_v27",
2342 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002343 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002344 vndk_version: "27",
2345 }
2346 apex_vndk {
2347 name: "myapex_v27_other",
2348 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002349 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002350 vndk_version: "27",
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "libvndk",
2361 srcs: ["mylib.cpp"],
2362 vendor_available: true,
2363 vndk: {
2364 enabled: true,
2365 },
2366 system_shared_libs: [],
2367 stl: "none",
2368 }
2369
2370 vndk_prebuilt_shared {
2371 name: "libvndk",
2372 version: "27",
2373 vendor_available: true,
2374 vndk: {
2375 enabled: true,
2376 },
2377 srcs: ["libvndk.so"],
2378 }
2379 `, withFiles(map[string][]byte{
2380 "libvndk.so": nil,
2381 }))
2382}
2383
Jooyung Han90eee022019-10-01 20:02:42 +09002384func TestVndkApexNameRule(t *testing.T) {
2385 ctx, _ := testApex(t, `
2386 apex_vndk {
2387 name: "myapex",
2388 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002389 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002390 }
2391 apex_vndk {
2392 name: "myapex_v28",
2393 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002394 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002395 vndk_version: "28",
2396 }
2397 apex_key {
2398 name: "myapex.key",
2399 public_key: "testkey.avbpubkey",
2400 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002401 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002402
2403 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002404 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002405 actual := proptools.String(bundle.properties.Apex_name)
2406 if !reflect.DeepEqual(actual, expected) {
2407 t.Errorf("Got '%v', expected '%v'", actual, expected)
2408 }
2409 }
2410
2411 assertApexName("com.android.vndk.vVER", "myapex")
2412 assertApexName("com.android.vndk.v28", "myapex_v28")
2413}
2414
Jooyung Han344d5432019-08-23 11:17:39 +09002415func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2416 ctx, _ := testApex(t, `
2417 apex_vndk {
2418 name: "myapex",
2419 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002420 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002421 }
2422
2423 apex_key {
2424 name: "myapex.key",
2425 public_key: "testkey.avbpubkey",
2426 private_key: "testkey.pem",
2427 }
2428
2429 cc_library {
2430 name: "libvndk",
2431 srcs: ["mylib.cpp"],
2432 vendor_available: true,
2433 native_bridge_supported: true,
2434 host_supported: true,
2435 vndk: {
2436 enabled: true,
2437 },
2438 system_shared_libs: [],
2439 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002440 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002441 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002442 `+vndkLibrariesTxtFiles("current"),
2443 withTargets(map[android.OsType][]android.Target{
2444 android.Android: []android.Target{
2445 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2446 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2447 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
2448 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
2449 },
2450 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002451
Jooyung Hana57af4a2020-01-23 05:36:59 +00002452 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002453 "lib/libvndk.so",
2454 "lib64/libvndk.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002455 "lib/libc++.so",
2456 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002457 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002458 })
Jooyung Han344d5432019-08-23 11:17:39 +09002459}
2460
2461func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2462 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2463 apex_vndk {
2464 name: "myapex",
2465 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002466 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002467 native_bridge_supported: true,
2468 }
2469
2470 apex_key {
2471 name: "myapex.key",
2472 public_key: "testkey.avbpubkey",
2473 private_key: "testkey.pem",
2474 }
2475
2476 cc_library {
2477 name: "libvndk",
2478 srcs: ["mylib.cpp"],
2479 vendor_available: true,
2480 native_bridge_supported: true,
2481 host_supported: true,
2482 vndk: {
2483 enabled: true,
2484 },
2485 system_shared_libs: [],
2486 stl: "none",
2487 }
2488 `)
2489}
2490
Jooyung Han31c470b2019-10-18 16:26:59 +09002491func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002492 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002493 apex_vndk {
2494 name: "myapex_v27",
2495 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002496 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002497 vndk_version: "27",
2498 }
2499
2500 apex_key {
2501 name: "myapex.key",
2502 public_key: "testkey.avbpubkey",
2503 private_key: "testkey.pem",
2504 }
2505
2506 vndk_prebuilt_shared {
2507 name: "libvndk27",
2508 version: "27",
2509 target_arch: "arm",
2510 vendor_available: true,
2511 vndk: {
2512 enabled: true,
2513 },
2514 arch: {
2515 arm: {
2516 srcs: ["libvndk27.so"],
2517 }
2518 },
2519 }
2520
2521 vndk_prebuilt_shared {
2522 name: "libvndk27",
2523 version: "27",
2524 target_arch: "arm",
2525 binder32bit: true,
2526 vendor_available: true,
2527 vndk: {
2528 enabled: true,
2529 },
2530 arch: {
2531 arm: {
2532 srcs: ["libvndk27binder32.so"],
2533 }
2534 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002535 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002536 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002537 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002538 withFiles(map[string][]byte{
2539 "libvndk27.so": nil,
2540 "libvndk27binder32.so": nil,
2541 }),
2542 withBinder32bit,
2543 withTargets(map[android.OsType][]android.Target{
2544 android.Android: []android.Target{
2545 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2546 },
2547 }),
2548 )
2549
Jooyung Hana57af4a2020-01-23 05:36:59 +00002550 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002551 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002552 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002553 })
2554}
2555
Jooyung Hane1633032019-08-01 17:41:43 +09002556func TestDependenciesInApexManifest(t *testing.T) {
2557 ctx, _ := testApex(t, `
2558 apex {
2559 name: "myapex_nodep",
2560 key: "myapex.key",
2561 native_shared_libs: ["lib_nodep"],
2562 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002563 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002564 }
2565
2566 apex {
2567 name: "myapex_dep",
2568 key: "myapex.key",
2569 native_shared_libs: ["lib_dep"],
2570 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002571 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002572 }
2573
2574 apex {
2575 name: "myapex_provider",
2576 key: "myapex.key",
2577 native_shared_libs: ["libfoo"],
2578 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002579 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002580 }
2581
2582 apex {
2583 name: "myapex_selfcontained",
2584 key: "myapex.key",
2585 native_shared_libs: ["lib_dep", "libfoo"],
2586 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002587 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002588 }
2589
2590 apex_key {
2591 name: "myapex.key",
2592 public_key: "testkey.avbpubkey",
2593 private_key: "testkey.pem",
2594 }
2595
2596 cc_library {
2597 name: "lib_nodep",
2598 srcs: ["mylib.cpp"],
2599 system_shared_libs: [],
2600 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002601 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002602 }
2603
2604 cc_library {
2605 name: "lib_dep",
2606 srcs: ["mylib.cpp"],
2607 shared_libs: ["libfoo"],
2608 system_shared_libs: [],
2609 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002610 apex_available: [
2611 "myapex_dep",
2612 "myapex_provider",
2613 "myapex_selfcontained",
2614 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002615 }
2616
2617 cc_library {
2618 name: "libfoo",
2619 srcs: ["mytest.cpp"],
2620 stubs: {
2621 versions: ["1"],
2622 },
2623 system_shared_libs: [],
2624 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002625 apex_available: [
2626 "myapex_provider",
2627 "myapex_selfcontained",
2628 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002629 }
2630 `)
2631
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002632 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002633 var provideNativeLibs, requireNativeLibs []string
2634
Sundong Ahnabb64432019-10-22 13:58:29 +09002635 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002636 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2637 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002638 ensureListEmpty(t, provideNativeLibs)
2639 ensureListEmpty(t, requireNativeLibs)
2640
Sundong Ahnabb64432019-10-22 13:58:29 +09002641 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002642 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2643 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002644 ensureListEmpty(t, provideNativeLibs)
2645 ensureListContains(t, requireNativeLibs, "libfoo.so")
2646
Sundong Ahnabb64432019-10-22 13:58:29 +09002647 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002648 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2649 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002650 ensureListContains(t, provideNativeLibs, "libfoo.so")
2651 ensureListEmpty(t, requireNativeLibs)
2652
Sundong Ahnabb64432019-10-22 13:58:29 +09002653 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002654 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2655 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002656 ensureListContains(t, provideNativeLibs, "libfoo.so")
2657 ensureListEmpty(t, requireNativeLibs)
2658}
2659
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002660func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002661 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002662 apex {
2663 name: "myapex",
2664 key: "myapex.key",
2665 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002666 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002667 }
2668
2669 apex_key {
2670 name: "myapex.key",
2671 public_key: "testkey.avbpubkey",
2672 private_key: "testkey.pem",
2673 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002674
2675 cc_library {
2676 name: "mylib",
2677 srcs: ["mylib.cpp"],
2678 system_shared_libs: [],
2679 stl: "none",
2680 apex_available: [
2681 "//apex_available:platform",
2682 "myapex",
2683 ],
2684 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002685 `)
2686
Sundong Ahnabb64432019-10-22 13:58:29 +09002687 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002688 apexManifestRule := module.Rule("apexManifestRule")
2689 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2690 apexRule := module.Rule("apexRule")
2691 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002692
2693 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2694 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2695 name := apexBundle.BaseModuleName()
2696 prefix := "TARGET_"
2697 var builder strings.Builder
2698 data.Custom(&builder, name, prefix, "", data)
2699 androidMk := builder.String()
2700 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2701 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002702}
2703
Alex Light0851b882019-02-07 13:20:53 -08002704func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002705 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 native_shared_libs: ["mylib_common"],
2710 }
2711
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717
2718 cc_library {
2719 name: "mylib_common",
2720 srcs: ["mylib.cpp"],
2721 system_shared_libs: [],
2722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002723 apex_available: [
2724 "//apex_available:platform",
2725 "myapex",
2726 ],
Alex Light0851b882019-02-07 13:20:53 -08002727 }
2728 `)
2729
Sundong Ahnabb64432019-10-22 13:58:29 +09002730 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002731 apexRule := module.Rule("apexRule")
2732 copyCmds := apexRule.Args["copy_commands"]
2733
2734 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2735 t.Log("Apex was a test apex!")
2736 t.Fail()
2737 }
2738 // Ensure that main rule creates an output
2739 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2740
2741 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002742 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002743
2744 // Ensure that both direct and indirect deps are copied into apex
2745 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2746
Colin Cross7113d202019-11-20 16:39:12 -08002747 // Ensure that the platform variant ends with _shared
2748 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002749
2750 if !android.InAnyApex("mylib_common") {
2751 t.Log("Found mylib_common not in any apex!")
2752 t.Fail()
2753 }
2754}
2755
2756func TestTestApex(t *testing.T) {
2757 if android.InAnyApex("mylib_common_test") {
2758 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!")
2759 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002760 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002761 apex_test {
2762 name: "myapex",
2763 key: "myapex.key",
2764 native_shared_libs: ["mylib_common_test"],
2765 }
2766
2767 apex_key {
2768 name: "myapex.key",
2769 public_key: "testkey.avbpubkey",
2770 private_key: "testkey.pem",
2771 }
2772
2773 cc_library {
2774 name: "mylib_common_test",
2775 srcs: ["mylib.cpp"],
2776 system_shared_libs: [],
2777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002778 // TODO: remove //apex_available:platform
2779 apex_available: [
2780 "//apex_available:platform",
2781 "myapex",
2782 ],
Alex Light0851b882019-02-07 13:20:53 -08002783 }
2784 `)
2785
Sundong Ahnabb64432019-10-22 13:58:29 +09002786 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002787 apexRule := module.Rule("apexRule")
2788 copyCmds := apexRule.Args["copy_commands"]
2789
2790 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
2791 t.Log("Apex was not a test apex!")
2792 t.Fail()
2793 }
2794 // Ensure that main rule creates an output
2795 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2796
2797 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002798 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002799
2800 // Ensure that both direct and indirect deps are copied into apex
2801 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
2802
Colin Cross7113d202019-11-20 16:39:12 -08002803 // Ensure that the platform variant ends with _shared
2804 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002805}
2806
Alex Light9670d332019-01-29 18:07:33 -08002807func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002808 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08002809 apex {
2810 name: "myapex",
2811 key: "myapex.key",
2812 multilib: {
2813 first: {
2814 native_shared_libs: ["mylib_common"],
2815 }
2816 },
2817 target: {
2818 android: {
2819 multilib: {
2820 first: {
2821 native_shared_libs: ["mylib"],
2822 }
2823 }
2824 },
2825 host: {
2826 multilib: {
2827 first: {
2828 native_shared_libs: ["mylib2"],
2829 }
2830 }
2831 }
2832 }
2833 }
2834
2835 apex_key {
2836 name: "myapex.key",
2837 public_key: "testkey.avbpubkey",
2838 private_key: "testkey.pem",
2839 }
2840
2841 cc_library {
2842 name: "mylib",
2843 srcs: ["mylib.cpp"],
2844 system_shared_libs: [],
2845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002846 // TODO: remove //apex_available:platform
2847 apex_available: [
2848 "//apex_available:platform",
2849 "myapex",
2850 ],
Alex Light9670d332019-01-29 18:07:33 -08002851 }
2852
2853 cc_library {
2854 name: "mylib_common",
2855 srcs: ["mylib.cpp"],
2856 system_shared_libs: [],
2857 stl: "none",
2858 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002859 // TODO: remove //apex_available:platform
2860 apex_available: [
2861 "//apex_available:platform",
2862 "myapex",
2863 ],
Alex Light9670d332019-01-29 18:07:33 -08002864 }
2865
2866 cc_library {
2867 name: "mylib2",
2868 srcs: ["mylib.cpp"],
2869 system_shared_libs: [],
2870 stl: "none",
2871 compile_multilib: "first",
2872 }
2873 `)
2874
Sundong Ahnabb64432019-10-22 13:58:29 +09002875 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08002876 copyCmds := apexRule.Args["copy_commands"]
2877
2878 // Ensure that main rule creates an output
2879 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2880
2881 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002882 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
2883 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
2884 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08002885
2886 // Ensure that both direct and indirect deps are copied into apex
2887 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
2888 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2889 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
2890
Colin Cross7113d202019-11-20 16:39:12 -08002891 // Ensure that the platform variant ends with _shared
2892 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
2893 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
2894 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08002895}
Jiyong Park04480cf2019-02-06 00:16:29 +09002896
2897func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002898 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09002899 apex {
2900 name: "myapex",
2901 key: "myapex.key",
2902 binaries: ["myscript"],
2903 }
2904
2905 apex_key {
2906 name: "myapex.key",
2907 public_key: "testkey.avbpubkey",
2908 private_key: "testkey.pem",
2909 }
2910
2911 sh_binary {
2912 name: "myscript",
2913 src: "mylib.cpp",
2914 filename: "myscript.sh",
2915 sub_dir: "script",
2916 }
2917 `)
2918
Sundong Ahnabb64432019-10-22 13:58:29 +09002919 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09002920 copyCmds := apexRule.Args["copy_commands"]
2921
2922 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
2923}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002924
Jooyung Han91df2082019-11-20 01:49:42 +09002925func TestApexInVariousPartition(t *testing.T) {
2926 testcases := []struct {
2927 propName, parition, flattenedPartition string
2928 }{
2929 {"", "system", "system_ext"},
2930 {"product_specific: true", "product", "product"},
2931 {"soc_specific: true", "vendor", "vendor"},
2932 {"proprietary: true", "vendor", "vendor"},
2933 {"vendor: true", "vendor", "vendor"},
2934 {"system_ext_specific: true", "system_ext", "system_ext"},
2935 }
2936 for _, tc := range testcases {
2937 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
2938 ctx, _ := testApex(t, `
2939 apex {
2940 name: "myapex",
2941 key: "myapex.key",
2942 `+tc.propName+`
2943 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002944
Jooyung Han91df2082019-11-20 01:49:42 +09002945 apex_key {
2946 name: "myapex.key",
2947 public_key: "testkey.avbpubkey",
2948 private_key: "testkey.pem",
2949 }
2950 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002951
Jooyung Han91df2082019-11-20 01:49:42 +09002952 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2953 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
2954 actual := apex.installDir.String()
2955 if actual != expected {
2956 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2957 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002958
Jooyung Han91df2082019-11-20 01:49:42 +09002959 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
2960 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
2961 actual = flattened.installDir.String()
2962 if actual != expected {
2963 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2964 }
2965 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002966 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002967}
Jiyong Park67882562019-03-21 01:11:21 +09002968
Jooyung Han54aca7b2019-11-20 02:26:02 +09002969func TestFileContexts(t *testing.T) {
2970 ctx, _ := testApex(t, `
2971 apex {
2972 name: "myapex",
2973 key: "myapex.key",
2974 }
2975
2976 apex_key {
2977 name: "myapex.key",
2978 public_key: "testkey.avbpubkey",
2979 private_key: "testkey.pem",
2980 }
2981 `)
2982 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2983 apexRule := module.Rule("apexRule")
2984 actual := apexRule.Args["file_contexts"]
2985 expected := "system/sepolicy/apex/myapex-file_contexts"
2986 if actual != expected {
2987 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
2988 }
2989
2990 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
2991 apex {
2992 name: "myapex",
2993 key: "myapex.key",
2994 file_contexts: "my_own_file_contexts",
2995 }
2996
2997 apex_key {
2998 name: "myapex.key",
2999 public_key: "testkey.avbpubkey",
3000 private_key: "testkey.pem",
3001 }
3002 `, withFiles(map[string][]byte{
3003 "my_own_file_contexts": nil,
3004 }))
3005
3006 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3007 apex {
3008 name: "myapex",
3009 key: "myapex.key",
3010 product_specific: true,
3011 file_contexts: "product_specific_file_contexts",
3012 }
3013
3014 apex_key {
3015 name: "myapex.key",
3016 public_key: "testkey.avbpubkey",
3017 private_key: "testkey.pem",
3018 }
3019 `)
3020
3021 ctx, _ = testApex(t, `
3022 apex {
3023 name: "myapex",
3024 key: "myapex.key",
3025 product_specific: true,
3026 file_contexts: "product_specific_file_contexts",
3027 }
3028
3029 apex_key {
3030 name: "myapex.key",
3031 public_key: "testkey.avbpubkey",
3032 private_key: "testkey.pem",
3033 }
3034 `, withFiles(map[string][]byte{
3035 "product_specific_file_contexts": nil,
3036 }))
3037 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3038 apexRule = module.Rule("apexRule")
3039 actual = apexRule.Args["file_contexts"]
3040 expected = "product_specific_file_contexts"
3041 if actual != expected {
3042 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3043 }
3044
3045 ctx, _ = testApex(t, `
3046 apex {
3047 name: "myapex",
3048 key: "myapex.key",
3049 product_specific: true,
3050 file_contexts: ":my-file-contexts",
3051 }
3052
3053 apex_key {
3054 name: "myapex.key",
3055 public_key: "testkey.avbpubkey",
3056 private_key: "testkey.pem",
3057 }
3058
3059 filegroup {
3060 name: "my-file-contexts",
3061 srcs: ["product_specific_file_contexts"],
3062 }
3063 `, withFiles(map[string][]byte{
3064 "product_specific_file_contexts": nil,
3065 }))
3066 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3067 apexRule = module.Rule("apexRule")
3068 actual = apexRule.Args["file_contexts"]
3069 expected = "product_specific_file_contexts"
3070 if actual != expected {
3071 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3072 }
3073}
3074
Jiyong Park67882562019-03-21 01:11:21 +09003075func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003076 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003077 apex_key {
3078 name: "myapex.key",
3079 public_key: ":my.avbpubkey",
3080 private_key: ":my.pem",
3081 product_specific: true,
3082 }
3083
3084 filegroup {
3085 name: "my.avbpubkey",
3086 srcs: ["testkey2.avbpubkey"],
3087 }
3088
3089 filegroup {
3090 name: "my.pem",
3091 srcs: ["testkey2.pem"],
3092 }
3093 `)
3094
3095 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3096 expected_pubkey := "testkey2.avbpubkey"
3097 actual_pubkey := apex_key.public_key_file.String()
3098 if actual_pubkey != expected_pubkey {
3099 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3100 }
3101 expected_privkey := "testkey2.pem"
3102 actual_privkey := apex_key.private_key_file.String()
3103 if actual_privkey != expected_privkey {
3104 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3105 }
3106}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003107
3108func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003109 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003110 prebuilt_apex {
3111 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003112 arch: {
3113 arm64: {
3114 src: "myapex-arm64.apex",
3115 },
3116 arm: {
3117 src: "myapex-arm.apex",
3118 },
3119 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003120 }
3121 `)
3122
3123 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3124
Jiyong Parkc95714e2019-03-29 14:23:10 +09003125 expectedInput := "myapex-arm64.apex"
3126 if prebuilt.inputApex.String() != expectedInput {
3127 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3128 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003129}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003130
3131func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003132 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003133 prebuilt_apex {
3134 name: "myapex",
3135 src: "myapex-arm.apex",
3136 filename: "notmyapex.apex",
3137 }
3138 `)
3139
3140 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3141
3142 expected := "notmyapex.apex"
3143 if p.installFilename != expected {
3144 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3145 }
3146}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003147
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003148func TestPrebuiltOverrides(t *testing.T) {
3149 ctx, config := testApex(t, `
3150 prebuilt_apex {
3151 name: "myapex.prebuilt",
3152 src: "myapex-arm.apex",
3153 overrides: [
3154 "myapex",
3155 ],
3156 }
3157 `)
3158
3159 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3160
3161 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003162 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003163 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003164 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003165 }
3166}
3167
Roland Levillain630846d2019-06-26 12:48:34 +01003168func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003169 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003170 apex_test {
3171 name: "myapex",
3172 key: "myapex.key",
3173 tests: [
3174 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003175 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003176 ],
3177 }
3178
3179 apex_key {
3180 name: "myapex.key",
3181 public_key: "testkey.avbpubkey",
3182 private_key: "testkey.pem",
3183 }
3184
3185 cc_test {
3186 name: "mytest",
3187 gtest: false,
3188 srcs: ["mytest.cpp"],
3189 relative_install_path: "test",
3190 system_shared_libs: [],
3191 static_executable: true,
3192 stl: "none",
3193 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003194
3195 cc_test {
3196 name: "mytests",
3197 gtest: false,
3198 srcs: [
3199 "mytest1.cpp",
3200 "mytest2.cpp",
3201 "mytest3.cpp",
3202 ],
3203 test_per_src: true,
3204 relative_install_path: "test",
3205 system_shared_libs: [],
3206 static_executable: true,
3207 stl: "none",
3208 }
Roland Levillain630846d2019-06-26 12:48:34 +01003209 `)
3210
Sundong Ahnabb64432019-10-22 13:58:29 +09003211 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003212 copyCmds := apexRule.Args["copy_commands"]
3213
3214 // Ensure that test dep is copied into apex.
3215 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003216
3217 // Ensure that test deps built with `test_per_src` are copied into apex.
3218 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3219 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3220 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003221
3222 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003223 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003224 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3225 name := apexBundle.BaseModuleName()
3226 prefix := "TARGET_"
3227 var builder strings.Builder
3228 data.Custom(&builder, name, prefix, "", data)
3229 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003230 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3231 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3232 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3233 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003234 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003235 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003236 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003237}
3238
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003239func TestInstallExtraFlattenedApexes(t *testing.T) {
3240 ctx, config := testApex(t, `
3241 apex {
3242 name: "myapex",
3243 key: "myapex.key",
3244 }
3245 apex_key {
3246 name: "myapex.key",
3247 public_key: "testkey.avbpubkey",
3248 private_key: "testkey.pem",
3249 }
3250 `, func(fs map[string][]byte, config android.Config) {
3251 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3252 })
3253 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003254 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003255 mk := android.AndroidMkDataForTest(t, config, "", ab)
3256 var builder strings.Builder
3257 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3258 androidMk := builder.String()
3259 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3260}
3261
Jooyung Han5c998b92019-06-27 11:30:33 +09003262func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003263 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003264 apex {
3265 name: "myapex",
3266 key: "myapex.key",
3267 native_shared_libs: ["mylib"],
3268 uses: ["commonapex"],
3269 }
3270
3271 apex {
3272 name: "commonapex",
3273 key: "myapex.key",
3274 native_shared_libs: ["libcommon"],
3275 provide_cpp_shared_libs: true,
3276 }
3277
3278 apex_key {
3279 name: "myapex.key",
3280 public_key: "testkey.avbpubkey",
3281 private_key: "testkey.pem",
3282 }
3283
3284 cc_library {
3285 name: "mylib",
3286 srcs: ["mylib.cpp"],
3287 shared_libs: ["libcommon"],
3288 system_shared_libs: [],
3289 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003290 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003291 }
3292
3293 cc_library {
3294 name: "libcommon",
3295 srcs: ["mylib_common.cpp"],
3296 system_shared_libs: [],
3297 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003298 // TODO: remove //apex_available:platform
3299 apex_available: [
3300 "//apex_available:platform",
3301 "commonapex",
3302 "myapex",
3303 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003304 }
3305 `)
3306
Sundong Ahnabb64432019-10-22 13:58:29 +09003307 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003308 apexRule1 := module1.Rule("apexRule")
3309 copyCmds1 := apexRule1.Args["copy_commands"]
3310
Sundong Ahnabb64432019-10-22 13:58:29 +09003311 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003312 apexRule2 := module2.Rule("apexRule")
3313 copyCmds2 := apexRule2.Args["copy_commands"]
3314
Colin Cross7113d202019-11-20 16:39:12 -08003315 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3316 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003317 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3318 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3319 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3320}
3321
3322func TestApexUsesFailsIfNotProvided(t *testing.T) {
3323 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3324 apex {
3325 name: "myapex",
3326 key: "myapex.key",
3327 uses: ["commonapex"],
3328 }
3329
3330 apex {
3331 name: "commonapex",
3332 key: "myapex.key",
3333 }
3334
3335 apex_key {
3336 name: "myapex.key",
3337 public_key: "testkey.avbpubkey",
3338 private_key: "testkey.pem",
3339 }
3340 `)
3341 testApexError(t, `uses: "commonapex" is not a provider`, `
3342 apex {
3343 name: "myapex",
3344 key: "myapex.key",
3345 uses: ["commonapex"],
3346 }
3347
3348 cc_library {
3349 name: "commonapex",
3350 system_shared_libs: [],
3351 stl: "none",
3352 }
3353
3354 apex_key {
3355 name: "myapex.key",
3356 public_key: "testkey.avbpubkey",
3357 private_key: "testkey.pem",
3358 }
3359 `)
3360}
3361
3362func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3363 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3364 apex {
3365 name: "myapex",
3366 key: "myapex.key",
3367 use_vendor: true,
3368 uses: ["commonapex"],
3369 }
3370
3371 apex {
3372 name: "commonapex",
3373 key: "myapex.key",
3374 provide_cpp_shared_libs: true,
3375 }
3376
3377 apex_key {
3378 name: "myapex.key",
3379 public_key: "testkey.avbpubkey",
3380 private_key: "testkey.pem",
3381 }
Jooyung Handc782442019-11-01 03:14:38 +09003382 `, func(fs map[string][]byte, config android.Config) {
3383 setUseVendorWhitelistForTest(config, []string{"myapex"})
3384 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003385}
3386
Jooyung Hand48f3c32019-08-23 11:18:57 +09003387func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3388 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3389 apex {
3390 name: "myapex",
3391 key: "myapex.key",
3392 native_shared_libs: ["libfoo"],
3393 }
3394
3395 apex_key {
3396 name: "myapex.key",
3397 public_key: "testkey.avbpubkey",
3398 private_key: "testkey.pem",
3399 }
3400
3401 cc_library {
3402 name: "libfoo",
3403 stl: "none",
3404 system_shared_libs: [],
3405 enabled: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003406 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003407 }
3408 `)
3409 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3410 apex {
3411 name: "myapex",
3412 key: "myapex.key",
3413 java_libs: ["myjar"],
3414 }
3415
3416 apex_key {
3417 name: "myapex.key",
3418 public_key: "testkey.avbpubkey",
3419 private_key: "testkey.pem",
3420 }
3421
3422 java_library {
3423 name: "myjar",
3424 srcs: ["foo/bar/MyClass.java"],
3425 sdk_version: "none",
3426 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003427 enabled: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003428 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003429 }
3430 `)
3431}
3432
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003433func TestApexWithApps(t *testing.T) {
3434 ctx, _ := testApex(t, `
3435 apex {
3436 name: "myapex",
3437 key: "myapex.key",
3438 apps: [
3439 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003440 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003441 ],
3442 }
3443
3444 apex_key {
3445 name: "myapex.key",
3446 public_key: "testkey.avbpubkey",
3447 private_key: "testkey.pem",
3448 }
3449
3450 android_app {
3451 name: "AppFoo",
3452 srcs: ["foo/bar/MyClass.java"],
Colin Cross1c93c292020-02-15 10:38:00 -08003453 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003454 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003455 jni_libs: ["libjni"],
Colin Cross1c93c292020-02-15 10:38:00 -08003456 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003457 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003458 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003459
3460 android_app {
3461 name: "AppFooPriv",
3462 srcs: ["foo/bar/MyClass.java"],
Colin Cross1c93c292020-02-15 10:38:00 -08003463 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003464 system_modules: "none",
3465 privileged: true,
Colin Cross1c93c292020-02-15 10:38:00 -08003466 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003467 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003468 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003469
3470 cc_library_shared {
3471 name: "libjni",
3472 srcs: ["mylib.cpp"],
Jooyung Han65041792020-02-25 16:59:29 +09003473 shared_libs: ["libfoo"],
Jiyong Park8be103b2019-11-08 15:53:48 +09003474 stl: "none",
3475 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003476 apex_available: [ "myapex" ],
Jooyung Han65041792020-02-25 16:59:29 +09003477 sdk_version: "current",
3478 }
3479
3480 cc_library_shared {
3481 name: "libfoo",
3482 stl: "none",
3483 system_shared_libs: [],
3484 apex_available: [ "myapex" ],
3485 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003486 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003487 `)
3488
Sundong Ahnabb64432019-10-22 13:58:29 +09003489 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003490 apexRule := module.Rule("apexRule")
3491 copyCmds := apexRule.Args["copy_commands"]
3492
3493 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003494 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003495
Jooyung Han65041792020-02-25 16:59:29 +09003496 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3497 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003498 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Han65041792020-02-25 16:59:29 +09003499 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003500 }
Jooyung Han65041792020-02-25 16:59:29 +09003501 // JNI libraries including transitive deps are
3502 for _, jni := range []string{"libjni", "libfoo"} {
Colin Cross01fd7cc2020-02-19 16:54:04 -08003503 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Han65041792020-02-25 16:59:29 +09003504 // ... embedded inside APK (jnilibs.zip)
3505 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3506 // ... and not directly inside the APEX
3507 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3508 }
Dario Frenicde2a032019-10-27 00:29:22 +01003509}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003510
Dario Frenicde2a032019-10-27 00:29:22 +01003511func TestApexWithAppImports(t *testing.T) {
3512 ctx, _ := testApex(t, `
3513 apex {
3514 name: "myapex",
3515 key: "myapex.key",
3516 apps: [
3517 "AppFooPrebuilt",
3518 "AppFooPrivPrebuilt",
3519 ],
3520 }
3521
3522 apex_key {
3523 name: "myapex.key",
3524 public_key: "testkey.avbpubkey",
3525 private_key: "testkey.pem",
3526 }
3527
3528 android_app_import {
3529 name: "AppFooPrebuilt",
3530 apk: "PrebuiltAppFoo.apk",
3531 presigned: true,
3532 dex_preopt: {
3533 enabled: false,
3534 },
3535 }
3536
3537 android_app_import {
3538 name: "AppFooPrivPrebuilt",
3539 apk: "PrebuiltAppFooPriv.apk",
3540 privileged: true,
3541 presigned: true,
3542 dex_preopt: {
3543 enabled: false,
3544 },
Jooyung Han65cd0f02020-03-23 20:21:11 +09003545 filename: "AwesomePrebuiltAppFooPriv.apk",
Dario Frenicde2a032019-10-27 00:29:22 +01003546 }
3547 `)
3548
Sundong Ahnabb64432019-10-22 13:58:29 +09003549 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003550 apexRule := module.Rule("apexRule")
3551 copyCmds := apexRule.Args["copy_commands"]
3552
3553 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han65cd0f02020-03-23 20:21:11 +09003554 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3555}
3556
3557func TestApexWithAppImportsPrefer(t *testing.T) {
3558 ctx, _ := testApex(t, `
3559 apex {
3560 name: "myapex",
3561 key: "myapex.key",
3562 apps: [
3563 "AppFoo",
3564 ],
3565 }
3566
3567 apex_key {
3568 name: "myapex.key",
3569 public_key: "testkey.avbpubkey",
3570 private_key: "testkey.pem",
3571 }
3572
3573 android_app {
3574 name: "AppFoo",
3575 srcs: ["foo/bar/MyClass.java"],
3576 sdk_version: "none",
3577 system_modules: "none",
3578 apex_available: [ "myapex" ],
3579 }
3580
3581 android_app_import {
3582 name: "AppFoo",
3583 apk: "AppFooPrebuilt.apk",
3584 filename: "AppFooPrebuilt.apk",
3585 presigned: true,
3586 prefer: true,
3587 }
3588 `, withFiles(map[string][]byte{
3589 "AppFooPrebuilt.apk": nil,
3590 }))
3591
3592 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3593 "app/AppFoo/AppFooPrebuilt.apk",
3594 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003595}
3596
Dario Freni6f3937c2019-12-20 22:58:03 +00003597func TestApexWithTestHelperApp(t *testing.T) {
3598 ctx, _ := testApex(t, `
3599 apex {
3600 name: "myapex",
3601 key: "myapex.key",
3602 apps: [
3603 "TesterHelpAppFoo",
3604 ],
3605 }
3606
3607 apex_key {
3608 name: "myapex.key",
3609 public_key: "testkey.avbpubkey",
3610 private_key: "testkey.pem",
3611 }
3612
3613 android_test_helper_app {
3614 name: "TesterHelpAppFoo",
3615 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003616 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003617 }
3618
3619 `)
3620
3621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3622 apexRule := module.Rule("apexRule")
3623 copyCmds := apexRule.Args["copy_commands"]
3624
3625 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3626}
3627
Jooyung Han18020ea2019-11-13 10:50:48 +09003628func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3629 // libfoo's apex_available comes from cc_defaults
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003630 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003631 apex {
3632 name: "myapex",
3633 key: "myapex.key",
3634 native_shared_libs: ["libfoo"],
3635 }
3636
3637 apex_key {
3638 name: "myapex.key",
3639 public_key: "testkey.avbpubkey",
3640 private_key: "testkey.pem",
3641 }
3642
3643 apex {
3644 name: "otherapex",
3645 key: "myapex.key",
3646 native_shared_libs: ["libfoo"],
3647 }
3648
3649 cc_defaults {
3650 name: "libfoo-defaults",
3651 apex_available: ["otherapex"],
3652 }
3653
3654 cc_library {
3655 name: "libfoo",
3656 defaults: ["libfoo-defaults"],
3657 stl: "none",
3658 system_shared_libs: [],
3659 }`)
3660}
3661
Paul Duffinde7464c2020-03-30 17:54:29 +01003662func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003663 // libfoo is not available to myapex, but only to otherapex
3664 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3665 apex {
3666 name: "myapex",
3667 key: "myapex.key",
3668 native_shared_libs: ["libfoo"],
3669 }
3670
3671 apex_key {
3672 name: "myapex.key",
3673 public_key: "testkey.avbpubkey",
3674 private_key: "testkey.pem",
3675 }
3676
3677 apex {
3678 name: "otherapex",
3679 key: "otherapex.key",
3680 native_shared_libs: ["libfoo"],
3681 }
3682
3683 apex_key {
3684 name: "otherapex.key",
3685 public_key: "testkey.avbpubkey",
3686 private_key: "testkey.pem",
3687 }
3688
3689 cc_library {
3690 name: "libfoo",
3691 stl: "none",
3692 system_shared_libs: [],
3693 apex_available: ["otherapex"],
3694 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003695}
Jiyong Park127b40b2019-09-30 16:04:35 +09003696
Paul Duffinde7464c2020-03-30 17:54:29 +01003697func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003698 // libbbaz is an indirect dep
Paul Duffin868ecfd2020-03-30 17:58:21 +01003699 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinf0207962020-03-31 11:31:36 +01003700.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffin868ecfd2020-03-30 17:58:21 +01003701.*-> libfoo.*link:shared.*
Paul Duffinb20ad0a2020-03-31 15:23:40 +01003702.*via tag cc\.DependencyTag.*"shared".*
Paul Duffin868ecfd2020-03-30 17:58:21 +01003703.*-> libbar.*link:shared.*
Paul Duffinb20ad0a2020-03-31 15:23:40 +01003704.*via tag cc\.DependencyTag.*"shared".*
3705.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003706 apex {
3707 name: "myapex",
3708 key: "myapex.key",
3709 native_shared_libs: ["libfoo"],
3710 }
3711
3712 apex_key {
3713 name: "myapex.key",
3714 public_key: "testkey.avbpubkey",
3715 private_key: "testkey.pem",
3716 }
3717
Jiyong Park127b40b2019-09-30 16:04:35 +09003718 cc_library {
3719 name: "libfoo",
3720 stl: "none",
3721 shared_libs: ["libbar"],
3722 system_shared_libs: [],
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003723 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003724 }
3725
3726 cc_library {
3727 name: "libbar",
3728 stl: "none",
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003729 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003730 system_shared_libs: [],
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003731 apex_available: ["myapex"],
3732 }
3733
3734 cc_library {
3735 name: "libbaz",
3736 stl: "none",
3737 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003738 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003739}
Jiyong Park127b40b2019-09-30 16:04:35 +09003740
Paul Duffinde7464c2020-03-30 17:54:29 +01003741func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003742 testApexError(t, "\"otherapex\" is not a valid module name", `
3743 apex {
3744 name: "myapex",
3745 key: "myapex.key",
3746 native_shared_libs: ["libfoo"],
3747 }
3748
3749 apex_key {
3750 name: "myapex.key",
3751 public_key: "testkey.avbpubkey",
3752 private_key: "testkey.pem",
3753 }
3754
3755 cc_library {
3756 name: "libfoo",
3757 stl: "none",
3758 system_shared_libs: [],
3759 apex_available: ["otherapex"],
3760 }`)
3761
Paul Duffinde7464c2020-03-30 17:54:29 +01003762 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003763 apex {
3764 name: "myapex",
3765 key: "myapex.key",
3766 native_shared_libs: ["libfoo", "libbar"],
3767 }
3768
3769 apex_key {
3770 name: "myapex.key",
3771 public_key: "testkey.avbpubkey",
3772 private_key: "testkey.pem",
3773 }
3774
3775 cc_library {
3776 name: "libfoo",
3777 stl: "none",
3778 system_shared_libs: [],
Jiyong Park9f14b9b2020-03-01 17:29:06 +09003779 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003780 apex_available: ["myapex"],
3781 }
3782
3783 cc_library {
3784 name: "libbar",
3785 stl: "none",
3786 system_shared_libs: [],
3787 apex_available: ["//apex_available:anyapex"],
Jiyong Park9f14b9b2020-03-01 17:29:06 +09003788 }
3789
3790 cc_library {
3791 name: "libbaz",
3792 stl: "none",
3793 system_shared_libs: [],
3794 stubs: {
3795 versions: ["10", "20", "30"],
3796 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003797 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003798}
Jiyong Park127b40b2019-09-30 16:04:35 +09003799
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003800func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffinde7464c2020-03-30 17:54:29 +01003801 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003802 apex {
3803 name: "myapex",
3804 key: "myapex.key",
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003805 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003806 }
3807
3808 apex_key {
3809 name: "myapex.key",
3810 public_key: "testkey.avbpubkey",
3811 private_key: "testkey.pem",
3812 }
3813
3814 cc_library {
3815 name: "libfoo",
3816 stl: "none",
3817 system_shared_libs: [],
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003818 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003819 apex_available: ["//apex_available:platform"],
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003820 }
3821
3822 cc_library {
3823 name: "libfoo2",
3824 stl: "none",
3825 system_shared_libs: [],
3826 shared_libs: ["libbaz"],
3827 apex_available: ["//apex_available:platform"],
3828 }
3829
3830 cc_library {
3831 name: "libbar",
3832 stl: "none",
3833 system_shared_libs: [],
3834 apex_available: ["myapex"],
3835 }
3836
3837 cc_library {
3838 name: "libbaz",
3839 stl: "none",
3840 system_shared_libs: [],
3841 apex_available: ["myapex"],
3842 stubs: {
3843 versions: ["1"],
3844 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003845 }`)
3846
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003847 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
3848 // because it depends on libbar which isn't available to platform
3849 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3850 if libfoo.NotAvailableForPlatform() != true {
3851 t.Errorf("%q shouldn't be available to platform", libfoo.String())
3852 }
3853
3854 // libfoo2 however can be available to platform because it depends on libbaz which provides
3855 // stubs
3856 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3857 if libfoo2.NotAvailableForPlatform() == true {
3858 t.Errorf("%q should be available to platform", libfoo2.String())
3859 }
Paul Duffinde7464c2020-03-30 17:54:29 +01003860}
Jiyong Parka90ca002019-10-07 15:47:24 +09003861
Paul Duffinde7464c2020-03-30 17:54:29 +01003862func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003863 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09003864 apex {
3865 name: "myapex",
3866 key: "myapex.key",
3867 native_shared_libs: ["libfoo"],
3868 }
3869
3870 apex_key {
3871 name: "myapex.key",
3872 public_key: "testkey.avbpubkey",
3873 private_key: "testkey.pem",
3874 }
3875
3876 cc_library {
3877 name: "libfoo",
3878 stl: "none",
3879 system_shared_libs: [],
3880 apex_available: ["myapex"],
3881 static: {
3882 apex_available: ["//apex_available:platform"],
3883 },
3884 }`)
3885
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003886 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3887 if libfooShared.NotAvailableForPlatform() != true {
3888 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
3889 }
3890 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
3891 if libfooStatic.NotAvailableForPlatform() != false {
3892 t.Errorf("%q should be available to platform", libfooStatic.String())
3893 }
Jiyong Park127b40b2019-09-30 16:04:35 +09003894}
3895
Jiyong Park5d790c32019-11-15 18:40:32 +09003896func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003897 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09003898 apex {
3899 name: "myapex",
3900 key: "myapex.key",
3901 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003902 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09003903 }
3904
3905 override_apex {
3906 name: "override_myapex",
3907 base: "myapex",
3908 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003909 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08003910 logging_parent: "com.foo.bar",
Baligh Uddincb6aa122020-03-15 13:01:05 -07003911 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09003912 }
3913
3914 apex_key {
3915 name: "myapex.key",
3916 public_key: "testkey.avbpubkey",
3917 private_key: "testkey.pem",
3918 }
3919
3920 android_app {
3921 name: "app",
3922 srcs: ["foo/bar/MyClass.java"],
3923 package_name: "foo",
3924 sdk_version: "none",
3925 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003926 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09003927 }
3928
3929 override_android_app {
3930 name: "override_app",
3931 base: "app",
3932 package_name: "bar",
3933 }
Jiyong Parka519c542020-03-03 11:45:41 +09003934 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09003935
Jiyong Park317645e2019-12-05 13:20:58 +09003936 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
3937 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
3938 if originalVariant.GetOverriddenBy() != "" {
3939 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
3940 }
3941 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
3942 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
3943 }
3944
Jiyong Park5d790c32019-11-15 18:40:32 +09003945 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
3946 apexRule := module.Rule("apexRule")
3947 copyCmds := apexRule.Args["copy_commands"]
3948
3949 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han65cd0f02020-03-23 20:21:11 +09003950 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003951
3952 apexBundle := module.Module().(*apexBundle)
3953 name := apexBundle.Name()
3954 if name != "override_myapex" {
3955 t.Errorf("name should be \"override_myapex\", but was %q", name)
3956 }
3957
Baligh Uddin004d7172020-02-19 21:29:28 -08003958 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
3959 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
3960 }
3961
Jiyong Parka519c542020-03-03 11:45:41 +09003962 optFlags := apexRule.Args["opt_flags"]
Baligh Uddincb6aa122020-03-15 13:01:05 -07003963 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Parka519c542020-03-03 11:45:41 +09003964
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003965 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3966 var builder strings.Builder
3967 data.Custom(&builder, name, "TARGET_", "", data)
3968 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09003969 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003970 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
3971 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003972 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003973 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09003974 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003975 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
3976 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09003977}
3978
Jooyung Han214bf372019-11-12 13:03:50 +09003979func TestLegacyAndroid10Support(t *testing.T) {
3980 ctx, _ := testApex(t, `
3981 apex {
3982 name: "myapex",
3983 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003984 native_shared_libs: ["mylib"],
Jooyung Han23b0adf2020-03-12 18:37:20 +09003985 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09003986 }
3987
3988 apex_key {
3989 name: "myapex.key",
3990 public_key: "testkey.avbpubkey",
3991 private_key: "testkey.pem",
3992 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003993
3994 cc_library {
3995 name: "mylib",
3996 srcs: ["mylib.cpp"],
3997 stl: "libc++",
3998 system_shared_libs: [],
3999 apex_available: [ "myapex" ],
4000 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004001 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004002
4003 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4004 args := module.Rule("apexRule").Args
4005 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004006 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004007
4008 // The copies of the libraries in the apex should have one more dependency than
4009 // the ones outside the apex, namely the unwinder. Ideally we should check
4010 // the dependency names directly here but for some reason the names are blank in
4011 // this test.
4012 for _, lib := range []string{"libc++", "mylib"} {
4013 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4014 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4015 if len(apexImplicits) != len(nonApexImplicits)+1 {
4016 t.Errorf("%q missing unwinder dep", lib)
4017 }
4018 }
Jooyung Han214bf372019-11-12 13:03:50 +09004019}
4020
Jooyung Han58f26ab2019-12-18 15:34:32 +09004021func TestJavaSDKLibrary(t *testing.T) {
4022 ctx, _ := testApex(t, `
4023 apex {
4024 name: "myapex",
4025 key: "myapex.key",
4026 java_libs: ["foo"],
4027 }
4028
4029 apex_key {
4030 name: "myapex.key",
4031 public_key: "testkey.avbpubkey",
4032 private_key: "testkey.pem",
4033 }
4034
4035 java_sdk_library {
4036 name: "foo",
4037 srcs: ["a.java"],
4038 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004039 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004040 }
4041 `, withFiles(map[string][]byte{
4042 "api/current.txt": nil,
4043 "api/removed.txt": nil,
4044 "api/system-current.txt": nil,
4045 "api/system-removed.txt": nil,
4046 "api/test-current.txt": nil,
4047 "api/test-removed.txt": nil,
4048 }))
4049
4050 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004051 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004052 "javalib/foo.jar",
4053 "etc/permissions/foo.xml",
4054 })
4055 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004056 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4057 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004058}
4059
atrost6e126252020-01-27 17:01:16 +00004060func TestCompatConfig(t *testing.T) {
4061 ctx, _ := testApex(t, `
4062 apex {
4063 name: "myapex",
4064 key: "myapex.key",
4065 prebuilts: ["myjar-platform-compat-config"],
4066 java_libs: ["myjar"],
4067 }
4068
4069 apex_key {
4070 name: "myapex.key",
4071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 platform_compat_config {
4076 name: "myjar-platform-compat-config",
4077 src: ":myjar",
4078 }
4079
4080 java_library {
4081 name: "myjar",
4082 srcs: ["foo/bar/MyClass.java"],
4083 sdk_version: "none",
4084 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004085 apex_available: [ "myapex" ],
4086 }
4087 `)
4088 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4089 "etc/compatconfig/myjar-platform-compat-config.xml",
4090 "javalib/myjar.jar",
4091 })
4092}
4093
Jiyong Park479321d2019-12-16 11:47:12 +09004094func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4095 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4096 apex {
4097 name: "myapex",
4098 key: "myapex.key",
4099 java_libs: ["myjar"],
4100 }
4101
4102 apex_key {
4103 name: "myapex.key",
4104 public_key: "testkey.avbpubkey",
4105 private_key: "testkey.pem",
4106 }
4107
4108 java_library {
4109 name: "myjar",
4110 srcs: ["foo/bar/MyClass.java"],
4111 sdk_version: "none",
4112 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004113 compile_dex: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09004114 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004115 }
4116 `)
4117}
4118
Jiyong Park7afd1072019-12-30 16:56:33 +09004119func TestCarryRequiredModuleNames(t *testing.T) {
4120 ctx, config := testApex(t, `
4121 apex {
4122 name: "myapex",
4123 key: "myapex.key",
4124 native_shared_libs: ["mylib"],
4125 }
4126
4127 apex_key {
4128 name: "myapex.key",
4129 public_key: "testkey.avbpubkey",
4130 private_key: "testkey.pem",
4131 }
4132
4133 cc_library {
4134 name: "mylib",
4135 srcs: ["mylib.cpp"],
4136 system_shared_libs: [],
4137 stl: "none",
4138 required: ["a", "b"],
4139 host_required: ["c", "d"],
4140 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004141 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004142 }
4143 `)
4144
4145 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4146 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4147 name := apexBundle.BaseModuleName()
4148 prefix := "TARGET_"
4149 var builder strings.Builder
4150 data.Custom(&builder, name, prefix, "", data)
4151 androidMk := builder.String()
4152 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4153 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4154 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4155}
4156
Jiyong Park7cd10e32020-01-14 09:22:18 +09004157func TestSymlinksFromApexToSystem(t *testing.T) {
4158 bp := `
4159 apex {
4160 name: "myapex",
4161 key: "myapex.key",
4162 native_shared_libs: ["mylib"],
4163 java_libs: ["myjar"],
4164 }
4165
Jiyong Park9d677202020-02-19 16:29:35 +09004166 apex {
4167 name: "myapex.updatable",
4168 key: "myapex.key",
4169 native_shared_libs: ["mylib"],
4170 java_libs: ["myjar"],
4171 updatable: true,
Jooyung Hanced674e2020-04-27 12:10:30 +09004172 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004173 }
4174
Jiyong Park7cd10e32020-01-14 09:22:18 +09004175 apex_key {
4176 name: "myapex.key",
4177 public_key: "testkey.avbpubkey",
4178 private_key: "testkey.pem",
4179 }
4180
4181 cc_library {
4182 name: "mylib",
4183 srcs: ["mylib.cpp"],
4184 shared_libs: ["myotherlib"],
4185 system_shared_libs: [],
4186 stl: "none",
4187 apex_available: [
4188 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004189 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004190 "//apex_available:platform",
4191 ],
4192 }
4193
4194 cc_library {
4195 name: "myotherlib",
4196 srcs: ["mylib.cpp"],
4197 system_shared_libs: [],
4198 stl: "none",
4199 apex_available: [
4200 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004201 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004202 "//apex_available:platform",
4203 ],
4204 }
4205
4206 java_library {
4207 name: "myjar",
4208 srcs: ["foo/bar/MyClass.java"],
4209 sdk_version: "none",
4210 system_modules: "none",
4211 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004212 apex_available: [
4213 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004214 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004215 "//apex_available:platform",
4216 ],
4217 }
4218
4219 java_library {
4220 name: "myotherjar",
4221 srcs: ["foo/bar/MyClass.java"],
4222 sdk_version: "none",
4223 system_modules: "none",
4224 apex_available: [
4225 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004226 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004227 "//apex_available:platform",
4228 ],
4229 }
4230 `
4231
4232 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4233 for _, f := range files {
4234 if f.path == file {
4235 if f.isLink {
4236 t.Errorf("%q is not a real file", file)
4237 }
4238 return
4239 }
4240 }
4241 t.Errorf("%q is not found", file)
4242 }
4243
4244 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4245 for _, f := range files {
4246 if f.path == file {
4247 if !f.isLink {
4248 t.Errorf("%q is not a symlink", file)
4249 }
4250 return
4251 }
4252 }
4253 t.Errorf("%q is not found", file)
4254 }
4255
Jiyong Park9d677202020-02-19 16:29:35 +09004256 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4257 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004258 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004259 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004260 ensureRealfileExists(t, files, "javalib/myjar.jar")
4261 ensureRealfileExists(t, files, "lib64/mylib.so")
4262 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4263
Jiyong Park9d677202020-02-19 16:29:35 +09004264 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4265 ensureRealfileExists(t, files, "javalib/myjar.jar")
4266 ensureRealfileExists(t, files, "lib64/mylib.so")
4267 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4268
4269 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004270 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004271 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004272 ensureRealfileExists(t, files, "javalib/myjar.jar")
4273 ensureRealfileExists(t, files, "lib64/mylib.so")
4274 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004275
4276 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4277 ensureRealfileExists(t, files, "javalib/myjar.jar")
4278 ensureRealfileExists(t, files, "lib64/mylib.so")
4279 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004280}
4281
Jooyung Han40b286c2020-04-17 13:43:10 +09004282func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4283 ctx, _ := testApex(t, `
4284 apex {
4285 name: "myapex",
4286 key: "myapex.key",
4287 }
4288 apex_key {
4289 name: "myapex.key",
4290 public_key: "testkey.avbpubkey",
4291 private_key: "testkey.pem",
4292 }
4293 `, func(fs map[string][]byte, config android.Config) {
4294 delete(config.Targets, android.Android)
4295 config.AndroidCommonTarget = android.Target{}
4296 })
4297
4298 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4299 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4300 }
4301}
4302
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004303func TestAppBundle(t *testing.T) {
4304 ctx, _ := testApex(t, `
4305 apex {
4306 name: "myapex",
4307 key: "myapex.key",
4308 apps: ["AppFoo"],
4309 }
4310
4311 apex_key {
4312 name: "myapex.key",
4313 public_key: "testkey.avbpubkey",
4314 private_key: "testkey.pem",
4315 }
4316
4317 android_app {
4318 name: "AppFoo",
4319 srcs: ["foo/bar/MyClass.java"],
4320 sdk_version: "none",
4321 system_modules: "none",
4322 apex_available: [ "myapex" ],
4323 }
Jiyong Parkaf8998c2020-02-28 16:51:07 +09004324 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004325
4326 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4327 content := bundleConfigRule.Args["content"]
4328
4329 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkaf8998c2020-02-28 16:51:07 +09004330 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo/AppFoo.apk"}]}`)
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004331}
4332
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004333func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4334 t.Helper()
4335
4336 bp = bp + `
4337 filegroup {
4338 name: "some-updatable-apex-file_contexts",
4339 srcs: [
4340 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4341 ],
4342 }
4343 `
4344 bp += cc.GatherRequiredDepsForTest(android.Android)
4345 bp += java.GatherRequiredDepsForTest()
4346 bp += dexpreopt.BpToolModulesForTest()
4347
4348 fs := map[string][]byte{
4349 "a.java": nil,
4350 "a.jar": nil,
4351 "build/make/target/product/security": nil,
4352 "apex_manifest.json": nil,
4353 "AndroidManifest.xml": nil,
4354 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
4355 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4356 "framework/aidl/a.aidl": nil,
4357 }
4358 cc.GatherRequiredFilesForTest(fs)
4359
4360 ctx := android.NewTestArchContext()
4361 ctx.RegisterModuleType("apex", BundleFactory)
4362 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4363 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
4364 cc.RegisterRequiredBuildComponentsForTest(ctx)
4365 java.RegisterJavaBuildComponents(ctx)
4366 java.RegisterSystemModulesBuildComponents(ctx)
4367 java.RegisterAppBuildComponents(ctx)
4368 java.RegisterDexpreoptBootJarsComponents(ctx)
4369 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
4370 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4371 ctx.PreDepsMutators(RegisterPreDepsMutators)
4372 ctx.PostDepsMutators(RegisterPostDepsMutators)
4373
4374 config := android.TestArchConfig(buildDir, nil, bp, fs)
4375 ctx.Register(config)
4376
4377 _ = dexpreopt.GlobalSoongConfigForTests(config)
4378 dexpreopt.RegisterToolModulesForTest(ctx)
4379 pathCtx := android.PathContextForTesting(config)
4380 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4381 transformDexpreoptConfig(dexpreoptConfig)
4382 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4383
4384 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4385 android.FailIfErrored(t, errs)
4386
4387 _, errs = ctx.PrepareBuildActions(config)
4388 if errmsg == "" {
4389 android.FailIfErrored(t, errs)
4390 } else if len(errs) > 0 {
4391 android.FailIfNoMatchingErrors(t, errmsg, errs)
4392 return
4393 } else {
4394 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4395 }
4396}
4397
Jooyung Hanced674e2020-04-27 12:10:30 +09004398func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4399 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4400 apex {
4401 name: "myapex",
4402 key: "myapex.key",
4403 updatable: true,
4404 }
4405
4406 apex_key {
4407 name: "myapex.key",
4408 public_key: "testkey.avbpubkey",
4409 private_key: "testkey.pem",
4410 }
4411 `)
4412}
4413
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004414func TestNoUpdatableJarsInBootImage(t *testing.T) {
4415 bp := `
4416 java_library {
4417 name: "some-updatable-apex-lib",
4418 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004419 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004420 apex_available: [
4421 "some-updatable-apex",
4422 ],
4423 }
4424
4425 java_library {
4426 name: "some-platform-lib",
4427 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004428 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004429 installable: true,
4430 }
4431
4432 java_library {
4433 name: "some-art-lib",
4434 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004435 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004436 apex_available: [
4437 "com.android.art.something",
4438 ],
4439 hostdex: true,
4440 }
4441
4442 apex {
4443 name: "some-updatable-apex",
4444 key: "some-updatable-apex.key",
4445 java_libs: ["some-updatable-apex-lib"],
4446 }
4447
4448 apex_key {
4449 name: "some-updatable-apex.key",
4450 }
4451
4452 apex {
4453 name: "com.android.art.something",
4454 key: "com.android.art.something.key",
4455 java_libs: ["some-art-lib"],
4456 }
4457
4458 apex_key {
4459 name: "com.android.art.something.key",
4460 }
4461 `
4462
4463 var error string
4464 var transform func(*dexpreopt.GlobalConfig)
4465
4466 // updatable jar from ART apex in the ART boot image => ok
4467 transform = func(config *dexpreopt.GlobalConfig) {
4468 config.ArtApexJars = []string{"some-art-lib"}
4469 }
4470 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4471
4472 // updatable jar from ART apex in the framework boot image => error
4473 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4474 transform = func(config *dexpreopt.GlobalConfig) {
4475 config.BootJars = []string{"some-art-lib"}
4476 }
4477 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4478
4479 // updatable jar from some other apex in the ART boot image => error
4480 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4481 transform = func(config *dexpreopt.GlobalConfig) {
4482 config.ArtApexJars = []string{"some-updatable-apex-lib"}
4483 }
4484 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4485
4486 // updatable jar from some other apex in the framework boot image => error
4487 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4488 transform = func(config *dexpreopt.GlobalConfig) {
4489 config.BootJars = []string{"some-updatable-apex-lib"}
4490 }
4491 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4492
4493 // nonexistent jar in the ART boot image => error
4494 error = "failed to find a dex jar path for module 'nonexistent'"
4495 transform = func(config *dexpreopt.GlobalConfig) {
4496 config.ArtApexJars = []string{"nonexistent"}
4497 }
4498 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4499
4500 // nonexistent jar in the framework boot image => error
4501 error = "failed to find a dex jar path for module 'nonexistent'"
4502 transform = func(config *dexpreopt.GlobalConfig) {
4503 config.BootJars = []string{"nonexistent"}
4504 }
4505 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4506
4507 // platform jar in the ART boot image => error
4508 error = "module 'some-platform-lib' is part of the platform and not allowed in the ART boot image"
4509 transform = func(config *dexpreopt.GlobalConfig) {
4510 config.ArtApexJars = []string{"some-platform-lib"}
4511 }
4512 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4513
4514 // platform jar in the framework boot image => ok
4515 transform = func(config *dexpreopt.GlobalConfig) {
4516 config.BootJars = []string{"some-platform-lib"}
4517 }
4518 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4519}
4520
Jiyong Parkf0d01b72020-04-13 16:19:48 +09004521func TestTestFor(t *testing.T) {
4522 ctx, _ := testApex(t, `
4523 apex {
4524 name: "myapex",
4525 key: "myapex.key",
4526 native_shared_libs: ["mylib", "myprivlib"],
4527 }
4528
4529 apex_key {
4530 name: "myapex.key",
4531 public_key: "testkey.avbpubkey",
4532 private_key: "testkey.pem",
4533 }
4534
4535 cc_library {
4536 name: "mylib",
4537 srcs: ["mylib.cpp"],
4538 system_shared_libs: [],
4539 stl: "none",
4540 stubs: {
4541 versions: ["1"],
4542 },
4543 apex_available: ["myapex"],
4544 }
4545
4546 cc_library {
4547 name: "myprivlib",
4548 srcs: ["mylib.cpp"],
4549 system_shared_libs: [],
4550 stl: "none",
4551 apex_available: ["myapex"],
4552 }
4553
4554
4555 cc_test {
4556 name: "mytest",
4557 gtest: false,
4558 srcs: ["mylib.cpp"],
4559 system_shared_libs: [],
4560 stl: "none",
4561 shared_libs: ["mylib", "myprivlib"],
4562 test_for: ["myapex"]
4563 }
4564 `)
4565
4566 // the test 'mytest' is a test for the apex, therefore is linked to the
4567 // actual implementation of mylib instead of its stub.
4568 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4569 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4570 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4571}
4572
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004573func TestMain(m *testing.M) {
4574 run := func() int {
4575 setUp()
4576 defer tearDown()
4577
4578 return m.Run()
4579 }
4580
4581 os.Exit(run())
4582}