blob: 24b93ecfdbfe8ed85f41cb3809e1755688fd776a [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"
Jaewoong Jungfccad6b2020-06-01 10:45:49 -070032 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090033 "android/soong/java"
Jaewoong Jungfccad6b2020-06-01 10:45:49 -070034 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090035)
36
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070037var buildDir string
38
Jooyung Hand3639552019-08-09 12:57:43 +090039// names returns name list from white space separated string
40func names(s string) (ns []string) {
41 for _, n := range strings.Split(s, " ") {
42 if len(n) > 0 {
43 ns = append(ns, n)
44 }
45 }
46 return
47}
48
Jooyung Han344d5432019-08-23 11:17:39 +090049func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
50 t.Helper()
51 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090052 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
53 if len(errs) > 0 {
54 android.FailIfNoMatchingErrors(t, pattern, errs)
55 return
56 }
57 _, errs = ctx.PrepareBuildActions(config)
58 if len(errs) > 0 {
59 android.FailIfNoMatchingErrors(t, pattern, errs)
60 return
61 }
62
63 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
64}
65
Jooyung Han344d5432019-08-23 11:17:39 +090066func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
67 t.Helper()
68 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090069 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
70 android.FailIfErrored(t, errs)
71 _, errs = ctx.PrepareBuildActions(config)
72 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070073 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090074}
75
Jooyung Han344d5432019-08-23 11:17:39 +090076type testCustomizer func(fs map[string][]byte, config android.Config)
77
78func withFiles(files map[string][]byte) testCustomizer {
79 return func(fs map[string][]byte, config android.Config) {
80 for k, v := range files {
81 fs[k] = v
82 }
83 }
84}
85
86func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
87 return func(fs map[string][]byte, config android.Config) {
88 for k, v := range targets {
89 config.Targets[k] = v
90 }
91 }
92}
93
Jiyong Parkaf8998c2020-02-28 16:51:07 +090094func withManifestPackageNameOverrides(specs []string) testCustomizer {
95 return func(fs map[string][]byte, config android.Config) {
96 config.TestProductVariables.ManifestPackageNameOverrides = specs
97 }
98}
99
Sasha Smundakc4f0ff12020-05-27 16:36:07 -0700100func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900101 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
102}
103
Sasha Smundakc4f0ff12020-05-27 16:36:07 -0700104func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900105 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
106}
107
Sasha Smundakc4f0ff12020-05-27 16:36:07 -0700108func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900109 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900110
111 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900112 filegroup {
113 name: "myapex-file_contexts",
114 srcs: [
115 "system/sepolicy/apex/myapex-file_contexts",
116 ],
117 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900118 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800119
Colin Crossf9aabd72020-02-15 11:29:50 -0800120 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
121
Dario Frenicde2a032019-10-27 00:29:22 +0100122 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900123
Jooyung Han344d5432019-08-23 11:17:39 +0900124 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900125 "a.java": nil,
126 "PrebuiltAppFoo.apk": nil,
127 "PrebuiltAppFooPriv.apk": nil,
128 "build/make/target/product/security": nil,
129 "apex_manifest.json": nil,
130 "AndroidManifest.xml": nil,
131 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900132 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900133 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900134 "system/sepolicy/apex/otherapex-file_contexts": nil,
135 "system/sepolicy/apex/commonapex-file_contexts": nil,
136 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800137 "mylib.cpp": nil,
138 "mylib_common.cpp": nil,
139 "mytest.cpp": nil,
140 "mytest1.cpp": nil,
141 "mytest2.cpp": nil,
142 "mytest3.cpp": nil,
143 "myprebuilt": nil,
144 "my_include": nil,
145 "foo/bar/MyClass.java": nil,
146 "prebuilt.jar": nil,
Paul Duffin3766cb72020-04-07 15:25:44 +0100147 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800148 "vendor/foo/devkeys/test.x509.pem": nil,
149 "vendor/foo/devkeys/test.pk8": nil,
150 "testkey.x509.pem": nil,
151 "testkey.pk8": nil,
152 "testkey.override.x509.pem": nil,
153 "testkey.override.pk8": nil,
154 "vendor/foo/devkeys/testkey.avbpubkey": nil,
155 "vendor/foo/devkeys/testkey.pem": nil,
156 "NOTICE": nil,
157 "custom_notice": nil,
Jiyong Park162e8442020-03-17 19:16:40 +0900158 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800159 "testkey2.avbpubkey": nil,
160 "testkey2.pem": nil,
161 "myapex-arm64.apex": nil,
162 "myapex-arm.apex": nil,
Jaewoong Jung8cf307e2020-05-14 14:15:24 -0700163 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800164 "frameworks/base/api/current.txt": nil,
165 "framework/aidl/a.aidl": nil,
166 "build/make/core/proguard.flags": nil,
167 "build/make/core/proguard_basic_keeps.flags": nil,
168 "dummy.txt": nil,
Sasha Smundakc4f0ff12020-05-27 16:36:07 -0700169 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900170 }
171
Colin Crossf9aabd72020-02-15 11:29:50 -0800172 cc.GatherRequiredFilesForTest(fs)
173
Jooyung Han344d5432019-08-23 11:17:39 +0900174 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800175 // The fs now needs to be populated before creating the config, call handlers twice
176 // for now, once to get any fs changes, and later after the config was created to
177 // set product variables or targets.
178 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
179 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900180 }
181
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 config := android.TestArchConfig(buildDir, nil, bp, fs)
183 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
184 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
185 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
186 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
187 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
188 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
189
190 for _, handler := range handlers {
191 // The fs now needs to be populated before creating the config, call handlers twice
192 // for now, earlier to get any fs changes, and now after the config was created to
193 // set product variables or targets.
194 tempFS := map[string][]byte{}
195 handler(tempFS, config)
196 }
197
198 ctx := android.NewTestArchContext()
199 ctx.RegisterModuleType("apex", BundleFactory)
200 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
201 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
202 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
203 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
204 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
205 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jung8cf307e2020-05-14 14:15:24 -0700206 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800207
Jooyung Hana57af4a2020-01-23 05:36:59 +0000208 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
209 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
210
Paul Duffin77980a82019-12-19 16:01:36 +0000211 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800212 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800213 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
214 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jungfccad6b2020-06-01 10:45:49 -0700215 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000216 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jungfccad6b2020-06-01 10:45:49 -0700217 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800218 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000219 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000220 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000221 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900222 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800223
Colin Cross98be1bb2019-12-13 20:41:13 -0800224 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800225 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800226
227 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900228
Jooyung Han5c998b92019-06-27 11:30:33 +0900229 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900230}
231
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700232func setUp() {
233 var err error
234 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700236 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900237 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900238}
239
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700240func tearDown() {
Sasha Smundakc4f0ff12020-05-27 16:36:07 -0700241 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242}
243
244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
252// ensures that 'result' does not contain 'notExpected'
253func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900254 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900255 if strings.Contains(result, notExpected) {
256 t.Errorf("%q is found in %q", notExpected, result)
257 }
258}
259
Sasha Smundakc4f0ff12020-05-27 16:36:07 -0700260func ensureMatches(t *testing.T, result string, expectedRex string) {
261 ok, err := regexp.MatchString(expectedRex, result)
262 if err != nil {
263 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
264 return
265 }
266 if !ok {
267 t.Errorf("%s does not match regular expession %s", result, expectedRex)
268 }
269}
270
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900272 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273 if !android.InList(expected, result) {
274 t.Errorf("%q is not found in %v", expected, result)
275 }
276}
277
278func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if android.InList(notExpected, result) {
281 t.Errorf("%q is found in %v", notExpected, result)
282 }
283}
284
Jooyung Hane1633032019-08-01 17:41:43 +0900285func ensureListEmpty(t *testing.T, result []string) {
286 t.Helper()
287 if len(result) > 0 {
288 t.Errorf("%q is expected to be empty", result)
289 }
290}
291
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292// Minimal test
293func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700294 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900295 apex_defaults {
296 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900297 manifest: ":myapex.manifest",
298 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900299 key: "myapex.key",
300 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800301 multilib: {
302 both: {
303 binaries: ["foo",],
304 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900305 },
Jiyong Park2cd081c2020-06-01 21:39:15 +0900306 java_libs: [
307 "myjar",
308 "myjar_dex",
309 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310 }
311
Jiyong Park30ca9372019-02-07 16:27:23 +0900312 apex {
313 name: "myapex",
314 defaults: ["myapex-defaults"],
315 }
316
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 apex_key {
318 name: "myapex.key",
319 public_key: "testkey.avbpubkey",
320 private_key: "testkey.pem",
321 }
322
Jiyong Park809bb722019-02-13 21:33:49 +0900323 filegroup {
324 name: "myapex.manifest",
325 srcs: ["apex_manifest.json"],
326 }
327
328 filegroup {
329 name: "myapex.androidmanifest",
330 srcs: ["AndroidManifest.xml"],
331 }
332
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333 cc_library {
334 name: "mylib",
335 srcs: ["mylib.cpp"],
336 shared_libs: ["mylib2"],
337 system_shared_libs: [],
338 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000339 // TODO: remove //apex_available:platform
340 apex_available: [
341 "//apex_available:platform",
342 "myapex",
343 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900344 }
345
Alex Light3d673592019-01-18 14:37:31 -0800346 cc_binary {
347 name: "foo",
348 srcs: ["mylib.cpp"],
349 compile_multilib: "both",
350 multilib: {
351 lib32: {
352 suffix: "32",
353 },
354 lib64: {
355 suffix: "64",
356 },
357 },
358 symlinks: ["foo_link_"],
359 symlink_preferred_arch: true,
360 system_shared_libs: [],
361 static_executable: true,
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800364 }
365
Paul Duffin3766cb72020-04-07 15:25:44 +0100366 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 name: "mylib2",
368 srcs: ["mylib.cpp"],
369 system_shared_libs: [],
370 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900371 notice: "custom_notice",
Jiyong Park162e8442020-03-17 19:16:40 +0900372 static_libs: ["libstatic"],
373 // TODO: remove //apex_available:platform
374 apex_available: [
375 "//apex_available:platform",
376 "myapex",
377 ],
378 }
379
Paul Duffin3766cb72020-04-07 15:25:44 +0100380 cc_prebuilt_library_shared {
381 name: "mylib2",
382 srcs: ["prebuilt.so"],
383 // TODO: remove //apex_available:platform
384 apex_available: [
385 "//apex_available:platform",
386 "myapex",
387 ],
388 }
389
Jiyong Park162e8442020-03-17 19:16:40 +0900390 cc_library_static {
391 name: "libstatic",
392 srcs: ["mylib.cpp"],
393 system_shared_libs: [],
394 stl: "none",
395 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000396 // TODO: remove //apex_available:platform
397 apex_available: [
398 "//apex_available:platform",
399 "myapex",
400 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900401 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900402
403 java_library {
404 name: "myjar",
405 srcs: ["foo/bar/MyClass.java"],
Jiyong Parked50ca82020-05-28 23:46:55 +0900406 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900407 sdk_version: "none",
408 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900409 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900410 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000411 // TODO: remove //apex_available:platform
412 apex_available: [
413 "//apex_available:platform",
414 "myapex",
415 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900416 }
417
Jiyong Park2cd081c2020-06-01 21:39:15 +0900418 dex_import {
419 name: "myjar_dex",
420 jars: ["prebuilt.jar"],
421 apex_available: [
422 "//apex_available:platform",
423 "myapex",
424 ],
425 }
426
Jiyong Park7f7766d2019-07-25 22:02:35 +0900427 java_library {
428 name: "myotherjar",
429 srcs: ["foo/bar/MyClass.java"],
430 sdk_version: "none",
431 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900432 // TODO: remove //apex_available:platform
433 apex_available: [
434 "//apex_available:platform",
435 "myapex",
436 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900437 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900438
439 java_library {
440 name: "mysharedjar",
441 srcs: ["foo/bar/MyClass.java"],
442 sdk_version: "none",
443 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900444 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 `)
446
Sundong Ahnabb64432019-10-22 13:58:29 +0900447 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900448
449 optFlags := apexRule.Args["opt_flags"]
450 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700451 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900452 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900453
Jiyong Park25fc6a92018-11-18 18:02:45 +0900454 copyCmds := apexRule.Args["copy_commands"]
455
456 // Ensure that main rule creates an output
457 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
458
459 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800460 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park2cd081c2020-06-01 21:39:15 +0900462 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463
464 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800465 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900467
468 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800469 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
470 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parked50ca82020-05-28 23:46:55 +0900471 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park2cd081c2020-06-01 21:39:15 +0900472 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900473 // .. but not for java libs
474 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900475 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800476
Colin Cross7113d202019-11-20 16:39:12 -0800477 // Ensure that the platform variant ends with _shared or _common
478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
479 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
481 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900482 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
483
484 // Ensure that dynamic dependency to java libs are not included
485 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800486
487 // Ensure that all symlinks are present.
488 found_foo_link_64 := false
489 found_foo := false
490 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900491 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800492 if strings.HasSuffix(cmd, "bin/foo") {
493 found_foo = true
494 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
495 found_foo_link_64 = true
496 }
497 }
498 }
499 good := found_foo && found_foo_link_64
500 if !good {
501 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
502 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900503
Sundong Ahnabb64432019-10-22 13:58:29 +0900504 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700505 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park162e8442020-03-17 19:16:40 +0900506 if len(noticeInputs) != 3 {
507 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900508 }
509 ensureListContains(t, noticeInputs, "NOTICE")
510 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park162e8442020-03-17 19:16:40 +0900511 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900512
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100513 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100514 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
515 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
516 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
517 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
518 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100519
520 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100521 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
522 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
523 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
524 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
525 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800526}
527
Jooyung Hanf21c7972019-12-16 22:32:06 +0900528func TestDefaults(t *testing.T) {
529 ctx, _ := testApex(t, `
530 apex_defaults {
531 name: "myapex-defaults",
532 key: "myapex.key",
533 prebuilts: ["myetc"],
534 native_shared_libs: ["mylib"],
535 java_libs: ["myjar"],
536 apps: ["AppFoo"],
537 }
538
539 prebuilt_etc {
540 name: "myetc",
541 src: "myprebuilt",
542 }
543
544 apex {
545 name: "myapex",
546 defaults: ["myapex-defaults"],
547 }
548
549 apex_key {
550 name: "myapex.key",
551 public_key: "testkey.avbpubkey",
552 private_key: "testkey.pem",
553 }
554
555 cc_library {
556 name: "mylib",
557 system_shared_libs: [],
558 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000559 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900560 }
561
562 java_library {
563 name: "myjar",
564 srcs: ["foo/bar/MyClass.java"],
565 sdk_version: "none",
566 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000567 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900568 }
569
570 android_app {
571 name: "AppFoo",
572 srcs: ["foo/bar/MyClass.java"],
573 sdk_version: "none",
574 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000575 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900576 }
577 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000578 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900579 "etc/myetc",
580 "javalib/myjar.jar",
581 "lib64/mylib.so",
582 "app/AppFoo/AppFoo.apk",
583 })
584}
585
Jooyung Han01a3ee22019-11-02 02:52:25 +0900586func TestApexManifest(t *testing.T) {
587 ctx, _ := testApex(t, `
588 apex {
589 name: "myapex",
590 key: "myapex.key",
591 }
592
593 apex_key {
594 name: "myapex.key",
595 public_key: "testkey.avbpubkey",
596 private_key: "testkey.pem",
597 }
598 `)
599
600 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900601 args := module.Rule("apexRule").Args
602 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
603 t.Error("manifest should be apex_manifest.pb, but " + manifest)
604 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900605}
606
Alex Light5098a612018-11-29 17:12:15 -0800607func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700608 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800609 apex {
610 name: "myapex",
611 key: "myapex.key",
612 payload_type: "zip",
613 native_shared_libs: ["mylib"],
614 }
615
616 apex_key {
617 name: "myapex.key",
618 public_key: "testkey.avbpubkey",
619 private_key: "testkey.pem",
620 }
621
622 cc_library {
623 name: "mylib",
624 srcs: ["mylib.cpp"],
625 shared_libs: ["mylib2"],
626 system_shared_libs: [],
627 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000628 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800629 }
630
631 cc_library {
632 name: "mylib2",
633 srcs: ["mylib.cpp"],
634 system_shared_libs: [],
635 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000636 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800637 }
638 `)
639
Sundong Ahnabb64432019-10-22 13:58:29 +0900640 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800641 copyCmds := zipApexRule.Args["copy_commands"]
642
643 // Ensure that main rule creates an output
644 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
645
646 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800647 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800648
649 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800650 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800651
652 // Ensure that both direct and indirect deps are copied into apex
653 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
654 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900655}
656
657func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700658 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900659 apex {
660 name: "myapex",
661 key: "myapex.key",
662 native_shared_libs: ["mylib", "mylib3"],
663 }
664
665 apex_key {
666 name: "myapex.key",
667 public_key: "testkey.avbpubkey",
668 private_key: "testkey.pem",
669 }
670
671 cc_library {
672 name: "mylib",
673 srcs: ["mylib.cpp"],
674 shared_libs: ["mylib2", "mylib3"],
675 system_shared_libs: [],
676 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000677 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900678 }
679
680 cc_library {
681 name: "mylib2",
682 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900683 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900684 system_shared_libs: [],
685 stl: "none",
686 stubs: {
687 versions: ["1", "2", "3"],
688 },
689 }
690
691 cc_library {
692 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900693 srcs: ["mylib.cpp"],
694 shared_libs: ["mylib4"],
695 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900696 stl: "none",
697 stubs: {
698 versions: ["10", "11", "12"],
699 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000700 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900701 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900702
703 cc_library {
704 name: "mylib4",
705 srcs: ["mylib.cpp"],
706 system_shared_libs: [],
707 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000708 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900709 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900710 `)
711
Sundong Ahnabb64432019-10-22 13:58:29 +0900712 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900713 copyCmds := apexRule.Args["copy_commands"]
714
715 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800716 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900717
718 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800719 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900720
721 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800722 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900723
Colin Cross7113d202019-11-20 16:39:12 -0800724 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900725
726 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900727 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900729 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900730
731 // 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 -0800732 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900733 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800734 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900735
736 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900737 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900738 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900739
740 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900741 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900742
Jooyung Hana57af4a2020-01-23 05:36:59 +0000743 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900744 "lib64/mylib.so",
745 "lib64/mylib3.so",
746 "lib64/mylib4.so",
747 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748}
749
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900750func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700751 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900752 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900753 name: "myapex2",
754 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900755 native_shared_libs: ["mylib"],
756 }
757
758 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900759 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900760 public_key: "testkey.avbpubkey",
761 private_key: "testkey.pem",
762 }
763
764 cc_library {
765 name: "mylib",
766 srcs: ["mylib.cpp"],
767 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900768 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900769 system_shared_libs: [],
770 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000771 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900772 }
773
774 cc_library {
775 name: "libfoo",
776 srcs: ["mylib.cpp"],
777 shared_libs: ["libbar"],
778 system_shared_libs: [],
779 stl: "none",
780 stubs: {
781 versions: ["10", "20", "30"],
782 },
783 }
784
785 cc_library {
786 name: "libbar",
787 srcs: ["mylib.cpp"],
788 system_shared_libs: [],
789 stl: "none",
790 }
791
Jiyong Park678c8812020-02-07 17:25:49 +0900792 cc_library_static {
793 name: "libbaz",
794 srcs: ["mylib.cpp"],
795 system_shared_libs: [],
796 stl: "none",
797 apex_available: [ "myapex2" ],
798 }
799
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900800 `)
801
Jiyong Park83dc74b2020-01-14 18:38:44 +0900802 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900803 copyCmds := apexRule.Args["copy_commands"]
804
805 // Ensure that direct non-stubs dep is always included
806 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
807
808 // Ensure that indirect stubs dep is not included
809 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
810
811 // Ensure that dependency of stubs is not included
812 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
813
Jiyong Park83dc74b2020-01-14 18:38:44 +0900814 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900815
816 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900817 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900818 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900819 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900820
Jiyong Park3ff16992019-12-27 14:11:47 +0900821 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900822
823 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
824 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900825
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100826 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100827 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
828 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
829 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900830
Artur Satayev5e7c32d2020-04-27 18:07:06 +0100831 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev388d39b2020-04-27 18:53:18 +0100832 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
833 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
834 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900835}
836
Jooyung Hand3639552019-08-09 12:57:43 +0900837func TestApexWithRuntimeLibsDependency(t *testing.T) {
838 /*
839 myapex
840 |
841 v (runtime_libs)
842 mylib ------+------> libfoo [provides stub]
843 |
844 `------> libbar
845 */
846 ctx, _ := testApex(t, `
847 apex {
848 name: "myapex",
849 key: "myapex.key",
850 native_shared_libs: ["mylib"],
851 }
852
853 apex_key {
854 name: "myapex.key",
855 public_key: "testkey.avbpubkey",
856 private_key: "testkey.pem",
857 }
858
859 cc_library {
860 name: "mylib",
861 srcs: ["mylib.cpp"],
862 runtime_libs: ["libfoo", "libbar"],
863 system_shared_libs: [],
864 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000865 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900866 }
867
868 cc_library {
869 name: "libfoo",
870 srcs: ["mylib.cpp"],
871 system_shared_libs: [],
872 stl: "none",
873 stubs: {
874 versions: ["10", "20", "30"],
875 },
876 }
877
878 cc_library {
879 name: "libbar",
880 srcs: ["mylib.cpp"],
881 system_shared_libs: [],
882 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900884 }
885
886 `)
887
Sundong Ahnabb64432019-10-22 13:58:29 +0900888 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900889 copyCmds := apexRule.Args["copy_commands"]
890
891 // Ensure that direct non-stubs dep is always included
892 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
893
894 // Ensure that indirect stubs dep is not included
895 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
896
897 // Ensure that runtime_libs dep in included
898 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
899
Sundong Ahnabb64432019-10-22 13:58:29 +0900900 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900901 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
902 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900903
904}
905
Jooyung Han67a96cd2020-03-13 15:23:36 +0900906func TestApexDependsOnLLNDKTransitively(t *testing.T) {
907 testcases := []struct {
908 name string
909 minSdkVersion string
910 shouldLink string
911 shouldNotLink []string
912 }{
913 {
Jooyung Han74066602020-03-20 04:29:24 +0900914 name: "should link to the latest",
Jooyung Han67a96cd2020-03-13 15:23:36 +0900915 minSdkVersion: "current",
916 shouldLink: "30",
917 shouldNotLink: []string{"29"},
918 },
919 {
920 name: "should link to llndk#29",
921 minSdkVersion: "29",
922 shouldLink: "29",
923 shouldNotLink: []string{"30"},
924 },
925 }
926 for _, tc := range testcases {
927 t.Run(tc.name, func(t *testing.T) {
928 ctx, _ := testApex(t, `
929 apex {
930 name: "myapex",
931 key: "myapex.key",
932 use_vendor: true,
933 native_shared_libs: ["mylib"],
934 min_sdk_version: "`+tc.minSdkVersion+`",
935 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900936
Jooyung Han67a96cd2020-03-13 15:23:36 +0900937 apex_key {
938 name: "myapex.key",
939 public_key: "testkey.avbpubkey",
940 private_key: "testkey.pem",
941 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900942
Jooyung Han67a96cd2020-03-13 15:23:36 +0900943 cc_library {
944 name: "mylib",
945 srcs: ["mylib.cpp"],
946 vendor_available: true,
947 shared_libs: ["libbar"],
948 system_shared_libs: [],
949 stl: "none",
950 apex_available: [ "myapex" ],
951 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900952
Jooyung Han67a96cd2020-03-13 15:23:36 +0900953 cc_library {
954 name: "libbar",
955 srcs: ["mylib.cpp"],
956 system_shared_libs: [],
957 stl: "none",
958 stubs: { versions: ["29","30"] },
959 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900960
Jooyung Han67a96cd2020-03-13 15:23:36 +0900961 llndk_library {
962 name: "libbar",
963 symbol_file: "",
964 }
965 `, func(fs map[string][]byte, config android.Config) {
966 setUseVendorWhitelistForTest(config, []string{"myapex"})
967 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +0900968
Jooyung Han67a96cd2020-03-13 15:23:36 +0900969 // Ensure that LLNDK dep is not included
970 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
971 "lib64/mylib.so",
972 })
Jooyung Han9c80bae2019-08-20 17:30:57 +0900973
Jooyung Han67a96cd2020-03-13 15:23:36 +0900974 // Ensure that LLNDK dep is required
975 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
976 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
977 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +0900978
Jooyung Han67a96cd2020-03-13 15:23:36 +0900979 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
980 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
981 for _, ver := range tc.shouldNotLink {
982 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
983 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900984
Jooyung Han67a96cd2020-03-13 15:23:36 +0900985 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
986 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
987 })
988 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900989}
990
Jiyong Park25fc6a92018-11-18 18:02:45 +0900991func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700992 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900993 apex {
994 name: "myapex",
995 key: "myapex.key",
996 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
997 }
998
999 apex_key {
1000 name: "myapex.key",
1001 public_key: "testkey.avbpubkey",
1002 private_key: "testkey.pem",
1003 }
1004
1005 cc_library {
1006 name: "mylib",
1007 srcs: ["mylib.cpp"],
1008 shared_libs: ["libdl#27"],
1009 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001010 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011 }
1012
1013 cc_library_shared {
1014 name: "mylib_shared",
1015 srcs: ["mylib.cpp"],
1016 shared_libs: ["libdl#27"],
1017 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001018 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001019 }
1020
1021 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001022 name: "libBootstrap",
1023 srcs: ["mylib.cpp"],
1024 stl: "none",
1025 bootstrap: true,
1026 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027 `)
1028
Sundong Ahnabb64432019-10-22 13:58:29 +09001029 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001030 copyCmds := apexRule.Args["copy_commands"]
1031
1032 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001033 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001034 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1035 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001036
1037 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001038 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001039
Colin Cross7113d202019-11-20 16:39:12 -08001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1041 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1042 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001043
1044 // For dependency to libc
1045 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001046 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001047 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001048 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001049 // ... Cflags from stub is correctly exported to mylib
1050 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1051 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1052
1053 // For dependency to libm
1054 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001055 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001056 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001057 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001058 // ... and is not compiling with the stub
1059 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1060 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1061
1062 // For dependency to libdl
1063 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001064 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001065 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001066 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1067 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001068 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001069 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001070 // ... Cflags from stub is correctly exported to mylib
1071 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1072 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001073
1074 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001075 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1076 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1077 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1078 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001079}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001080
Jooyung Han0c4e0162020-02-26 22:45:42 +09001081func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1082 // there are three links between liba --> libz
1083 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1084 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1085 // 3) (platform) -> liba -> libz : this should be non-stub link
1086 ctx, _ := testApex(t, `
1087 apex {
1088 name: "myapex",
1089 key: "myapex.key",
1090 native_shared_libs: ["libx"],
1091 min_sdk_version: "2",
1092 }
1093
1094 apex {
1095 name: "otherapex",
1096 key: "myapex.key",
1097 native_shared_libs: ["liby"],
1098 min_sdk_version: "3",
1099 }
1100
1101 apex_key {
1102 name: "myapex.key",
1103 public_key: "testkey.avbpubkey",
1104 private_key: "testkey.pem",
1105 }
1106
1107 cc_library {
1108 name: "libx",
1109 shared_libs: ["liba"],
1110 system_shared_libs: [],
1111 stl: "none",
1112 apex_available: [ "myapex" ],
1113 }
1114
1115 cc_library {
1116 name: "liby",
1117 shared_libs: ["liba"],
1118 system_shared_libs: [],
1119 stl: "none",
1120 apex_available: [ "otherapex" ],
1121 }
1122
1123 cc_library {
1124 name: "liba",
1125 shared_libs: ["libz"],
1126 system_shared_libs: [],
1127 stl: "none",
1128 apex_available: [
1129 "//apex_available:anyapex",
1130 "//apex_available:platform",
1131 ],
1132 }
1133
1134 cc_library {
1135 name: "libz",
1136 system_shared_libs: [],
1137 stl: "none",
1138 stubs: {
1139 versions: ["1", "3"],
1140 },
1141 }
1142 `, withUnbundledBuild)
1143
1144 expectLink := func(from, from_variant, to, to_variant string) {
1145 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1146 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1147 }
1148 expectNoLink := func(from, from_variant, to, to_variant string) {
1149 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1150 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1151 }
1152 // platform liba is linked to non-stub version
1153 expectLink("liba", "shared", "libz", "shared")
1154 // liba in myapex is linked to #1
1155 expectLink("liba", "shared_myapex", "libz", "shared_1")
1156 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1157 expectNoLink("liba", "shared_myapex", "libz", "shared")
1158 // liba in otherapex is linked to #3
1159 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1160 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1161 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1162}
1163
Jooyung Han29e91d22020-04-02 01:41:41 +09001164func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1165 ctx, _ := testApex(t, `
1166 apex {
1167 name: "myapex",
1168 key: "myapex.key",
1169 native_shared_libs: ["libx"],
1170 min_sdk_version: "R",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 cc_library {
1180 name: "libx",
1181 shared_libs: ["libz"],
1182 system_shared_libs: [],
1183 stl: "none",
1184 apex_available: [ "myapex" ],
1185 }
1186
1187 cc_library {
1188 name: "libz",
1189 system_shared_libs: [],
1190 stl: "none",
1191 stubs: {
1192 versions: ["29", "R"],
1193 },
1194 }
1195 `, func(fs map[string][]byte, config android.Config) {
1196 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1197 })
1198
1199 expectLink := func(from, from_variant, to, to_variant string) {
1200 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1201 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1202 }
1203 expectNoLink := func(from, from_variant, to, to_variant string) {
1204 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1205 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1206 }
1207 // 9000 is quite a magic number.
1208 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1209 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1210 // to distinguish them from finalized and future_api(10000)
1211 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1212 // (refer android/api_levels.go)
1213 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1214 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1215 expectNoLink("libx", "shared_myapex", "libz", "shared")
1216}
1217
Jooyung Han0c4e0162020-02-26 22:45:42 +09001218func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1219 ctx, _ := testApex(t, `
1220 apex {
1221 name: "myapex",
1222 key: "myapex.key",
1223 native_shared_libs: ["libx"],
1224 }
1225
1226 apex_key {
1227 name: "myapex.key",
1228 public_key: "testkey.avbpubkey",
1229 private_key: "testkey.pem",
1230 }
1231
1232 cc_library {
1233 name: "libx",
1234 shared_libs: ["libz"],
1235 system_shared_libs: [],
1236 stl: "none",
1237 apex_available: [ "myapex" ],
1238 }
1239
1240 cc_library {
1241 name: "libz",
1242 system_shared_libs: [],
1243 stl: "none",
1244 stubs: {
1245 versions: ["1", "2"],
1246 },
1247 }
1248 `)
1249
1250 expectLink := func(from, from_variant, to, to_variant string) {
1251 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1252 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1253 }
1254 expectNoLink := func(from, from_variant, to, to_variant string) {
1255 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1256 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1257 }
1258 expectLink("libx", "shared_myapex", "libz", "shared_2")
1259 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1260 expectNoLink("libx", "shared_myapex", "libz", "shared")
1261}
1262
1263func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1264 ctx, _ := testApex(t, `
1265 apex {
1266 name: "myapex",
1267 key: "myapex.key",
1268 native_shared_libs: ["libx"],
1269 }
1270
1271 apex_key {
1272 name: "myapex.key",
1273 public_key: "testkey.avbpubkey",
1274 private_key: "testkey.pem",
1275 }
1276
1277 cc_library {
1278 name: "libx",
1279 system_shared_libs: [],
1280 stl: "none",
1281 apex_available: [ "myapex" ],
1282 stubs: {
1283 versions: ["1", "2"],
1284 },
1285 }
1286
1287 cc_library {
1288 name: "libz",
1289 shared_libs: ["libx"],
1290 system_shared_libs: [],
1291 stl: "none",
1292 }
1293 `)
1294
1295 expectLink := func(from, from_variant, to, to_variant string) {
1296 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1297 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1298 }
1299 expectNoLink := func(from, from_variant, to, to_variant string) {
1300 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1301 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1302 }
1303 expectLink("libz", "shared", "libx", "shared_2")
1304 expectNoLink("libz", "shared", "libz", "shared_1")
1305 expectNoLink("libz", "shared", "libz", "shared")
1306}
1307
Jooyung Han74066602020-03-20 04:29:24 +09001308func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han0c4e0162020-02-26 22:45:42 +09001309 ctx, _ := testApex(t, `
1310 apex {
1311 name: "myapex",
1312 key: "myapex.key",
1313 native_shared_libs: ["libx"],
1314 min_sdk_version: "29",
1315 }
1316
1317 apex_key {
1318 name: "myapex.key",
1319 public_key: "testkey.avbpubkey",
1320 private_key: "testkey.pem",
1321 }
1322
1323 cc_library {
1324 name: "libx",
1325 shared_libs: ["libbar"],
1326 apex_available: [ "myapex" ],
1327 }
1328
1329 cc_library {
1330 name: "libbar",
1331 stubs: {
1332 versions: ["29", "30"],
1333 },
1334 }
Jooyung Han74066602020-03-20 04:29:24 +09001335 `, func(fs map[string][]byte, config android.Config) {
1336 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1337 })
Jooyung Han0c4e0162020-02-26 22:45:42 +09001338 expectLink := func(from, from_variant, to, to_variant string) {
1339 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1340 libFlags := ld.Args["libFlags"]
1341 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1342 }
Jooyung Han74066602020-03-20 04:29:24 +09001343 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han0c4e0162020-02-26 22:45:42 +09001344}
1345
Jooyung Han74066602020-03-20 04:29:24 +09001346func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han0c4e0162020-02-26 22:45:42 +09001347 ctx, _ := testApex(t, `
1348 apex {
1349 name: "myapex",
1350 key: "myapex.key",
1351 native_shared_libs: ["libx"],
1352 min_sdk_version: "29",
1353 }
1354
1355 apex_key {
1356 name: "myapex.key",
1357 public_key: "testkey.avbpubkey",
1358 private_key: "testkey.pem",
1359 }
1360
1361 cc_library {
1362 name: "libx",
1363 apex_available: [ "myapex" ],
1364 }
Jooyung Han74066602020-03-20 04:29:24 +09001365 `)
Jooyung Han0c4e0162020-02-26 22:45:42 +09001366
1367 // ensure apex variant of c++ is linked with static unwinder
1368 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1369 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1370 // note that platform variant is not.
1371 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1372 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han0c4e0162020-02-26 22:45:42 +09001373}
1374
1375func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han74066602020-03-20 04:29:24 +09001376 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han0c4e0162020-02-26 22:45:42 +09001377 apex {
1378 name: "myapex",
1379 key: "myapex.key",
1380 native_shared_libs: ["libx"],
1381 min_sdk_version: "29",
1382 }
1383
1384 apex_key {
1385 name: "myapex.key",
1386 public_key: "testkey.avbpubkey",
1387 private_key: "testkey.pem",
1388 }
1389
1390 cc_library {
1391 name: "libx",
1392 shared_libs: ["libz"],
1393 system_shared_libs: [],
1394 stl: "none",
1395 apex_available: [ "myapex" ],
1396 }
1397
1398 cc_library {
1399 name: "libz",
1400 system_shared_libs: [],
1401 stl: "none",
1402 stubs: {
1403 versions: ["30"],
1404 },
1405 }
Jooyung Han74066602020-03-20 04:29:24 +09001406 `)
Jooyung Han0c4e0162020-02-26 22:45:42 +09001407
Jooyung Han29e91d22020-04-02 01:41:41 +09001408 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han0c4e0162020-02-26 22:45:42 +09001409 apex {
1410 name: "myapex",
1411 key: "myapex.key",
Jooyung Han29e91d22020-04-02 01:41:41 +09001412 min_sdk_version: "abc",
Jooyung Han0c4e0162020-02-26 22:45:42 +09001413 }
1414
1415 apex_key {
1416 name: "myapex.key",
1417 public_key: "testkey.avbpubkey",
1418 private_key: "testkey.pem",
1419 }
1420 `)
1421}
1422
Artur Satayev2eedf622020-04-15 17:29:42 +01001423func TestJavaStableSdkVersion(t *testing.T) {
1424 testCases := []struct {
1425 name string
1426 expectedError string
1427 bp string
1428 }{
1429 {
1430 name: "Non-updatable apex with non-stable dep",
1431 bp: `
1432 apex {
1433 name: "myapex",
1434 java_libs: ["myjar"],
1435 key: "myapex.key",
1436 }
1437 apex_key {
1438 name: "myapex.key",
1439 public_key: "testkey.avbpubkey",
1440 private_key: "testkey.pem",
1441 }
1442 java_library {
1443 name: "myjar",
1444 srcs: ["foo/bar/MyClass.java"],
1445 sdk_version: "core_platform",
1446 apex_available: ["myapex"],
1447 }
1448 `,
1449 },
1450 {
1451 name: "Updatable apex with stable dep",
1452 bp: `
1453 apex {
1454 name: "myapex",
1455 java_libs: ["myjar"],
1456 key: "myapex.key",
1457 updatable: true,
1458 min_sdk_version: "29",
1459 }
1460 apex_key {
1461 name: "myapex.key",
1462 public_key: "testkey.avbpubkey",
1463 private_key: "testkey.pem",
1464 }
1465 java_library {
1466 name: "myjar",
1467 srcs: ["foo/bar/MyClass.java"],
1468 sdk_version: "current",
1469 apex_available: ["myapex"],
1470 }
1471 `,
1472 },
1473 {
1474 name: "Updatable apex with non-stable dep",
1475 expectedError: "cannot depend on \"myjar\"",
1476 bp: `
1477 apex {
1478 name: "myapex",
1479 java_libs: ["myjar"],
1480 key: "myapex.key",
1481 updatable: true,
1482 }
1483 apex_key {
1484 name: "myapex.key",
1485 public_key: "testkey.avbpubkey",
1486 private_key: "testkey.pem",
1487 }
1488 java_library {
1489 name: "myjar",
1490 srcs: ["foo/bar/MyClass.java"],
1491 sdk_version: "core_platform",
1492 apex_available: ["myapex"],
1493 }
1494 `,
1495 },
1496 {
1497 name: "Updatable apex with non-stable transitive dep",
1498 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1499 bp: `
1500 apex {
1501 name: "myapex",
1502 java_libs: ["myjar"],
1503 key: "myapex.key",
1504 updatable: true,
1505 }
1506 apex_key {
1507 name: "myapex.key",
1508 public_key: "testkey.avbpubkey",
1509 private_key: "testkey.pem",
1510 }
1511 java_library {
1512 name: "myjar",
1513 srcs: ["foo/bar/MyClass.java"],
1514 sdk_version: "current",
1515 apex_available: ["myapex"],
1516 static_libs: ["transitive-jar"],
1517 }
1518 java_library {
1519 name: "transitive-jar",
1520 srcs: ["foo/bar/MyClass.java"],
1521 sdk_version: "core_platform",
1522 apex_available: ["myapex"],
1523 }
1524 `,
1525 },
1526 }
1527
1528 for _, test := range testCases {
1529 t.Run(test.name, func(t *testing.T) {
1530 if test.expectedError == "" {
1531 testApex(t, test.bp)
1532 } else {
1533 testApexError(t, test.expectedError, test.bp)
1534 }
1535 })
1536 }
1537}
1538
Jiyong Park7c2ee712018-12-07 00:42:25 +09001539func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001540 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001541 apex {
1542 name: "myapex",
1543 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001544 native_shared_libs: ["mylib"],
1545 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001546 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001547 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001548 }
1549
1550 apex_key {
1551 name: "myapex.key",
1552 public_key: "testkey.avbpubkey",
1553 private_key: "testkey.pem",
1554 }
1555
1556 prebuilt_etc {
1557 name: "myetc",
1558 src: "myprebuilt",
1559 sub_dir: "foo/bar",
1560 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001561
1562 cc_library {
1563 name: "mylib",
1564 srcs: ["mylib.cpp"],
1565 relative_install_path: "foo/bar",
1566 system_shared_libs: [],
1567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001568 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001569 }
1570
1571 cc_binary {
1572 name: "mybin",
1573 srcs: ["mylib.cpp"],
1574 relative_install_path: "foo/bar",
1575 system_shared_libs: [],
1576 static_executable: true,
1577 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001578 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001579 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001580 `)
1581
Sundong Ahnabb64432019-10-22 13:58:29 +09001582 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001583 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1584
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001585 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001586 ensureListContains(t, dirs, "etc")
1587 ensureListContains(t, dirs, "etc/foo")
1588 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001589 ensureListContains(t, dirs, "lib64")
1590 ensureListContains(t, dirs, "lib64/foo")
1591 ensureListContains(t, dirs, "lib64/foo/bar")
1592 ensureListContains(t, dirs, "lib")
1593 ensureListContains(t, dirs, "lib/foo")
1594 ensureListContains(t, dirs, "lib/foo/bar")
1595
Jiyong Parkbd13e442019-03-15 18:10:35 +09001596 ensureListContains(t, dirs, "bin")
1597 ensureListContains(t, dirs, "bin/foo")
1598 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001599}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001600
1601func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001602 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001603 apex {
1604 name: "myapex",
1605 key: "myapex.key",
1606 native_shared_libs: ["mylib"],
1607 use_vendor: true,
1608 }
1609
1610 apex_key {
1611 name: "myapex.key",
1612 public_key: "testkey.avbpubkey",
1613 private_key: "testkey.pem",
1614 }
1615
1616 cc_library {
1617 name: "mylib",
1618 srcs: ["mylib.cpp"],
1619 shared_libs: ["mylib2"],
1620 system_shared_libs: [],
1621 vendor_available: true,
1622 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001623 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001624 }
1625
1626 cc_library {
1627 name: "mylib2",
1628 srcs: ["mylib.cpp"],
1629 system_shared_libs: [],
1630 vendor_available: true,
1631 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001632 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001633 }
Jooyung Handc782442019-11-01 03:14:38 +09001634 `, func(fs map[string][]byte, config android.Config) {
1635 setUseVendorWhitelistForTest(config, []string{"myapex"})
1636 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001637
1638 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001639 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001640 for _, implicit := range i.Implicits {
1641 inputsList = append(inputsList, implicit.String())
1642 }
1643 }
1644 inputsString := strings.Join(inputsList, " ")
1645
1646 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001647 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1648 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001649
1650 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001651 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1652 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001653}
Jiyong Park16e91a02018-12-20 18:18:08 +09001654
Jooyung Handc782442019-11-01 03:14:38 +09001655func TestUseVendorRestriction(t *testing.T) {
1656 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1657 apex {
1658 name: "myapex",
1659 key: "myapex.key",
1660 use_vendor: true,
1661 }
1662 apex_key {
1663 name: "myapex.key",
1664 public_key: "testkey.avbpubkey",
1665 private_key: "testkey.pem",
1666 }
1667 `, func(fs map[string][]byte, config android.Config) {
1668 setUseVendorWhitelistForTest(config, []string{""})
1669 })
1670 // no error with whitelist
1671 testApex(t, `
1672 apex {
1673 name: "myapex",
1674 key: "myapex.key",
1675 use_vendor: true,
1676 }
1677 apex_key {
1678 name: "myapex.key",
1679 public_key: "testkey.avbpubkey",
1680 private_key: "testkey.pem",
1681 }
1682 `, func(fs map[string][]byte, config android.Config) {
1683 setUseVendorWhitelistForTest(config, []string{"myapex"})
1684 })
1685}
1686
Jooyung Han5c998b92019-06-27 11:30:33 +09001687func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1688 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1689 apex {
1690 name: "myapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["mylib"],
1693 use_vendor: true,
1694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "mylib",
1704 srcs: ["mylib.cpp"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 }
1708 `)
1709}
1710
Jiyong Park16e91a02018-12-20 18:18:08 +09001711func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001712 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001713 apex {
1714 name: "myapex",
1715 key: "myapex.key",
1716 native_shared_libs: ["mylib"],
1717 }
1718
1719 apex_key {
1720 name: "myapex.key",
1721 public_key: "testkey.avbpubkey",
1722 private_key: "testkey.pem",
1723 }
1724
1725 cc_library {
1726 name: "mylib",
1727 srcs: ["mylib.cpp"],
1728 system_shared_libs: [],
1729 stl: "none",
1730 stubs: {
1731 versions: ["1", "2", "3"],
1732 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001733 apex_available: [
1734 "//apex_available:platform",
1735 "myapex",
1736 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001737 }
1738
1739 cc_binary {
1740 name: "not_in_apex",
1741 srcs: ["mylib.cpp"],
1742 static_libs: ["mylib"],
1743 static_executable: true,
1744 system_shared_libs: [],
1745 stl: "none",
1746 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001747 `)
1748
Colin Cross7113d202019-11-20 16:39:12 -08001749 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001750
1751 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001752 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001753}
Jiyong Park9335a262018-12-24 11:31:58 +09001754
1755func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001756 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001757 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001758 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001759 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001760 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001761 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001762 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001763 }
1764
1765 cc_library {
1766 name: "mylib",
1767 srcs: ["mylib.cpp"],
1768 system_shared_libs: [],
1769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001770 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001779 android_app_certificate {
1780 name: "myapex.certificate",
1781 certificate: "testkey",
1782 }
1783
1784 android_app_certificate {
1785 name: "myapex.certificate.override",
1786 certificate: "testkey.override",
1787 }
1788
Jiyong Park9335a262018-12-24 11:31:58 +09001789 `)
1790
1791 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001792 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001793
1794 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1795 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1796 "vendor/foo/devkeys/testkey.avbpubkey")
1797 }
1798 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1799 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1800 "vendor/foo/devkeys/testkey.pem")
1801 }
1802
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001803 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001804 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001805 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001806 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001807 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001808 }
1809}
Jiyong Park58e364a2019-01-19 19:24:06 +09001810
Jooyung Hanf121a652019-12-17 14:30:11 +09001811func TestCertificate(t *testing.T) {
1812 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
1813 ctx, _ := testApex(t, `
1814 apex {
1815 name: "myapex",
1816 key: "myapex.key",
1817 }
1818 apex_key {
1819 name: "myapex.key",
1820 public_key: "testkey.avbpubkey",
1821 private_key: "testkey.pem",
1822 }`)
1823 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1824 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
1825 if actual := rule.Args["certificates"]; actual != expected {
1826 t.Errorf("certificates should be %q, not %q", expected, actual)
1827 }
1828 })
1829 t.Run("override when unspecified", func(t *testing.T) {
1830 ctx, _ := testApex(t, `
1831 apex {
1832 name: "myapex_keytest",
1833 key: "myapex.key",
1834 file_contexts: ":myapex-file_contexts",
1835 }
1836 apex_key {
1837 name: "myapex.key",
1838 public_key: "testkey.avbpubkey",
1839 private_key: "testkey.pem",
1840 }
1841 android_app_certificate {
1842 name: "myapex.certificate.override",
1843 certificate: "testkey.override",
1844 }`)
1845 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1846 expected := "testkey.override.x509.pem testkey.override.pk8"
1847 if actual := rule.Args["certificates"]; actual != expected {
1848 t.Errorf("certificates should be %q, not %q", expected, actual)
1849 }
1850 })
1851 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
1852 ctx, _ := testApex(t, `
1853 apex {
1854 name: "myapex",
1855 key: "myapex.key",
1856 certificate: ":myapex.certificate",
1857 }
1858 apex_key {
1859 name: "myapex.key",
1860 public_key: "testkey.avbpubkey",
1861 private_key: "testkey.pem",
1862 }
1863 android_app_certificate {
1864 name: "myapex.certificate",
1865 certificate: "testkey",
1866 }`)
1867 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1868 expected := "testkey.x509.pem testkey.pk8"
1869 if actual := rule.Args["certificates"]; actual != expected {
1870 t.Errorf("certificates should be %q, not %q", expected, actual)
1871 }
1872 })
1873 t.Run("override when specifiec as <:module>", func(t *testing.T) {
1874 ctx, _ := testApex(t, `
1875 apex {
1876 name: "myapex_keytest",
1877 key: "myapex.key",
1878 file_contexts: ":myapex-file_contexts",
1879 certificate: ":myapex.certificate",
1880 }
1881 apex_key {
1882 name: "myapex.key",
1883 public_key: "testkey.avbpubkey",
1884 private_key: "testkey.pem",
1885 }
1886 android_app_certificate {
1887 name: "myapex.certificate.override",
1888 certificate: "testkey.override",
1889 }`)
1890 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1891 expected := "testkey.override.x509.pem testkey.override.pk8"
1892 if actual := rule.Args["certificates"]; actual != expected {
1893 t.Errorf("certificates should be %q, not %q", expected, actual)
1894 }
1895 })
1896 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
1897 ctx, _ := testApex(t, `
1898 apex {
1899 name: "myapex",
1900 key: "myapex.key",
1901 certificate: "testkey",
1902 }
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }`)
1908 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1909 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
1910 if actual := rule.Args["certificates"]; actual != expected {
1911 t.Errorf("certificates should be %q, not %q", expected, actual)
1912 }
1913 })
1914 t.Run("override when specified as <name>", func(t *testing.T) {
1915 ctx, _ := testApex(t, `
1916 apex {
1917 name: "myapex_keytest",
1918 key: "myapex.key",
1919 file_contexts: ":myapex-file_contexts",
1920 certificate: "testkey",
1921 }
1922 apex_key {
1923 name: "myapex.key",
1924 public_key: "testkey.avbpubkey",
1925 private_key: "testkey.pem",
1926 }
1927 android_app_certificate {
1928 name: "myapex.certificate.override",
1929 certificate: "testkey.override",
1930 }`)
1931 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1932 expected := "testkey.override.x509.pem testkey.override.pk8"
1933 if actual := rule.Args["certificates"]; actual != expected {
1934 t.Errorf("certificates should be %q, not %q", expected, actual)
1935 }
1936 })
1937}
1938
Jiyong Park58e364a2019-01-19 19:24:06 +09001939func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001940 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001941 apex {
1942 name: "myapex",
1943 key: "myapex.key",
Jooyung Han68e511e2020-03-02 17:44:33 +09001944 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09001945 }
1946
1947 apex {
1948 name: "otherapex",
1949 key: "myapex.key",
Jooyung Han68e511e2020-03-02 17:44:33 +09001950 native_shared_libs: ["mylib", "mylib2"],
Jooyung Han61c41542020-03-07 03:45:53 +09001951 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09001952 }
1953
1954 apex_key {
1955 name: "myapex.key",
1956 public_key: "testkey.avbpubkey",
1957 private_key: "testkey.pem",
1958 }
1959
1960 cc_library {
1961 name: "mylib",
1962 srcs: ["mylib.cpp"],
1963 system_shared_libs: [],
1964 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001965 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001966 "myapex",
1967 "otherapex",
1968 ],
Jooyung Hanc3e92632020-03-21 23:20:55 +09001969 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09001970 }
Jooyung Han68e511e2020-03-02 17:44:33 +09001971 cc_library {
1972 name: "mylib2",
1973 srcs: ["mylib.cpp"],
1974 system_shared_libs: [],
1975 stl: "none",
1976 apex_available: [
1977 "myapex",
1978 "otherapex",
1979 ],
1980 use_apex_name_macro: true,
1981 }
Jiyong Park58e364a2019-01-19 19:24:06 +09001982 `)
1983
Jooyung Han68e511e2020-03-02 17:44:33 +09001984 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08001985 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001986 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han74066602020-03-20 04:29:24 +09001987 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Han68e511e2020-03-02 17:44:33 +09001988
Jooyung Han61c41542020-03-07 03:45:53 +09001989 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Han68e511e2020-03-02 17:44:33 +09001990 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1991 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han61c41542020-03-07 03:45:53 +09001992 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09001993 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han68e511e2020-03-02 17:44:33 +09001994
Jooyung Han61c41542020-03-07 03:45:53 +09001995 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Han68e511e2020-03-02 17:44:33 +09001996 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
1997 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han61c41542020-03-07 03:45:53 +09001998 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09001999 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002000
Jooyung Han68e511e2020-03-02 17:44:33 +09002001 // When cc_library sets use_apex_name_macro: true
2002 // apex variants define additional macro to distinguish which apex variant it is built for
2003
2004 // non-APEX variant does not have __ANDROID_APEX__ defined
2005 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2006 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2007
2008 // APEX variant has __ANDROID_APEX__ defined
2009 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002010 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002011 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2012 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002013
Jooyung Han68e511e2020-03-02 17:44:33 +09002014 // APEX variant has __ANDROID_APEX__ defined
2015 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002016 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002017 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2018 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Hanc3e92632020-03-21 23:20:55 +09002019
2020 // recovery variant does not set __ANDROID_SDK_VERSION__
2021 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2022 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2023 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002024}
Jiyong Park7e636d02019-01-28 16:16:54 +09002025
2026func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002027 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["mylib"],
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library_headers {
2041 name: "mylib_headers",
2042 export_include_dirs: ["my_include"],
2043 system_shared_libs: [],
2044 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002045 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002046 }
2047
2048 cc_library {
2049 name: "mylib",
2050 srcs: ["mylib.cpp"],
2051 system_shared_libs: [],
2052 stl: "none",
2053 header_libs: ["mylib_headers"],
2054 export_header_lib_headers: ["mylib_headers"],
2055 stubs: {
2056 versions: ["1", "2", "3"],
2057 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002058 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002059 }
2060
2061 cc_library {
2062 name: "otherlib",
2063 srcs: ["mylib.cpp"],
2064 system_shared_libs: [],
2065 stl: "none",
2066 shared_libs: ["mylib"],
2067 }
2068 `)
2069
Colin Cross7113d202019-11-20 16:39:12 -08002070 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002071
2072 // Ensure that the include path of the header lib is exported to 'otherlib'
2073 ensureContains(t, cFlags, "-Imy_include")
2074}
Alex Light9670d332019-01-29 18:07:33 -08002075
Jiyong Park7cd10e32020-01-14 09:22:18 +09002076type fileInApex struct {
2077 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002078 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002079 isLink bool
2080}
2081
Jooyung Hana57af4a2020-01-23 05:36:59 +00002082func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002083 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002084 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002085 copyCmds := apexRule.Args["copy_commands"]
2086 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002087 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002088 for _, cmd := range strings.Split(copyCmds, "&&") {
2089 cmd = strings.TrimSpace(cmd)
2090 if cmd == "" {
2091 continue
2092 }
2093 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002094 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002095 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002096 switch terms[0] {
2097 case "mkdir":
2098 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002099 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002100 t.Fatal("copyCmds contains invalid cp command", cmd)
2101 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002102 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002103 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002104 isLink = false
2105 case "ln":
2106 if len(terms) != 3 && len(terms) != 4 {
2107 // ln LINK TARGET or ln -s LINK TARGET
2108 t.Fatal("copyCmds contains invalid ln command", cmd)
2109 }
2110 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002111 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002112 isLink = true
2113 default:
2114 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2115 }
2116 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002117 index := strings.Index(dst, imageApexDir)
2118 if index == -1 {
2119 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2120 }
2121 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002122 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002123 }
2124 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002125 return ret
2126}
2127
Jooyung Hana57af4a2020-01-23 05:36:59 +00002128func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2129 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002130 var failed bool
2131 var surplus []string
2132 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002133 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han8d8906c2020-02-27 13:31:56 +09002134 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002135 for _, expected := range files {
2136 if matched, _ := path.Match(expected, file.path); matched {
2137 filesMatched[expected] = true
Jooyung Han8d8906c2020-02-27 13:31:56 +09002138 mactchFound = true
2139 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002140 }
2141 }
Jooyung Han8d8906c2020-02-27 13:31:56 +09002142 if !mactchFound {
2143 surplus = append(surplus, file.path)
2144 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002145 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002146
Jooyung Han31c470b2019-10-18 16:26:59 +09002147 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002148 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002149 t.Log("surplus files", surplus)
2150 failed = true
2151 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002152
2153 if len(files) > len(filesMatched) {
2154 var missing []string
2155 for _, expected := range files {
2156 if !filesMatched[expected] {
2157 missing = append(missing, expected)
2158 }
2159 }
2160 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002161 t.Log("missing files", missing)
2162 failed = true
2163 }
2164 if failed {
2165 t.Fail()
2166 }
2167}
2168
Jooyung Han344d5432019-08-23 11:17:39 +09002169func TestVndkApexCurrent(t *testing.T) {
2170 ctx, _ := testApex(t, `
2171 apex_vndk {
2172 name: "myapex",
2173 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002174 }
2175
2176 apex_key {
2177 name: "myapex.key",
2178 public_key: "testkey.avbpubkey",
2179 private_key: "testkey.pem",
2180 }
2181
2182 cc_library {
2183 name: "libvndk",
2184 srcs: ["mylib.cpp"],
2185 vendor_available: true,
2186 vndk: {
2187 enabled: true,
2188 },
2189 system_shared_libs: [],
2190 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002191 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002192 }
2193
2194 cc_library {
2195 name: "libvndksp",
2196 srcs: ["mylib.cpp"],
2197 vendor_available: true,
2198 vndk: {
2199 enabled: true,
2200 support_system_process: true,
2201 },
2202 system_shared_libs: [],
2203 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002204 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002205 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002206 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002207
Jooyung Hana57af4a2020-01-23 05:36:59 +00002208 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002209 "lib/libvndk.so",
2210 "lib/libvndksp.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002211 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002212 "lib64/libvndk.so",
2213 "lib64/libvndksp.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002214 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002215 "etc/llndk.libraries.VER.txt",
2216 "etc/vndkcore.libraries.VER.txt",
2217 "etc/vndksp.libraries.VER.txt",
2218 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002219 })
Jooyung Han344d5432019-08-23 11:17:39 +09002220}
2221
2222func TestVndkApexWithPrebuilt(t *testing.T) {
2223 ctx, _ := testApex(t, `
2224 apex_vndk {
2225 name: "myapex",
2226 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002227 }
2228
2229 apex_key {
2230 name: "myapex.key",
2231 public_key: "testkey.avbpubkey",
2232 private_key: "testkey.pem",
2233 }
2234
2235 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002236 name: "libvndk",
2237 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002238 vendor_available: true,
2239 vndk: {
2240 enabled: true,
2241 },
2242 system_shared_libs: [],
2243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002244 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002245 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002246
2247 cc_prebuilt_library_shared {
2248 name: "libvndk.arm",
2249 srcs: ["libvndk.arm.so"],
2250 vendor_available: true,
2251 vndk: {
2252 enabled: true,
2253 },
2254 enabled: false,
2255 arch: {
2256 arm: {
2257 enabled: true,
2258 },
2259 },
2260 system_shared_libs: [],
2261 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002262 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002263 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002264 `+vndkLibrariesTxtFiles("current"),
2265 withFiles(map[string][]byte{
2266 "libvndk.so": nil,
2267 "libvndk.arm.so": nil,
2268 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002269
Jooyung Hana57af4a2020-01-23 05:36:59 +00002270 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002271 "lib/libvndk.so",
2272 "lib/libvndk.arm.so",
2273 "lib64/libvndk.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002274 "lib/libc++.so",
2275 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002276 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002277 })
Jooyung Han344d5432019-08-23 11:17:39 +09002278}
2279
Jooyung Han39edb6c2019-11-06 16:53:07 +09002280func vndkLibrariesTxtFiles(vers ...string) (result string) {
2281 for _, v := range vers {
2282 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002283 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002284 result += `
2285 vndk_libraries_txt {
2286 name: "` + txt + `.libraries.txt",
2287 }
2288 `
2289 }
2290 } else {
2291 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2292 result += `
2293 prebuilt_etc {
2294 name: "` + txt + `.libraries.` + v + `.txt",
2295 src: "dummy.txt",
2296 }
2297 `
2298 }
2299 }
2300 }
2301 return
2302}
2303
Jooyung Han344d5432019-08-23 11:17:39 +09002304func TestVndkApexVersion(t *testing.T) {
2305 ctx, _ := testApex(t, `
2306 apex_vndk {
2307 name: "myapex_v27",
2308 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002309 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002310 vndk_version: "27",
2311 }
2312
2313 apex_key {
2314 name: "myapex.key",
2315 public_key: "testkey.avbpubkey",
2316 private_key: "testkey.pem",
2317 }
2318
Jooyung Han31c470b2019-10-18 16:26:59 +09002319 vndk_prebuilt_shared {
2320 name: "libvndk27",
2321 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002322 vendor_available: true,
2323 vndk: {
2324 enabled: true,
2325 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002326 target_arch: "arm64",
2327 arch: {
2328 arm: {
2329 srcs: ["libvndk27_arm.so"],
2330 },
2331 arm64: {
2332 srcs: ["libvndk27_arm64.so"],
2333 },
2334 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002335 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002336 }
2337
2338 vndk_prebuilt_shared {
2339 name: "libvndk27",
2340 version: "27",
2341 vendor_available: true,
2342 vndk: {
2343 enabled: true,
2344 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002345 target_arch: "x86_64",
2346 arch: {
2347 x86: {
2348 srcs: ["libvndk27_x86.so"],
2349 },
2350 x86_64: {
2351 srcs: ["libvndk27_x86_64.so"],
2352 },
2353 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002354 }
2355 `+vndkLibrariesTxtFiles("27"),
2356 withFiles(map[string][]byte{
2357 "libvndk27_arm.so": nil,
2358 "libvndk27_arm64.so": nil,
2359 "libvndk27_x86.so": nil,
2360 "libvndk27_x86_64.so": nil,
2361 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002362
Jooyung Hana57af4a2020-01-23 05:36:59 +00002363 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002364 "lib/libvndk27_arm.so",
2365 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002366 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002367 })
Jooyung Han344d5432019-08-23 11:17:39 +09002368}
2369
2370func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2371 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2372 apex_vndk {
2373 name: "myapex_v27",
2374 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002375 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002376 vndk_version: "27",
2377 }
2378 apex_vndk {
2379 name: "myapex_v27_other",
2380 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002381 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002382 vndk_version: "27",
2383 }
2384
2385 apex_key {
2386 name: "myapex.key",
2387 public_key: "testkey.avbpubkey",
2388 private_key: "testkey.pem",
2389 }
2390
2391 cc_library {
2392 name: "libvndk",
2393 srcs: ["mylib.cpp"],
2394 vendor_available: true,
2395 vndk: {
2396 enabled: true,
2397 },
2398 system_shared_libs: [],
2399 stl: "none",
2400 }
2401
2402 vndk_prebuilt_shared {
2403 name: "libvndk",
2404 version: "27",
2405 vendor_available: true,
2406 vndk: {
2407 enabled: true,
2408 },
2409 srcs: ["libvndk.so"],
2410 }
2411 `, withFiles(map[string][]byte{
2412 "libvndk.so": nil,
2413 }))
2414}
2415
Jooyung Han90eee022019-10-01 20:02:42 +09002416func TestVndkApexNameRule(t *testing.T) {
2417 ctx, _ := testApex(t, `
2418 apex_vndk {
2419 name: "myapex",
2420 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002421 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002422 }
2423 apex_vndk {
2424 name: "myapex_v28",
2425 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002426 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002427 vndk_version: "28",
2428 }
2429 apex_key {
2430 name: "myapex.key",
2431 public_key: "testkey.avbpubkey",
2432 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002433 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002434
2435 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002436 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002437 actual := proptools.String(bundle.properties.Apex_name)
2438 if !reflect.DeepEqual(actual, expected) {
2439 t.Errorf("Got '%v', expected '%v'", actual, expected)
2440 }
2441 }
2442
2443 assertApexName("com.android.vndk.vVER", "myapex")
2444 assertApexName("com.android.vndk.v28", "myapex_v28")
2445}
2446
Jooyung Han344d5432019-08-23 11:17:39 +09002447func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2448 ctx, _ := testApex(t, `
2449 apex_vndk {
2450 name: "myapex",
2451 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002452 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002453 }
2454
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460
2461 cc_library {
2462 name: "libvndk",
2463 srcs: ["mylib.cpp"],
2464 vendor_available: true,
2465 native_bridge_supported: true,
2466 host_supported: true,
2467 vndk: {
2468 enabled: true,
2469 },
2470 system_shared_libs: [],
2471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002472 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002473 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002474 `+vndkLibrariesTxtFiles("current"),
2475 withTargets(map[android.OsType][]android.Target{
2476 android.Android: []android.Target{
2477 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2478 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2479 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
2480 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
2481 },
2482 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002483
Jooyung Hana57af4a2020-01-23 05:36:59 +00002484 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002485 "lib/libvndk.so",
2486 "lib64/libvndk.so",
Jooyung Han8d8906c2020-02-27 13:31:56 +09002487 "lib/libc++.so",
2488 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002489 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002490 })
Jooyung Han344d5432019-08-23 11:17:39 +09002491}
2492
2493func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2494 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2495 apex_vndk {
2496 name: "myapex",
2497 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002498 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002499 native_bridge_supported: true,
2500 }
2501
2502 apex_key {
2503 name: "myapex.key",
2504 public_key: "testkey.avbpubkey",
2505 private_key: "testkey.pem",
2506 }
2507
2508 cc_library {
2509 name: "libvndk",
2510 srcs: ["mylib.cpp"],
2511 vendor_available: true,
2512 native_bridge_supported: true,
2513 host_supported: true,
2514 vndk: {
2515 enabled: true,
2516 },
2517 system_shared_libs: [],
2518 stl: "none",
2519 }
2520 `)
2521}
2522
Jooyung Han31c470b2019-10-18 16:26:59 +09002523func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002524 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002525 apex_vndk {
2526 name: "myapex_v27",
2527 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002528 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002529 vndk_version: "27",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
2538 vndk_prebuilt_shared {
2539 name: "libvndk27",
2540 version: "27",
2541 target_arch: "arm",
2542 vendor_available: true,
2543 vndk: {
2544 enabled: true,
2545 },
2546 arch: {
2547 arm: {
2548 srcs: ["libvndk27.so"],
2549 }
2550 },
2551 }
2552
2553 vndk_prebuilt_shared {
2554 name: "libvndk27",
2555 version: "27",
2556 target_arch: "arm",
2557 binder32bit: true,
2558 vendor_available: true,
2559 vndk: {
2560 enabled: true,
2561 },
2562 arch: {
2563 arm: {
2564 srcs: ["libvndk27binder32.so"],
2565 }
2566 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002567 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002568 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002569 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002570 withFiles(map[string][]byte{
2571 "libvndk27.so": nil,
2572 "libvndk27binder32.so": nil,
2573 }),
2574 withBinder32bit,
2575 withTargets(map[android.OsType][]android.Target{
2576 android.Android: []android.Target{
2577 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
2578 },
2579 }),
2580 )
2581
Jooyung Hana57af4a2020-01-23 05:36:59 +00002582 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002583 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002584 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002585 })
2586}
2587
Jooyung Hane1633032019-08-01 17:41:43 +09002588func TestDependenciesInApexManifest(t *testing.T) {
2589 ctx, _ := testApex(t, `
2590 apex {
2591 name: "myapex_nodep",
2592 key: "myapex.key",
2593 native_shared_libs: ["lib_nodep"],
2594 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002595 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002596 }
2597
2598 apex {
2599 name: "myapex_dep",
2600 key: "myapex.key",
2601 native_shared_libs: ["lib_dep"],
2602 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002603 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002604 }
2605
2606 apex {
2607 name: "myapex_provider",
2608 key: "myapex.key",
2609 native_shared_libs: ["libfoo"],
2610 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002611 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002612 }
2613
2614 apex {
2615 name: "myapex_selfcontained",
2616 key: "myapex.key",
2617 native_shared_libs: ["lib_dep", "libfoo"],
2618 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002619 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002620 }
2621
2622 apex_key {
2623 name: "myapex.key",
2624 public_key: "testkey.avbpubkey",
2625 private_key: "testkey.pem",
2626 }
2627
2628 cc_library {
2629 name: "lib_nodep",
2630 srcs: ["mylib.cpp"],
2631 system_shared_libs: [],
2632 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002633 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002634 }
2635
2636 cc_library {
2637 name: "lib_dep",
2638 srcs: ["mylib.cpp"],
2639 shared_libs: ["libfoo"],
2640 system_shared_libs: [],
2641 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002642 apex_available: [
2643 "myapex_dep",
2644 "myapex_provider",
2645 "myapex_selfcontained",
2646 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002647 }
2648
2649 cc_library {
2650 name: "libfoo",
2651 srcs: ["mytest.cpp"],
2652 stubs: {
2653 versions: ["1"],
2654 },
2655 system_shared_libs: [],
2656 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002657 apex_available: [
2658 "myapex_provider",
2659 "myapex_selfcontained",
2660 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002661 }
2662 `)
2663
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002664 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002665 var provideNativeLibs, requireNativeLibs []string
2666
Sundong Ahnabb64432019-10-22 13:58:29 +09002667 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002668 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2669 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002670 ensureListEmpty(t, provideNativeLibs)
2671 ensureListEmpty(t, requireNativeLibs)
2672
Sundong Ahnabb64432019-10-22 13:58:29 +09002673 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002674 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2675 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002676 ensureListEmpty(t, provideNativeLibs)
2677 ensureListContains(t, requireNativeLibs, "libfoo.so")
2678
Sundong Ahnabb64432019-10-22 13:58:29 +09002679 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002680 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2681 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002682 ensureListContains(t, provideNativeLibs, "libfoo.so")
2683 ensureListEmpty(t, requireNativeLibs)
2684
Sundong Ahnabb64432019-10-22 13:58:29 +09002685 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002686 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2687 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002688 ensureListContains(t, provideNativeLibs, "libfoo.so")
2689 ensureListEmpty(t, requireNativeLibs)
2690}
2691
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002692func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002693 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002694 apex {
2695 name: "myapex",
2696 key: "myapex.key",
2697 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002698 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002699 }
2700
2701 apex_key {
2702 name: "myapex.key",
2703 public_key: "testkey.avbpubkey",
2704 private_key: "testkey.pem",
2705 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002706
2707 cc_library {
2708 name: "mylib",
2709 srcs: ["mylib.cpp"],
2710 system_shared_libs: [],
2711 stl: "none",
2712 apex_available: [
2713 "//apex_available:platform",
2714 "myapex",
2715 ],
2716 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002717 `)
2718
Sundong Ahnabb64432019-10-22 13:58:29 +09002719 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002720 apexManifestRule := module.Rule("apexManifestRule")
2721 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2722 apexRule := module.Rule("apexRule")
2723 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002724
2725 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2726 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2727 name := apexBundle.BaseModuleName()
2728 prefix := "TARGET_"
2729 var builder strings.Builder
2730 data.Custom(&builder, name, prefix, "", data)
2731 androidMk := builder.String()
2732 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2733 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002734}
2735
Alex Light0851b882019-02-07 13:20:53 -08002736func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002737 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002738 apex {
2739 name: "myapex",
2740 key: "myapex.key",
2741 native_shared_libs: ["mylib_common"],
2742 }
2743
2744 apex_key {
2745 name: "myapex.key",
2746 public_key: "testkey.avbpubkey",
2747 private_key: "testkey.pem",
2748 }
2749
2750 cc_library {
2751 name: "mylib_common",
2752 srcs: ["mylib.cpp"],
2753 system_shared_libs: [],
2754 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002755 apex_available: [
2756 "//apex_available:platform",
2757 "myapex",
2758 ],
Alex Light0851b882019-02-07 13:20:53 -08002759 }
2760 `)
2761
Sundong Ahnabb64432019-10-22 13:58:29 +09002762 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002763 apexRule := module.Rule("apexRule")
2764 copyCmds := apexRule.Args["copy_commands"]
2765
2766 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2767 t.Log("Apex was a test apex!")
2768 t.Fail()
2769 }
2770 // Ensure that main rule creates an output
2771 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2772
2773 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002774 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002775
2776 // Ensure that both direct and indirect deps are copied into apex
2777 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2778
Colin Cross7113d202019-11-20 16:39:12 -08002779 // Ensure that the platform variant ends with _shared
2780 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002781
2782 if !android.InAnyApex("mylib_common") {
2783 t.Log("Found mylib_common not in any apex!")
2784 t.Fail()
2785 }
2786}
2787
2788func TestTestApex(t *testing.T) {
2789 if android.InAnyApex("mylib_common_test") {
2790 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!")
2791 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002792 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002793 apex_test {
2794 name: "myapex",
2795 key: "myapex.key",
2796 native_shared_libs: ["mylib_common_test"],
2797 }
2798
2799 apex_key {
2800 name: "myapex.key",
2801 public_key: "testkey.avbpubkey",
2802 private_key: "testkey.pem",
2803 }
2804
2805 cc_library {
2806 name: "mylib_common_test",
2807 srcs: ["mylib.cpp"],
2808 system_shared_libs: [],
2809 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002810 // TODO: remove //apex_available:platform
2811 apex_available: [
2812 "//apex_available:platform",
2813 "myapex",
2814 ],
Alex Light0851b882019-02-07 13:20:53 -08002815 }
2816 `)
2817
Sundong Ahnabb64432019-10-22 13:58:29 +09002818 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002819 apexRule := module.Rule("apexRule")
2820 copyCmds := apexRule.Args["copy_commands"]
2821
2822 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
2823 t.Log("Apex was not a test apex!")
2824 t.Fail()
2825 }
2826 // Ensure that main rule creates an output
2827 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2828
2829 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002831
2832 // Ensure that both direct and indirect deps are copied into apex
2833 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
2834
Colin Cross7113d202019-11-20 16:39:12 -08002835 // Ensure that the platform variant ends with _shared
2836 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002837}
2838
Alex Light9670d332019-01-29 18:07:33 -08002839func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002840 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08002841 apex {
2842 name: "myapex",
2843 key: "myapex.key",
2844 multilib: {
2845 first: {
2846 native_shared_libs: ["mylib_common"],
2847 }
2848 },
2849 target: {
2850 android: {
2851 multilib: {
2852 first: {
2853 native_shared_libs: ["mylib"],
2854 }
2855 }
2856 },
2857 host: {
2858 multilib: {
2859 first: {
2860 native_shared_libs: ["mylib2"],
2861 }
2862 }
2863 }
2864 }
2865 }
2866
2867 apex_key {
2868 name: "myapex.key",
2869 public_key: "testkey.avbpubkey",
2870 private_key: "testkey.pem",
2871 }
2872
2873 cc_library {
2874 name: "mylib",
2875 srcs: ["mylib.cpp"],
2876 system_shared_libs: [],
2877 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002878 // TODO: remove //apex_available:platform
2879 apex_available: [
2880 "//apex_available:platform",
2881 "myapex",
2882 ],
Alex Light9670d332019-01-29 18:07:33 -08002883 }
2884
2885 cc_library {
2886 name: "mylib_common",
2887 srcs: ["mylib.cpp"],
2888 system_shared_libs: [],
2889 stl: "none",
2890 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002891 // TODO: remove //apex_available:platform
2892 apex_available: [
2893 "//apex_available:platform",
2894 "myapex",
2895 ],
Alex Light9670d332019-01-29 18:07:33 -08002896 }
2897
2898 cc_library {
2899 name: "mylib2",
2900 srcs: ["mylib.cpp"],
2901 system_shared_libs: [],
2902 stl: "none",
2903 compile_multilib: "first",
2904 }
2905 `)
2906
Sundong Ahnabb64432019-10-22 13:58:29 +09002907 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08002908 copyCmds := apexRule.Args["copy_commands"]
2909
2910 // Ensure that main rule creates an output
2911 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2912
2913 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002914 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
2915 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
2916 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08002917
2918 // Ensure that both direct and indirect deps are copied into apex
2919 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
2920 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
2922
Colin Cross7113d202019-11-20 16:39:12 -08002923 // Ensure that the platform variant ends with _shared
2924 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
2925 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
2926 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08002927}
Jiyong Park04480cf2019-02-06 00:16:29 +09002928
2929func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002930 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09002931 apex {
2932 name: "myapex",
2933 key: "myapex.key",
2934 binaries: ["myscript"],
2935 }
2936
2937 apex_key {
2938 name: "myapex.key",
2939 public_key: "testkey.avbpubkey",
2940 private_key: "testkey.pem",
2941 }
2942
2943 sh_binary {
2944 name: "myscript",
2945 src: "mylib.cpp",
2946 filename: "myscript.sh",
2947 sub_dir: "script",
2948 }
2949 `)
2950
Sundong Ahnabb64432019-10-22 13:58:29 +09002951 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09002952 copyCmds := apexRule.Args["copy_commands"]
2953
2954 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
2955}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002956
Jooyung Han91df2082019-11-20 01:49:42 +09002957func TestApexInVariousPartition(t *testing.T) {
2958 testcases := []struct {
2959 propName, parition, flattenedPartition string
2960 }{
2961 {"", "system", "system_ext"},
2962 {"product_specific: true", "product", "product"},
2963 {"soc_specific: true", "vendor", "vendor"},
2964 {"proprietary: true", "vendor", "vendor"},
2965 {"vendor: true", "vendor", "vendor"},
2966 {"system_ext_specific: true", "system_ext", "system_ext"},
2967 }
2968 for _, tc := range testcases {
2969 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
2970 ctx, _ := testApex(t, `
2971 apex {
2972 name: "myapex",
2973 key: "myapex.key",
2974 `+tc.propName+`
2975 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002976
Jooyung Han91df2082019-11-20 01:49:42 +09002977 apex_key {
2978 name: "myapex.key",
2979 public_key: "testkey.avbpubkey",
2980 private_key: "testkey.pem",
2981 }
2982 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002983
Jooyung Han91df2082019-11-20 01:49:42 +09002984 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2985 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
2986 actual := apex.installDir.String()
2987 if actual != expected {
2988 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2989 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002990
Jooyung Han91df2082019-11-20 01:49:42 +09002991 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
2992 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
2993 actual = flattened.installDir.String()
2994 if actual != expected {
2995 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2996 }
2997 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002998 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002999}
Jiyong Park67882562019-03-21 01:11:21 +09003000
Jooyung Han54aca7b2019-11-20 02:26:02 +09003001func TestFileContexts(t *testing.T) {
3002 ctx, _ := testApex(t, `
3003 apex {
3004 name: "myapex",
3005 key: "myapex.key",
3006 }
3007
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013 `)
3014 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3015 apexRule := module.Rule("apexRule")
3016 actual := apexRule.Args["file_contexts"]
3017 expected := "system/sepolicy/apex/myapex-file_contexts"
3018 if actual != expected {
3019 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3020 }
3021
3022 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3023 apex {
3024 name: "myapex",
3025 key: "myapex.key",
3026 file_contexts: "my_own_file_contexts",
3027 }
3028
3029 apex_key {
3030 name: "myapex.key",
3031 public_key: "testkey.avbpubkey",
3032 private_key: "testkey.pem",
3033 }
3034 `, withFiles(map[string][]byte{
3035 "my_own_file_contexts": nil,
3036 }))
3037
3038 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3039 apex {
3040 name: "myapex",
3041 key: "myapex.key",
3042 product_specific: true,
3043 file_contexts: "product_specific_file_contexts",
3044 }
3045
3046 apex_key {
3047 name: "myapex.key",
3048 public_key: "testkey.avbpubkey",
3049 private_key: "testkey.pem",
3050 }
3051 `)
3052
3053 ctx, _ = testApex(t, `
3054 apex {
3055 name: "myapex",
3056 key: "myapex.key",
3057 product_specific: true,
3058 file_contexts: "product_specific_file_contexts",
3059 }
3060
3061 apex_key {
3062 name: "myapex.key",
3063 public_key: "testkey.avbpubkey",
3064 private_key: "testkey.pem",
3065 }
3066 `, withFiles(map[string][]byte{
3067 "product_specific_file_contexts": nil,
3068 }))
3069 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3070 apexRule = module.Rule("apexRule")
3071 actual = apexRule.Args["file_contexts"]
3072 expected = "product_specific_file_contexts"
3073 if actual != expected {
3074 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3075 }
3076
3077 ctx, _ = testApex(t, `
3078 apex {
3079 name: "myapex",
3080 key: "myapex.key",
3081 product_specific: true,
3082 file_contexts: ":my-file-contexts",
3083 }
3084
3085 apex_key {
3086 name: "myapex.key",
3087 public_key: "testkey.avbpubkey",
3088 private_key: "testkey.pem",
3089 }
3090
3091 filegroup {
3092 name: "my-file-contexts",
3093 srcs: ["product_specific_file_contexts"],
3094 }
3095 `, withFiles(map[string][]byte{
3096 "product_specific_file_contexts": nil,
3097 }))
3098 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3099 apexRule = module.Rule("apexRule")
3100 actual = apexRule.Args["file_contexts"]
3101 expected = "product_specific_file_contexts"
3102 if actual != expected {
3103 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3104 }
3105}
3106
Jiyong Park67882562019-03-21 01:11:21 +09003107func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003108 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003109 apex_key {
3110 name: "myapex.key",
3111 public_key: ":my.avbpubkey",
3112 private_key: ":my.pem",
3113 product_specific: true,
3114 }
3115
3116 filegroup {
3117 name: "my.avbpubkey",
3118 srcs: ["testkey2.avbpubkey"],
3119 }
3120
3121 filegroup {
3122 name: "my.pem",
3123 srcs: ["testkey2.pem"],
3124 }
3125 `)
3126
3127 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3128 expected_pubkey := "testkey2.avbpubkey"
3129 actual_pubkey := apex_key.public_key_file.String()
3130 if actual_pubkey != expected_pubkey {
3131 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3132 }
3133 expected_privkey := "testkey2.pem"
3134 actual_privkey := apex_key.private_key_file.String()
3135 if actual_privkey != expected_privkey {
3136 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3137 }
3138}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003139
3140func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003141 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003142 prebuilt_apex {
3143 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003144 arch: {
3145 arm64: {
3146 src: "myapex-arm64.apex",
3147 },
3148 arm: {
3149 src: "myapex-arm.apex",
3150 },
3151 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003152 }
3153 `)
3154
3155 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3156
Jiyong Parkc95714e2019-03-29 14:23:10 +09003157 expectedInput := "myapex-arm64.apex"
3158 if prebuilt.inputApex.String() != expectedInput {
3159 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3160 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003161}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003162
3163func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003164 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003165 prebuilt_apex {
3166 name: "myapex",
3167 src: "myapex-arm.apex",
3168 filename: "notmyapex.apex",
3169 }
3170 `)
3171
3172 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3173
3174 expected := "notmyapex.apex"
3175 if p.installFilename != expected {
3176 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3177 }
3178}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003179
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003180func TestPrebuiltOverrides(t *testing.T) {
3181 ctx, config := testApex(t, `
3182 prebuilt_apex {
3183 name: "myapex.prebuilt",
3184 src: "myapex-arm.apex",
3185 overrides: [
3186 "myapex",
3187 ],
3188 }
3189 `)
3190
3191 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3192
3193 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003194 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003195 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003196 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003197 }
3198}
3199
Roland Levillain630846d2019-06-26 12:48:34 +01003200func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003201 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003202 apex_test {
3203 name: "myapex",
3204 key: "myapex.key",
3205 tests: [
3206 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003207 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003208 ],
3209 }
3210
3211 apex_key {
3212 name: "myapex.key",
3213 public_key: "testkey.avbpubkey",
3214 private_key: "testkey.pem",
3215 }
3216
3217 cc_test {
3218 name: "mytest",
3219 gtest: false,
3220 srcs: ["mytest.cpp"],
3221 relative_install_path: "test",
3222 system_shared_libs: [],
3223 static_executable: true,
3224 stl: "none",
3225 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003226
3227 cc_test {
3228 name: "mytests",
3229 gtest: false,
3230 srcs: [
3231 "mytest1.cpp",
3232 "mytest2.cpp",
3233 "mytest3.cpp",
3234 ],
3235 test_per_src: true,
3236 relative_install_path: "test",
3237 system_shared_libs: [],
3238 static_executable: true,
3239 stl: "none",
3240 }
Roland Levillain630846d2019-06-26 12:48:34 +01003241 `)
3242
Sundong Ahnabb64432019-10-22 13:58:29 +09003243 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003244 copyCmds := apexRule.Args["copy_commands"]
3245
3246 // Ensure that test dep is copied into apex.
3247 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003248
3249 // Ensure that test deps built with `test_per_src` are copied into apex.
3250 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3251 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3252 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003253
3254 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003255 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003256 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3257 name := apexBundle.BaseModuleName()
3258 prefix := "TARGET_"
3259 var builder strings.Builder
3260 data.Custom(&builder, name, prefix, "", data)
3261 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003262 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3263 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3264 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3265 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003266 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003267 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003268 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003269}
3270
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003271func TestInstallExtraFlattenedApexes(t *testing.T) {
3272 ctx, config := testApex(t, `
3273 apex {
3274 name: "myapex",
3275 key: "myapex.key",
3276 }
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282 `, func(fs map[string][]byte, config android.Config) {
3283 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3284 })
3285 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003286 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003287 mk := android.AndroidMkDataForTest(t, config, "", ab)
3288 var builder strings.Builder
3289 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3290 androidMk := builder.String()
3291 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3292}
3293
Jooyung Han5c998b92019-06-27 11:30:33 +09003294func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003295 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003296 apex {
3297 name: "myapex",
3298 key: "myapex.key",
3299 native_shared_libs: ["mylib"],
3300 uses: ["commonapex"],
3301 }
3302
3303 apex {
3304 name: "commonapex",
3305 key: "myapex.key",
3306 native_shared_libs: ["libcommon"],
3307 provide_cpp_shared_libs: true,
3308 }
3309
3310 apex_key {
3311 name: "myapex.key",
3312 public_key: "testkey.avbpubkey",
3313 private_key: "testkey.pem",
3314 }
3315
3316 cc_library {
3317 name: "mylib",
3318 srcs: ["mylib.cpp"],
3319 shared_libs: ["libcommon"],
3320 system_shared_libs: [],
3321 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003322 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003323 }
3324
3325 cc_library {
3326 name: "libcommon",
3327 srcs: ["mylib_common.cpp"],
3328 system_shared_libs: [],
3329 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003330 // TODO: remove //apex_available:platform
3331 apex_available: [
3332 "//apex_available:platform",
3333 "commonapex",
3334 "myapex",
3335 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003336 }
3337 `)
3338
Sundong Ahnabb64432019-10-22 13:58:29 +09003339 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003340 apexRule1 := module1.Rule("apexRule")
3341 copyCmds1 := apexRule1.Args["copy_commands"]
3342
Sundong Ahnabb64432019-10-22 13:58:29 +09003343 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003344 apexRule2 := module2.Rule("apexRule")
3345 copyCmds2 := apexRule2.Args["copy_commands"]
3346
Colin Cross7113d202019-11-20 16:39:12 -08003347 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3348 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003349 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3350 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3351 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3352}
3353
3354func TestApexUsesFailsIfNotProvided(t *testing.T) {
3355 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3356 apex {
3357 name: "myapex",
3358 key: "myapex.key",
3359 uses: ["commonapex"],
3360 }
3361
3362 apex {
3363 name: "commonapex",
3364 key: "myapex.key",
3365 }
3366
3367 apex_key {
3368 name: "myapex.key",
3369 public_key: "testkey.avbpubkey",
3370 private_key: "testkey.pem",
3371 }
3372 `)
3373 testApexError(t, `uses: "commonapex" is not a provider`, `
3374 apex {
3375 name: "myapex",
3376 key: "myapex.key",
3377 uses: ["commonapex"],
3378 }
3379
3380 cc_library {
3381 name: "commonapex",
3382 system_shared_libs: [],
3383 stl: "none",
3384 }
3385
3386 apex_key {
3387 name: "myapex.key",
3388 public_key: "testkey.avbpubkey",
3389 private_key: "testkey.pem",
3390 }
3391 `)
3392}
3393
3394func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3395 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3396 apex {
3397 name: "myapex",
3398 key: "myapex.key",
3399 use_vendor: true,
3400 uses: ["commonapex"],
3401 }
3402
3403 apex {
3404 name: "commonapex",
3405 key: "myapex.key",
3406 provide_cpp_shared_libs: true,
3407 }
3408
3409 apex_key {
3410 name: "myapex.key",
3411 public_key: "testkey.avbpubkey",
3412 private_key: "testkey.pem",
3413 }
Jooyung Handc782442019-11-01 03:14:38 +09003414 `, func(fs map[string][]byte, config android.Config) {
3415 setUseVendorWhitelistForTest(config, []string{"myapex"})
3416 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003417}
3418
Jooyung Hand48f3c32019-08-23 11:18:57 +09003419func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3420 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3421 apex {
3422 name: "myapex",
3423 key: "myapex.key",
3424 native_shared_libs: ["libfoo"],
3425 }
3426
3427 apex_key {
3428 name: "myapex.key",
3429 public_key: "testkey.avbpubkey",
3430 private_key: "testkey.pem",
3431 }
3432
3433 cc_library {
3434 name: "libfoo",
3435 stl: "none",
3436 system_shared_libs: [],
3437 enabled: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003438 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003439 }
3440 `)
3441 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3442 apex {
3443 name: "myapex",
3444 key: "myapex.key",
3445 java_libs: ["myjar"],
3446 }
3447
3448 apex_key {
3449 name: "myapex.key",
3450 public_key: "testkey.avbpubkey",
3451 private_key: "testkey.pem",
3452 }
3453
3454 java_library {
3455 name: "myjar",
3456 srcs: ["foo/bar/MyClass.java"],
3457 sdk_version: "none",
3458 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003459 enabled: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003460 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003461 }
3462 `)
3463}
3464
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003465func TestApexWithApps(t *testing.T) {
3466 ctx, _ := testApex(t, `
3467 apex {
3468 name: "myapex",
3469 key: "myapex.key",
3470 apps: [
3471 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003472 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003473 ],
3474 }
3475
3476 apex_key {
3477 name: "myapex.key",
3478 public_key: "testkey.avbpubkey",
3479 private_key: "testkey.pem",
3480 }
3481
3482 android_app {
3483 name: "AppFoo",
3484 srcs: ["foo/bar/MyClass.java"],
Colin Cross1c93c292020-02-15 10:38:00 -08003485 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003486 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003487 jni_libs: ["libjni"],
Colin Cross1c93c292020-02-15 10:38:00 -08003488 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003489 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003490 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003491
3492 android_app {
3493 name: "AppFooPriv",
3494 srcs: ["foo/bar/MyClass.java"],
Colin Cross1c93c292020-02-15 10:38:00 -08003495 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003496 system_modules: "none",
3497 privileged: true,
Colin Cross1c93c292020-02-15 10:38:00 -08003498 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003499 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003500 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003501
3502 cc_library_shared {
3503 name: "libjni",
3504 srcs: ["mylib.cpp"],
Jooyung Han65041792020-02-25 16:59:29 +09003505 shared_libs: ["libfoo"],
Jiyong Park8be103b2019-11-08 15:53:48 +09003506 stl: "none",
3507 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003508 apex_available: [ "myapex" ],
Jooyung Han65041792020-02-25 16:59:29 +09003509 sdk_version: "current",
3510 }
3511
3512 cc_library_shared {
3513 name: "libfoo",
3514 stl: "none",
3515 system_shared_libs: [],
3516 apex_available: [ "myapex" ],
3517 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003518 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003519 `)
3520
Sundong Ahnabb64432019-10-22 13:58:29 +09003521 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003522 apexRule := module.Rule("apexRule")
3523 copyCmds := apexRule.Args["copy_commands"]
3524
3525 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003526 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003527
Jooyung Han65041792020-02-25 16:59:29 +09003528 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3529 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003530 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Han65041792020-02-25 16:59:29 +09003531 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003532 }
Jooyung Han65041792020-02-25 16:59:29 +09003533 // JNI libraries including transitive deps are
3534 for _, jni := range []string{"libjni", "libfoo"} {
Colin Cross01fd7cc2020-02-19 16:54:04 -08003535 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Han65041792020-02-25 16:59:29 +09003536 // ... embedded inside APK (jnilibs.zip)
3537 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3538 // ... and not directly inside the APEX
3539 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3540 }
Dario Frenicde2a032019-10-27 00:29:22 +01003541}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003542
Dario Frenicde2a032019-10-27 00:29:22 +01003543func TestApexWithAppImports(t *testing.T) {
3544 ctx, _ := testApex(t, `
3545 apex {
3546 name: "myapex",
3547 key: "myapex.key",
3548 apps: [
3549 "AppFooPrebuilt",
3550 "AppFooPrivPrebuilt",
3551 ],
3552 }
3553
3554 apex_key {
3555 name: "myapex.key",
3556 public_key: "testkey.avbpubkey",
3557 private_key: "testkey.pem",
3558 }
3559
3560 android_app_import {
3561 name: "AppFooPrebuilt",
3562 apk: "PrebuiltAppFoo.apk",
3563 presigned: true,
3564 dex_preopt: {
3565 enabled: false,
3566 },
3567 }
3568
3569 android_app_import {
3570 name: "AppFooPrivPrebuilt",
3571 apk: "PrebuiltAppFooPriv.apk",
3572 privileged: true,
3573 presigned: true,
3574 dex_preopt: {
3575 enabled: false,
3576 },
Jooyung Han65cd0f02020-03-23 20:21:11 +09003577 filename: "AwesomePrebuiltAppFooPriv.apk",
Dario Frenicde2a032019-10-27 00:29:22 +01003578 }
3579 `)
3580
Sundong Ahnabb64432019-10-22 13:58:29 +09003581 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003582 apexRule := module.Rule("apexRule")
3583 copyCmds := apexRule.Args["copy_commands"]
3584
3585 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han65cd0f02020-03-23 20:21:11 +09003586 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3587}
3588
3589func TestApexWithAppImportsPrefer(t *testing.T) {
3590 ctx, _ := testApex(t, `
3591 apex {
3592 name: "myapex",
3593 key: "myapex.key",
3594 apps: [
3595 "AppFoo",
3596 ],
3597 }
3598
3599 apex_key {
3600 name: "myapex.key",
3601 public_key: "testkey.avbpubkey",
3602 private_key: "testkey.pem",
3603 }
3604
3605 android_app {
3606 name: "AppFoo",
3607 srcs: ["foo/bar/MyClass.java"],
3608 sdk_version: "none",
3609 system_modules: "none",
3610 apex_available: [ "myapex" ],
3611 }
3612
3613 android_app_import {
3614 name: "AppFoo",
3615 apk: "AppFooPrebuilt.apk",
3616 filename: "AppFooPrebuilt.apk",
3617 presigned: true,
3618 prefer: true,
3619 }
3620 `, withFiles(map[string][]byte{
3621 "AppFooPrebuilt.apk": nil,
3622 }))
3623
3624 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3625 "app/AppFoo/AppFooPrebuilt.apk",
3626 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003627}
3628
Dario Freni6f3937c2019-12-20 22:58:03 +00003629func TestApexWithTestHelperApp(t *testing.T) {
3630 ctx, _ := testApex(t, `
3631 apex {
3632 name: "myapex",
3633 key: "myapex.key",
3634 apps: [
3635 "TesterHelpAppFoo",
3636 ],
3637 }
3638
3639 apex_key {
3640 name: "myapex.key",
3641 public_key: "testkey.avbpubkey",
3642 private_key: "testkey.pem",
3643 }
3644
3645 android_test_helper_app {
3646 name: "TesterHelpAppFoo",
3647 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003648 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003649 }
3650
3651 `)
3652
3653 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3654 apexRule := module.Rule("apexRule")
3655 copyCmds := apexRule.Args["copy_commands"]
3656
3657 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3658}
3659
Jooyung Han18020ea2019-11-13 10:50:48 +09003660func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3661 // libfoo's apex_available comes from cc_defaults
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003662 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003663 apex {
3664 name: "myapex",
3665 key: "myapex.key",
3666 native_shared_libs: ["libfoo"],
3667 }
3668
3669 apex_key {
3670 name: "myapex.key",
3671 public_key: "testkey.avbpubkey",
3672 private_key: "testkey.pem",
3673 }
3674
3675 apex {
3676 name: "otherapex",
3677 key: "myapex.key",
3678 native_shared_libs: ["libfoo"],
3679 }
3680
3681 cc_defaults {
3682 name: "libfoo-defaults",
3683 apex_available: ["otherapex"],
3684 }
3685
3686 cc_library {
3687 name: "libfoo",
3688 defaults: ["libfoo-defaults"],
3689 stl: "none",
3690 system_shared_libs: [],
3691 }`)
3692}
3693
Paul Duffinde7464c2020-03-30 17:54:29 +01003694func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003695 // libfoo is not available to myapex, but only to otherapex
3696 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3697 apex {
3698 name: "myapex",
3699 key: "myapex.key",
3700 native_shared_libs: ["libfoo"],
3701 }
3702
3703 apex_key {
3704 name: "myapex.key",
3705 public_key: "testkey.avbpubkey",
3706 private_key: "testkey.pem",
3707 }
3708
3709 apex {
3710 name: "otherapex",
3711 key: "otherapex.key",
3712 native_shared_libs: ["libfoo"],
3713 }
3714
3715 apex_key {
3716 name: "otherapex.key",
3717 public_key: "testkey.avbpubkey",
3718 private_key: "testkey.pem",
3719 }
3720
3721 cc_library {
3722 name: "libfoo",
3723 stl: "none",
3724 system_shared_libs: [],
3725 apex_available: ["otherapex"],
3726 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003727}
Jiyong Park127b40b2019-09-30 16:04:35 +09003728
Paul Duffinde7464c2020-03-30 17:54:29 +01003729func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003730 // libbbaz is an indirect dep
Paul Duffin868ecfd2020-03-30 17:58:21 +01003731 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinf0207962020-03-31 11:31:36 +01003732.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffin868ecfd2020-03-30 17:58:21 +01003733.*-> libfoo.*link:shared.*
Paul Duffinb20ad0a2020-03-31 15:23:40 +01003734.*via tag cc\.DependencyTag.*"shared".*
Paul Duffin868ecfd2020-03-30 17:58:21 +01003735.*-> libbar.*link:shared.*
Paul Duffinb20ad0a2020-03-31 15:23:40 +01003736.*via tag cc\.DependencyTag.*"shared".*
3737.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003738 apex {
3739 name: "myapex",
3740 key: "myapex.key",
3741 native_shared_libs: ["libfoo"],
3742 }
3743
3744 apex_key {
3745 name: "myapex.key",
3746 public_key: "testkey.avbpubkey",
3747 private_key: "testkey.pem",
3748 }
3749
Jiyong Park127b40b2019-09-30 16:04:35 +09003750 cc_library {
3751 name: "libfoo",
3752 stl: "none",
3753 shared_libs: ["libbar"],
3754 system_shared_libs: [],
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003755 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003756 }
3757
3758 cc_library {
3759 name: "libbar",
3760 stl: "none",
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003761 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003762 system_shared_libs: [],
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09003763 apex_available: ["myapex"],
3764 }
3765
3766 cc_library {
3767 name: "libbaz",
3768 stl: "none",
3769 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003770 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003771}
Jiyong Park127b40b2019-09-30 16:04:35 +09003772
Paul Duffinde7464c2020-03-30 17:54:29 +01003773func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003774 testApexError(t, "\"otherapex\" is not a valid module name", `
3775 apex {
3776 name: "myapex",
3777 key: "myapex.key",
3778 native_shared_libs: ["libfoo"],
3779 }
3780
3781 apex_key {
3782 name: "myapex.key",
3783 public_key: "testkey.avbpubkey",
3784 private_key: "testkey.pem",
3785 }
3786
3787 cc_library {
3788 name: "libfoo",
3789 stl: "none",
3790 system_shared_libs: [],
3791 apex_available: ["otherapex"],
3792 }`)
3793
Paul Duffinde7464c2020-03-30 17:54:29 +01003794 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003795 apex {
3796 name: "myapex",
3797 key: "myapex.key",
3798 native_shared_libs: ["libfoo", "libbar"],
3799 }
3800
3801 apex_key {
3802 name: "myapex.key",
3803 public_key: "testkey.avbpubkey",
3804 private_key: "testkey.pem",
3805 }
3806
3807 cc_library {
3808 name: "libfoo",
3809 stl: "none",
3810 system_shared_libs: [],
Jiyong Park9f14b9b2020-03-01 17:29:06 +09003811 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003812 apex_available: ["myapex"],
3813 }
3814
3815 cc_library {
3816 name: "libbar",
3817 stl: "none",
3818 system_shared_libs: [],
3819 apex_available: ["//apex_available:anyapex"],
Jiyong Park9f14b9b2020-03-01 17:29:06 +09003820 }
3821
3822 cc_library {
3823 name: "libbaz",
3824 stl: "none",
3825 system_shared_libs: [],
3826 stubs: {
3827 versions: ["10", "20", "30"],
3828 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003829 }`)
Paul Duffinde7464c2020-03-30 17:54:29 +01003830}
Jiyong Park127b40b2019-09-30 16:04:35 +09003831
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003832func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffinde7464c2020-03-30 17:54:29 +01003833 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003834 apex {
3835 name: "myapex",
3836 key: "myapex.key",
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003837 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003838 }
3839
3840 apex_key {
3841 name: "myapex.key",
3842 public_key: "testkey.avbpubkey",
3843 private_key: "testkey.pem",
3844 }
3845
3846 cc_library {
3847 name: "libfoo",
3848 stl: "none",
3849 system_shared_libs: [],
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003850 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003851 apex_available: ["//apex_available:platform"],
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003852 }
3853
3854 cc_library {
3855 name: "libfoo2",
3856 stl: "none",
3857 system_shared_libs: [],
3858 shared_libs: ["libbaz"],
3859 apex_available: ["//apex_available:platform"],
3860 }
3861
3862 cc_library {
3863 name: "libbar",
3864 stl: "none",
3865 system_shared_libs: [],
3866 apex_available: ["myapex"],
3867 }
3868
3869 cc_library {
3870 name: "libbaz",
3871 stl: "none",
3872 system_shared_libs: [],
3873 apex_available: ["myapex"],
3874 stubs: {
3875 versions: ["1"],
3876 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003877 }`)
3878
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003879 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
3880 // because it depends on libbar which isn't available to platform
3881 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3882 if libfoo.NotAvailableForPlatform() != true {
3883 t.Errorf("%q shouldn't be available to platform", libfoo.String())
3884 }
3885
3886 // libfoo2 however can be available to platform because it depends on libbaz which provides
3887 // stubs
3888 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3889 if libfoo2.NotAvailableForPlatform() == true {
3890 t.Errorf("%q should be available to platform", libfoo2.String())
3891 }
Paul Duffinde7464c2020-03-30 17:54:29 +01003892}
Jiyong Parka90ca002019-10-07 15:47:24 +09003893
Paul Duffinde7464c2020-03-30 17:54:29 +01003894func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003895 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09003896 apex {
3897 name: "myapex",
3898 key: "myapex.key",
3899 native_shared_libs: ["libfoo"],
3900 }
3901
3902 apex_key {
3903 name: "myapex.key",
3904 public_key: "testkey.avbpubkey",
3905 private_key: "testkey.pem",
3906 }
3907
3908 cc_library {
3909 name: "libfoo",
3910 stl: "none",
3911 system_shared_libs: [],
3912 apex_available: ["myapex"],
3913 static: {
3914 apex_available: ["//apex_available:platform"],
3915 },
3916 }`)
3917
Jiyong Park6a9ddc32020-04-07 16:37:39 +09003918 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3919 if libfooShared.NotAvailableForPlatform() != true {
3920 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
3921 }
3922 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
3923 if libfooStatic.NotAvailableForPlatform() != false {
3924 t.Errorf("%q should be available to platform", libfooStatic.String())
3925 }
Jiyong Park127b40b2019-09-30 16:04:35 +09003926}
3927
Jiyong Park5d790c32019-11-15 18:40:32 +09003928func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003929 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09003930 apex {
3931 name: "myapex",
3932 key: "myapex.key",
3933 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003934 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09003935 }
3936
3937 override_apex {
3938 name: "override_myapex",
3939 base: "myapex",
3940 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003941 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08003942 logging_parent: "com.foo.bar",
Baligh Uddincb6aa122020-03-15 13:01:05 -07003943 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09003944 }
3945
3946 apex_key {
3947 name: "myapex.key",
3948 public_key: "testkey.avbpubkey",
3949 private_key: "testkey.pem",
3950 }
3951
3952 android_app {
3953 name: "app",
3954 srcs: ["foo/bar/MyClass.java"],
3955 package_name: "foo",
3956 sdk_version: "none",
3957 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003958 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09003959 }
3960
3961 override_android_app {
3962 name: "override_app",
3963 base: "app",
3964 package_name: "bar",
3965 }
Jiyong Parka519c542020-03-03 11:45:41 +09003966 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09003967
Jiyong Park317645e2019-12-05 13:20:58 +09003968 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
3969 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
3970 if originalVariant.GetOverriddenBy() != "" {
3971 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
3972 }
3973 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
3974 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
3975 }
3976
Jiyong Park5d790c32019-11-15 18:40:32 +09003977 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
3978 apexRule := module.Rule("apexRule")
3979 copyCmds := apexRule.Args["copy_commands"]
3980
3981 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han65cd0f02020-03-23 20:21:11 +09003982 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003983
3984 apexBundle := module.Module().(*apexBundle)
3985 name := apexBundle.Name()
3986 if name != "override_myapex" {
3987 t.Errorf("name should be \"override_myapex\", but was %q", name)
3988 }
3989
Baligh Uddin004d7172020-02-19 21:29:28 -08003990 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
3991 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
3992 }
3993
Jiyong Parka519c542020-03-03 11:45:41 +09003994 optFlags := apexRule.Args["opt_flags"]
Baligh Uddincb6aa122020-03-15 13:01:05 -07003995 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Parka519c542020-03-03 11:45:41 +09003996
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003997 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3998 var builder strings.Builder
3999 data.Custom(&builder, name, "TARGET_", "", data)
4000 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004001 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004002 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4003 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004004 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004005 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004006 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004007 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4008 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004009}
4010
Jooyung Han214bf372019-11-12 13:03:50 +09004011func TestLegacyAndroid10Support(t *testing.T) {
4012 ctx, _ := testApex(t, `
4013 apex {
4014 name: "myapex",
4015 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004016 native_shared_libs: ["mylib"],
Jooyung Han23b0adf2020-03-12 18:37:20 +09004017 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004018 }
4019
4020 apex_key {
4021 name: "myapex.key",
4022 public_key: "testkey.avbpubkey",
4023 private_key: "testkey.pem",
4024 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004025
4026 cc_library {
4027 name: "mylib",
4028 srcs: ["mylib.cpp"],
4029 stl: "libc++",
4030 system_shared_libs: [],
4031 apex_available: [ "myapex" ],
4032 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004033 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004034
4035 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4036 args := module.Rule("apexRule").Args
4037 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004038 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004039
4040 // The copies of the libraries in the apex should have one more dependency than
4041 // the ones outside the apex, namely the unwinder. Ideally we should check
4042 // the dependency names directly here but for some reason the names are blank in
4043 // this test.
4044 for _, lib := range []string{"libc++", "mylib"} {
4045 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4046 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4047 if len(apexImplicits) != len(nonApexImplicits)+1 {
4048 t.Errorf("%q missing unwinder dep", lib)
4049 }
4050 }
Jooyung Han214bf372019-11-12 13:03:50 +09004051}
4052
Paul Duffinbf19a972020-05-26 13:21:35 +01004053var filesForSdkLibrary = map[string][]byte{
4054 "api/current.txt": nil,
4055 "api/removed.txt": nil,
4056 "api/system-current.txt": nil,
4057 "api/system-removed.txt": nil,
4058 "api/test-current.txt": nil,
4059 "api/test-removed.txt": nil,
4060}
4061
Jooyung Han58f26ab2019-12-18 15:34:32 +09004062func TestJavaSDKLibrary(t *testing.T) {
4063 ctx, _ := testApex(t, `
4064 apex {
4065 name: "myapex",
4066 key: "myapex.key",
4067 java_libs: ["foo"],
4068 }
4069
4070 apex_key {
4071 name: "myapex.key",
4072 public_key: "testkey.avbpubkey",
4073 private_key: "testkey.pem",
4074 }
4075
4076 java_sdk_library {
4077 name: "foo",
4078 srcs: ["a.java"],
4079 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004080 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004081 }
Paul Duffinbf19a972020-05-26 13:21:35 +01004082 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004083
4084 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004085 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004086 "javalib/foo.jar",
4087 "etc/permissions/foo.xml",
4088 })
4089 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004090 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4091 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004092}
4093
Paul Duffinbf19a972020-05-26 13:21:35 +01004094func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4095 ctx, _ := testApex(t, `
4096 apex {
4097 name: "myapex",
4098 key: "myapex.key",
4099 java_libs: ["foo", "bar"],
4100 }
4101
4102 apex_key {
4103 name: "myapex.key",
4104 public_key: "testkey.avbpubkey",
4105 private_key: "testkey.pem",
4106 }
4107
4108 java_sdk_library {
4109 name: "foo",
4110 srcs: ["a.java"],
4111 api_packages: ["foo"],
4112 apex_available: ["myapex"],
4113 sdk_version: "none",
4114 system_modules: "none",
4115 }
4116
4117 java_library {
4118 name: "bar",
4119 srcs: ["a.java"],
4120 libs: ["foo"],
4121 apex_available: ["myapex"],
4122 sdk_version: "none",
4123 system_modules: "none",
4124 }
4125 `, withFiles(filesForSdkLibrary))
4126
4127 // java_sdk_library installs both impl jar and permission XML
4128 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4129 "javalib/bar.jar",
4130 "javalib/foo.jar",
4131 "etc/permissions/foo.xml",
4132 })
4133
4134 // The bar library should depend on the implementation jar.
4135 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4136 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4137 t.Errorf("expected %q, found %#q", expected, actual)
4138 }
4139}
4140
4141func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4142 ctx, _ := testApex(t, `
4143 apex {
4144 name: "myapex",
4145 key: "myapex.key",
4146 java_libs: ["foo"],
4147 }
4148
4149 apex_key {
4150 name: "myapex.key",
4151 public_key: "testkey.avbpubkey",
4152 private_key: "testkey.pem",
4153 }
4154
4155 java_sdk_library {
4156 name: "foo",
4157 srcs: ["a.java"],
4158 api_packages: ["foo"],
4159 apex_available: ["myapex"],
4160 sdk_version: "none",
4161 system_modules: "none",
4162 }
4163
4164 java_library {
4165 name: "bar",
4166 srcs: ["a.java"],
4167 libs: ["foo"],
4168 sdk_version: "none",
4169 system_modules: "none",
4170 }
4171 `, withFiles(filesForSdkLibrary))
4172
4173 // java_sdk_library installs both impl jar and permission XML
4174 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4175 "javalib/foo.jar",
4176 "etc/permissions/foo.xml",
4177 })
4178
4179 // The bar library should depend on the stubs jar.
4180 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4181 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4182 t.Errorf("expected %q, found %#q", expected, actual)
4183 }
4184}
4185
atrost6e126252020-01-27 17:01:16 +00004186func TestCompatConfig(t *testing.T) {
4187 ctx, _ := testApex(t, `
4188 apex {
4189 name: "myapex",
4190 key: "myapex.key",
4191 prebuilts: ["myjar-platform-compat-config"],
4192 java_libs: ["myjar"],
4193 }
4194
4195 apex_key {
4196 name: "myapex.key",
4197 public_key: "testkey.avbpubkey",
4198 private_key: "testkey.pem",
4199 }
4200
4201 platform_compat_config {
4202 name: "myjar-platform-compat-config",
4203 src: ":myjar",
4204 }
4205
4206 java_library {
4207 name: "myjar",
4208 srcs: ["foo/bar/MyClass.java"],
4209 sdk_version: "none",
4210 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004211 apex_available: [ "myapex" ],
4212 }
4213 `)
4214 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4215 "etc/compatconfig/myjar-platform-compat-config.xml",
4216 "javalib/myjar.jar",
4217 })
4218}
4219
Jiyong Park479321d2019-12-16 11:47:12 +09004220func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4221 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4222 apex {
4223 name: "myapex",
4224 key: "myapex.key",
4225 java_libs: ["myjar"],
4226 }
4227
4228 apex_key {
4229 name: "myapex.key",
4230 public_key: "testkey.avbpubkey",
4231 private_key: "testkey.pem",
4232 }
4233
4234 java_library {
4235 name: "myjar",
4236 srcs: ["foo/bar/MyClass.java"],
4237 sdk_version: "none",
4238 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004239 compile_dex: false,
Jooyung Hanb8fa86a2020-03-10 06:23:13 +09004240 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004241 }
4242 `)
4243}
4244
Jiyong Park7afd1072019-12-30 16:56:33 +09004245func TestCarryRequiredModuleNames(t *testing.T) {
4246 ctx, config := testApex(t, `
4247 apex {
4248 name: "myapex",
4249 key: "myapex.key",
4250 native_shared_libs: ["mylib"],
4251 }
4252
4253 apex_key {
4254 name: "myapex.key",
4255 public_key: "testkey.avbpubkey",
4256 private_key: "testkey.pem",
4257 }
4258
4259 cc_library {
4260 name: "mylib",
4261 srcs: ["mylib.cpp"],
4262 system_shared_libs: [],
4263 stl: "none",
4264 required: ["a", "b"],
4265 host_required: ["c", "d"],
4266 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004267 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004268 }
4269 `)
4270
4271 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4272 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4273 name := apexBundle.BaseModuleName()
4274 prefix := "TARGET_"
4275 var builder strings.Builder
4276 data.Custom(&builder, name, prefix, "", data)
4277 androidMk := builder.String()
4278 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4279 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4280 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4281}
4282
Jiyong Park7cd10e32020-01-14 09:22:18 +09004283func TestSymlinksFromApexToSystem(t *testing.T) {
4284 bp := `
4285 apex {
4286 name: "myapex",
4287 key: "myapex.key",
4288 native_shared_libs: ["mylib"],
4289 java_libs: ["myjar"],
4290 }
4291
Jiyong Park9d677202020-02-19 16:29:35 +09004292 apex {
4293 name: "myapex.updatable",
4294 key: "myapex.key",
4295 native_shared_libs: ["mylib"],
4296 java_libs: ["myjar"],
4297 updatable: true,
Jooyung Hanced674e2020-04-27 12:10:30 +09004298 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004299 }
4300
Jiyong Park7cd10e32020-01-14 09:22:18 +09004301 apex_key {
4302 name: "myapex.key",
4303 public_key: "testkey.avbpubkey",
4304 private_key: "testkey.pem",
4305 }
4306
4307 cc_library {
4308 name: "mylib",
4309 srcs: ["mylib.cpp"],
4310 shared_libs: ["myotherlib"],
4311 system_shared_libs: [],
4312 stl: "none",
4313 apex_available: [
4314 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004315 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004316 "//apex_available:platform",
4317 ],
4318 }
4319
4320 cc_library {
4321 name: "myotherlib",
4322 srcs: ["mylib.cpp"],
4323 system_shared_libs: [],
4324 stl: "none",
4325 apex_available: [
4326 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004327 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004328 "//apex_available:platform",
4329 ],
4330 }
4331
4332 java_library {
4333 name: "myjar",
4334 srcs: ["foo/bar/MyClass.java"],
4335 sdk_version: "none",
4336 system_modules: "none",
4337 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004338 apex_available: [
4339 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004340 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004341 "//apex_available:platform",
4342 ],
4343 }
4344
4345 java_library {
4346 name: "myotherjar",
4347 srcs: ["foo/bar/MyClass.java"],
4348 sdk_version: "none",
4349 system_modules: "none",
4350 apex_available: [
4351 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004352 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004353 "//apex_available:platform",
4354 ],
4355 }
4356 `
4357
4358 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4359 for _, f := range files {
4360 if f.path == file {
4361 if f.isLink {
4362 t.Errorf("%q is not a real file", file)
4363 }
4364 return
4365 }
4366 }
4367 t.Errorf("%q is not found", file)
4368 }
4369
4370 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4371 for _, f := range files {
4372 if f.path == file {
4373 if !f.isLink {
4374 t.Errorf("%q is not a symlink", file)
4375 }
4376 return
4377 }
4378 }
4379 t.Errorf("%q is not found", file)
4380 }
4381
Jiyong Park9d677202020-02-19 16:29:35 +09004382 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4383 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004384 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004385 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004386 ensureRealfileExists(t, files, "javalib/myjar.jar")
4387 ensureRealfileExists(t, files, "lib64/mylib.so")
4388 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4389
Jiyong Park9d677202020-02-19 16:29:35 +09004390 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4391 ensureRealfileExists(t, files, "javalib/myjar.jar")
4392 ensureRealfileExists(t, files, "lib64/mylib.so")
4393 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4394
4395 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004396 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004397 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004398 ensureRealfileExists(t, files, "javalib/myjar.jar")
4399 ensureRealfileExists(t, files, "lib64/mylib.so")
4400 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004401
4402 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4403 ensureRealfileExists(t, files, "javalib/myjar.jar")
4404 ensureRealfileExists(t, files, "lib64/mylib.so")
4405 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004406}
4407
Jooyung Han40b286c2020-04-17 13:43:10 +09004408func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4409 ctx, _ := testApex(t, `
4410 apex {
4411 name: "myapex",
4412 key: "myapex.key",
4413 }
4414 apex_key {
4415 name: "myapex.key",
4416 public_key: "testkey.avbpubkey",
4417 private_key: "testkey.pem",
4418 }
4419 `, func(fs map[string][]byte, config android.Config) {
4420 delete(config.Targets, android.Android)
4421 config.AndroidCommonTarget = android.Target{}
4422 })
4423
4424 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4425 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4426 }
4427}
4428
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004429func TestAppBundle(t *testing.T) {
4430 ctx, _ := testApex(t, `
4431 apex {
4432 name: "myapex",
4433 key: "myapex.key",
4434 apps: ["AppFoo"],
4435 }
4436
4437 apex_key {
4438 name: "myapex.key",
4439 public_key: "testkey.avbpubkey",
4440 private_key: "testkey.pem",
4441 }
4442
4443 android_app {
4444 name: "AppFoo",
4445 srcs: ["foo/bar/MyClass.java"],
4446 sdk_version: "none",
4447 system_modules: "none",
4448 apex_available: [ "myapex" ],
4449 }
Jiyong Parkaf8998c2020-02-28 16:51:07 +09004450 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkd93e1b12020-02-28 15:22:21 +09004451
4452 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4453 content := bundleConfigRule.Args["content"]
4454
4455 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkaf8998c2020-02-28 16:51:07 +09004456 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 +09004457}
4458
Sasha Smundakc4f0ff12020-05-27 16:36:07 -07004459func TestAppSetBundle(t *testing.T) {
4460 ctx, _ := testApex(t, `
4461 apex {
4462 name: "myapex",
4463 key: "myapex.key",
4464 apps: ["AppSet"],
4465 }
4466
4467 apex_key {
4468 name: "myapex.key",
4469 public_key: "testkey.avbpubkey",
4470 private_key: "testkey.pem",
4471 }
4472
4473 android_app_set {
4474 name: "AppSet",
4475 set: "AppSet.apks",
4476 }`)
4477 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4478 bundleConfigRule := mod.Description("Bundle Config")
4479 content := bundleConfigRule.Args["content"]
4480 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
4481 s := mod.Rule("apexRule").Args["copy_commands"]
4482 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
4483 if len(copyCmds) != 3 {
4484 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
4485 }
4486 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
4487 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
4488 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
4489}
4490
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004491func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4492 t.Helper()
4493
4494 bp = bp + `
4495 filegroup {
4496 name: "some-updatable-apex-file_contexts",
4497 srcs: [
4498 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4499 ],
4500 }
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004501
4502 filegroup {
4503 name: "some-non-updatable-apex-file_contexts",
4504 srcs: [
4505 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4506 ],
4507 }
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004508 `
4509 bp += cc.GatherRequiredDepsForTest(android.Android)
4510 bp += java.GatherRequiredDepsForTest()
4511 bp += dexpreopt.BpToolModulesForTest()
4512
4513 fs := map[string][]byte{
4514 "a.java": nil,
4515 "a.jar": nil,
4516 "build/make/target/product/security": nil,
4517 "apex_manifest.json": nil,
4518 "AndroidManifest.xml": nil,
4519 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004520 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004521 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4522 "framework/aidl/a.aidl": nil,
4523 }
4524 cc.GatherRequiredFilesForTest(fs)
4525
4526 ctx := android.NewTestArchContext()
4527 ctx.RegisterModuleType("apex", BundleFactory)
4528 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4529 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffineedf3f12020-04-29 18:27:14 +01004530 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004531 cc.RegisterRequiredBuildComponentsForTest(ctx)
4532 java.RegisterJavaBuildComponents(ctx)
4533 java.RegisterSystemModulesBuildComponents(ctx)
4534 java.RegisterAppBuildComponents(ctx)
4535 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004536 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4537 ctx.PreDepsMutators(RegisterPreDepsMutators)
4538 ctx.PostDepsMutators(RegisterPostDepsMutators)
4539
4540 config := android.TestArchConfig(buildDir, nil, bp, fs)
4541 ctx.Register(config)
4542
4543 _ = dexpreopt.GlobalSoongConfigForTests(config)
4544 dexpreopt.RegisterToolModulesForTest(ctx)
4545 pathCtx := android.PathContextForTesting(config)
4546 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4547 transformDexpreoptConfig(dexpreoptConfig)
4548 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4549
4550 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4551 android.FailIfErrored(t, errs)
4552
4553 _, errs = ctx.PrepareBuildActions(config)
4554 if errmsg == "" {
4555 android.FailIfErrored(t, errs)
4556 } else if len(errs) > 0 {
4557 android.FailIfNoMatchingErrors(t, errmsg, errs)
4558 return
4559 } else {
4560 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4561 }
4562}
4563
Jooyung Hanced674e2020-04-27 12:10:30 +09004564func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4565 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4566 apex {
4567 name: "myapex",
4568 key: "myapex.key",
4569 updatable: true,
4570 }
4571
4572 apex_key {
4573 name: "myapex.key",
4574 public_key: "testkey.avbpubkey",
4575 private_key: "testkey.pem",
4576 }
4577 `)
4578}
4579
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004580func TestNoUpdatableJarsInBootImage(t *testing.T) {
4581 bp := `
4582 java_library {
4583 name: "some-updatable-apex-lib",
4584 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004585 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004586 apex_available: [
4587 "some-updatable-apex",
4588 ],
4589 }
4590
4591 java_library {
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004592 name: "some-non-updatable-apex-lib",
4593 srcs: ["a.java"],
4594 apex_available: [
4595 "some-non-updatable-apex",
4596 ],
4597 }
4598
4599 java_library {
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004600 name: "some-platform-lib",
4601 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004602 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004603 installable: true,
4604 }
4605
4606 java_library {
4607 name: "some-art-lib",
4608 srcs: ["a.java"],
Artur Satayev2eedf622020-04-15 17:29:42 +01004609 sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004610 apex_available: [
4611 "com.android.art.something",
4612 ],
4613 hostdex: true,
4614 }
4615
4616 apex {
4617 name: "some-updatable-apex",
4618 key: "some-updatable-apex.key",
4619 java_libs: ["some-updatable-apex-lib"],
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004620 updatable: true,
4621 min_sdk_version: "current",
4622 }
4623
4624 apex {
4625 name: "some-non-updatable-apex",
4626 key: "some-non-updatable-apex.key",
4627 java_libs: ["some-non-updatable-apex-lib"],
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004628 }
4629
4630 apex_key {
4631 name: "some-updatable-apex.key",
4632 }
4633
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004634 apex_key {
4635 name: "some-non-updatable-apex.key",
4636 }
4637
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004638 apex {
4639 name: "com.android.art.something",
4640 key: "com.android.art.something.key",
4641 java_libs: ["some-art-lib"],
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004642 updatable: true,
4643 min_sdk_version: "current",
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004644 }
4645
4646 apex_key {
4647 name: "com.android.art.something.key",
4648 }
4649 `
4650
4651 var error string
4652 var transform func(*dexpreopt.GlobalConfig)
4653
4654 // updatable jar from ART apex in the ART boot image => ok
4655 transform = func(config *dexpreopt.GlobalConfig) {
4656 config.ArtApexJars = []string{"some-art-lib"}
4657 }
4658 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4659
4660 // updatable jar from ART apex in the framework boot image => error
4661 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4662 transform = func(config *dexpreopt.GlobalConfig) {
4663 config.BootJars = []string{"some-art-lib"}
4664 }
4665 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4666
4667 // updatable jar from some other apex in the ART boot image => error
4668 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4669 transform = func(config *dexpreopt.GlobalConfig) {
4670 config.ArtApexJars = []string{"some-updatable-apex-lib"}
4671 }
4672 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4673
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004674 // non-updatable jar from some other apex in the ART boot image => error
4675 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4676 transform = func(config *dexpreopt.GlobalConfig) {
4677 config.ArtApexJars = []string{"some-non-updatable-apex-lib"}
4678 }
4679 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4680
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004681 // updatable jar from some other apex in the framework boot image => error
4682 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4683 transform = func(config *dexpreopt.GlobalConfig) {
4684 config.BootJars = []string{"some-updatable-apex-lib"}
4685 }
4686 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4687
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004688 // non-updatable jar from some other apex in the framework boot image => ok
4689 transform = func(config *dexpreopt.GlobalConfig) {
4690 config.BootJars = []string{"some-non-updatable-apex-lib"}
4691 }
4692 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4693
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004694 // nonexistent jar in the ART boot image => error
4695 error = "failed to find a dex jar path for module 'nonexistent'"
4696 transform = func(config *dexpreopt.GlobalConfig) {
4697 config.ArtApexJars = []string{"nonexistent"}
4698 }
4699 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4700
4701 // nonexistent jar in the framework boot image => error
4702 error = "failed to find a dex jar path for module 'nonexistent'"
4703 transform = func(config *dexpreopt.GlobalConfig) {
4704 config.BootJars = []string{"nonexistent"}
4705 }
4706 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4707
4708 // platform jar in the ART boot image => error
Ulya Trafimovichc0eb0b12020-04-22 18:05:58 +01004709 error = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovichcc21bba2020-01-13 15:18:16 +00004710 transform = func(config *dexpreopt.GlobalConfig) {
4711 config.ArtApexJars = []string{"some-platform-lib"}
4712 }
4713 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4714
4715 // platform jar in the framework boot image => ok
4716 transform = func(config *dexpreopt.GlobalConfig) {
4717 config.BootJars = []string{"some-platform-lib"}
4718 }
4719 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4720}
4721
Jiyong Parkf0d01b72020-04-13 16:19:48 +09004722func TestTestFor(t *testing.T) {
4723 ctx, _ := testApex(t, `
4724 apex {
4725 name: "myapex",
4726 key: "myapex.key",
4727 native_shared_libs: ["mylib", "myprivlib"],
4728 }
4729
4730 apex_key {
4731 name: "myapex.key",
4732 public_key: "testkey.avbpubkey",
4733 private_key: "testkey.pem",
4734 }
4735
4736 cc_library {
4737 name: "mylib",
4738 srcs: ["mylib.cpp"],
4739 system_shared_libs: [],
4740 stl: "none",
4741 stubs: {
4742 versions: ["1"],
4743 },
4744 apex_available: ["myapex"],
4745 }
4746
4747 cc_library {
4748 name: "myprivlib",
4749 srcs: ["mylib.cpp"],
4750 system_shared_libs: [],
4751 stl: "none",
4752 apex_available: ["myapex"],
4753 }
4754
4755
4756 cc_test {
4757 name: "mytest",
4758 gtest: false,
4759 srcs: ["mylib.cpp"],
4760 system_shared_libs: [],
4761 stl: "none",
4762 shared_libs: ["mylib", "myprivlib"],
4763 test_for: ["myapex"]
4764 }
4765 `)
4766
4767 // the test 'mytest' is a test for the apex, therefore is linked to the
4768 // actual implementation of mylib instead of its stub.
4769 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4770 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4771 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4772}
4773
Jaewoong Jung8cf307e2020-05-14 14:15:24 -07004774// TODO(jungjw): Move this to proptools
4775func intPtr(i int) *int {
4776 return &i
4777}
4778
4779func TestApexSet(t *testing.T) {
4780 ctx, config := testApex(t, `
4781 apex_set {
4782 name: "myapex",
4783 set: "myapex.apks",
4784 filename: "foo_v2.apex",
4785 overrides: ["foo"],
4786 }
4787 `, func(fs map[string][]byte, config android.Config) {
4788 config.TestProductVariables.Platform_sdk_version = intPtr(30)
4789 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
4790 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
4791 })
4792
4793 m := ctx.ModuleForTests("myapex", "android_common")
4794
4795 // Check extract_apks tool parameters.
4796 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
4797 actual := extractedApex.Args["abis"]
4798 expected := "ARMEABI_V7A,ARM64_V8A"
4799 if actual != expected {
4800 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
4801 }
4802 actual = extractedApex.Args["sdk-version"]
4803 expected = "30"
4804 if actual != expected {
4805 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
4806 }
4807
4808 a := m.Module().(*ApexSet)
4809 expectedOverrides := []string{"foo"}
4810 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
4811 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
4812 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
4813 }
4814}
4815
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004816func TestMain(m *testing.M) {
4817 run := func() int {
4818 setUp()
4819 defer tearDown()
4820
4821 return m.Run()
4822 }
4823
4824 os.Exit(run())
4825}