blob: 42f9a94b3401a79a06ec1012fde4f74efa3af61d [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffinbf19a972020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090032 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090033)
34
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070035var buildDir string
36
Jooyung Hand3639552019-08-09 12:57:43 +090037// names returns name list from white space separated string
38func names(s string) (ns []string) {
39 for _, n := range strings.Split(s, " ") {
40 if len(n) > 0 {
41 ns = append(ns, n)
42 }
43 }
44 return
45}
46
Jooyung Han344d5432019-08-23 11:17:39 +090047func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
48 t.Helper()
49 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090050 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
51 if len(errs) > 0 {
52 android.FailIfNoMatchingErrors(t, pattern, errs)
53 return
54 }
55 _, errs = ctx.PrepareBuildActions(config)
56 if len(errs) > 0 {
57 android.FailIfNoMatchingErrors(t, pattern, errs)
58 return
59 }
60
61 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
62}
63
Jooyung Han344d5432019-08-23 11:17:39 +090064func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
65 t.Helper()
66 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090067 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
68 android.FailIfErrored(t, errs)
69 _, errs = ctx.PrepareBuildActions(config)
70 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070071 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090072}
73
Jooyung Han344d5432019-08-23 11:17:39 +090074type testCustomizer func(fs map[string][]byte, config android.Config)
75
76func withFiles(files map[string][]byte) testCustomizer {
77 return func(fs map[string][]byte, config android.Config) {
78 for k, v := range files {
79 fs[k] = v
80 }
81 }
82}
83
84func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
85 return func(fs map[string][]byte, config android.Config) {
86 for k, v := range targets {
87 config.Targets[k] = v
88 }
89 }
90}
91
Jiyong Parkaf8998c2020-02-28 16:51:07 +090092func withManifestPackageNameOverrides(specs []string) testCustomizer {
93 return func(fs map[string][]byte, config android.Config) {
94 config.TestProductVariables.ManifestPackageNameOverrides = specs
95 }
96}
97
Jooyung Han31c470b2019-10-18 16:26:59 +090098func withBinder32bit(fs map[string][]byte, config android.Config) {
99 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
100}
101
Jiyong Park7cd10e32020-01-14 09:22:18 +0900102func withUnbundledBuild(fs map[string][]byte, config android.Config) {
103 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
104}
105
Jooyung Han344d5432019-08-23 11:17:39 +0900106func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900107 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900108
109 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900110 filegroup {
111 name: "myapex-file_contexts",
112 srcs: [
113 "system/sepolicy/apex/myapex-file_contexts",
114 ],
115 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900116 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800117
Colin Crossf9aabd72020-02-15 11:29:50 -0800118 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
119
Dario Frenicde2a032019-10-27 00:29:22 +0100120 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900121
Jooyung Han344d5432019-08-23 11:17:39 +0900122 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900123 "a.java": nil,
124 "PrebuiltAppFoo.apk": nil,
125 "PrebuiltAppFooPriv.apk": nil,
126 "build/make/target/product/security": nil,
127 "apex_manifest.json": nil,
128 "AndroidManifest.xml": nil,
129 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900130 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900131 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900132 "system/sepolicy/apex/otherapex-file_contexts": nil,
133 "system/sepolicy/apex/commonapex-file_contexts": nil,
134 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800135 "mylib.cpp": nil,
136 "mylib_common.cpp": nil,
137 "mytest.cpp": nil,
138 "mytest1.cpp": nil,
139 "mytest2.cpp": nil,
140 "mytest3.cpp": nil,
141 "myprebuilt": nil,
142 "my_include": nil,
143 "foo/bar/MyClass.java": nil,
144 "prebuilt.jar": nil,
Paul Duffin3766cb72020-04-07 15:25:44 +0100145 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800146 "vendor/foo/devkeys/test.x509.pem": nil,
147 "vendor/foo/devkeys/test.pk8": nil,
148 "testkey.x509.pem": nil,
149 "testkey.pk8": nil,
150 "testkey.override.x509.pem": nil,
151 "testkey.override.pk8": nil,
152 "vendor/foo/devkeys/testkey.avbpubkey": nil,
153 "vendor/foo/devkeys/testkey.pem": nil,
154 "NOTICE": nil,
155 "custom_notice": nil,
Jiyong Park162e8442020-03-17 19:16:40 +0900156 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "testkey2.avbpubkey": nil,
158 "testkey2.pem": nil,
159 "myapex-arm64.apex": nil,
160 "myapex-arm.apex": nil,
Jaewoong Jung8cf307e2020-05-14 14:15:24 -0700161 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800162 "frameworks/base/api/current.txt": nil,
163 "framework/aidl/a.aidl": nil,
164 "build/make/core/proguard.flags": nil,
165 "build/make/core/proguard_basic_keeps.flags": nil,
166 "dummy.txt": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900167 }
168
Colin Crossf9aabd72020-02-15 11:29:50 -0800169 cc.GatherRequiredFilesForTest(fs)
170
Jooyung Han344d5432019-08-23 11:17:39 +0900171 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800172 // The fs now needs to be populated before creating the config, call handlers twice
173 // for now, once to get any fs changes, and later after the config was created to
174 // set product variables or targets.
175 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
176 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900177 }
178
Colin Cross98be1bb2019-12-13 20:41:13 -0800179 config := android.TestArchConfig(buildDir, nil, bp, fs)
180 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
181 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
182 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
183 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
184 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
185 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
186
187 for _, handler := range handlers {
188 // The fs now needs to be populated before creating the config, call handlers twice
189 // for now, earlier to get any fs changes, and now after the config was created to
190 // set product variables or targets.
191 tempFS := map[string][]byte{}
192 handler(tempFS, config)
193 }
194
195 ctx := android.NewTestArchContext()
196 ctx.RegisterModuleType("apex", BundleFactory)
197 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
198 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
199 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
200 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
201 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
202 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jung8cf307e2020-05-14 14:15:24 -0700203 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800204
Jooyung Hana57af4a2020-01-23 05:36:59 +0000205 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
206 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
207
Paul Duffin77980a82019-12-19 16:01:36 +0000208 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800209 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800210 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
211 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800212 ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000213 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800214 ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800215 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000216 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000217 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000218 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900219 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800220
Colin Cross98be1bb2019-12-13 20:41:13 -0800221 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800222 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800223
224 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225
Jooyung Han5c998b92019-06-27 11:30:33 +0900226 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900227}
228
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700229func setUp() {
230 var err error
231 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900232 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700233 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900234 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235}
236
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700237func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900238 os.RemoveAll(buildDir)
239}
240
241// ensure that 'result' contains 'expected'
242func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900243 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244 if !strings.Contains(result, expected) {
245 t.Errorf("%q is not found in %q", expected, result)
246 }
247}
248
249// ensures that 'result' does not contain 'notExpected'
250func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900251 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252 if strings.Contains(result, notExpected) {
253 t.Errorf("%q is found in %q", notExpected, result)
254 }
255}
256
257func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900258 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259 if !android.InList(expected, result) {
260 t.Errorf("%q is not found in %v", expected, result)
261 }
262}
263
264func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900265 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900266 if android.InList(notExpected, result) {
267 t.Errorf("%q is found in %v", notExpected, result)
268 }
269}
270
Jooyung Hane1633032019-08-01 17:41:43 +0900271func ensureListEmpty(t *testing.T, result []string) {
272 t.Helper()
273 if len(result) > 0 {
274 t.Errorf("%q is expected to be empty", result)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278// Minimal test
279func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700280 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900281 apex_defaults {
282 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900283 manifest: ":myapex.manifest",
284 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900285 key: "myapex.key",
286 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800287 multilib: {
288 both: {
289 binaries: ["foo",],
290 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900291 },
Jiyong Park2cd081c2020-06-01 21:39:15 +0900292 java_libs: [
293 "myjar",
294 "myjar_dex",
295 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900296 }
297
Jiyong Park30ca9372019-02-07 16:27:23 +0900298 apex {
299 name: "myapex",
300 defaults: ["myapex-defaults"],
301 }
302
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 apex_key {
304 name: "myapex.key",
305 public_key: "testkey.avbpubkey",
306 private_key: "testkey.pem",
307 }
308
Jiyong Park809bb722019-02-13 21:33:49 +0900309 filegroup {
310 name: "myapex.manifest",
311 srcs: ["apex_manifest.json"],
312 }
313
314 filegroup {
315 name: "myapex.androidmanifest",
316 srcs: ["AndroidManifest.xml"],
317 }
318
Jiyong Park25fc6a92018-11-18 18:02:45 +0900319 cc_library {
320 name: "mylib",
321 srcs: ["mylib.cpp"],
322 shared_libs: ["mylib2"],
323 system_shared_libs: [],
324 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000325 // TODO: remove //apex_available:platform
326 apex_available: [
327 "//apex_available:platform",
328 "myapex",
329 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Alex Light3d673592019-01-18 14:37:31 -0800332 cc_binary {
333 name: "foo",
334 srcs: ["mylib.cpp"],
335 compile_multilib: "both",
336 multilib: {
337 lib32: {
338 suffix: "32",
339 },
340 lib64: {
341 suffix: "64",
342 },
343 },
344 symlinks: ["foo_link_"],
345 symlink_preferred_arch: true,
346 system_shared_libs: [],
347 static_executable: true,
348 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000349 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800350 }
351
Paul Duffin3766cb72020-04-07 15:25:44 +0100352 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 name: "mylib2",
354 srcs: ["mylib.cpp"],
355 system_shared_libs: [],
356 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900357 notice: "custom_notice",
Jiyong Park162e8442020-03-17 19:16:40 +0900358 static_libs: ["libstatic"],
359 // TODO: remove //apex_available:platform
360 apex_available: [
361 "//apex_available:platform",
362 "myapex",
363 ],
364 }
365
Paul Duffin3766cb72020-04-07 15:25:44 +0100366 cc_prebuilt_library_shared {
367 name: "mylib2",
368 srcs: ["prebuilt.so"],
369 // TODO: remove //apex_available:platform
370 apex_available: [
371 "//apex_available:platform",
372 "myapex",
373 ],
374 }
375
Jiyong Park162e8442020-03-17 19:16:40 +0900376 cc_library_static {
377 name: "libstatic",
378 srcs: ["mylib.cpp"],
379 system_shared_libs: [],
380 stl: "none",
381 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000382 // TODO: remove //apex_available:platform
383 apex_available: [
384 "//apex_available:platform",
385 "myapex",
386 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900387 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900388
389 java_library {
390 name: "myjar",
391 srcs: ["foo/bar/MyClass.java"],
Jiyong Parked50ca82020-05-28 23:46:55 +0900392 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900393 sdk_version: "none",
394 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900395 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900396 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000397 // TODO: remove //apex_available:platform
398 apex_available: [
399 "//apex_available:platform",
400 "myapex",
401 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900402 }
403
Jiyong Park2cd081c2020-06-01 21:39:15 +0900404 dex_import {
405 name: "myjar_dex",
406 jars: ["prebuilt.jar"],
407 apex_available: [
408 "//apex_available:platform",
409 "myapex",
410 ],
411 }
412
Jiyong Park7f7766d2019-07-25 22:02:35 +0900413 java_library {
414 name: "myotherjar",
415 srcs: ["foo/bar/MyClass.java"],
416 sdk_version: "none",
417 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900418 // TODO: remove //apex_available:platform
419 apex_available: [
420 "//apex_available:platform",
421 "myapex",
422 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900423 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900424
425 java_library {
426 name: "mysharedjar",
427 srcs: ["foo/bar/MyClass.java"],
428 sdk_version: "none",
429 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900430 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 `)
432
Sundong Ahnabb64432019-10-22 13:58:29 +0900433 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900434
435 optFlags := apexRule.Args["opt_flags"]
436 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700437 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900438 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900439
Jiyong Park25fc6a92018-11-18 18:02:45 +0900440 copyCmds := apexRule.Args["copy_commands"]
441
442 // Ensure that main rule creates an output
443 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
444
445 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800446 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900447 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park2cd081c2020-06-01 21:39:15 +0900448 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900449
450 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800451 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900452 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900453
454 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800455 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
456 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parked50ca82020-05-28 23:46:55 +0900457 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park2cd081c2020-06-01 21:39:15 +0900458 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900459 // .. but not for java libs
460 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900461 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800462
Colin Cross7113d202019-11-20 16:39:12 -0800463 // Ensure that the platform variant ends with _shared or _common
464 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
465 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
467 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900468 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
469
470 // Ensure that dynamic dependency to java libs are not included
471 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800472
473 // Ensure that all symlinks are present.
474 found_foo_link_64 := false
475 found_foo := false
476 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900477 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800478 if strings.HasSuffix(cmd, "bin/foo") {
479 found_foo = true
480 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
481 found_foo_link_64 = true
482 }
483 }
484 }
485 good := found_foo && found_foo_link_64
486 if !good {
487 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
488 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900489
Sundong Ahnabb64432019-10-22 13:58:29 +0900490 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700491 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park162e8442020-03-17 19:16:40 +0900492 if len(noticeInputs) != 3 {
493 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900494 }
495 ensureListContains(t, noticeInputs, "NOTICE")
496 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park162e8442020-03-17 19:16:40 +0900497 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900498
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100499 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100500 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
501 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
502 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
503 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
504 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100505
506 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100507 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
508 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
509 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
510 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
511 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800512}
513
Jooyung Hanf21c7972019-12-16 22:32:06 +0900514func TestDefaults(t *testing.T) {
515 ctx, _ := testApex(t, `
516 apex_defaults {
517 name: "myapex-defaults",
518 key: "myapex.key",
519 prebuilts: ["myetc"],
520 native_shared_libs: ["mylib"],
521 java_libs: ["myjar"],
522 apps: ["AppFoo"],
523 }
524
525 prebuilt_etc {
526 name: "myetc",
527 src: "myprebuilt",
528 }
529
530 apex {
531 name: "myapex",
532 defaults: ["myapex-defaults"],
533 }
534
535 apex_key {
536 name: "myapex.key",
537 public_key: "testkey.avbpubkey",
538 private_key: "testkey.pem",
539 }
540
541 cc_library {
542 name: "mylib",
543 system_shared_libs: [],
544 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000545 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900546 }
547
548 java_library {
549 name: "myjar",
550 srcs: ["foo/bar/MyClass.java"],
551 sdk_version: "none",
552 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000553 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900554 }
555
556 android_app {
557 name: "AppFoo",
558 srcs: ["foo/bar/MyClass.java"],
559 sdk_version: "none",
560 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000561 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900562 }
563 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000564 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900565 "etc/myetc",
566 "javalib/myjar.jar",
567 "lib64/mylib.so",
568 "app/AppFoo/AppFoo.apk",
569 })
570}
571
Jooyung Han01a3ee22019-11-02 02:52:25 +0900572func TestApexManifest(t *testing.T) {
573 ctx, _ := testApex(t, `
574 apex {
575 name: "myapex",
576 key: "myapex.key",
577 }
578
579 apex_key {
580 name: "myapex.key",
581 public_key: "testkey.avbpubkey",
582 private_key: "testkey.pem",
583 }
584 `)
585
586 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900587 args := module.Rule("apexRule").Args
588 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
589 t.Error("manifest should be apex_manifest.pb, but " + manifest)
590 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900591}
592
Alex Light5098a612018-11-29 17:12:15 -0800593func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700594 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800595 apex {
596 name: "myapex",
597 key: "myapex.key",
598 payload_type: "zip",
599 native_shared_libs: ["mylib"],
600 }
601
602 apex_key {
603 name: "myapex.key",
604 public_key: "testkey.avbpubkey",
605 private_key: "testkey.pem",
606 }
607
608 cc_library {
609 name: "mylib",
610 srcs: ["mylib.cpp"],
611 shared_libs: ["mylib2"],
612 system_shared_libs: [],
613 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000614 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800615 }
616
617 cc_library {
618 name: "mylib2",
619 srcs: ["mylib.cpp"],
620 system_shared_libs: [],
621 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000622 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800623 }
624 `)
625
Sundong Ahnabb64432019-10-22 13:58:29 +0900626 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800627 copyCmds := zipApexRule.Args["copy_commands"]
628
629 // Ensure that main rule creates an output
630 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
631
632 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800633 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800634
635 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800636 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800637
638 // Ensure that both direct and indirect deps are copied into apex
639 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
640 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900641}
642
643func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700644 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900645 apex {
646 name: "myapex",
647 key: "myapex.key",
648 native_shared_libs: ["mylib", "mylib3"],
649 }
650
651 apex_key {
652 name: "myapex.key",
653 public_key: "testkey.avbpubkey",
654 private_key: "testkey.pem",
655 }
656
657 cc_library {
658 name: "mylib",
659 srcs: ["mylib.cpp"],
660 shared_libs: ["mylib2", "mylib3"],
661 system_shared_libs: [],
662 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000663 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900664 }
665
666 cc_library {
667 name: "mylib2",
668 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900669 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900670 system_shared_libs: [],
671 stl: "none",
672 stubs: {
673 versions: ["1", "2", "3"],
674 },
675 }
676
677 cc_library {
678 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900679 srcs: ["mylib.cpp"],
680 shared_libs: ["mylib4"],
681 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900682 stl: "none",
683 stubs: {
684 versions: ["10", "11", "12"],
685 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000686 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900687 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900688
689 cc_library {
690 name: "mylib4",
691 srcs: ["mylib.cpp"],
692 system_shared_libs: [],
693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000694 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900695 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900696 `)
697
Sundong Ahnabb64432019-10-22 13:58:29 +0900698 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900699 copyCmds := apexRule.Args["copy_commands"]
700
701 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800702 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900703
704 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800705 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900706
707 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800708 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900709
Colin Cross7113d202019-11-20 16:39:12 -0800710 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900711
712 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900713 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900714 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900715 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900716
717 // 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 -0800718 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900719 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800720 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900721
722 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900723 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900724 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900725
726 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900727 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900728
Jooyung Hana57af4a2020-01-23 05:36:59 +0000729 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900730 "lib64/mylib.so",
731 "lib64/mylib3.so",
732 "lib64/mylib4.so",
733 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900734}
735
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900736func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700737 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900738 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900739 name: "myapex2",
740 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900741 native_shared_libs: ["mylib"],
742 }
743
744 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900745 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749
750 cc_library {
751 name: "mylib",
752 srcs: ["mylib.cpp"],
753 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900754 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900755 system_shared_libs: [],
756 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000757 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900758 }
759
760 cc_library {
761 name: "libfoo",
762 srcs: ["mylib.cpp"],
763 shared_libs: ["libbar"],
764 system_shared_libs: [],
765 stl: "none",
766 stubs: {
767 versions: ["10", "20", "30"],
768 },
769 }
770
771 cc_library {
772 name: "libbar",
773 srcs: ["mylib.cpp"],
774 system_shared_libs: [],
775 stl: "none",
776 }
777
Jiyong Park678c8812020-02-07 17:25:49 +0900778 cc_library_static {
779 name: "libbaz",
780 srcs: ["mylib.cpp"],
781 system_shared_libs: [],
782 stl: "none",
783 apex_available: [ "myapex2" ],
784 }
785
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900786 `)
787
Jiyong Park83dc74b2020-01-14 18:38:44 +0900788 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900789 copyCmds := apexRule.Args["copy_commands"]
790
791 // Ensure that direct non-stubs dep is always included
792 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
793
794 // Ensure that indirect stubs dep is not included
795 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
796
797 // Ensure that dependency of stubs is not included
798 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
799
Jiyong Park83dc74b2020-01-14 18:38:44 +0900800 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900801
802 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900803 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900804 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900805 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900806
Jiyong Park3ff16992019-12-27 14:11:47 +0900807 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900808
809 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
810 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900811
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100812 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100813 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
814 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
815 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900816
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100817 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100818 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
819 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
820 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900821}
822
Jooyung Hand3639552019-08-09 12:57:43 +0900823func TestApexWithRuntimeLibsDependency(t *testing.T) {
824 /*
825 myapex
826 |
827 v (runtime_libs)
828 mylib ------+------> libfoo [provides stub]
829 |
830 `------> libbar
831 */
832 ctx, _ := testApex(t, `
833 apex {
834 name: "myapex",
835 key: "myapex.key",
836 native_shared_libs: ["mylib"],
837 }
838
839 apex_key {
840 name: "myapex.key",
841 public_key: "testkey.avbpubkey",
842 private_key: "testkey.pem",
843 }
844
845 cc_library {
846 name: "mylib",
847 srcs: ["mylib.cpp"],
848 runtime_libs: ["libfoo", "libbar"],
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 cc_library {
855 name: "libfoo",
856 srcs: ["mylib.cpp"],
857 system_shared_libs: [],
858 stl: "none",
859 stubs: {
860 versions: ["10", "20", "30"],
861 },
862 }
863
864 cc_library {
865 name: "libbar",
866 srcs: ["mylib.cpp"],
867 system_shared_libs: [],
868 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000869 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900870 }
871
872 `)
873
Sundong Ahnabb64432019-10-22 13:58:29 +0900874 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900875 copyCmds := apexRule.Args["copy_commands"]
876
877 // Ensure that direct non-stubs dep is always included
878 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
879
880 // Ensure that indirect stubs dep is not included
881 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
882
883 // Ensure that runtime_libs dep in included
884 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
885
Sundong Ahnabb64432019-10-22 13:58:29 +0900886 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900887 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
888 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900889
890}
891
Jooyung Han67a96cd2020-03-13 15:23:36 +0900892func TestApexDependsOnLLNDKTransitively(t *testing.T) {
893 testcases := []struct {
894 name string
895 minSdkVersion string
896 shouldLink string
897 shouldNotLink []string
898 }{
899 {
Jooyung Han74066602020-03-20 04:29:24 +0900900 name: "should link to the latest",
Jooyung Han67a96cd2020-03-13 15:23:36 +0900901 minSdkVersion: "current",
902 shouldLink: "30",
903 shouldNotLink: []string{"29"},
904 },
905 {
906 name: "should link to llndk#29",
907 minSdkVersion: "29",
908 shouldLink: "29",
909 shouldNotLink: []string{"30"},
910 },
911 }
912 for _, tc := range testcases {
913 t.Run(tc.name, func(t *testing.T) {
914 ctx, _ := testApex(t, `
915 apex {
916 name: "myapex",
917 key: "myapex.key",
918 use_vendor: true,
919 native_shared_libs: ["mylib"],
920 min_sdk_version: "`+tc.minSdkVersion+`",
921 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900922
Jooyung Han67a96cd2020-03-13 15:23:36 +0900923 apex_key {
924 name: "myapex.key",
925 public_key: "testkey.avbpubkey",
926 private_key: "testkey.pem",
927 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900928
Jooyung Han67a96cd2020-03-13 15:23:36 +0900929 cc_library {
930 name: "mylib",
931 srcs: ["mylib.cpp"],
932 vendor_available: true,
933 shared_libs: ["libbar"],
934 system_shared_libs: [],
935 stl: "none",
936 apex_available: [ "myapex" ],
937 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900938
Jooyung Han67a96cd2020-03-13 15:23:36 +0900939 cc_library {
940 name: "libbar",
941 srcs: ["mylib.cpp"],
942 system_shared_libs: [],
943 stl: "none",
944 stubs: { versions: ["29","30"] },
945 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900946
Jooyung Han67a96cd2020-03-13 15:23:36 +0900947 llndk_library {
948 name: "libbar",
949 symbol_file: "",
950 }
951 `, func(fs map[string][]byte, config android.Config) {
952 setUseVendorWhitelistForTest(config, []string{"myapex"})
953 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +0900954
Jooyung Han67a96cd2020-03-13 15:23:36 +0900955 // Ensure that LLNDK dep is not included
956 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
957 "lib64/mylib.so",
958 })
Jooyung Han9c80bae2019-08-20 17:30:57 +0900959
Jooyung Han67a96cd2020-03-13 15:23:36 +0900960 // Ensure that LLNDK dep is required
961 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
962 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
963 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +0900964
Jooyung Han67a96cd2020-03-13 15:23:36 +0900965 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
966 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
967 for _, ver := range tc.shouldNotLink {
968 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
969 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900970
Jooyung Han67a96cd2020-03-13 15:23:36 +0900971 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
972 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
973 })
974 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900975}
976
Jiyong Park25fc6a92018-11-18 18:02:45 +0900977func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700978 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900979 apex {
980 name: "myapex",
981 key: "myapex.key",
982 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
983 }
984
985 apex_key {
986 name: "myapex.key",
987 public_key: "testkey.avbpubkey",
988 private_key: "testkey.pem",
989 }
990
991 cc_library {
992 name: "mylib",
993 srcs: ["mylib.cpp"],
994 shared_libs: ["libdl#27"],
995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000996 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900997 }
998
999 cc_library_shared {
1000 name: "mylib_shared",
1001 srcs: ["mylib.cpp"],
1002 shared_libs: ["libdl#27"],
1003 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001004 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001005 }
1006
1007 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001008 name: "libBootstrap",
1009 srcs: ["mylib.cpp"],
1010 stl: "none",
1011 bootstrap: true,
1012 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001013 `)
1014
Sundong Ahnabb64432019-10-22 13:58:29 +09001015 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016 copyCmds := apexRule.Args["copy_commands"]
1017
1018 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001019 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001020 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1021 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001022
1023 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001024 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001025
Colin Cross7113d202019-11-20 16:39:12 -08001026 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1027 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1028 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001029
1030 // For dependency to libc
1031 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001032 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001033 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001034 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001035 // ... Cflags from stub is correctly exported to mylib
1036 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1037 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1038
1039 // For dependency to libm
1040 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001041 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001042 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001043 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001044 // ... and is not compiling with the stub
1045 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1046 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1047
1048 // For dependency to libdl
1049 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001050 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001051 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001052 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1053 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001054 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001055 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001056 // ... Cflags from stub is correctly exported to mylib
1057 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1058 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001059
1060 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001061 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1062 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1063 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1064 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001065}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001066
Jooyung Han0c4e0162020-02-26 22:45:42 +09001067func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1068 // there are three links between liba --> libz
1069 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1070 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1071 // 3) (platform) -> liba -> libz : this should be non-stub link
1072 ctx, _ := testApex(t, `
1073 apex {
1074 name: "myapex",
1075 key: "myapex.key",
1076 native_shared_libs: ["libx"],
1077 min_sdk_version: "2",
1078 }
1079
1080 apex {
1081 name: "otherapex",
1082 key: "myapex.key",
1083 native_shared_libs: ["liby"],
1084 min_sdk_version: "3",
1085 }
1086
1087 apex_key {
1088 name: "myapex.key",
1089 public_key: "testkey.avbpubkey",
1090 private_key: "testkey.pem",
1091 }
1092
1093 cc_library {
1094 name: "libx",
1095 shared_libs: ["liba"],
1096 system_shared_libs: [],
1097 stl: "none",
1098 apex_available: [ "myapex" ],
1099 }
1100
1101 cc_library {
1102 name: "liby",
1103 shared_libs: ["liba"],
1104 system_shared_libs: [],
1105 stl: "none",
1106 apex_available: [ "otherapex" ],
1107 }
1108
1109 cc_library {
1110 name: "liba",
1111 shared_libs: ["libz"],
1112 system_shared_libs: [],
1113 stl: "none",
1114 apex_available: [
1115 "//apex_available:anyapex",
1116 "//apex_available:platform",
1117 ],
1118 }
1119
1120 cc_library {
1121 name: "libz",
1122 system_shared_libs: [],
1123 stl: "none",
1124 stubs: {
1125 versions: ["1", "3"],
1126 },
1127 }
1128 `, withUnbundledBuild)
1129
1130 expectLink := func(from, from_variant, to, to_variant string) {
1131 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1132 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1133 }
1134 expectNoLink := func(from, from_variant, to, to_variant string) {
1135 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1136 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1137 }
1138 // platform liba is linked to non-stub version
1139 expectLink("liba", "shared", "libz", "shared")
1140 // liba in myapex is linked to #1
1141 expectLink("liba", "shared_myapex", "libz", "shared_1")
1142 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1143 expectNoLink("liba", "shared_myapex", "libz", "shared")
1144 // liba in otherapex is linked to #3
1145 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1146 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1147 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1148}
1149
Jooyung Han29e91d22020-04-02 01:41:41 +09001150func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1151 ctx, _ := testApex(t, `
1152 apex {
1153 name: "myapex",
1154 key: "myapex.key",
1155 native_shared_libs: ["libx"],
1156 min_sdk_version: "R",
1157 }
1158
1159 apex_key {
1160 name: "myapex.key",
1161 public_key: "testkey.avbpubkey",
1162 private_key: "testkey.pem",
1163 }
1164
1165 cc_library {
1166 name: "libx",
1167 shared_libs: ["libz"],
1168 system_shared_libs: [],
1169 stl: "none",
1170 apex_available: [ "myapex" ],
1171 }
1172
1173 cc_library {
1174 name: "libz",
1175 system_shared_libs: [],
1176 stl: "none",
1177 stubs: {
1178 versions: ["29", "R"],
1179 },
1180 }
1181 `, func(fs map[string][]byte, config android.Config) {
1182 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1183 })
1184
1185 expectLink := func(from, from_variant, to, to_variant string) {
1186 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1187 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1188 }
1189 expectNoLink := func(from, from_variant, to, to_variant string) {
1190 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1191 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1192 }
1193 // 9000 is quite a magic number.
1194 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1195 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1196 // to distinguish them from finalized and future_api(10000)
1197 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1198 // (refer android/api_levels.go)
1199 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1200 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1201 expectNoLink("libx", "shared_myapex", "libz", "shared")
1202}
1203
Jooyung Han0c4e0162020-02-26 22:45:42 +09001204func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1205 ctx, _ := testApex(t, `
1206 apex {
1207 name: "myapex",
1208 key: "myapex.key",
1209 native_shared_libs: ["libx"],
1210 }
1211
1212 apex_key {
1213 name: "myapex.key",
1214 public_key: "testkey.avbpubkey",
1215 private_key: "testkey.pem",
1216 }
1217
1218 cc_library {
1219 name: "libx",
1220 shared_libs: ["libz"],
1221 system_shared_libs: [],
1222 stl: "none",
1223 apex_available: [ "myapex" ],
1224 }
1225
1226 cc_library {
1227 name: "libz",
1228 system_shared_libs: [],
1229 stl: "none",
1230 stubs: {
1231 versions: ["1", "2"],
1232 },
1233 }
1234 `)
1235
1236 expectLink := func(from, from_variant, to, to_variant string) {
1237 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1238 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1239 }
1240 expectNoLink := func(from, from_variant, to, to_variant string) {
1241 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1242 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1243 }
1244 expectLink("libx", "shared_myapex", "libz", "shared_2")
1245 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1246 expectNoLink("libx", "shared_myapex", "libz", "shared")
1247}
1248
1249func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1250 ctx, _ := testApex(t, `
1251 apex {
1252 name: "myapex",
1253 key: "myapex.key",
1254 native_shared_libs: ["libx"],
1255 }
1256
1257 apex_key {
1258 name: "myapex.key",
1259 public_key: "testkey.avbpubkey",
1260 private_key: "testkey.pem",
1261 }
1262
1263 cc_library {
1264 name: "libx",
1265 system_shared_libs: [],
1266 stl: "none",
1267 apex_available: [ "myapex" ],
1268 stubs: {
1269 versions: ["1", "2"],
1270 },
1271 }
1272
1273 cc_library {
1274 name: "libz",
1275 shared_libs: ["libx"],
1276 system_shared_libs: [],
1277 stl: "none",
1278 }
1279 `)
1280
1281 expectLink := func(from, from_variant, to, to_variant string) {
1282 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1283 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1284 }
1285 expectNoLink := func(from, from_variant, to, to_variant string) {
1286 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1287 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1288 }
1289 expectLink("libz", "shared", "libx", "shared_2")
1290 expectNoLink("libz", "shared", "libz", "shared_1")
1291 expectNoLink("libz", "shared", "libz", "shared")
1292}
1293
Jooyung Han74066602020-03-20 04:29:24 +09001294func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han0c4e0162020-02-26 22:45:42 +09001295 ctx, _ := testApex(t, `
1296 apex {
1297 name: "myapex",
1298 key: "myapex.key",
1299 native_shared_libs: ["libx"],
1300 min_sdk_version: "29",
1301 }
1302
1303 apex_key {
1304 name: "myapex.key",
1305 public_key: "testkey.avbpubkey",
1306 private_key: "testkey.pem",
1307 }
1308
1309 cc_library {
1310 name: "libx",
1311 shared_libs: ["libbar"],
1312 apex_available: [ "myapex" ],
1313 }
1314
1315 cc_library {
1316 name: "libbar",
1317 stubs: {
1318 versions: ["29", "30"],
1319 },
1320 }
Jooyung Han74066602020-03-20 04:29:24 +09001321 `, func(fs map[string][]byte, config android.Config) {
1322 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1323 })
Jooyung Han0c4e0162020-02-26 22:45:42 +09001324 expectLink := func(from, from_variant, to, to_variant string) {
1325 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1326 libFlags := ld.Args["libFlags"]
1327 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1328 }
Jooyung Han74066602020-03-20 04:29:24 +09001329 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han0c4e0162020-02-26 22:45:42 +09001330}
1331
Jooyung Han74066602020-03-20 04:29:24 +09001332func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han0c4e0162020-02-26 22:45:42 +09001333 ctx, _ := testApex(t, `
1334 apex {
1335 name: "myapex",
1336 key: "myapex.key",
1337 native_shared_libs: ["libx"],
1338 min_sdk_version: "29",
1339 }
1340
1341 apex_key {
1342 name: "myapex.key",
1343 public_key: "testkey.avbpubkey",
1344 private_key: "testkey.pem",
1345 }
1346
1347 cc_library {
1348 name: "libx",
1349 apex_available: [ "myapex" ],
1350 }
Jooyung Han74066602020-03-20 04:29:24 +09001351 `)
Jooyung Han0c4e0162020-02-26 22:45:42 +09001352
1353 // ensure apex variant of c++ is linked with static unwinder
1354 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1355 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1356 // note that platform variant is not.
1357 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1358 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han0c4e0162020-02-26 22:45:42 +09001359}
1360
1361func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han74066602020-03-20 04:29:24 +09001362 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han0c4e0162020-02-26 22:45:42 +09001363 apex {
1364 name: "myapex",
1365 key: "myapex.key",
1366 native_shared_libs: ["libx"],
1367 min_sdk_version: "29",
1368 }
1369
1370 apex_key {
1371 name: "myapex.key",
1372 public_key: "testkey.avbpubkey",
1373 private_key: "testkey.pem",
1374 }
1375
1376 cc_library {
1377 name: "libx",
1378 shared_libs: ["libz"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 apex_available: [ "myapex" ],
1382 }
1383
1384 cc_library {
1385 name: "libz",
1386 system_shared_libs: [],
1387 stl: "none",
1388 stubs: {
1389 versions: ["30"],
1390 },
1391 }
Jooyung Han74066602020-03-20 04:29:24 +09001392 `)
Jooyung Han0c4e0162020-02-26 22:45:42 +09001393
Jooyung Han29e91d22020-04-02 01:41:41 +09001394 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han0c4e0162020-02-26 22:45:42 +09001395 apex {
1396 name: "myapex",
1397 key: "myapex.key",
Jooyung Han29e91d22020-04-02 01:41:41 +09001398 min_sdk_version: "abc",
Jooyung Han0c4e0162020-02-26 22:45:42 +09001399 }
1400
1401 apex_key {
1402 name: "myapex.key",
1403 public_key: "testkey.avbpubkey",
1404 private_key: "testkey.pem",
1405 }
1406 `)
1407}
1408
Artur Satayev2eedf622020-04-15 17:29:42 +01001409func TestJavaStableSdkVersion(t *testing.T) {
1410 testCases := []struct {
1411 name string
1412 expectedError string
1413 bp string
1414 }{
1415 {
1416 name: "Non-updatable apex with non-stable dep",
1417 bp: `
1418 apex {
1419 name: "myapex",
1420 java_libs: ["myjar"],
1421 key: "myapex.key",
1422 }
1423 apex_key {
1424 name: "myapex.key",
1425 public_key: "testkey.avbpubkey",
1426 private_key: "testkey.pem",
1427 }
1428 java_library {
1429 name: "myjar",
1430 srcs: ["foo/bar/MyClass.java"],
1431 sdk_version: "core_platform",
1432 apex_available: ["myapex"],
1433 }
1434 `,
1435 },
1436 {
1437 name: "Updatable apex with stable dep",
1438 bp: `
1439 apex {
1440 name: "myapex",
1441 java_libs: ["myjar"],
1442 key: "myapex.key",
1443 updatable: true,
1444 min_sdk_version: "29",
1445 }
1446 apex_key {
1447 name: "myapex.key",
1448 public_key: "testkey.avbpubkey",
1449 private_key: "testkey.pem",
1450 }
1451 java_library {
1452 name: "myjar",
1453 srcs: ["foo/bar/MyClass.java"],
1454 sdk_version: "current",
1455 apex_available: ["myapex"],
1456 }
1457 `,
1458 },
1459 {
1460 name: "Updatable apex with non-stable dep",
1461 expectedError: "cannot depend on \"myjar\"",
1462 bp: `
1463 apex {
1464 name: "myapex",
1465 java_libs: ["myjar"],
1466 key: "myapex.key",
1467 updatable: true,
1468 }
1469 apex_key {
1470 name: "myapex.key",
1471 public_key: "testkey.avbpubkey",
1472 private_key: "testkey.pem",
1473 }
1474 java_library {
1475 name: "myjar",
1476 srcs: ["foo/bar/MyClass.java"],
1477 sdk_version: "core_platform",
1478 apex_available: ["myapex"],
1479 }
1480 `,
1481 },
1482 {
1483 name: "Updatable apex with non-stable transitive dep",
1484 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1485 bp: `
1486 apex {
1487 name: "myapex",
1488 java_libs: ["myjar"],
1489 key: "myapex.key",
1490 updatable: true,
1491 }
1492 apex_key {
1493 name: "myapex.key",
1494 public_key: "testkey.avbpubkey",
1495 private_key: "testkey.pem",
1496 }
1497 java_library {
1498 name: "myjar",
1499 srcs: ["foo/bar/MyClass.java"],
1500 sdk_version: "current",
1501 apex_available: ["myapex"],
1502 static_libs: ["transitive-jar"],
1503 }
1504 java_library {
1505 name: "transitive-jar",
1506 srcs: ["foo/bar/MyClass.java"],
1507 sdk_version: "core_platform",
1508 apex_available: ["myapex"],
1509 }
1510 `,
1511 },
1512 }
1513
1514 for _, test := range testCases {
1515 t.Run(test.name, func(t *testing.T) {
1516 if test.expectedError == "" {
1517 testApex(t, test.bp)
1518 } else {
1519 testApexError(t, test.expectedError, test.bp)
1520 }
1521 })
1522 }
1523}
1524
Jiyong Park7c2ee712018-12-07 00:42:25 +09001525func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001526 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001527 apex {
1528 name: "myapex",
1529 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001530 native_shared_libs: ["mylib"],
1531 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001532 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001533 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001534 }
1535
1536 apex_key {
1537 name: "myapex.key",
1538 public_key: "testkey.avbpubkey",
1539 private_key: "testkey.pem",
1540 }
1541
1542 prebuilt_etc {
1543 name: "myetc",
1544 src: "myprebuilt",
1545 sub_dir: "foo/bar",
1546 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001547
1548 cc_library {
1549 name: "mylib",
1550 srcs: ["mylib.cpp"],
1551 relative_install_path: "foo/bar",
1552 system_shared_libs: [],
1553 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001554 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001555 }
1556
1557 cc_binary {
1558 name: "mybin",
1559 srcs: ["mylib.cpp"],
1560 relative_install_path: "foo/bar",
1561 system_shared_libs: [],
1562 static_executable: true,
1563 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001564 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001565 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001566 `)
1567
Sundong Ahnabb64432019-10-22 13:58:29 +09001568 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001569 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1570
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001571 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001572 ensureListContains(t, dirs, "etc")
1573 ensureListContains(t, dirs, "etc/foo")
1574 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001575 ensureListContains(t, dirs, "lib64")
1576 ensureListContains(t, dirs, "lib64/foo")
1577 ensureListContains(t, dirs, "lib64/foo/bar")
1578 ensureListContains(t, dirs, "lib")
1579 ensureListContains(t, dirs, "lib/foo")
1580 ensureListContains(t, dirs, "lib/foo/bar")
1581
Jiyong Parkbd13e442019-03-15 18:10:35 +09001582 ensureListContains(t, dirs, "bin")
1583 ensureListContains(t, dirs, "bin/foo")
1584 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001585}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001586
1587func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001588 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001589 apex {
1590 name: "myapex",
1591 key: "myapex.key",
1592 native_shared_libs: ["mylib"],
1593 use_vendor: true,
1594 }
1595
1596 apex_key {
1597 name: "myapex.key",
1598 public_key: "testkey.avbpubkey",
1599 private_key: "testkey.pem",
1600 }
1601
1602 cc_library {
1603 name: "mylib",
1604 srcs: ["mylib.cpp"],
1605 shared_libs: ["mylib2"],
1606 system_shared_libs: [],
1607 vendor_available: true,
1608 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001609 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001610 }
1611
1612 cc_library {
1613 name: "mylib2",
1614 srcs: ["mylib.cpp"],
1615 system_shared_libs: [],
1616 vendor_available: true,
1617 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001618 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001619 }
Jooyung Handc782442019-11-01 03:14:38 +09001620 `, func(fs map[string][]byte, config android.Config) {
1621 setUseVendorWhitelistForTest(config, []string{"myapex"})
1622 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001623
1624 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001625 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001626 for _, implicit := range i.Implicits {
1627 inputsList = append(inputsList, implicit.String())
1628 }
1629 }
1630 inputsString := strings.Join(inputsList, " ")
1631
1632 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001633 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1634 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001635
1636 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001637 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1638 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001639}
Jiyong Park16e91a02018-12-20 18:18:08 +09001640
Jooyung Handc782442019-11-01 03:14:38 +09001641func TestUseVendorRestriction(t *testing.T) {
1642 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1643 apex {
1644 name: "myapex",
1645 key: "myapex.key",
1646 use_vendor: true,
1647 }
1648 apex_key {
1649 name: "myapex.key",
1650 public_key: "testkey.avbpubkey",
1651 private_key: "testkey.pem",
1652 }
1653 `, func(fs map[string][]byte, config android.Config) {
1654 setUseVendorWhitelistForTest(config, []string{""})
1655 })
1656 // no error with whitelist
1657 testApex(t, `
1658 apex {
1659 name: "myapex",
1660 key: "myapex.key",
1661 use_vendor: true,
1662 }
1663 apex_key {
1664 name: "myapex.key",
1665 public_key: "testkey.avbpubkey",
1666 private_key: "testkey.pem",
1667 }
1668 `, func(fs map[string][]byte, config android.Config) {
1669 setUseVendorWhitelistForTest(config, []string{"myapex"})
1670 })
1671}
1672
Jooyung Han5c998b92019-06-27 11:30:33 +09001673func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1674 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1675 apex {
1676 name: "myapex",
1677 key: "myapex.key",
1678 native_shared_libs: ["mylib"],
1679 use_vendor: true,
1680 }
1681
1682 apex_key {
1683 name: "myapex.key",
1684 public_key: "testkey.avbpubkey",
1685 private_key: "testkey.pem",
1686 }
1687
1688 cc_library {
1689 name: "mylib",
1690 srcs: ["mylib.cpp"],
1691 system_shared_libs: [],
1692 stl: "none",
1693 }
1694 `)
1695}
1696
Jiyong Park16e91a02018-12-20 18:18:08 +09001697func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001698 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001699 apex {
1700 name: "myapex",
1701 key: "myapex.key",
1702 native_shared_libs: ["mylib"],
1703 }
1704
1705 apex_key {
1706 name: "myapex.key",
1707 public_key: "testkey.avbpubkey",
1708 private_key: "testkey.pem",
1709 }
1710
1711 cc_library {
1712 name: "mylib",
1713 srcs: ["mylib.cpp"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 stubs: {
1717 versions: ["1", "2", "3"],
1718 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001719 apex_available: [
1720 "//apex_available:platform",
1721 "myapex",
1722 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001723 }
1724
1725 cc_binary {
1726 name: "not_in_apex",
1727 srcs: ["mylib.cpp"],
1728 static_libs: ["mylib"],
1729 static_executable: true,
1730 system_shared_libs: [],
1731 stl: "none",
1732 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001733 `)
1734
Colin Cross7113d202019-11-20 16:39:12 -08001735 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001736
1737 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001738 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001739}
Jiyong Park9335a262018-12-24 11:31:58 +09001740
1741func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001742 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001743 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001744 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001745 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001746 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001747 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001748 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001749 }
1750
1751 cc_library {
1752 name: "mylib",
1753 srcs: ["mylib.cpp"],
1754 system_shared_libs: [],
1755 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001756 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001757 }
1758
1759 apex_key {
1760 name: "myapex.key",
1761 public_key: "testkey.avbpubkey",
1762 private_key: "testkey.pem",
1763 }
1764
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001765 android_app_certificate {
1766 name: "myapex.certificate",
1767 certificate: "testkey",
1768 }
1769
1770 android_app_certificate {
1771 name: "myapex.certificate.override",
1772 certificate: "testkey.override",
1773 }
1774
Jiyong Park9335a262018-12-24 11:31:58 +09001775 `)
1776
1777 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001778 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001779
1780 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1781 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1782 "vendor/foo/devkeys/testkey.avbpubkey")
1783 }
1784 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1785 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1786 "vendor/foo/devkeys/testkey.pem")
1787 }
1788
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001789 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001790 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001791 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001792 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001793 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001794 }
1795}
Jiyong Park58e364a2019-01-19 19:24:06 +09001796
Jooyung Hanf121a652019-12-17 14:30:11 +09001797func TestCertificate(t *testing.T) {
1798 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
1799 ctx, _ := testApex(t, `
1800 apex {
1801 name: "myapex",
1802 key: "myapex.key",
1803 }
1804 apex_key {
1805 name: "myapex.key",
1806 public_key: "testkey.avbpubkey",
1807 private_key: "testkey.pem",
1808 }`)
1809 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1810 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
1811 if actual := rule.Args["certificates"]; actual != expected {
1812 t.Errorf("certificates should be %q, not %q", expected, actual)
1813 }
1814 })
1815 t.Run("override when unspecified", func(t *testing.T) {
1816 ctx, _ := testApex(t, `
1817 apex {
1818 name: "myapex_keytest",
1819 key: "myapex.key",
1820 file_contexts: ":myapex-file_contexts",
1821 }
1822 apex_key {
1823 name: "myapex.key",
1824 public_key: "testkey.avbpubkey",
1825 private_key: "testkey.pem",
1826 }
1827 android_app_certificate {
1828 name: "myapex.certificate.override",
1829 certificate: "testkey.override",
1830 }`)
1831 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1832 expected := "testkey.override.x509.pem testkey.override.pk8"
1833 if actual := rule.Args["certificates"]; actual != expected {
1834 t.Errorf("certificates should be %q, not %q", expected, actual)
1835 }
1836 })
1837 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
1838 ctx, _ := testApex(t, `
1839 apex {
1840 name: "myapex",
1841 key: "myapex.key",
1842 certificate: ":myapex.certificate",
1843 }
1844 apex_key {
1845 name: "myapex.key",
1846 public_key: "testkey.avbpubkey",
1847 private_key: "testkey.pem",
1848 }
1849 android_app_certificate {
1850 name: "myapex.certificate",
1851 certificate: "testkey",
1852 }`)
1853 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1854 expected := "testkey.x509.pem testkey.pk8"
1855 if actual := rule.Args["certificates"]; actual != expected {
1856 t.Errorf("certificates should be %q, not %q", expected, actual)
1857 }
1858 })
1859 t.Run("override when specifiec as <:module>", func(t *testing.T) {
1860 ctx, _ := testApex(t, `
1861 apex {
1862 name: "myapex_keytest",
1863 key: "myapex.key",
1864 file_contexts: ":myapex-file_contexts",
1865 certificate: ":myapex.certificate",
1866 }
1867 apex_key {
1868 name: "myapex.key",
1869 public_key: "testkey.avbpubkey",
1870 private_key: "testkey.pem",
1871 }
1872 android_app_certificate {
1873 name: "myapex.certificate.override",
1874 certificate: "testkey.override",
1875 }`)
1876 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1877 expected := "testkey.override.x509.pem testkey.override.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("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
1883 ctx, _ := testApex(t, `
1884 apex {
1885 name: "myapex",
1886 key: "myapex.key",
1887 certificate: "testkey",
1888 }
1889 apex_key {
1890 name: "myapex.key",
1891 public_key: "testkey.avbpubkey",
1892 private_key: "testkey.pem",
1893 }`)
1894 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1895 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
1896 if actual := rule.Args["certificates"]; actual != expected {
1897 t.Errorf("certificates should be %q, not %q", expected, actual)
1898 }
1899 })
1900 t.Run("override when specified as <name>", func(t *testing.T) {
1901 ctx, _ := testApex(t, `
1902 apex {
1903 name: "myapex_keytest",
1904 key: "myapex.key",
1905 file_contexts: ":myapex-file_contexts",
1906 certificate: "testkey",
1907 }
1908 apex_key {
1909 name: "myapex.key",
1910 public_key: "testkey.avbpubkey",
1911 private_key: "testkey.pem",
1912 }
1913 android_app_certificate {
1914 name: "myapex.certificate.override",
1915 certificate: "testkey.override",
1916 }`)
1917 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1918 expected := "testkey.override.x509.pem testkey.override.pk8"
1919 if actual := rule.Args["certificates"]; actual != expected {
1920 t.Errorf("certificates should be %q, not %q", expected, actual)
1921 }
1922 })
1923}
1924
Jiyong Park58e364a2019-01-19 19:24:06 +09001925func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001926 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001927 apex {
1928 name: "myapex",
1929 key: "myapex.key",
Jooyung Han68e511e2020-03-02 17:44:33 +09001930 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09001931 }
1932
1933 apex {
1934 name: "otherapex",
1935 key: "myapex.key",
Jooyung Han68e511e2020-03-02 17:44:33 +09001936 native_shared_libs: ["mylib", "mylib2"],
Jooyung Han61c41542020-03-07 03:45:53 +09001937 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09001938 }
1939
1940 apex_key {
1941 name: "myapex.key",
1942 public_key: "testkey.avbpubkey",
1943 private_key: "testkey.pem",
1944 }
1945
1946 cc_library {
1947 name: "mylib",
1948 srcs: ["mylib.cpp"],
1949 system_shared_libs: [],
1950 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001951 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001952 "myapex",
1953 "otherapex",
1954 ],
Jooyung Hanc3e92632020-03-21 23:20:55 +09001955 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09001956 }
Jooyung Han68e511e2020-03-02 17:44:33 +09001957 cc_library {
1958 name: "mylib2",
1959 srcs: ["mylib.cpp"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 apex_available: [
1963 "myapex",
1964 "otherapex",
1965 ],
1966 use_apex_name_macro: true,
1967 }
Jiyong Park58e364a2019-01-19 19:24:06 +09001968 `)
1969
Jooyung Han68e511e2020-03-02 17:44:33 +09001970 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08001971 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001972 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han74066602020-03-20 04:29:24 +09001973 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Han68e511e2020-03-02 17:44:33 +09001974
Jooyung Han61c41542020-03-07 03:45:53 +09001975 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Han68e511e2020-03-02 17:44:33 +09001976 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1977 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han61c41542020-03-07 03:45:53 +09001978 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09001979 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han68e511e2020-03-02 17:44:33 +09001980
Jooyung Han61c41542020-03-07 03:45:53 +09001981 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Han68e511e2020-03-02 17:44:33 +09001982 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
1983 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han61c41542020-03-07 03:45:53 +09001984 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09001985 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001986
Jooyung Han68e511e2020-03-02 17:44:33 +09001987 // When cc_library sets use_apex_name_macro: true
1988 // apex variants define additional macro to distinguish which apex variant it is built for
1989
1990 // non-APEX variant does not have __ANDROID_APEX__ defined
1991 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1992 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
1993
1994 // APEX variant has __ANDROID_APEX__ defined
1995 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001996 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001997 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1998 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001999
Jooyung Han68e511e2020-03-02 17:44:33 +09002000 // APEX variant has __ANDROID_APEX__ defined
2001 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002002 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002003 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2004 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Hanc3e92632020-03-21 23:20:55 +09002005
2006 // recovery variant does not set __ANDROID_SDK_VERSION__
2007 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2008 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2009 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002010}
Jiyong Park7e636d02019-01-28 16:16:54 +09002011
2012func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002013 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002014 apex {
2015 name: "myapex",
2016 key: "myapex.key",
2017 native_shared_libs: ["mylib"],
2018 }
2019
2020 apex_key {
2021 name: "myapex.key",
2022 public_key: "testkey.avbpubkey",
2023 private_key: "testkey.pem",
2024 }
2025
2026 cc_library_headers {
2027 name: "mylib_headers",
2028 export_include_dirs: ["my_include"],
2029 system_shared_libs: [],
2030 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002031 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002032 }
2033
2034 cc_library {
2035 name: "mylib",
2036 srcs: ["mylib.cpp"],
2037 system_shared_libs: [],
2038 stl: "none",
2039 header_libs: ["mylib_headers"],
2040 export_header_lib_headers: ["mylib_headers"],
2041 stubs: {
2042 versions: ["1", "2", "3"],
2043 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002044 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002045 }
2046
2047 cc_library {
2048 name: "otherlib",
2049 srcs: ["mylib.cpp"],
2050 system_shared_libs: [],
2051 stl: "none",
2052 shared_libs: ["mylib"],
2053 }
2054 `)
2055
Colin Cross7113d202019-11-20 16:39:12 -08002056 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002057
2058 // Ensure that the include path of the header lib is exported to 'otherlib'
2059 ensureContains(t, cFlags, "-Imy_include")
2060}
Alex Light9670d332019-01-29 18:07:33 -08002061
Jiyong Park7cd10e32020-01-14 09:22:18 +09002062type fileInApex struct {
2063 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002064 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002065 isLink bool
2066}
2067
Jooyung Hana57af4a2020-01-23 05:36:59 +00002068func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002069 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002070 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002071 copyCmds := apexRule.Args["copy_commands"]
2072 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002073 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002074 for _, cmd := range strings.Split(copyCmds, "&&") {
2075 cmd = strings.TrimSpace(cmd)
2076 if cmd == "" {
2077 continue
2078 }
2079 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002080 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002081 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002082 switch terms[0] {
2083 case "mkdir":
2084 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002085 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002086 t.Fatal("copyCmds contains invalid cp command", cmd)
2087 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002088 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002089 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002090 isLink = false
2091 case "ln":
2092 if len(terms) != 3 && len(terms) != 4 {
2093 // ln LINK TARGET or ln -s LINK TARGET
2094 t.Fatal("copyCmds contains invalid ln command", cmd)
2095 }
2096 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002097 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002098 isLink = true
2099 default:
2100 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2101 }
2102 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002103 index := strings.Index(dst, imageApexDir)
2104 if index == -1 {
2105 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2106 }
2107 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002108 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002109 }
2110 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002111 return ret
2112}
2113
Jooyung Hana57af4a2020-01-23 05:36:59 +00002114func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2115 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002116 var failed bool
2117 var surplus []string
2118 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002119 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han8d8906c2020-02-27 13:31:56 +09002120 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002121 for _, expected := range files {
2122 if matched, _ := path.Match(expected, file.path); matched {
2123 filesMatched[expected] = true
Jooyung Han8d8906c2020-02-27 13:31:56 +09002124 mactchFound = true
2125 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002126 }
2127 }
Jooyung Han8d8906c2020-02-27 13:31:56 +09002128 if !mactchFound {
2129 surplus = append(surplus, file.path)
2130 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002131 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002132
Jooyung Han31c470b2019-10-18 16:26:59 +09002133 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002134 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002135 t.Log("surplus files", surplus)
2136 failed = true
2137 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002138
2139 if len(files) > len(filesMatched) {
2140 var missing []string
2141 for _, expected := range files {
2142 if !filesMatched[expected] {
2143 missing = append(missing, expected)
2144 }
2145 }
2146 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002147 t.Log("missing files", missing)
2148 failed = true
2149 }
2150 if failed {
2151 t.Fail()
2152 }
2153}
2154
Jooyung Han344d5432019-08-23 11:17:39 +09002155func TestVndkApexCurrent(t *testing.T) {
2156 ctx, _ := testApex(t, `
2157 apex_vndk {
2158 name: "myapex",
2159 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002160 }
2161
2162 apex_key {
2163 name: "myapex.key",
2164 public_key: "testkey.avbpubkey",
2165 private_key: "testkey.pem",
2166 }
2167
2168 cc_library {
2169 name: "libvndk",
2170 srcs: ["mylib.cpp"],
2171 vendor_available: true,
2172 vndk: {
2173 enabled: true,
2174 },
2175 system_shared_libs: [],
2176 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002177 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002178 }
2179
2180 cc_library {
2181 name: "libvndksp",
2182 srcs: ["mylib.cpp"],
2183 vendor_available: true,
2184 vndk: {
2185 enabled: true,
2186 support_system_process: true,
2187 },
2188 system_shared_libs: [],
2189 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002190 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002191 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002192 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002193
Jooyung Hana57af4a2020-01-23 05:36:59 +00002194 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002195 "lib/libvndk.so",
2196 "lib/libvndksp.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002197 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002198 "lib64/libvndk.so",
2199 "lib64/libvndksp.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002200 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002201 "etc/llndk.libraries.VER.txt",
2202 "etc/vndkcore.libraries.VER.txt",
2203 "etc/vndksp.libraries.VER.txt",
2204 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002205 })
Jooyung Han344d5432019-08-23 11:17:39 +09002206}
2207
2208func TestVndkApexWithPrebuilt(t *testing.T) {
2209 ctx, _ := testApex(t, `
2210 apex_vndk {
2211 name: "myapex",
2212 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002213 }
2214
2215 apex_key {
2216 name: "myapex.key",
2217 public_key: "testkey.avbpubkey",
2218 private_key: "testkey.pem",
2219 }
2220
2221 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002222 name: "libvndk",
2223 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002224 vendor_available: true,
2225 vndk: {
2226 enabled: true,
2227 },
2228 system_shared_libs: [],
2229 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002230 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002231 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002232
2233 cc_prebuilt_library_shared {
2234 name: "libvndk.arm",
2235 srcs: ["libvndk.arm.so"],
2236 vendor_available: true,
2237 vndk: {
2238 enabled: true,
2239 },
2240 enabled: false,
2241 arch: {
2242 arm: {
2243 enabled: true,
2244 },
2245 },
2246 system_shared_libs: [],
2247 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002248 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002249 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002250 `+vndkLibrariesTxtFiles("current"),
2251 withFiles(map[string][]byte{
2252 "libvndk.so": nil,
2253 "libvndk.arm.so": nil,
2254 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002255
Jooyung Hana57af4a2020-01-23 05:36:59 +00002256 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002257 "lib/libvndk.so",
2258 "lib/libvndk.arm.so",
2259 "lib64/libvndk.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002260 "lib/libc++.so",
2261 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002262 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002263 })
Jooyung Han344d5432019-08-23 11:17:39 +09002264}
2265
Jooyung Han39edb6c2019-11-06 16:53:07 +09002266func vndkLibrariesTxtFiles(vers ...string) (result string) {
2267 for _, v := range vers {
2268 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002269 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002270 result += `
2271 vndk_libraries_txt {
2272 name: "` + txt + `.libraries.txt",
2273 }
2274 `
2275 }
2276 } else {
2277 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2278 result += `
2279 prebuilt_etc {
2280 name: "` + txt + `.libraries.` + v + `.txt",
2281 src: "dummy.txt",
2282 }
2283 `
2284 }
2285 }
2286 }
2287 return
2288}
2289
Jooyung Han344d5432019-08-23 11:17:39 +09002290func TestVndkApexVersion(t *testing.T) {
2291 ctx, _ := testApex(t, `
2292 apex_vndk {
2293 name: "myapex_v27",
2294 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002295 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002296 vndk_version: "27",
2297 }
2298
2299 apex_key {
2300 name: "myapex.key",
2301 public_key: "testkey.avbpubkey",
2302 private_key: "testkey.pem",
2303 }
2304
Jooyung Han31c470b2019-10-18 16:26:59 +09002305 vndk_prebuilt_shared {
2306 name: "libvndk27",
2307 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002308 vendor_available: true,
2309 vndk: {
2310 enabled: true,
2311 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002312 target_arch: "arm64",
2313 arch: {
2314 arm: {
2315 srcs: ["libvndk27_arm.so"],
2316 },
2317 arm64: {
2318 srcs: ["libvndk27_arm64.so"],
2319 },
2320 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002321 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002322 }
2323
2324 vndk_prebuilt_shared {
2325 name: "libvndk27",
2326 version: "27",
2327 vendor_available: true,
2328 vndk: {
2329 enabled: true,
2330 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002331 target_arch: "x86_64",
2332 arch: {
2333 x86: {
2334 srcs: ["libvndk27_x86.so"],
2335 },
2336 x86_64: {
2337 srcs: ["libvndk27_x86_64.so"],
2338 },
2339 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002340 }
2341 `+vndkLibrariesTxtFiles("27"),
2342 withFiles(map[string][]byte{
2343 "libvndk27_arm.so": nil,
2344 "libvndk27_arm64.so": nil,
2345 "libvndk27_x86.so": nil,
2346 "libvndk27_x86_64.so": nil,
2347 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002348
Jooyung Hana57af4a2020-01-23 05:36:59 +00002349 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002350 "lib/libvndk27_arm.so",
2351 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002352 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002353 })
Jooyung Han344d5432019-08-23 11:17:39 +09002354}
2355
2356func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2357 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2358 apex_vndk {
2359 name: "myapex_v27",
2360 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002361 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002362 vndk_version: "27",
2363 }
2364 apex_vndk {
2365 name: "myapex_v27_other",
2366 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002367 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002368 vndk_version: "27",
2369 }
2370
2371 apex_key {
2372 name: "myapex.key",
2373 public_key: "testkey.avbpubkey",
2374 private_key: "testkey.pem",
2375 }
2376
2377 cc_library {
2378 name: "libvndk",
2379 srcs: ["mylib.cpp"],
2380 vendor_available: true,
2381 vndk: {
2382 enabled: true,
2383 },
2384 system_shared_libs: [],
2385 stl: "none",
2386 }
2387
2388 vndk_prebuilt_shared {
2389 name: "libvndk",
2390 version: "27",
2391 vendor_available: true,
2392 vndk: {
2393 enabled: true,
2394 },
2395 srcs: ["libvndk.so"],
2396 }
2397 `, withFiles(map[string][]byte{
2398 "libvndk.so": nil,
2399 }))
2400}
2401
Jooyung Han90eee022019-10-01 20:02:42 +09002402func TestVndkApexNameRule(t *testing.T) {
2403 ctx, _ := testApex(t, `
2404 apex_vndk {
2405 name: "myapex",
2406 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002407 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002408 }
2409 apex_vndk {
2410 name: "myapex_v28",
2411 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002412 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002413 vndk_version: "28",
2414 }
2415 apex_key {
2416 name: "myapex.key",
2417 public_key: "testkey.avbpubkey",
2418 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002419 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002420
2421 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002422 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002423 actual := proptools.String(bundle.properties.Apex_name)
2424 if !reflect.DeepEqual(actual, expected) {
2425 t.Errorf("Got '%v', expected '%v'", actual, expected)
2426 }
2427 }
2428
2429 assertApexName("com.android.vndk.vVER", "myapex")
2430 assertApexName("com.android.vndk.v28", "myapex_v28")
2431}
2432
Jooyung Han344d5432019-08-23 11:17:39 +09002433func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2434 ctx, _ := testApex(t, `
2435 apex_vndk {
2436 name: "myapex",
2437 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002438 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002439 }
2440
2441 apex_key {
2442 name: "myapex.key",
2443 public_key: "testkey.avbpubkey",
2444 private_key: "testkey.pem",
2445 }
2446
2447 cc_library {
2448 name: "libvndk",
2449 srcs: ["mylib.cpp"],
2450 vendor_available: true,
2451 native_bridge_supported: true,
2452 host_supported: true,
2453 vndk: {
2454 enabled: true,
2455 },
2456 system_shared_libs: [],
2457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002458 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002459 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002460 `+vndkLibrariesTxtFiles("current"),
2461 withTargets(map[android.OsType][]android.Target{
2462 android.Android: []android.Target{
2463 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2464 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2465 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
2466 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
2467 },
2468 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002469
Jooyung Hana57af4a2020-01-23 05:36:59 +00002470 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002471 "lib/libvndk.so",
2472 "lib64/libvndk.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002473 "lib/libc++.so",
2474 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002475 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002476 })
Jooyung Han344d5432019-08-23 11:17:39 +09002477}
2478
2479func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2480 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2481 apex_vndk {
2482 name: "myapex",
2483 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002484 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002485 native_bridge_supported: true,
2486 }
2487
2488 apex_key {
2489 name: "myapex.key",
2490 public_key: "testkey.avbpubkey",
2491 private_key: "testkey.pem",
2492 }
2493
2494 cc_library {
2495 name: "libvndk",
2496 srcs: ["mylib.cpp"],
2497 vendor_available: true,
2498 native_bridge_supported: true,
2499 host_supported: true,
2500 vndk: {
2501 enabled: true,
2502 },
2503 system_shared_libs: [],
2504 stl: "none",
2505 }
2506 `)
2507}
2508
Jooyung Han31c470b2019-10-18 16:26:59 +09002509func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002510 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002511 apex_vndk {
2512 name: "myapex_v27",
2513 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002514 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002515 vndk_version: "27",
2516 }
2517
2518 apex_key {
2519 name: "myapex.key",
2520 public_key: "testkey.avbpubkey",
2521 private_key: "testkey.pem",
2522 }
2523
2524 vndk_prebuilt_shared {
2525 name: "libvndk27",
2526 version: "27",
2527 target_arch: "arm",
2528 vendor_available: true,
2529 vndk: {
2530 enabled: true,
2531 },
2532 arch: {
2533 arm: {
2534 srcs: ["libvndk27.so"],
2535 }
2536 },
2537 }
2538
2539 vndk_prebuilt_shared {
2540 name: "libvndk27",
2541 version: "27",
2542 target_arch: "arm",
2543 binder32bit: true,
2544 vendor_available: true,
2545 vndk: {
2546 enabled: true,
2547 },
2548 arch: {
2549 arm: {
2550 srcs: ["libvndk27binder32.so"],
2551 }
2552 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002553 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002554 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002555 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002556 withFiles(map[string][]byte{
2557 "libvndk27.so": nil,
2558 "libvndk27binder32.so": nil,
2559 }),
2560 withBinder32bit,
2561 withTargets(map[android.OsType][]android.Target{
2562 android.Android: []android.Target{
2563 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2564 },
2565 }),
2566 )
2567
Jooyung Hana57af4a2020-01-23 05:36:59 +00002568 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002569 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002570 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002571 })
2572}
2573
Jooyung Hane1633032019-08-01 17:41:43 +09002574func TestDependenciesInApexManifest(t *testing.T) {
2575 ctx, _ := testApex(t, `
2576 apex {
2577 name: "myapex_nodep",
2578 key: "myapex.key",
2579 native_shared_libs: ["lib_nodep"],
2580 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002581 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002582 }
2583
2584 apex {
2585 name: "myapex_dep",
2586 key: "myapex.key",
2587 native_shared_libs: ["lib_dep"],
2588 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002589 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002590 }
2591
2592 apex {
2593 name: "myapex_provider",
2594 key: "myapex.key",
2595 native_shared_libs: ["libfoo"],
2596 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002597 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002598 }
2599
2600 apex {
2601 name: "myapex_selfcontained",
2602 key: "myapex.key",
2603 native_shared_libs: ["lib_dep", "libfoo"],
2604 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002605 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002606 }
2607
2608 apex_key {
2609 name: "myapex.key",
2610 public_key: "testkey.avbpubkey",
2611 private_key: "testkey.pem",
2612 }
2613
2614 cc_library {
2615 name: "lib_nodep",
2616 srcs: ["mylib.cpp"],
2617 system_shared_libs: [],
2618 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002619 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002620 }
2621
2622 cc_library {
2623 name: "lib_dep",
2624 srcs: ["mylib.cpp"],
2625 shared_libs: ["libfoo"],
2626 system_shared_libs: [],
2627 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002628 apex_available: [
2629 "myapex_dep",
2630 "myapex_provider",
2631 "myapex_selfcontained",
2632 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002633 }
2634
2635 cc_library {
2636 name: "libfoo",
2637 srcs: ["mytest.cpp"],
2638 stubs: {
2639 versions: ["1"],
2640 },
2641 system_shared_libs: [],
2642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002643 apex_available: [
2644 "myapex_provider",
2645 "myapex_selfcontained",
2646 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002647 }
2648 `)
2649
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002650 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002651 var provideNativeLibs, requireNativeLibs []string
2652
Sundong Ahnabb64432019-10-22 13:58:29 +09002653 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_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 ensureListEmpty(t, provideNativeLibs)
2657 ensureListEmpty(t, requireNativeLibs)
2658
Sundong Ahnabb64432019-10-22 13:58:29 +09002659 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002660 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2661 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002662 ensureListEmpty(t, provideNativeLibs)
2663 ensureListContains(t, requireNativeLibs, "libfoo.so")
2664
Sundong Ahnabb64432019-10-22 13:58:29 +09002665 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002666 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2667 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002668 ensureListContains(t, provideNativeLibs, "libfoo.so")
2669 ensureListEmpty(t, requireNativeLibs)
2670
Sundong Ahnabb64432019-10-22 13:58:29 +09002671 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002672 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2673 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002674 ensureListContains(t, provideNativeLibs, "libfoo.so")
2675 ensureListEmpty(t, requireNativeLibs)
2676}
2677
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002678func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002679 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002680 apex {
2681 name: "myapex",
2682 key: "myapex.key",
2683 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002684 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002685 }
2686
2687 apex_key {
2688 name: "myapex.key",
2689 public_key: "testkey.avbpubkey",
2690 private_key: "testkey.pem",
2691 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002692
2693 cc_library {
2694 name: "mylib",
2695 srcs: ["mylib.cpp"],
2696 system_shared_libs: [],
2697 stl: "none",
2698 apex_available: [
2699 "//apex_available:platform",
2700 "myapex",
2701 ],
2702 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002703 `)
2704
Sundong Ahnabb64432019-10-22 13:58:29 +09002705 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002706 apexManifestRule := module.Rule("apexManifestRule")
2707 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2708 apexRule := module.Rule("apexRule")
2709 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002710
2711 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2712 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2713 name := apexBundle.BaseModuleName()
2714 prefix := "TARGET_"
2715 var builder strings.Builder
2716 data.Custom(&builder, name, prefix, "", data)
2717 androidMk := builder.String()
2718 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2719 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002720}
2721
Alex Light0851b882019-02-07 13:20:53 -08002722func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002723 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002724 apex {
2725 name: "myapex",
2726 key: "myapex.key",
2727 native_shared_libs: ["mylib_common"],
2728 }
2729
2730 apex_key {
2731 name: "myapex.key",
2732 public_key: "testkey.avbpubkey",
2733 private_key: "testkey.pem",
2734 }
2735
2736 cc_library {
2737 name: "mylib_common",
2738 srcs: ["mylib.cpp"],
2739 system_shared_libs: [],
2740 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002741 apex_available: [
2742 "//apex_available:platform",
2743 "myapex",
2744 ],
Alex Light0851b882019-02-07 13:20:53 -08002745 }
2746 `)
2747
Sundong Ahnabb64432019-10-22 13:58:29 +09002748 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002749 apexRule := module.Rule("apexRule")
2750 copyCmds := apexRule.Args["copy_commands"]
2751
2752 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2753 t.Log("Apex was a test apex!")
2754 t.Fail()
2755 }
2756 // Ensure that main rule creates an output
2757 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2758
2759 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002760 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002761
2762 // Ensure that both direct and indirect deps are copied into apex
2763 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2764
Colin Cross7113d202019-11-20 16:39:12 -08002765 // Ensure that the platform variant ends with _shared
2766 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002767
2768 if !android.InAnyApex("mylib_common") {
2769 t.Log("Found mylib_common not in any apex!")
2770 t.Fail()
2771 }
2772}
2773
2774func TestTestApex(t *testing.T) {
2775 if android.InAnyApex("mylib_common_test") {
2776 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!")
2777 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002778 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002779 apex_test {
2780 name: "myapex",
2781 key: "myapex.key",
2782 native_shared_libs: ["mylib_common_test"],
2783 }
2784
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790
2791 cc_library {
2792 name: "mylib_common_test",
2793 srcs: ["mylib.cpp"],
2794 system_shared_libs: [],
2795 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002796 // TODO: remove //apex_available:platform
2797 apex_available: [
2798 "//apex_available:platform",
2799 "myapex",
2800 ],
Alex Light0851b882019-02-07 13:20:53 -08002801 }
2802 `)
2803
Sundong Ahnabb64432019-10-22 13:58:29 +09002804 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002805 apexRule := module.Rule("apexRule")
2806 copyCmds := apexRule.Args["copy_commands"]
2807
2808 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
2809 t.Log("Apex was not a test apex!")
2810 t.Fail()
2811 }
2812 // Ensure that main rule creates an output
2813 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2814
2815 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002816 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002817
2818 // Ensure that both direct and indirect deps are copied into apex
2819 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
2820
Colin Cross7113d202019-11-20 16:39:12 -08002821 // Ensure that the platform variant ends with _shared
2822 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002823}
2824
Alex Light9670d332019-01-29 18:07:33 -08002825func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002826 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08002827 apex {
2828 name: "myapex",
2829 key: "myapex.key",
2830 multilib: {
2831 first: {
2832 native_shared_libs: ["mylib_common"],
2833 }
2834 },
2835 target: {
2836 android: {
2837 multilib: {
2838 first: {
2839 native_shared_libs: ["mylib"],
2840 }
2841 }
2842 },
2843 host: {
2844 multilib: {
2845 first: {
2846 native_shared_libs: ["mylib2"],
2847 }
2848 }
2849 }
2850 }
2851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 cc_library {
2860 name: "mylib",
2861 srcs: ["mylib.cpp"],
2862 system_shared_libs: [],
2863 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002864 // TODO: remove //apex_available:platform
2865 apex_available: [
2866 "//apex_available:platform",
2867 "myapex",
2868 ],
Alex Light9670d332019-01-29 18:07:33 -08002869 }
2870
2871 cc_library {
2872 name: "mylib_common",
2873 srcs: ["mylib.cpp"],
2874 system_shared_libs: [],
2875 stl: "none",
2876 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002877 // TODO: remove //apex_available:platform
2878 apex_available: [
2879 "//apex_available:platform",
2880 "myapex",
2881 ],
Alex Light9670d332019-01-29 18:07:33 -08002882 }
2883
2884 cc_library {
2885 name: "mylib2",
2886 srcs: ["mylib.cpp"],
2887 system_shared_libs: [],
2888 stl: "none",
2889 compile_multilib: "first",
2890 }
2891 `)
2892
Sundong Ahnabb64432019-10-22 13:58:29 +09002893 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08002894 copyCmds := apexRule.Args["copy_commands"]
2895
2896 // Ensure that main rule creates an output
2897 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2898
2899 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002900 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
2901 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
2902 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08002903
2904 // Ensure that both direct and indirect deps are copied into apex
2905 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
2906 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2907 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
2908
Colin Cross7113d202019-11-20 16:39:12 -08002909 // Ensure that the platform variant ends with _shared
2910 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
2911 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
2912 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08002913}
Jiyong Park04480cf2019-02-06 00:16:29 +09002914
2915func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002916 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09002917 apex {
2918 name: "myapex",
2919 key: "myapex.key",
2920 binaries: ["myscript"],
2921 }
2922
2923 apex_key {
2924 name: "myapex.key",
2925 public_key: "testkey.avbpubkey",
2926 private_key: "testkey.pem",
2927 }
2928
2929 sh_binary {
2930 name: "myscript",
2931 src: "mylib.cpp",
2932 filename: "myscript.sh",
2933 sub_dir: "script",
2934 }
2935 `)
2936
Sundong Ahnabb64432019-10-22 13:58:29 +09002937 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09002938 copyCmds := apexRule.Args["copy_commands"]
2939
2940 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
2941}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002942
Jooyung Han91df2082019-11-20 01:49:42 +09002943func TestApexInVariousPartition(t *testing.T) {
2944 testcases := []struct {
2945 propName, parition, flattenedPartition string
2946 }{
2947 {"", "system", "system_ext"},
2948 {"product_specific: true", "product", "product"},
2949 {"soc_specific: true", "vendor", "vendor"},
2950 {"proprietary: true", "vendor", "vendor"},
2951 {"vendor: true", "vendor", "vendor"},
2952 {"system_ext_specific: true", "system_ext", "system_ext"},
2953 }
2954 for _, tc := range testcases {
2955 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
2956 ctx, _ := testApex(t, `
2957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 `+tc.propName+`
2961 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002962
Jooyung Han91df2082019-11-20 01:49:42 +09002963 apex_key {
2964 name: "myapex.key",
2965 public_key: "testkey.avbpubkey",
2966 private_key: "testkey.pem",
2967 }
2968 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002969
Jooyung Han91df2082019-11-20 01:49:42 +09002970 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2971 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
2972 actual := apex.installDir.String()
2973 if actual != expected {
2974 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2975 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002976
Jooyung Han91df2082019-11-20 01:49:42 +09002977 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
2978 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
2979 actual = flattened.installDir.String()
2980 if actual != expected {
2981 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2982 }
2983 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002984 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002985}
Jiyong Park67882562019-03-21 01:11:21 +09002986
Jooyung Han54aca7b2019-11-20 02:26:02 +09002987func TestFileContexts(t *testing.T) {
2988 ctx, _ := testApex(t, `
2989 apex {
2990 name: "myapex",
2991 key: "myapex.key",
2992 }
2993
2994 apex_key {
2995 name: "myapex.key",
2996 public_key: "testkey.avbpubkey",
2997 private_key: "testkey.pem",
2998 }
2999 `)
3000 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3001 apexRule := module.Rule("apexRule")
3002 actual := apexRule.Args["file_contexts"]
3003 expected := "system/sepolicy/apex/myapex-file_contexts"
3004 if actual != expected {
3005 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3006 }
3007
3008 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3009 apex {
3010 name: "myapex",
3011 key: "myapex.key",
3012 file_contexts: "my_own_file_contexts",
3013 }
3014
3015 apex_key {
3016 name: "myapex.key",
3017 public_key: "testkey.avbpubkey",
3018 private_key: "testkey.pem",
3019 }
3020 `, withFiles(map[string][]byte{
3021 "my_own_file_contexts": nil,
3022 }))
3023
3024 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3025 apex {
3026 name: "myapex",
3027 key: "myapex.key",
3028 product_specific: true,
3029 file_contexts: "product_specific_file_contexts",
3030 }
3031
3032 apex_key {
3033 name: "myapex.key",
3034 public_key: "testkey.avbpubkey",
3035 private_key: "testkey.pem",
3036 }
3037 `)
3038
3039 ctx, _ = testApex(t, `
3040 apex {
3041 name: "myapex",
3042 key: "myapex.key",
3043 product_specific: true,
3044 file_contexts: "product_specific_file_contexts",
3045 }
3046
3047 apex_key {
3048 name: "myapex.key",
3049 public_key: "testkey.avbpubkey",
3050 private_key: "testkey.pem",
3051 }
3052 `, withFiles(map[string][]byte{
3053 "product_specific_file_contexts": nil,
3054 }))
3055 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3056 apexRule = module.Rule("apexRule")
3057 actual = apexRule.Args["file_contexts"]
3058 expected = "product_specific_file_contexts"
3059 if actual != expected {
3060 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3061 }
3062
3063 ctx, _ = testApex(t, `
3064 apex {
3065 name: "myapex",
3066 key: "myapex.key",
3067 product_specific: true,
3068 file_contexts: ":my-file-contexts",
3069 }
3070
3071 apex_key {
3072 name: "myapex.key",
3073 public_key: "testkey.avbpubkey",
3074 private_key: "testkey.pem",
3075 }
3076
3077 filegroup {
3078 name: "my-file-contexts",
3079 srcs: ["product_specific_file_contexts"],
3080 }
3081 `, withFiles(map[string][]byte{
3082 "product_specific_file_contexts": nil,
3083 }))
3084 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3085 apexRule = module.Rule("apexRule")
3086 actual = apexRule.Args["file_contexts"]
3087 expected = "product_specific_file_contexts"
3088 if actual != expected {
3089 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3090 }
3091}
3092
Jiyong Park67882562019-03-21 01:11:21 +09003093func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003094 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003095 apex_key {
3096 name: "myapex.key",
3097 public_key: ":my.avbpubkey",
3098 private_key: ":my.pem",
3099 product_specific: true,
3100 }
3101
3102 filegroup {
3103 name: "my.avbpubkey",
3104 srcs: ["testkey2.avbpubkey"],
3105 }
3106
3107 filegroup {
3108 name: "my.pem",
3109 srcs: ["testkey2.pem"],
3110 }
3111 `)
3112
3113 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3114 expected_pubkey := "testkey2.avbpubkey"
3115 actual_pubkey := apex_key.public_key_file.String()
3116 if actual_pubkey != expected_pubkey {
3117 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3118 }
3119 expected_privkey := "testkey2.pem"
3120 actual_privkey := apex_key.private_key_file.String()
3121 if actual_privkey != expected_privkey {
3122 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3123 }
3124}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003125
3126func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003127 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003128 prebuilt_apex {
3129 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003130 arch: {
3131 arm64: {
3132 src: "myapex-arm64.apex",
3133 },
3134 arm: {
3135 src: "myapex-arm.apex",
3136 },
3137 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003138 }
3139 `)
3140
3141 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3142
Jiyong Parkc95714e2019-03-29 14:23:10 +09003143 expectedInput := "myapex-arm64.apex"
3144 if prebuilt.inputApex.String() != expectedInput {
3145 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3146 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003147}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003148
3149func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003150 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003151 prebuilt_apex {
3152 name: "myapex",
3153 src: "myapex-arm.apex",
3154 filename: "notmyapex.apex",
3155 }
3156 `)
3157
3158 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3159
3160 expected := "notmyapex.apex"
3161 if p.installFilename != expected {
3162 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3163 }
3164}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003165
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003166func TestPrebuiltOverrides(t *testing.T) {
3167 ctx, config := testApex(t, `
3168 prebuilt_apex {
3169 name: "myapex.prebuilt",
3170 src: "myapex-arm.apex",
3171 overrides: [
3172 "myapex",
3173 ],
3174 }
3175 `)
3176
3177 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3178
3179 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003180 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003181 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003182 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003183 }
3184}
3185
Roland Levillain630846d2019-06-26 12:48:34 +01003186func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003187 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003188 apex_test {
3189 name: "myapex",
3190 key: "myapex.key",
3191 tests: [
3192 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003193 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003194 ],
3195 }
3196
3197 apex_key {
3198 name: "myapex.key",
3199 public_key: "testkey.avbpubkey",
3200 private_key: "testkey.pem",
3201 }
3202
3203 cc_test {
3204 name: "mytest",
3205 gtest: false,
3206 srcs: ["mytest.cpp"],
3207 relative_install_path: "test",
3208 system_shared_libs: [],
3209 static_executable: true,
3210 stl: "none",
3211 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003212
3213 cc_test {
3214 name: "mytests",
3215 gtest: false,
3216 srcs: [
3217 "mytest1.cpp",
3218 "mytest2.cpp",
3219 "mytest3.cpp",
3220 ],
3221 test_per_src: true,
3222 relative_install_path: "test",
3223 system_shared_libs: [],
3224 static_executable: true,
3225 stl: "none",
3226 }
Roland Levillain630846d2019-06-26 12:48:34 +01003227 `)
3228
Sundong Ahnabb64432019-10-22 13:58:29 +09003229 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003230 copyCmds := apexRule.Args["copy_commands"]
3231
3232 // Ensure that test dep is copied into apex.
3233 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003234
3235 // Ensure that test deps built with `test_per_src` are copied into apex.
3236 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3237 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3238 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003239
3240 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003241 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003242 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3243 name := apexBundle.BaseModuleName()
3244 prefix := "TARGET_"
3245 var builder strings.Builder
3246 data.Custom(&builder, name, prefix, "", data)
3247 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003248 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3249 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3250 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3251 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003252 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003253 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003254 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003255}
3256
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003257func TestInstallExtraFlattenedApexes(t *testing.T) {
3258 ctx, config := testApex(t, `
3259 apex {
3260 name: "myapex",
3261 key: "myapex.key",
3262 }
3263 apex_key {
3264 name: "myapex.key",
3265 public_key: "testkey.avbpubkey",
3266 private_key: "testkey.pem",
3267 }
3268 `, func(fs map[string][]byte, config android.Config) {
3269 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3270 })
3271 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003272 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003273 mk := android.AndroidMkDataForTest(t, config, "", ab)
3274 var builder strings.Builder
3275 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3276 androidMk := builder.String()
3277 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3278}
3279
Jooyung Han5c998b92019-06-27 11:30:33 +09003280func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003281 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003282 apex {
3283 name: "myapex",
3284 key: "myapex.key",
3285 native_shared_libs: ["mylib"],
3286 uses: ["commonapex"],
3287 }
3288
3289 apex {
3290 name: "commonapex",
3291 key: "myapex.key",
3292 native_shared_libs: ["libcommon"],
3293 provide_cpp_shared_libs: true,
3294 }
3295
3296 apex_key {
3297 name: "myapex.key",
3298 public_key: "testkey.avbpubkey",
3299 private_key: "testkey.pem",
3300 }
3301
3302 cc_library {
3303 name: "mylib",
3304 srcs: ["mylib.cpp"],
3305 shared_libs: ["libcommon"],
3306 system_shared_libs: [],
3307 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003308 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003309 }
3310
3311 cc_library {
3312 name: "libcommon",
3313 srcs: ["mylib_common.cpp"],
3314 system_shared_libs: [],
3315 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003316 // TODO: remove //apex_available:platform
3317 apex_available: [
3318 "//apex_available:platform",
3319 "commonapex",
3320 "myapex",
3321 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003322 }
3323 `)
3324
Sundong Ahnabb64432019-10-22 13:58:29 +09003325 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003326 apexRule1 := module1.Rule("apexRule")
3327 copyCmds1 := apexRule1.Args["copy_commands"]
3328
Sundong Ahnabb64432019-10-22 13:58:29 +09003329 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003330 apexRule2 := module2.Rule("apexRule")
3331 copyCmds2 := apexRule2.Args["copy_commands"]
3332
Colin Cross7113d202019-11-20 16:39:12 -08003333 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3334 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003335 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3336 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3337 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3338}
3339
3340func TestApexUsesFailsIfNotProvided(t *testing.T) {
3341 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3342 apex {
3343 name: "myapex",
3344 key: "myapex.key",
3345 uses: ["commonapex"],
3346 }
3347
3348 apex {
3349 name: "commonapex",
3350 key: "myapex.key",
3351 }
3352
3353 apex_key {
3354 name: "myapex.key",
3355 public_key: "testkey.avbpubkey",
3356 private_key: "testkey.pem",
3357 }
3358 `)
3359 testApexError(t, `uses: "commonapex" is not a provider`, `
3360 apex {
3361 name: "myapex",
3362 key: "myapex.key",
3363 uses: ["commonapex"],
3364 }
3365
3366 cc_library {
3367 name: "commonapex",
3368 system_shared_libs: [],
3369 stl: "none",
3370 }
3371
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377 `)
3378}
3379
3380func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3381 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3382 apex {
3383 name: "myapex",
3384 key: "myapex.key",
3385 use_vendor: true,
3386 uses: ["commonapex"],
3387 }
3388
3389 apex {
3390 name: "commonapex",
3391 key: "myapex.key",
3392 provide_cpp_shared_libs: true,
3393 }
3394
3395 apex_key {
3396 name: "myapex.key",
3397 public_key: "testkey.avbpubkey",
3398 private_key: "testkey.pem",
3399 }
Jooyung Handc782442019-11-01 03:14:38 +09003400 `, func(fs map[string][]byte, config android.Config) {
3401 setUseVendorWhitelistForTest(config, []string{"myapex"})
3402 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003403}
3404
Jooyung Hand48f3c32019-08-23 11:18:57 +09003405func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3406 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3407 apex {
3408 name: "myapex",
3409 key: "myapex.key",
3410 native_shared_libs: ["libfoo"],
3411 }
3412
3413 apex_key {
3414 name: "myapex.key",
3415 public_key: "testkey.avbpubkey",
3416 private_key: "testkey.pem",
3417 }
3418
3419 cc_library {
3420 name: "libfoo",
3421 stl: "none",
3422 system_shared_libs: [],
3423 enabled: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003424 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003425 }
3426 `)
3427 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3428 apex {
3429 name: "myapex",
3430 key: "myapex.key",
3431 java_libs: ["myjar"],
3432 }
3433
3434 apex_key {
3435 name: "myapex.key",
3436 public_key: "testkey.avbpubkey",
3437 private_key: "testkey.pem",
3438 }
3439
3440 java_library {
3441 name: "myjar",
3442 srcs: ["foo/bar/MyClass.java"],
3443 sdk_version: "none",
3444 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003445 enabled: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003446 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003447 }
3448 `)
3449}
3450
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003451func TestApexWithApps(t *testing.T) {
3452 ctx, _ := testApex(t, `
3453 apex {
3454 name: "myapex",
3455 key: "myapex.key",
3456 apps: [
3457 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003458 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003459 ],
3460 }
3461
3462 apex_key {
3463 name: "myapex.key",
3464 public_key: "testkey.avbpubkey",
3465 private_key: "testkey.pem",
3466 }
3467
3468 android_app {
3469 name: "AppFoo",
3470 srcs: ["foo/bar/MyClass.java"],
Colin Cross1c93c292020-02-15 10:38:00 -08003471 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003472 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003473 jni_libs: ["libjni"],
Colin Cross1c93c292020-02-15 10:38:00 -08003474 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003475 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003476 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003477
3478 android_app {
3479 name: "AppFooPriv",
3480 srcs: ["foo/bar/MyClass.java"],
Colin Cross1c93c292020-02-15 10:38:00 -08003481 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003482 system_modules: "none",
3483 privileged: true,
Colin Cross1c93c292020-02-15 10:38:00 -08003484 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003485 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003486 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003487
3488 cc_library_shared {
3489 name: "libjni",
3490 srcs: ["mylib.cpp"],
Jooyung Han65041792020-02-25 16:59:29 +09003491 shared_libs: ["libfoo"],
Jiyong Park8be103b2019-11-08 15:53:48 +09003492 stl: "none",
3493 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003494 apex_available: [ "myapex" ],
Jooyung Han65041792020-02-25 16:59:29 +09003495 sdk_version: "current",
3496 }
3497
3498 cc_library_shared {
3499 name: "libfoo",
3500 stl: "none",
3501 system_shared_libs: [],
3502 apex_available: [ "myapex" ],
3503 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003504 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003505 `)
3506
Sundong Ahnabb64432019-10-22 13:58:29 +09003507 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003508 apexRule := module.Rule("apexRule")
3509 copyCmds := apexRule.Args["copy_commands"]
3510
3511 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003512 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003513
Jooyung Han65041792020-02-25 16:59:29 +09003514 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3515 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003516 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Han65041792020-02-25 16:59:29 +09003517 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003518 }
Jooyung Han65041792020-02-25 16:59:29 +09003519 // JNI libraries including transitive deps are
3520 for _, jni := range []string{"libjni", "libfoo"} {
Colin Cross01fd7cc2020-02-19 16:54:04 -08003521 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Han65041792020-02-25 16:59:29 +09003522 // ... embedded inside APK (jnilibs.zip)
3523 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3524 // ... and not directly inside the APEX
3525 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3526 }
Dario Frenicde2a032019-10-27 00:29:22 +01003527}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003528
Dario Frenicde2a032019-10-27 00:29:22 +01003529func TestApexWithAppImports(t *testing.T) {
3530 ctx, _ := testApex(t, `
3531 apex {
3532 name: "myapex",
3533 key: "myapex.key",
3534 apps: [
3535 "AppFooPrebuilt",
3536 "AppFooPrivPrebuilt",
3537 ],
3538 }
3539
3540 apex_key {
3541 name: "myapex.key",
3542 public_key: "testkey.avbpubkey",
3543 private_key: "testkey.pem",
3544 }
3545
3546 android_app_import {
3547 name: "AppFooPrebuilt",
3548 apk: "PrebuiltAppFoo.apk",
3549 presigned: true,
3550 dex_preopt: {
3551 enabled: false,
3552 },
3553 }
3554
3555 android_app_import {
3556 name: "AppFooPrivPrebuilt",
3557 apk: "PrebuiltAppFooPriv.apk",
3558 privileged: true,
3559 presigned: true,
3560 dex_preopt: {
3561 enabled: false,
3562 },
Jooyung Han65cd0f02020-03-23 20:21:11 +09003563 filename: "AwesomePrebuiltAppFooPriv.apk",
Dario Frenicde2a032019-10-27 00:29:22 +01003564 }
3565 `)
3566
Sundong Ahnabb64432019-10-22 13:58:29 +09003567 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003568 apexRule := module.Rule("apexRule")
3569 copyCmds := apexRule.Args["copy_commands"]
3570
3571 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han65cd0f02020-03-23 20:21:11 +09003572 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3573}
3574
3575func TestApexWithAppImportsPrefer(t *testing.T) {
3576 ctx, _ := testApex(t, `
3577 apex {
3578 name: "myapex",
3579 key: "myapex.key",
3580 apps: [
3581 "AppFoo",
3582 ],
3583 }
3584
3585 apex_key {
3586 name: "myapex.key",
3587 public_key: "testkey.avbpubkey",
3588 private_key: "testkey.pem",
3589 }
3590
3591 android_app {
3592 name: "AppFoo",
3593 srcs: ["foo/bar/MyClass.java"],
3594 sdk_version: "none",
3595 system_modules: "none",
3596 apex_available: [ "myapex" ],
3597 }
3598
3599 android_app_import {
3600 name: "AppFoo",
3601 apk: "AppFooPrebuilt.apk",
3602 filename: "AppFooPrebuilt.apk",
3603 presigned: true,
3604 prefer: true,
3605 }
3606 `, withFiles(map[string][]byte{
3607 "AppFooPrebuilt.apk": nil,
3608 }))
3609
3610 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3611 "app/AppFoo/AppFooPrebuilt.apk",
3612 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003613}
3614
Dario Freni6f3937c2019-12-20 22:58:03 +00003615func TestApexWithTestHelperApp(t *testing.T) {
3616 ctx, _ := testApex(t, `
3617 apex {
3618 name: "myapex",
3619 key: "myapex.key",
3620 apps: [
3621 "TesterHelpAppFoo",
3622 ],
3623 }
3624
3625 apex_key {
3626 name: "myapex.key",
3627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
3630
3631 android_test_helper_app {
3632 name: "TesterHelpAppFoo",
3633 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003634 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003635 }
3636
3637 `)
3638
3639 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3640 apexRule := module.Rule("apexRule")
3641 copyCmds := apexRule.Args["copy_commands"]
3642
3643 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3644}
3645
Jooyung Han18020ea2019-11-13 10:50:48 +09003646func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3647 // libfoo's apex_available comes from cc_defaults
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003648 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003649 apex {
3650 name: "myapex",
3651 key: "myapex.key",
3652 native_shared_libs: ["libfoo"],
3653 }
3654
3655 apex_key {
3656 name: "myapex.key",
3657 public_key: "testkey.avbpubkey",
3658 private_key: "testkey.pem",
3659 }
3660
3661 apex {
3662 name: "otherapex",
3663 key: "myapex.key",
3664 native_shared_libs: ["libfoo"],
3665 }
3666
3667 cc_defaults {
3668 name: "libfoo-defaults",
3669 apex_available: ["otherapex"],
3670 }
3671
3672 cc_library {
3673 name: "libfoo",
3674 defaults: ["libfoo-defaults"],
3675 stl: "none",
3676 system_shared_libs: [],
3677 }`)
3678}
3679
Paul Duffinde7464c2020-03-30 17:54:29 +01003680func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003681 // libfoo is not available to myapex, but only to otherapex
3682 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3683 apex {
3684 name: "myapex",
3685 key: "myapex.key",
3686 native_shared_libs: ["libfoo"],
3687 }
3688
3689 apex_key {
3690 name: "myapex.key",
3691 public_key: "testkey.avbpubkey",
3692 private_key: "testkey.pem",
3693 }
3694
3695 apex {
3696 name: "otherapex",
3697 key: "otherapex.key",
3698 native_shared_libs: ["libfoo"],
3699 }
3700
3701 apex_key {
3702 name: "otherapex.key",
3703 public_key: "testkey.avbpubkey",
3704 private_key: "testkey.pem",
3705 }
3706
3707 cc_library {
3708 name: "libfoo",
3709 stl: "none",
3710 system_shared_libs: [],
3711 apex_available: ["otherapex"],
3712 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003713}
Jiyong Park127b40b2019-09-30 16:04:35 +09003714
Paul Duffinde7464c2020-03-30 17:54:29 +01003715func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003716 // libbbaz is an indirect dep
Paul Duffin868ecfd2020-03-30 17:58:21 +01003717 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinf0207962020-03-31 11:31:36 +01003718.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffin868ecfd2020-03-30 17:58:21 +01003719.*-> libfoo.*link:shared.*
Paul Duffinb20ad0a2020-03-31 15:23:40 +01003720.*via tag cc\.DependencyTag.*"shared".*
Paul Duffin868ecfd2020-03-30 17:58:21 +01003721.*-> libbar.*link:shared.*
Paul Duffinb20ad0a2020-03-31 15:23:40 +01003722.*via tag cc\.DependencyTag.*"shared".*
3723.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003724 apex {
3725 name: "myapex",
3726 key: "myapex.key",
3727 native_shared_libs: ["libfoo"],
3728 }
3729
3730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
3735
Jiyong Park127b40b2019-09-30 16:04:35 +09003736 cc_library {
3737 name: "libfoo",
3738 stl: "none",
3739 shared_libs: ["libbar"],
3740 system_shared_libs: [],
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003741 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003742 }
3743
3744 cc_library {
3745 name: "libbar",
3746 stl: "none",
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003747 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003748 system_shared_libs: [],
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003749 apex_available: ["myapex"],
3750 }
3751
3752 cc_library {
3753 name: "libbaz",
3754 stl: "none",
3755 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003756 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003757}
Jiyong Park127b40b2019-09-30 16:04:35 +09003758
Paul Duffinde7464c2020-03-30 17:54:29 +01003759func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003760 testApexError(t, "\"otherapex\" is not a valid module name", `
3761 apex {
3762 name: "myapex",
3763 key: "myapex.key",
3764 native_shared_libs: ["libfoo"],
3765 }
3766
3767 apex_key {
3768 name: "myapex.key",
3769 public_key: "testkey.avbpubkey",
3770 private_key: "testkey.pem",
3771 }
3772
3773 cc_library {
3774 name: "libfoo",
3775 stl: "none",
3776 system_shared_libs: [],
3777 apex_available: ["otherapex"],
3778 }`)
3779
Paul Duffinde7464c2020-03-30 17:54:29 +01003780 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003781 apex {
3782 name: "myapex",
3783 key: "myapex.key",
3784 native_shared_libs: ["libfoo", "libbar"],
3785 }
3786
3787 apex_key {
3788 name: "myapex.key",
3789 public_key: "testkey.avbpubkey",
3790 private_key: "testkey.pem",
3791 }
3792
3793 cc_library {
3794 name: "libfoo",
3795 stl: "none",
3796 system_shared_libs: [],
Jiyong Park9f14b9b2020-03-01 17:29:06 +09003797 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003798 apex_available: ["myapex"],
3799 }
3800
3801 cc_library {
3802 name: "libbar",
3803 stl: "none",
3804 system_shared_libs: [],
3805 apex_available: ["//apex_available:anyapex"],
Jiyong Park9f14b9b2020-03-01 17:29:06 +09003806 }
3807
3808 cc_library {
3809 name: "libbaz",
3810 stl: "none",
3811 system_shared_libs: [],
3812 stubs: {
3813 versions: ["10", "20", "30"],
3814 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003815 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003816}
Jiyong Park127b40b2019-09-30 16:04:35 +09003817
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003818func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffinde7464c2020-03-30 17:54:29 +01003819 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003820 apex {
3821 name: "myapex",
3822 key: "myapex.key",
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003823 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003824 }
3825
3826 apex_key {
3827 name: "myapex.key",
3828 public_key: "testkey.avbpubkey",
3829 private_key: "testkey.pem",
3830 }
3831
3832 cc_library {
3833 name: "libfoo",
3834 stl: "none",
3835 system_shared_libs: [],
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003836 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003837 apex_available: ["//apex_available:platform"],
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003838 }
3839
3840 cc_library {
3841 name: "libfoo2",
3842 stl: "none",
3843 system_shared_libs: [],
3844 shared_libs: ["libbaz"],
3845 apex_available: ["//apex_available:platform"],
3846 }
3847
3848 cc_library {
3849 name: "libbar",
3850 stl: "none",
3851 system_shared_libs: [],
3852 apex_available: ["myapex"],
3853 }
3854
3855 cc_library {
3856 name: "libbaz",
3857 stl: "none",
3858 system_shared_libs: [],
3859 apex_available: ["myapex"],
3860 stubs: {
3861 versions: ["1"],
3862 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003863 }`)
3864
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003865 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
3866 // because it depends on libbar which isn't available to platform
3867 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3868 if libfoo.NotAvailableForPlatform() != true {
3869 t.Errorf("%q shouldn't be available to platform", libfoo.String())
3870 }
3871
3872 // libfoo2 however can be available to platform because it depends on libbaz which provides
3873 // stubs
3874 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3875 if libfoo2.NotAvailableForPlatform() == true {
3876 t.Errorf("%q should be available to platform", libfoo2.String())
3877 }
Paul Duffinde7464c2020-03-30 17:54:29 +01003878}
Jiyong Parka90ca002019-10-07 15:47:24 +09003879
Paul Duffinde7464c2020-03-30 17:54:29 +01003880func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003881 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09003882 apex {
3883 name: "myapex",
3884 key: "myapex.key",
3885 native_shared_libs: ["libfoo"],
3886 }
3887
3888 apex_key {
3889 name: "myapex.key",
3890 public_key: "testkey.avbpubkey",
3891 private_key: "testkey.pem",
3892 }
3893
3894 cc_library {
3895 name: "libfoo",
3896 stl: "none",
3897 system_shared_libs: [],
3898 apex_available: ["myapex"],
3899 static: {
3900 apex_available: ["//apex_available:platform"],
3901 },
3902 }`)
3903
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003904 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3905 if libfooShared.NotAvailableForPlatform() != true {
3906 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
3907 }
3908 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
3909 if libfooStatic.NotAvailableForPlatform() != false {
3910 t.Errorf("%q should be available to platform", libfooStatic.String())
3911 }
Jiyong Park127b40b2019-09-30 16:04:35 +09003912}
3913
Jiyong Park5d790c32019-11-15 18:40:32 +09003914func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003915 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09003916 apex {
3917 name: "myapex",
3918 key: "myapex.key",
3919 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003920 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09003921 }
3922
3923 override_apex {
3924 name: "override_myapex",
3925 base: "myapex",
3926 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003927 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08003928 logging_parent: "com.foo.bar",
Baligh Uddincb6aa122020-03-15 13:01:05 -07003929 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09003930 }
3931
3932 apex_key {
3933 name: "myapex.key",
3934 public_key: "testkey.avbpubkey",
3935 private_key: "testkey.pem",
3936 }
3937
3938 android_app {
3939 name: "app",
3940 srcs: ["foo/bar/MyClass.java"],
3941 package_name: "foo",
3942 sdk_version: "none",
3943 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003944 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09003945 }
3946
3947 override_android_app {
3948 name: "override_app",
3949 base: "app",
3950 package_name: "bar",
3951 }
Jiyong Parka519c542020-03-03 11:45:41 +09003952 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09003953
Jiyong Park317645e2019-12-05 13:20:58 +09003954 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
3955 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
3956 if originalVariant.GetOverriddenBy() != "" {
3957 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
3958 }
3959 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
3960 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
3961 }
3962
Jiyong Park5d790c32019-11-15 18:40:32 +09003963 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
3964 apexRule := module.Rule("apexRule")
3965 copyCmds := apexRule.Args["copy_commands"]
3966
3967 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han65cd0f02020-03-23 20:21:11 +09003968 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003969
3970 apexBundle := module.Module().(*apexBundle)
3971 name := apexBundle.Name()
3972 if name != "override_myapex" {
3973 t.Errorf("name should be \"override_myapex\", but was %q", name)
3974 }
3975
Baligh Uddin004d7172020-02-19 21:29:28 -08003976 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
3977 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
3978 }
3979
Jiyong Parka519c542020-03-03 11:45:41 +09003980 optFlags := apexRule.Args["opt_flags"]
Baligh Uddincb6aa122020-03-15 13:01:05 -07003981 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Parka519c542020-03-03 11:45:41 +09003982
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003983 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3984 var builder strings.Builder
3985 data.Custom(&builder, name, "TARGET_", "", data)
3986 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09003987 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003988 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
3989 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003990 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003991 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09003992 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003993 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
3994 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09003995}
3996
Jooyung Han214bf372019-11-12 13:03:50 +09003997func TestLegacyAndroid10Support(t *testing.T) {
3998 ctx, _ := testApex(t, `
3999 apex {
4000 name: "myapex",
4001 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004002 native_shared_libs: ["mylib"],
Jooyung Han23b0adf2020-03-12 18:37:20 +09004003 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004004 }
4005
4006 apex_key {
4007 name: "myapex.key",
4008 public_key: "testkey.avbpubkey",
4009 private_key: "testkey.pem",
4010 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004011
4012 cc_library {
4013 name: "mylib",
4014 srcs: ["mylib.cpp"],
4015 stl: "libc++",
4016 system_shared_libs: [],
4017 apex_available: [ "myapex" ],
4018 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004019 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004020
4021 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4022 args := module.Rule("apexRule").Args
4023 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004024 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004025
4026 // The copies of the libraries in the apex should have one more dependency than
4027 // the ones outside the apex, namely the unwinder. Ideally we should check
4028 // the dependency names directly here but for some reason the names are blank in
4029 // this test.
4030 for _, lib := range []string{"libc++", "mylib"} {
4031 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4032 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4033 if len(apexImplicits) != len(nonApexImplicits)+1 {
4034 t.Errorf("%q missing unwinder dep", lib)
4035 }
4036 }
Jooyung Han214bf372019-11-12 13:03:50 +09004037}
4038
Paul Duffinbf19a972020-05-26 13:21:35 +01004039var filesForSdkLibrary = map[string][]byte{
4040 "api/current.txt": nil,
4041 "api/removed.txt": nil,
4042 "api/system-current.txt": nil,
4043 "api/system-removed.txt": nil,
4044 "api/test-current.txt": nil,
4045 "api/test-removed.txt": nil,
4046}
4047
Jooyung Han58f26ab2019-12-18 15:34:32 +09004048func TestJavaSDKLibrary(t *testing.T) {
4049 ctx, _ := testApex(t, `
4050 apex {
4051 name: "myapex",
4052 key: "myapex.key",
4053 java_libs: ["foo"],
4054 }
4055
4056 apex_key {
4057 name: "myapex.key",
4058 public_key: "testkey.avbpubkey",
4059 private_key: "testkey.pem",
4060 }
4061
4062 java_sdk_library {
4063 name: "foo",
4064 srcs: ["a.java"],
4065 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004066 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004067 }
Paul Duffinbf19a972020-05-26 13:21:35 +01004068 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004069
4070 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004071 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004072 "javalib/foo.jar",
4073 "etc/permissions/foo.xml",
4074 })
4075 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004076 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4077 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004078}
4079
Paul Duffinbf19a972020-05-26 13:21:35 +01004080func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4081 ctx, _ := testApex(t, `
4082 apex {
4083 name: "myapex",
4084 key: "myapex.key",
4085 java_libs: ["foo", "bar"],
4086 }
4087
4088 apex_key {
4089 name: "myapex.key",
4090 public_key: "testkey.avbpubkey",
4091 private_key: "testkey.pem",
4092 }
4093
4094 java_sdk_library {
4095 name: "foo",
4096 srcs: ["a.java"],
4097 api_packages: ["foo"],
4098 apex_available: ["myapex"],
4099 sdk_version: "none",
4100 system_modules: "none",
4101 }
4102
4103 java_library {
4104 name: "bar",
4105 srcs: ["a.java"],
4106 libs: ["foo"],
4107 apex_available: ["myapex"],
4108 sdk_version: "none",
4109 system_modules: "none",
4110 }
4111 `, withFiles(filesForSdkLibrary))
4112
4113 // java_sdk_library installs both impl jar and permission XML
4114 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4115 "javalib/bar.jar",
4116 "javalib/foo.jar",
4117 "etc/permissions/foo.xml",
4118 })
4119
4120 // The bar library should depend on the implementation jar.
4121 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4122 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4123 t.Errorf("expected %q, found %#q", expected, actual)
4124 }
4125}
4126
4127func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4128 ctx, _ := testApex(t, `
4129 apex {
4130 name: "myapex",
4131 key: "myapex.key",
4132 java_libs: ["foo"],
4133 }
4134
4135 apex_key {
4136 name: "myapex.key",
4137 public_key: "testkey.avbpubkey",
4138 private_key: "testkey.pem",
4139 }
4140
4141 java_sdk_library {
4142 name: "foo",
4143 srcs: ["a.java"],
4144 api_packages: ["foo"],
4145 apex_available: ["myapex"],
4146 sdk_version: "none",
4147 system_modules: "none",
4148 }
4149
4150 java_library {
4151 name: "bar",
4152 srcs: ["a.java"],
4153 libs: ["foo"],
4154 sdk_version: "none",
4155 system_modules: "none",
4156 }
4157 `, withFiles(filesForSdkLibrary))
4158
4159 // java_sdk_library installs both impl jar and permission XML
4160 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4161 "javalib/foo.jar",
4162 "etc/permissions/foo.xml",
4163 })
4164
4165 // The bar library should depend on the stubs jar.
4166 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4167 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4168 t.Errorf("expected %q, found %#q", expected, actual)
4169 }
4170}
4171
atrost6e126252020-01-27 17:01:16 +00004172func TestCompatConfig(t *testing.T) {
4173 ctx, _ := testApex(t, `
4174 apex {
4175 name: "myapex",
4176 key: "myapex.key",
4177 prebuilts: ["myjar-platform-compat-config"],
4178 java_libs: ["myjar"],
4179 }
4180
4181 apex_key {
4182 name: "myapex.key",
4183 public_key: "testkey.avbpubkey",
4184 private_key: "testkey.pem",
4185 }
4186
4187 platform_compat_config {
4188 name: "myjar-platform-compat-config",
4189 src: ":myjar",
4190 }
4191
4192 java_library {
4193 name: "myjar",
4194 srcs: ["foo/bar/MyClass.java"],
4195 sdk_version: "none",
4196 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004197 apex_available: [ "myapex" ],
4198 }
4199 `)
4200 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4201 "etc/compatconfig/myjar-platform-compat-config.xml",
4202 "javalib/myjar.jar",
4203 })
4204}
4205
Jiyong Park479321d2019-12-16 11:47:12 +09004206func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4207 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4208 apex {
4209 name: "myapex",
4210 key: "myapex.key",
4211 java_libs: ["myjar"],
4212 }
4213
4214 apex_key {
4215 name: "myapex.key",
4216 public_key: "testkey.avbpubkey",
4217 private_key: "testkey.pem",
4218 }
4219
4220 java_library {
4221 name: "myjar",
4222 srcs: ["foo/bar/MyClass.java"],
4223 sdk_version: "none",
4224 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004225 compile_dex: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09004226 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004227 }
4228 `)
4229}
4230
Jiyong Park7afd1072019-12-30 16:56:33 +09004231func TestCarryRequiredModuleNames(t *testing.T) {
4232 ctx, config := testApex(t, `
4233 apex {
4234 name: "myapex",
4235 key: "myapex.key",
4236 native_shared_libs: ["mylib"],
4237 }
4238
4239 apex_key {
4240 name: "myapex.key",
4241 public_key: "testkey.avbpubkey",
4242 private_key: "testkey.pem",
4243 }
4244
4245 cc_library {
4246 name: "mylib",
4247 srcs: ["mylib.cpp"],
4248 system_shared_libs: [],
4249 stl: "none",
4250 required: ["a", "b"],
4251 host_required: ["c", "d"],
4252 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004253 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004254 }
4255 `)
4256
4257 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4258 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4259 name := apexBundle.BaseModuleName()
4260 prefix := "TARGET_"
4261 var builder strings.Builder
4262 data.Custom(&builder, name, prefix, "", data)
4263 androidMk := builder.String()
4264 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4265 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4266 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4267}
4268
Jiyong Park7cd10e32020-01-14 09:22:18 +09004269func TestSymlinksFromApexToSystem(t *testing.T) {
4270 bp := `
4271 apex {
4272 name: "myapex",
4273 key: "myapex.key",
4274 native_shared_libs: ["mylib"],
4275 java_libs: ["myjar"],
4276 }
4277
Jiyong Park9d677202020-02-19 16:29:35 +09004278 apex {
4279 name: "myapex.updatable",
4280 key: "myapex.key",
4281 native_shared_libs: ["mylib"],
4282 java_libs: ["myjar"],
4283 updatable: true,
Jooyung Hanced674e2020-04-27 12:10:30 +09004284 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004285 }
4286
Jiyong Park7cd10e32020-01-14 09:22:18 +09004287 apex_key {
4288 name: "myapex.key",
4289 public_key: "testkey.avbpubkey",
4290 private_key: "testkey.pem",
4291 }
4292
4293 cc_library {
4294 name: "mylib",
4295 srcs: ["mylib.cpp"],
4296 shared_libs: ["myotherlib"],
4297 system_shared_libs: [],
4298 stl: "none",
4299 apex_available: [
4300 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004301 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004302 "//apex_available:platform",
4303 ],
4304 }
4305
4306 cc_library {
4307 name: "myotherlib",
4308 srcs: ["mylib.cpp"],
4309 system_shared_libs: [],
4310 stl: "none",
4311 apex_available: [
4312 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004313 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004314 "//apex_available:platform",
4315 ],
4316 }
4317
4318 java_library {
4319 name: "myjar",
4320 srcs: ["foo/bar/MyClass.java"],
4321 sdk_version: "none",
4322 system_modules: "none",
4323 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004324 apex_available: [
4325 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004326 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004327 "//apex_available:platform",
4328 ],
4329 }
4330
4331 java_library {
4332 name: "myotherjar",
4333 srcs: ["foo/bar/MyClass.java"],
4334 sdk_version: "none",
4335 system_modules: "none",
4336 apex_available: [
4337 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004338 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004339 "//apex_available:platform",
4340 ],
4341 }
4342 `
4343
4344 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4345 for _, f := range files {
4346 if f.path == file {
4347 if f.isLink {
4348 t.Errorf("%q is not a real file", file)
4349 }
4350 return
4351 }
4352 }
4353 t.Errorf("%q is not found", file)
4354 }
4355
4356 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4357 for _, f := range files {
4358 if f.path == file {
4359 if !f.isLink {
4360 t.Errorf("%q is not a symlink", file)
4361 }
4362 return
4363 }
4364 }
4365 t.Errorf("%q is not found", file)
4366 }
4367
Jiyong Park9d677202020-02-19 16:29:35 +09004368 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4369 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004370 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004371 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004372 ensureRealfileExists(t, files, "javalib/myjar.jar")
4373 ensureRealfileExists(t, files, "lib64/mylib.so")
4374 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4375
Jiyong Park9d677202020-02-19 16:29:35 +09004376 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4377 ensureRealfileExists(t, files, "javalib/myjar.jar")
4378 ensureRealfileExists(t, files, "lib64/mylib.so")
4379 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4380
4381 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004382 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004383 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004384 ensureRealfileExists(t, files, "javalib/myjar.jar")
4385 ensureRealfileExists(t, files, "lib64/mylib.so")
4386 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004387
4388 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4389 ensureRealfileExists(t, files, "javalib/myjar.jar")
4390 ensureRealfileExists(t, files, "lib64/mylib.so")
4391 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004392}
4393
Jooyung Han40b286c2020-04-17 13:43:10 +09004394func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4395 ctx, _ := testApex(t, `
4396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
4399 }
4400 apex_key {
4401 name: "myapex.key",
4402 public_key: "testkey.avbpubkey",
4403 private_key: "testkey.pem",
4404 }
4405 `, func(fs map[string][]byte, config android.Config) {
4406 delete(config.Targets, android.Android)
4407 config.AndroidCommonTarget = android.Target{}
4408 })
4409
4410 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4411 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4412 }
4413}
4414
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004415func TestAppBundle(t *testing.T) {
4416 ctx, _ := testApex(t, `
4417 apex {
4418 name: "myapex",
4419 key: "myapex.key",
4420 apps: ["AppFoo"],
4421 }
4422
4423 apex_key {
4424 name: "myapex.key",
4425 public_key: "testkey.avbpubkey",
4426 private_key: "testkey.pem",
4427 }
4428
4429 android_app {
4430 name: "AppFoo",
4431 srcs: ["foo/bar/MyClass.java"],
4432 sdk_version: "none",
4433 system_modules: "none",
4434 apex_available: [ "myapex" ],
4435 }
Jiyong Parkaf8998c2020-02-28 16:51:07 +09004436 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004437
4438 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4439 content := bundleConfigRule.Args["content"]
4440
4441 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkaf8998c2020-02-28 16:51:07 +09004442 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 +09004443}
4444
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004445func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4446 t.Helper()
4447
4448 bp = bp + `
4449 filegroup {
4450 name: "some-updatable-apex-file_contexts",
4451 srcs: [
4452 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4453 ],
4454 }
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004455
4456 filegroup {
4457 name: "some-non-updatable-apex-file_contexts",
4458 srcs: [
4459 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4460 ],
4461 }
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004462 `
4463 bp += cc.GatherRequiredDepsForTest(android.Android)
4464 bp += java.GatherRequiredDepsForTest()
4465 bp += dexpreopt.BpToolModulesForTest()
4466
4467 fs := map[string][]byte{
4468 "a.java": nil,
4469 "a.jar": nil,
4470 "build/make/target/product/security": nil,
4471 "apex_manifest.json": nil,
4472 "AndroidManifest.xml": nil,
4473 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004474 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004475 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4476 "framework/aidl/a.aidl": nil,
4477 }
4478 cc.GatherRequiredFilesForTest(fs)
4479
4480 ctx := android.NewTestArchContext()
4481 ctx.RegisterModuleType("apex", BundleFactory)
4482 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4483 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffineedf3f12020-04-29 18:27:14 +01004484 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004485 cc.RegisterRequiredBuildComponentsForTest(ctx)
4486 java.RegisterJavaBuildComponents(ctx)
4487 java.RegisterSystemModulesBuildComponents(ctx)
4488 java.RegisterAppBuildComponents(ctx)
4489 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004490 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4491 ctx.PreDepsMutators(RegisterPreDepsMutators)
4492 ctx.PostDepsMutators(RegisterPostDepsMutators)
4493
4494 config := android.TestArchConfig(buildDir, nil, bp, fs)
4495 ctx.Register(config)
4496
4497 _ = dexpreopt.GlobalSoongConfigForTests(config)
4498 dexpreopt.RegisterToolModulesForTest(ctx)
4499 pathCtx := android.PathContextForTesting(config)
4500 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4501 transformDexpreoptConfig(dexpreoptConfig)
4502 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4503
4504 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4505 android.FailIfErrored(t, errs)
4506
4507 _, errs = ctx.PrepareBuildActions(config)
4508 if errmsg == "" {
4509 android.FailIfErrored(t, errs)
4510 } else if len(errs) > 0 {
4511 android.FailIfNoMatchingErrors(t, errmsg, errs)
4512 return
4513 } else {
4514 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4515 }
4516}
4517
Jooyung Hanced674e2020-04-27 12:10:30 +09004518func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4519 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4520 apex {
4521 name: "myapex",
4522 key: "myapex.key",
4523 updatable: true,
4524 }
4525
4526 apex_key {
4527 name: "myapex.key",
4528 public_key: "testkey.avbpubkey",
4529 private_key: "testkey.pem",
4530 }
4531 `)
4532}
4533
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004534func TestNoUpdatableJarsInBootImage(t *testing.T) {
4535 bp := `
4536 java_library {
4537 name: "some-updatable-apex-lib",
4538 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004539 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004540 apex_available: [
4541 "some-updatable-apex",
4542 ],
4543 }
4544
4545 java_library {
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004546 name: "some-non-updatable-apex-lib",
4547 srcs: ["a.java"],
4548 apex_available: [
4549 "some-non-updatable-apex",
4550 ],
4551 }
4552
4553 java_library {
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004554 name: "some-platform-lib",
4555 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004556 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004557 installable: true,
4558 }
4559
4560 java_library {
4561 name: "some-art-lib",
4562 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004563 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004564 apex_available: [
4565 "com.android.art.something",
4566 ],
4567 hostdex: true,
4568 }
4569
4570 apex {
4571 name: "some-updatable-apex",
4572 key: "some-updatable-apex.key",
4573 java_libs: ["some-updatable-apex-lib"],
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004574 updatable: true,
4575 min_sdk_version: "current",
4576 }
4577
4578 apex {
4579 name: "some-non-updatable-apex",
4580 key: "some-non-updatable-apex.key",
4581 java_libs: ["some-non-updatable-apex-lib"],
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004582 }
4583
4584 apex_key {
4585 name: "some-updatable-apex.key",
4586 }
4587
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004588 apex_key {
4589 name: "some-non-updatable-apex.key",
4590 }
4591
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004592 apex {
4593 name: "com.android.art.something",
4594 key: "com.android.art.something.key",
4595 java_libs: ["some-art-lib"],
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004596 updatable: true,
4597 min_sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004598 }
4599
4600 apex_key {
4601 name: "com.android.art.something.key",
4602 }
4603 `
4604
4605 var error string
4606 var transform func(*dexpreopt.GlobalConfig)
4607
4608 // updatable jar from ART apex in the ART boot image => ok
4609 transform = func(config *dexpreopt.GlobalConfig) {
4610 config.ArtApexJars = []string{"some-art-lib"}
4611 }
4612 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4613
4614 // updatable jar from ART apex in the framework boot image => error
4615 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4616 transform = func(config *dexpreopt.GlobalConfig) {
4617 config.BootJars = []string{"some-art-lib"}
4618 }
4619 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4620
4621 // updatable jar from some other apex in the ART boot image => error
4622 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4623 transform = func(config *dexpreopt.GlobalConfig) {
4624 config.ArtApexJars = []string{"some-updatable-apex-lib"}
4625 }
4626 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4627
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004628 // non-updatable jar from some other apex in the ART boot image => error
4629 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4630 transform = func(config *dexpreopt.GlobalConfig) {
4631 config.ArtApexJars = []string{"some-non-updatable-apex-lib"}
4632 }
4633 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4634
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004635 // updatable jar from some other apex in the framework boot image => error
4636 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4637 transform = func(config *dexpreopt.GlobalConfig) {
4638 config.BootJars = []string{"some-updatable-apex-lib"}
4639 }
4640 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4641
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004642 // non-updatable jar from some other apex in the framework boot image => ok
4643 transform = func(config *dexpreopt.GlobalConfig) {
4644 config.BootJars = []string{"some-non-updatable-apex-lib"}
4645 }
4646 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4647
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004648 // nonexistent jar in the ART boot image => error
4649 error = "failed to find a dex jar path for module 'nonexistent'"
4650 transform = func(config *dexpreopt.GlobalConfig) {
4651 config.ArtApexJars = []string{"nonexistent"}
4652 }
4653 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4654
4655 // nonexistent jar in the framework boot image => error
4656 error = "failed to find a dex jar path for module 'nonexistent'"
4657 transform = func(config *dexpreopt.GlobalConfig) {
4658 config.BootJars = []string{"nonexistent"}
4659 }
4660 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4661
4662 // platform jar in the ART boot image => error
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004663 error = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004664 transform = func(config *dexpreopt.GlobalConfig) {
4665 config.ArtApexJars = []string{"some-platform-lib"}
4666 }
4667 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4668
4669 // platform jar in the framework boot image => ok
4670 transform = func(config *dexpreopt.GlobalConfig) {
4671 config.BootJars = []string{"some-platform-lib"}
4672 }
4673 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4674}
4675
Jiyong Parkf0d01b72020-04-13 16:19:48 +09004676func TestTestFor(t *testing.T) {
4677 ctx, _ := testApex(t, `
4678 apex {
4679 name: "myapex",
4680 key: "myapex.key",
4681 native_shared_libs: ["mylib", "myprivlib"],
4682 }
4683
4684 apex_key {
4685 name: "myapex.key",
4686 public_key: "testkey.avbpubkey",
4687 private_key: "testkey.pem",
4688 }
4689
4690 cc_library {
4691 name: "mylib",
4692 srcs: ["mylib.cpp"],
4693 system_shared_libs: [],
4694 stl: "none",
4695 stubs: {
4696 versions: ["1"],
4697 },
4698 apex_available: ["myapex"],
4699 }
4700
4701 cc_library {
4702 name: "myprivlib",
4703 srcs: ["mylib.cpp"],
4704 system_shared_libs: [],
4705 stl: "none",
4706 apex_available: ["myapex"],
4707 }
4708
4709
4710 cc_test {
4711 name: "mytest",
4712 gtest: false,
4713 srcs: ["mylib.cpp"],
4714 system_shared_libs: [],
4715 stl: "none",
4716 shared_libs: ["mylib", "myprivlib"],
4717 test_for: ["myapex"]
4718 }
4719 `)
4720
4721 // the test 'mytest' is a test for the apex, therefore is linked to the
4722 // actual implementation of mylib instead of its stub.
4723 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4724 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4725 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4726}
4727
Jaewoong Jung8cf307e2020-05-14 14:15:24 -07004728// TODO(jungjw): Move this to proptools
4729func intPtr(i int) *int {
4730 return &i
4731}
4732
4733func TestApexSet(t *testing.T) {
4734 ctx, config := testApex(t, `
4735 apex_set {
4736 name: "myapex",
4737 set: "myapex.apks",
4738 filename: "foo_v2.apex",
4739 overrides: ["foo"],
4740 }
4741 `, func(fs map[string][]byte, config android.Config) {
4742 config.TestProductVariables.Platform_sdk_version = intPtr(30)
4743 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
4744 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
4745 })
4746
4747 m := ctx.ModuleForTests("myapex", "android_common")
4748
4749 // Check extract_apks tool parameters.
4750 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
4751 actual := extractedApex.Args["abis"]
4752 expected := "ARMEABI_V7A,ARM64_V8A"
4753 if actual != expected {
4754 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
4755 }
4756 actual = extractedApex.Args["sdk-version"]
4757 expected = "30"
4758 if actual != expected {
4759 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
4760 }
4761
4762 a := m.Module().(*ApexSet)
4763 expectedOverrides := []string{"foo"}
4764 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
4765 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
4766 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
4767 }
4768}
4769
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004770func TestMain(m *testing.M) {
4771 run := func() int {
4772 setUp()
4773 defer tearDown()
4774
4775 return m.Run()
4776 }
4777
4778 os.Exit(run())
4779}