blob: d5eb45761ba3eed32baa0efd66e6300517d49112 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070032 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090033 "android/soong/java"
Jaewoong Jung4b79e982020-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...)
Paul Duffineedc5d52020-06-12 17:46:39 +010069 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090070 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
Jooyung Han35155c42020-02-06 17:33:20 +090094// withNativeBridgeTargets sets configuration with targets including:
95// - X86_64 (primary)
96// - X86 (secondary)
97// - Arm64 on X86_64 (native bridge)
98// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -070099func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110}
111
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900112func withManifestPackageNameOverrides(specs []string) testCustomizer {
113 return func(fs map[string][]byte, config android.Config) {
114 config.TestProductVariables.ManifestPackageNameOverrides = specs
115 }
116}
117
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700118func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900119 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900123 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900127 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128
129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Dario Frenicde2a032019-10-27 00:29:22 +0100140 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900141
Jooyung Han344d5432019-08-23 11:17:39 +0900142 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "build/make/target/product/security": nil,
147 "apex_manifest.json": nil,
148 "AndroidManifest.xml": nil,
149 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900151 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/commonapex-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800155 "mylib.cpp": nil,
156 "mylib_common.cpp": nil,
157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900191 }
192
Colin Crossf9aabd72020-02-15 11:29:50 -0800193 cc.GatherRequiredFilesForTest(fs)
194
Jooyung Han344d5432019-08-23 11:17:39 +0900195 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800196 // The fs now needs to be populated before creating the config, call handlers twice
197 // for now, once to get any fs changes, and later after the config was created to
198 // set product variables or targets.
199 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
200 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900201 }
202
Colin Cross98be1bb2019-12-13 20:41:13 -0800203 config := android.TestArchConfig(buildDir, nil, bp, fs)
204 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
205 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
206 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
207 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
208 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jooyung Han749dc692020-04-15 11:03:39 +0900209 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800210 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
211
212 for _, handler := range handlers {
213 // The fs now needs to be populated before creating the config, call handlers twice
214 // for now, earlier to get any fs changes, and now after the config was created to
215 // set product variables or targets.
216 tempFS := map[string][]byte{}
217 handler(tempFS, config)
218 }
219
220 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100221
222 // from android package
223 android.RegisterPackageBuildComponents(ctx)
224 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
225
Colin Cross98be1bb2019-12-13 20:41:13 -0800226 ctx.RegisterModuleType("apex", BundleFactory)
227 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
228 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
229 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
230 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
231 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
232 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700233 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800234
Jooyung Hana57af4a2020-01-23 05:36:59 +0000235 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
236 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
237
Paul Duffin77980a82019-12-19 16:01:36 +0000238 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100239
240 // Register this after the prebuilt mutators have been registered (in
241 // cc.RegisterRequiredBuildComponentsForTest) to match what happens at runtime.
242 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
243 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
244
Colin Cross98be1bb2019-12-13 20:41:13 -0800245 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
247 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700248 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000249 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700250 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000252 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000253 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000254 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100255 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900256 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800257
Colin Cross98be1bb2019-12-13 20:41:13 -0800258 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260
261 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264}
265
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700266func setUp() {
267 var err error
268 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700270 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272}
273
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700274func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700275 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276}
277
Jooyung Han643adc42020-02-27 13:50:06 +0900278// ensure that 'result' equals 'expected'
279func ensureEquals(t *testing.T, result string, expected string) {
280 t.Helper()
281 if result != expected {
282 t.Errorf("%q != %q", expected, result)
283 }
284}
285
Jiyong Park25fc6a92018-11-18 18:02:45 +0900286// ensure that 'result' contains 'expected'
287func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if !strings.Contains(result, expected) {
290 t.Errorf("%q is not found in %q", expected, result)
291 }
292}
293
Liz Kammer5bd365f2020-05-27 15:15:11 -0700294// ensure that 'result' contains 'expected' exactly one time
295func ensureContainsOnce(t *testing.T, result string, expected string) {
296 t.Helper()
297 count := strings.Count(result, expected)
298 if count != 1 {
299 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
300 }
301}
302
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303// ensures that 'result' does not contain 'notExpected'
304func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900305 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306 if strings.Contains(result, notExpected) {
307 t.Errorf("%q is found in %q", notExpected, result)
308 }
309}
310
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700311func ensureMatches(t *testing.T, result string, expectedRex string) {
312 ok, err := regexp.MatchString(expectedRex, result)
313 if err != nil {
314 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
315 return
316 }
317 if !ok {
318 t.Errorf("%s does not match regular expession %s", result, expectedRex)
319 }
320}
321
Jiyong Park25fc6a92018-11-18 18:02:45 +0900322func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900323 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900324 if !android.InList(expected, result) {
325 t.Errorf("%q is not found in %v", expected, result)
326 }
327}
328
329func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900330 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 if android.InList(notExpected, result) {
332 t.Errorf("%q is found in %v", notExpected, result)
333 }
334}
335
Jooyung Hane1633032019-08-01 17:41:43 +0900336func ensureListEmpty(t *testing.T, result []string) {
337 t.Helper()
338 if len(result) > 0 {
339 t.Errorf("%q is expected to be empty", result)
340 }
341}
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343// Minimal test
344func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900345 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900346 apex_defaults {
347 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900348 manifest: ":myapex.manifest",
349 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 key: "myapex.key",
351 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800352 multilib: {
353 both: {
354 binaries: ["foo",],
355 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900356 },
Jiyong Park77acec62020-06-01 21:39:15 +0900357 java_libs: [
358 "myjar",
359 "myjar_dex",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 }
362
Jiyong Park30ca9372019-02-07 16:27:23 +0900363 apex {
364 name: "myapex",
365 defaults: ["myapex-defaults"],
366 }
367
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 apex_key {
369 name: "myapex.key",
370 public_key: "testkey.avbpubkey",
371 private_key: "testkey.pem",
372 }
373
Jiyong Park809bb722019-02-13 21:33:49 +0900374 filegroup {
375 name: "myapex.manifest",
376 srcs: ["apex_manifest.json"],
377 }
378
379 filegroup {
380 name: "myapex.androidmanifest",
381 srcs: ["AndroidManifest.xml"],
382 }
383
Jiyong Park25fc6a92018-11-18 18:02:45 +0900384 cc_library {
385 name: "mylib",
386 srcs: ["mylib.cpp"],
387 shared_libs: ["mylib2"],
388 system_shared_libs: [],
389 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000390 // TODO: remove //apex_available:platform
391 apex_available: [
392 "//apex_available:platform",
393 "myapex",
394 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900395 }
396
Alex Light3d673592019-01-18 14:37:31 -0800397 cc_binary {
398 name: "foo",
399 srcs: ["mylib.cpp"],
400 compile_multilib: "both",
401 multilib: {
402 lib32: {
403 suffix: "32",
404 },
405 lib64: {
406 suffix: "64",
407 },
408 },
409 symlinks: ["foo_link_"],
410 symlink_preferred_arch: true,
411 system_shared_libs: [],
412 static_executable: true,
413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000414 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800415 }
416
Paul Duffindddd5462020-04-07 15:25:44 +0100417 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900418 name: "mylib2",
419 srcs: ["mylib.cpp"],
420 system_shared_libs: [],
421 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900422 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900423 static_libs: ["libstatic"],
424 // TODO: remove //apex_available:platform
425 apex_available: [
426 "//apex_available:platform",
427 "myapex",
428 ],
429 }
430
Paul Duffindddd5462020-04-07 15:25:44 +0100431 cc_prebuilt_library_shared {
432 name: "mylib2",
433 srcs: ["prebuilt.so"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Jiyong Park9918e1a2020-03-17 19:16:40 +0900441 cc_library_static {
442 name: "libstatic",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
446 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900452 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900453
454 java_library {
455 name: "myjar",
456 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900457 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900458 sdk_version: "none",
459 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900460 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900461 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000462 // TODO: remove //apex_available:platform
463 apex_available: [
464 "//apex_available:platform",
465 "myapex",
466 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900467 }
468
Jiyong Park77acec62020-06-01 21:39:15 +0900469 dex_import {
470 name: "myjar_dex",
471 jars: ["prebuilt.jar"],
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
476 }
477
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478 java_library {
479 name: "myotherjar",
480 srcs: ["foo/bar/MyClass.java"],
481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900483 // TODO: remove //apex_available:platform
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900489
490 java_library {
491 name: "mysharedjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900495 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900496 `)
497
Sundong Ahnabb64432019-10-22 13:58:29 +0900498 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900499
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900500 // Make sure that Android.mk is created
501 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
502 data := android.AndroidMkDataForTest(t, config, "", ab)
503 var builder strings.Builder
504 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
505
506 androidMk := builder.String()
507 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
508 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
509
Jiyong Park42cca6c2019-04-01 11:15:50 +0900510 optFlags := apexRule.Args["opt_flags"]
511 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700512 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900513 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900514
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515 copyCmds := apexRule.Args["copy_commands"]
516
517 // Ensure that main rule creates an output
518 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
519
520 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800521 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900523 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900524
525 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800526 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900527 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900528
529 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800530 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
531 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900532 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900533 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900534 // .. but not for java libs
535 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900536 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800537
Colin Cross7113d202019-11-20 16:39:12 -0800538 // Ensure that the platform variant ends with _shared or _common
539 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
542 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
544
545 // Ensure that dynamic dependency to java libs are not included
546 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800547
548 // Ensure that all symlinks are present.
549 found_foo_link_64 := false
550 found_foo := false
551 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900552 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800553 if strings.HasSuffix(cmd, "bin/foo") {
554 found_foo = true
555 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
556 found_foo_link_64 = true
557 }
558 }
559 }
560 good := found_foo && found_foo_link_64
561 if !good {
562 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
563 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900564
Sundong Ahnabb64432019-10-22 13:58:29 +0900565 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700566 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900567 if len(noticeInputs) != 3 {
568 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900569 }
570 ensureListContains(t, noticeInputs, "NOTICE")
571 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900572 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900573
Artur Satayeva8bd1132020-04-27 18:07:06 +0100574 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100575 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
576 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
577 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
578 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
579 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100580
581 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100582 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
583 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
584 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
585 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
586 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800587}
588
Jooyung Hanf21c7972019-12-16 22:32:06 +0900589func TestDefaults(t *testing.T) {
590 ctx, _ := testApex(t, `
591 apex_defaults {
592 name: "myapex-defaults",
593 key: "myapex.key",
594 prebuilts: ["myetc"],
595 native_shared_libs: ["mylib"],
596 java_libs: ["myjar"],
597 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900598 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900599 }
600
601 prebuilt_etc {
602 name: "myetc",
603 src: "myprebuilt",
604 }
605
606 apex {
607 name: "myapex",
608 defaults: ["myapex-defaults"],
609 }
610
611 apex_key {
612 name: "myapex.key",
613 public_key: "testkey.avbpubkey",
614 private_key: "testkey.pem",
615 }
616
617 cc_library {
618 name: "mylib",
619 system_shared_libs: [],
620 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000621 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 java_library {
625 name: "myjar",
626 srcs: ["foo/bar/MyClass.java"],
627 sdk_version: "none",
628 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000629 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900630 }
631
632 android_app {
633 name: "AppFoo",
634 srcs: ["foo/bar/MyClass.java"],
635 sdk_version: "none",
636 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000637 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900638 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900639
640 runtime_resource_overlay {
641 name: "rro",
642 theme: "blue",
643 }
644
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000646 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 "etc/myetc",
648 "javalib/myjar.jar",
649 "lib64/mylib.so",
650 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900651 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900652 })
653}
654
Jooyung Han01a3ee22019-11-02 02:52:25 +0900655func TestApexManifest(t *testing.T) {
656 ctx, _ := testApex(t, `
657 apex {
658 name: "myapex",
659 key: "myapex.key",
660 }
661
662 apex_key {
663 name: "myapex.key",
664 public_key: "testkey.avbpubkey",
665 private_key: "testkey.pem",
666 }
667 `)
668
669 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900670 args := module.Rule("apexRule").Args
671 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
672 t.Error("manifest should be apex_manifest.pb, but " + manifest)
673 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900674}
675
Alex Light5098a612018-11-29 17:12:15 -0800676func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700677 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800678 apex {
679 name: "myapex",
680 key: "myapex.key",
681 payload_type: "zip",
682 native_shared_libs: ["mylib"],
683 }
684
685 apex_key {
686 name: "myapex.key",
687 public_key: "testkey.avbpubkey",
688 private_key: "testkey.pem",
689 }
690
691 cc_library {
692 name: "mylib",
693 srcs: ["mylib.cpp"],
694 shared_libs: ["mylib2"],
695 system_shared_libs: [],
696 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000697 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800698 }
699
700 cc_library {
701 name: "mylib2",
702 srcs: ["mylib.cpp"],
703 system_shared_libs: [],
704 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000705 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800706 }
707 `)
708
Sundong Ahnabb64432019-10-22 13:58:29 +0900709 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800710 copyCmds := zipApexRule.Args["copy_commands"]
711
712 // Ensure that main rule creates an output
713 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
714
715 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800716 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800717
718 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800719 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800720
721 // Ensure that both direct and indirect deps are copied into apex
722 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
723 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900724}
725
726func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700727 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728 apex {
729 name: "myapex",
730 key: "myapex.key",
731 native_shared_libs: ["mylib", "mylib3"],
732 }
733
734 apex_key {
735 name: "myapex.key",
736 public_key: "testkey.avbpubkey",
737 private_key: "testkey.pem",
738 }
739
740 cc_library {
741 name: "mylib",
742 srcs: ["mylib.cpp"],
743 shared_libs: ["mylib2", "mylib3"],
744 system_shared_libs: [],
745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000746 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900747 }
748
749 cc_library {
750 name: "mylib2",
751 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900752 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900753 system_shared_libs: [],
754 stl: "none",
755 stubs: {
756 versions: ["1", "2", "3"],
757 },
758 }
759
760 cc_library {
761 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900762 srcs: ["mylib.cpp"],
763 shared_libs: ["mylib4"],
764 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900765 stl: "none",
766 stubs: {
767 versions: ["10", "11", "12"],
768 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000769 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900770 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900771
772 cc_library {
773 name: "mylib4",
774 srcs: ["mylib.cpp"],
775 system_shared_libs: [],
776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000777 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900778 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900779 `)
780
Sundong Ahnabb64432019-10-22 13:58:29 +0900781 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900782 copyCmds := apexRule.Args["copy_commands"]
783
784 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800785 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900786
787 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800788 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789
790 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800791 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900792
Colin Cross7113d202019-11-20 16:39:12 -0800793 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900794
795 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900796 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900798 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799
800 // 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 -0800801 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800803 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900804
805 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900806 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900807 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900808
809 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900810 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900811
Jooyung Hana57af4a2020-01-23 05:36:59 +0000812 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900813 "lib64/mylib.so",
814 "lib64/mylib3.so",
815 "lib64/mylib4.so",
816 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817}
818
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900819func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700820 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900821 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900822 name: "myapex2",
823 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900824 native_shared_libs: ["mylib"],
825 }
826
827 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900828 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829 public_key: "testkey.avbpubkey",
830 private_key: "testkey.pem",
831 }
832
833 cc_library {
834 name: "mylib",
835 srcs: ["mylib.cpp"],
836 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900837 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900838 system_shared_libs: [],
839 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000840 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900841 }
842
843 cc_library {
844 name: "libfoo",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["libbar"],
847 system_shared_libs: [],
848 stl: "none",
849 stubs: {
850 versions: ["10", "20", "30"],
851 },
852 }
853
854 cc_library {
855 name: "libbar",
856 srcs: ["mylib.cpp"],
857 system_shared_libs: [],
858 stl: "none",
859 }
860
Jiyong Park678c8812020-02-07 17:25:49 +0900861 cc_library_static {
862 name: "libbaz",
863 srcs: ["mylib.cpp"],
864 system_shared_libs: [],
865 stl: "none",
866 apex_available: [ "myapex2" ],
867 }
868
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900869 `)
870
Jiyong Park83dc74b2020-01-14 18:38:44 +0900871 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900872 copyCmds := apexRule.Args["copy_commands"]
873
874 // Ensure that direct non-stubs dep is always included
875 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
876
877 // Ensure that indirect stubs dep is not included
878 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
879
880 // Ensure that dependency of stubs is not included
881 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
882
Jiyong Park83dc74b2020-01-14 18:38:44 +0900883 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900884
885 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900886 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900887 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900888 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900889
Jiyong Park3ff16992019-12-27 14:11:47 +0900890 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900891
892 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
893 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900894
Artur Satayeva8bd1132020-04-27 18:07:06 +0100895 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100896 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
897 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
898 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900899
Artur Satayeva8bd1132020-04-27 18:07:06 +0100900 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100901 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
902 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
903 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900904}
905
Jooyung Hand3639552019-08-09 12:57:43 +0900906func TestApexWithRuntimeLibsDependency(t *testing.T) {
907 /*
908 myapex
909 |
910 v (runtime_libs)
911 mylib ------+------> libfoo [provides stub]
912 |
913 `------> libbar
914 */
915 ctx, _ := testApex(t, `
916 apex {
917 name: "myapex",
918 key: "myapex.key",
919 native_shared_libs: ["mylib"],
920 }
921
922 apex_key {
923 name: "myapex.key",
924 public_key: "testkey.avbpubkey",
925 private_key: "testkey.pem",
926 }
927
928 cc_library {
929 name: "mylib",
930 srcs: ["mylib.cpp"],
931 runtime_libs: ["libfoo", "libbar"],
932 system_shared_libs: [],
933 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000934 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900935 }
936
937 cc_library {
938 name: "libfoo",
939 srcs: ["mylib.cpp"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["10", "20", "30"],
944 },
945 }
946
947 cc_library {
948 name: "libbar",
949 srcs: ["mylib.cpp"],
950 system_shared_libs: [],
951 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000952 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900953 }
954
955 `)
956
Sundong Ahnabb64432019-10-22 13:58:29 +0900957 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900958 copyCmds := apexRule.Args["copy_commands"]
959
960 // Ensure that direct non-stubs dep is always included
961 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
962
963 // Ensure that indirect stubs dep is not included
964 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
965
966 // Ensure that runtime_libs dep in included
967 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
968
Sundong Ahnabb64432019-10-22 13:58:29 +0900969 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900970 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
971 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900972
973}
974
Jooyung Han8ce8db92020-05-15 19:05:05 +0900975func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
976 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
977 bp := `
978 apex {
979 name: "com.android.runtime",
980 key: "com.android.runtime.key",
981 native_shared_libs: ["libc"],
982 }
983
984 apex_key {
985 name: "com.android.runtime.key",
986 public_key: "testkey.avbpubkey",
987 private_key: "testkey.pem",
988 }
989
990 cc_library {
991 name: "libc",
992 no_libcrt: true,
993 nocrt: true,
994 stl: "none",
995 system_shared_libs: [],
996 stubs: { versions: ["1"] },
997 apex_available: ["com.android.runtime"],
998
999 sanitize: {
1000 hwaddress: true,
1001 }
1002 }
1003
1004 cc_prebuilt_library_shared {
1005 name: "libclang_rt.hwasan-aarch64-android",
1006 no_libcrt: true,
1007 nocrt: true,
1008 stl: "none",
1009 system_shared_libs: [],
1010 srcs: [""],
1011 stubs: { versions: ["1"] },
1012
1013 sanitize: {
1014 never: true,
1015 },
1016 }
1017 `
1018 // override bp to use hard-coded names: com.android.runtime and libc
1019 fs["Android.bp"] = []byte(bp)
1020 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1021 })
1022
1023 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1024 "lib64/bionic/libc.so",
1025 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1026 })
1027
1028 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1029
1030 installed := hwasan.Description("install libclang_rt.hwasan")
1031 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1032
1033 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1034 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1035 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1036}
1037
1038func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1039 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1040 bp := `
1041 apex {
1042 name: "com.android.runtime",
1043 key: "com.android.runtime.key",
1044 native_shared_libs: ["libc"],
1045 }
1046
1047 apex_key {
1048 name: "com.android.runtime.key",
1049 public_key: "testkey.avbpubkey",
1050 private_key: "testkey.pem",
1051 }
1052
1053 cc_library {
1054 name: "libc",
1055 no_libcrt: true,
1056 nocrt: true,
1057 stl: "none",
1058 system_shared_libs: [],
1059 stubs: { versions: ["1"] },
1060 apex_available: ["com.android.runtime"],
1061 }
1062
1063 cc_prebuilt_library_shared {
1064 name: "libclang_rt.hwasan-aarch64-android",
1065 no_libcrt: true,
1066 nocrt: true,
1067 stl: "none",
1068 system_shared_libs: [],
1069 srcs: [""],
1070 stubs: { versions: ["1"] },
1071
1072 sanitize: {
1073 never: true,
1074 },
1075 }
1076 `
1077 // override bp to use hard-coded names: com.android.runtime and libc
1078 fs["Android.bp"] = []byte(bp)
1079 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1080
1081 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1082 })
1083
1084 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1085 "lib64/bionic/libc.so",
1086 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1087 })
1088
1089 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1090
1091 installed := hwasan.Description("install libclang_rt.hwasan")
1092 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1093
1094 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1095 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1096 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1097}
1098
Jooyung Han61b66e92020-03-21 14:21:46 +00001099func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1100 testcases := []struct {
1101 name string
1102 minSdkVersion string
1103 shouldLink string
1104 shouldNotLink []string
1105 }{
1106 {
Jooyung Han75568392020-03-20 04:29:24 +09001107 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001108 minSdkVersion: "",
Jooyung Han61b66e92020-03-21 14:21:46 +00001109 shouldLink: "30",
1110 shouldNotLink: []string{"29"},
1111 },
1112 {
1113 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001114 minSdkVersion: "min_sdk_version: \"29\",",
Jooyung Han61b66e92020-03-21 14:21:46 +00001115 shouldLink: "29",
1116 shouldNotLink: []string{"30"},
1117 },
1118 }
1119 for _, tc := range testcases {
1120 t.Run(tc.name, func(t *testing.T) {
1121 ctx, _ := testApex(t, `
1122 apex {
1123 name: "myapex",
1124 key: "myapex.key",
1125 use_vendor: true,
1126 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001127 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001128 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001129
Jooyung Han61b66e92020-03-21 14:21:46 +00001130 apex_key {
1131 name: "myapex.key",
1132 public_key: "testkey.avbpubkey",
1133 private_key: "testkey.pem",
1134 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001135
Jooyung Han61b66e92020-03-21 14:21:46 +00001136 cc_library {
1137 name: "mylib",
1138 srcs: ["mylib.cpp"],
1139 vendor_available: true,
1140 shared_libs: ["libbar"],
1141 system_shared_libs: [],
1142 stl: "none",
1143 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001144 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001145 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001146
Jooyung Han61b66e92020-03-21 14:21:46 +00001147 cc_library {
1148 name: "libbar",
1149 srcs: ["mylib.cpp"],
1150 system_shared_libs: [],
1151 stl: "none",
1152 stubs: { versions: ["29","30"] },
1153 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001154
Jooyung Han61b66e92020-03-21 14:21:46 +00001155 llndk_library {
1156 name: "libbar",
1157 symbol_file: "",
1158 }
1159 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001160 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001161 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001162
Jooyung Han61b66e92020-03-21 14:21:46 +00001163 // Ensure that LLNDK dep is not included
1164 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1165 "lib64/mylib.so",
1166 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001167
Jooyung Han61b66e92020-03-21 14:21:46 +00001168 // Ensure that LLNDK dep is required
1169 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1170 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1171 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001172
Jooyung Han61b66e92020-03-21 14:21:46 +00001173 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1174 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1175 for _, ver := range tc.shouldNotLink {
1176 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1177 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001178
Jooyung Han61b66e92020-03-21 14:21:46 +00001179 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1180 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1181 })
1182 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001183}
1184
Jiyong Park25fc6a92018-11-18 18:02:45 +09001185func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001186 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001187 apex {
1188 name: "myapex",
1189 key: "myapex.key",
1190 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1191 }
1192
1193 apex_key {
1194 name: "myapex.key",
1195 public_key: "testkey.avbpubkey",
1196 private_key: "testkey.pem",
1197 }
1198
1199 cc_library {
1200 name: "mylib",
1201 srcs: ["mylib.cpp"],
1202 shared_libs: ["libdl#27"],
1203 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001204 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001205 }
1206
1207 cc_library_shared {
1208 name: "mylib_shared",
1209 srcs: ["mylib.cpp"],
1210 shared_libs: ["libdl#27"],
1211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001212 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001213 }
1214
1215 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001216 name: "libBootstrap",
1217 srcs: ["mylib.cpp"],
1218 stl: "none",
1219 bootstrap: true,
1220 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001221 `)
1222
Sundong Ahnabb64432019-10-22 13:58:29 +09001223 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001224 copyCmds := apexRule.Args["copy_commands"]
1225
1226 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001227 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001228 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1229 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001230
1231 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001232 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001233
Colin Cross7113d202019-11-20 16:39:12 -08001234 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1235 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1236 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001237
1238 // For dependency to libc
1239 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001240 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001241 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001242 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001243 // ... Cflags from stub is correctly exported to mylib
1244 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1245 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1246
1247 // For dependency to libm
1248 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001249 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001250 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001251 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001252 // ... and is not compiling with the stub
1253 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1254 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1255
1256 // For dependency to libdl
1257 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001258 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001259 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001260 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1261 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001262 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001263 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001264 // ... Cflags from stub is correctly exported to mylib
1265 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1266 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001267
1268 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001269 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1270 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1271 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1272 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001273}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001274
Jooyung Han749dc692020-04-15 11:03:39 +09001275func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001276 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001277 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1278 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001279 // 3) (platform) -> liba -> libz : this should be non-stub link
1280 ctx, _ := testApex(t, `
1281 apex {
1282 name: "myapex",
1283 key: "myapex.key",
1284 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001285 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001286 }
1287
1288 apex {
1289 name: "otherapex",
1290 key: "myapex.key",
1291 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001292 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001293 }
1294
1295 apex_key {
1296 name: "myapex.key",
1297 public_key: "testkey.avbpubkey",
1298 private_key: "testkey.pem",
1299 }
1300
1301 cc_library {
1302 name: "libx",
1303 shared_libs: ["liba"],
1304 system_shared_libs: [],
1305 stl: "none",
1306 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001307 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001308 }
1309
1310 cc_library {
1311 name: "liby",
1312 shared_libs: ["liba"],
1313 system_shared_libs: [],
1314 stl: "none",
1315 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001316 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001317 }
1318
1319 cc_library {
1320 name: "liba",
1321 shared_libs: ["libz"],
1322 system_shared_libs: [],
1323 stl: "none",
1324 apex_available: [
1325 "//apex_available:anyapex",
1326 "//apex_available:platform",
1327 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001328 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001329 }
1330
1331 cc_library {
1332 name: "libz",
1333 system_shared_libs: [],
1334 stl: "none",
1335 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001336 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001337 },
1338 }
Jooyung Han749dc692020-04-15 11:03:39 +09001339 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001340
1341 expectLink := func(from, from_variant, to, to_variant string) {
1342 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1343 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1344 }
1345 expectNoLink := func(from, from_variant, to, to_variant string) {
1346 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1347 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1348 }
1349 // platform liba is linked to non-stub version
1350 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001351 // liba in myapex is linked to #28
1352 expectLink("liba", "shared_myapex", "libz", "shared_28")
1353 expectNoLink("liba", "shared_myapex", "libz", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001354 expectNoLink("liba", "shared_myapex", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001355 // liba in otherapex is linked to #30
1356 expectLink("liba", "shared_otherapex", "libz", "shared_30")
1357 expectNoLink("liba", "shared_otherapex", "libz", "shared_28")
Jooyung Han03b51852020-02-26 22:45:42 +09001358 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1359}
1360
Jooyung Hanaed150d2020-04-02 01:41:41 +09001361func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1362 ctx, _ := testApex(t, `
1363 apex {
1364 name: "myapex",
1365 key: "myapex.key",
1366 native_shared_libs: ["libx"],
1367 min_sdk_version: "R",
1368 }
1369
1370 apex_key {
1371 name: "myapex.key",
1372 public_key: "testkey.avbpubkey",
1373 private_key: "testkey.pem",
1374 }
1375
1376 cc_library {
1377 name: "libx",
1378 shared_libs: ["libz"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001382 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001383 }
1384
1385 cc_library {
1386 name: "libz",
1387 system_shared_libs: [],
1388 stl: "none",
1389 stubs: {
1390 versions: ["29", "R"],
1391 },
1392 }
1393 `, func(fs map[string][]byte, config android.Config) {
1394 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1395 })
1396
1397 expectLink := func(from, from_variant, to, to_variant string) {
1398 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1399 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1400 }
1401 expectNoLink := func(from, from_variant, to, to_variant string) {
1402 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1403 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1404 }
1405 // 9000 is quite a magic number.
1406 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1407 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1408 // to distinguish them from finalized and future_api(10000)
1409 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1410 // (refer android/api_levels.go)
1411 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1412 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1413 expectNoLink("libx", "shared_myapex", "libz", "shared")
1414}
1415
Jooyung Han749dc692020-04-15 11:03:39 +09001416func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001417 ctx, _ := testApex(t, `
1418 apex {
1419 name: "myapex",
1420 key: "myapex.key",
1421 native_shared_libs: ["libx"],
1422 }
1423
1424 apex_key {
1425 name: "myapex.key",
1426 public_key: "testkey.avbpubkey",
1427 private_key: "testkey.pem",
1428 }
1429
1430 cc_library {
1431 name: "libx",
1432 shared_libs: ["libz"],
1433 system_shared_libs: [],
1434 stl: "none",
1435 apex_available: [ "myapex" ],
1436 }
1437
1438 cc_library {
1439 name: "libz",
1440 system_shared_libs: [],
1441 stl: "none",
1442 stubs: {
1443 versions: ["1", "2"],
1444 },
1445 }
1446 `)
1447
1448 expectLink := func(from, from_variant, to, to_variant string) {
1449 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1450 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1451 }
1452 expectNoLink := func(from, from_variant, to, to_variant string) {
1453 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1454 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1455 }
1456 expectLink("libx", "shared_myapex", "libz", "shared_2")
1457 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1458 expectNoLink("libx", "shared_myapex", "libz", "shared")
1459}
1460
1461func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1462 ctx, _ := testApex(t, `
1463 apex {
1464 name: "myapex",
1465 key: "myapex.key",
1466 native_shared_libs: ["libx"],
1467 }
1468
1469 apex_key {
1470 name: "myapex.key",
1471 public_key: "testkey.avbpubkey",
1472 private_key: "testkey.pem",
1473 }
1474
1475 cc_library {
1476 name: "libx",
1477 system_shared_libs: [],
1478 stl: "none",
1479 apex_available: [ "myapex" ],
1480 stubs: {
1481 versions: ["1", "2"],
1482 },
1483 }
1484
1485 cc_library {
1486 name: "libz",
1487 shared_libs: ["libx"],
1488 system_shared_libs: [],
1489 stl: "none",
1490 }
1491 `)
1492
1493 expectLink := func(from, from_variant, to, to_variant string) {
1494 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1495 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1496 }
1497 expectNoLink := func(from, from_variant, to, to_variant string) {
1498 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1499 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1500 }
1501 expectLink("libz", "shared", "libx", "shared_2")
1502 expectNoLink("libz", "shared", "libz", "shared_1")
1503 expectNoLink("libz", "shared", "libz", "shared")
1504}
1505
Jooyung Han75568392020-03-20 04:29:24 +09001506func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001507 ctx, _ := testApex(t, `
1508 apex {
1509 name: "myapex",
1510 key: "myapex.key",
1511 native_shared_libs: ["libx"],
1512 min_sdk_version: "29",
1513 }
1514
1515 apex_key {
1516 name: "myapex.key",
1517 public_key: "testkey.avbpubkey",
1518 private_key: "testkey.pem",
1519 }
1520
1521 cc_library {
1522 name: "libx",
1523 shared_libs: ["libbar"],
1524 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001525 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001526 }
1527
1528 cc_library {
1529 name: "libbar",
1530 stubs: {
1531 versions: ["29", "30"],
1532 },
1533 }
Jooyung Han75568392020-03-20 04:29:24 +09001534 `, func(fs map[string][]byte, config android.Config) {
1535 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1536 })
Jooyung Han03b51852020-02-26 22:45:42 +09001537 expectLink := func(from, from_variant, to, to_variant string) {
1538 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1539 libFlags := ld.Args["libFlags"]
1540 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1541 }
Jooyung Han75568392020-03-20 04:29:24 +09001542 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001543}
1544
Jooyung Han75568392020-03-20 04:29:24 +09001545func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001546 ctx, _ := testApex(t, `
1547 apex {
1548 name: "myapex",
1549 key: "myapex.key",
1550 native_shared_libs: ["libx"],
1551 min_sdk_version: "29",
1552 }
1553
1554 apex_key {
1555 name: "myapex.key",
1556 public_key: "testkey.avbpubkey",
1557 private_key: "testkey.pem",
1558 }
1559
1560 cc_library {
1561 name: "libx",
1562 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001563 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001564 }
Jooyung Han75568392020-03-20 04:29:24 +09001565 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001566
1567 // ensure apex variant of c++ is linked with static unwinder
1568 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1569 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1570 // note that platform variant is not.
1571 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1572 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001573}
1574
Jooyung Han749dc692020-04-15 11:03:39 +09001575func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001576 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001577 apex {
1578 name: "myapex",
1579 key: "myapex.key",
1580 native_shared_libs: ["libx"],
1581 min_sdk_version: "29",
1582 }
1583
1584 apex_key {
1585 name: "myapex.key",
1586 public_key: "testkey.avbpubkey",
1587 private_key: "testkey.pem",
1588 }
1589
1590 cc_library {
1591 name: "libx",
1592 shared_libs: ["libz"],
1593 system_shared_libs: [],
1594 stl: "none",
1595 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001596 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001597 }
1598
1599 cc_library {
1600 name: "libz",
1601 system_shared_libs: [],
1602 stl: "none",
1603 stubs: {
1604 versions: ["30"],
1605 },
1606 }
Jooyung Han75568392020-03-20 04:29:24 +09001607 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001608}
Jooyung Han03b51852020-02-26 22:45:42 +09001609
Jooyung Han749dc692020-04-15 11:03:39 +09001610func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1611 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001612 apex {
1613 name: "myapex",
1614 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001615 native_shared_libs: ["mylib"],
1616 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001617 }
1618
1619 apex_key {
1620 name: "myapex.key",
1621 public_key: "testkey.avbpubkey",
1622 private_key: "testkey.pem",
1623 }
Jooyung Han749dc692020-04-15 11:03:39 +09001624
1625 cc_library {
1626 name: "mylib",
1627 srcs: ["mylib.cpp"],
1628 system_shared_libs: [],
1629 stl: "none",
1630 apex_available: [
1631 "myapex",
1632 ],
1633 min_sdk_version: "30",
1634 }
1635 `)
1636}
1637
1638func TestApexMinSdkVersion_Okay(t *testing.T) {
1639 testApex(t, `
1640 apex {
1641 name: "myapex",
1642 key: "myapex.key",
1643 native_shared_libs: ["libfoo"],
1644 java_libs: ["libbar"],
1645 min_sdk_version: "29",
1646 }
1647
1648 apex_key {
1649 name: "myapex.key",
1650 public_key: "testkey.avbpubkey",
1651 private_key: "testkey.pem",
1652 }
1653
1654 cc_library {
1655 name: "libfoo",
1656 srcs: ["mylib.cpp"],
1657 shared_libs: ["libfoo_dep"],
1658 apex_available: ["myapex"],
1659 min_sdk_version: "29",
1660 }
1661
1662 cc_library {
1663 name: "libfoo_dep",
1664 srcs: ["mylib.cpp"],
1665 apex_available: ["myapex"],
1666 min_sdk_version: "29",
1667 }
1668
1669 java_library {
1670 name: "libbar",
1671 sdk_version: "current",
1672 srcs: ["a.java"],
1673 static_libs: ["libbar_dep"],
1674 apex_available: ["myapex"],
1675 min_sdk_version: "29",
1676 }
1677
1678 java_library {
1679 name: "libbar_dep",
1680 sdk_version: "current",
1681 srcs: ["a.java"],
1682 apex_available: ["myapex"],
1683 min_sdk_version: "29",
1684 }
Jooyung Han03b51852020-02-26 22:45:42 +09001685 `)
1686}
1687
Artur Satayev8cf899a2020-04-15 17:29:42 +01001688func TestJavaStableSdkVersion(t *testing.T) {
1689 testCases := []struct {
1690 name string
1691 expectedError string
1692 bp string
1693 }{
1694 {
1695 name: "Non-updatable apex with non-stable dep",
1696 bp: `
1697 apex {
1698 name: "myapex",
1699 java_libs: ["myjar"],
1700 key: "myapex.key",
1701 }
1702 apex_key {
1703 name: "myapex.key",
1704 public_key: "testkey.avbpubkey",
1705 private_key: "testkey.pem",
1706 }
1707 java_library {
1708 name: "myjar",
1709 srcs: ["foo/bar/MyClass.java"],
1710 sdk_version: "core_platform",
1711 apex_available: ["myapex"],
1712 }
1713 `,
1714 },
1715 {
1716 name: "Updatable apex with stable dep",
1717 bp: `
1718 apex {
1719 name: "myapex",
1720 java_libs: ["myjar"],
1721 key: "myapex.key",
1722 updatable: true,
1723 min_sdk_version: "29",
1724 }
1725 apex_key {
1726 name: "myapex.key",
1727 public_key: "testkey.avbpubkey",
1728 private_key: "testkey.pem",
1729 }
1730 java_library {
1731 name: "myjar",
1732 srcs: ["foo/bar/MyClass.java"],
1733 sdk_version: "current",
1734 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001735 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001736 }
1737 `,
1738 },
1739 {
1740 name: "Updatable apex with non-stable dep",
1741 expectedError: "cannot depend on \"myjar\"",
1742 bp: `
1743 apex {
1744 name: "myapex",
1745 java_libs: ["myjar"],
1746 key: "myapex.key",
1747 updatable: true,
1748 }
1749 apex_key {
1750 name: "myapex.key",
1751 public_key: "testkey.avbpubkey",
1752 private_key: "testkey.pem",
1753 }
1754 java_library {
1755 name: "myjar",
1756 srcs: ["foo/bar/MyClass.java"],
1757 sdk_version: "core_platform",
1758 apex_available: ["myapex"],
1759 }
1760 `,
1761 },
1762 {
1763 name: "Updatable apex with non-stable transitive dep",
1764 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1765 bp: `
1766 apex {
1767 name: "myapex",
1768 java_libs: ["myjar"],
1769 key: "myapex.key",
1770 updatable: true,
1771 }
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777 java_library {
1778 name: "myjar",
1779 srcs: ["foo/bar/MyClass.java"],
1780 sdk_version: "current",
1781 apex_available: ["myapex"],
1782 static_libs: ["transitive-jar"],
1783 }
1784 java_library {
1785 name: "transitive-jar",
1786 srcs: ["foo/bar/MyClass.java"],
1787 sdk_version: "core_platform",
1788 apex_available: ["myapex"],
1789 }
1790 `,
1791 },
1792 }
1793
1794 for _, test := range testCases {
1795 t.Run(test.name, func(t *testing.T) {
1796 if test.expectedError == "" {
1797 testApex(t, test.bp)
1798 } else {
1799 testApexError(t, test.expectedError, test.bp)
1800 }
1801 })
1802 }
1803}
1804
Jooyung Han749dc692020-04-15 11:03:39 +09001805func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1806 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1807 apex {
1808 name: "myapex",
1809 key: "myapex.key",
1810 native_shared_libs: ["mylib"],
1811 min_sdk_version: "29",
1812 }
1813
1814 apex_key {
1815 name: "myapex.key",
1816 public_key: "testkey.avbpubkey",
1817 private_key: "testkey.pem",
1818 }
1819
1820 cc_library {
1821 name: "mylib",
1822 srcs: ["mylib.cpp"],
1823 shared_libs: ["mylib2"],
1824 system_shared_libs: [],
1825 stl: "none",
1826 apex_available: [
1827 "myapex",
1828 ],
1829 min_sdk_version: "29",
1830 }
1831
1832 // indirect part of the apex
1833 cc_library {
1834 name: "mylib2",
1835 srcs: ["mylib.cpp"],
1836 system_shared_libs: [],
1837 stl: "none",
1838 apex_available: [
1839 "myapex",
1840 ],
1841 min_sdk_version: "30",
1842 }
1843 `)
1844}
1845
1846func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1847 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 apps: ["AppFoo"],
1852 min_sdk_version: "29",
1853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 android_app {
1862 name: "AppFoo",
1863 srcs: ["foo/bar/MyClass.java"],
1864 sdk_version: "current",
1865 min_sdk_version: "29",
1866 system_modules: "none",
1867 stl: "none",
1868 static_libs: ["bar"],
1869 apex_available: [ "myapex" ],
1870 }
1871
1872 java_library {
1873 name: "bar",
1874 sdk_version: "current",
1875 srcs: ["a.java"],
1876 apex_available: [ "myapex" ],
1877 }
1878 `)
1879}
1880
1881func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1882 ctx, _ := testApex(t, `
1883 apex {
1884 name: "myapex",
1885 key: "myapex.key",
1886 native_shared_libs: ["mylib"],
1887 min_sdk_version: "29",
1888 }
1889
1890 apex_key {
1891 name: "myapex.key",
1892 public_key: "testkey.avbpubkey",
1893 private_key: "testkey.pem",
1894 }
1895
1896 // mylib in myapex will link to mylib2#29
1897 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1898 cc_library {
1899 name: "mylib",
1900 srcs: ["mylib.cpp"],
1901 shared_libs: ["mylib2"],
1902 system_shared_libs: [],
1903 stl: "none",
1904 apex_available: ["myapex", "otherapex"],
1905 min_sdk_version: "29",
1906 }
1907
1908 cc_library {
1909 name: "mylib2",
1910 srcs: ["mylib.cpp"],
1911 system_shared_libs: [],
1912 stl: "none",
1913 apex_available: ["otherapex"],
1914 stubs: { versions: ["29", "30"] },
1915 min_sdk_version: "30",
1916 }
1917
1918 apex {
1919 name: "otherapex",
1920 key: "myapex.key",
1921 native_shared_libs: ["mylib", "mylib2"],
1922 min_sdk_version: "30",
1923 }
1924 `)
1925 expectLink := func(from, from_variant, to, to_variant string) {
1926 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1927 libFlags := ld.Args["libFlags"]
1928 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1929 }
1930 expectLink("mylib", "shared_myapex", "mylib2", "shared_29")
1931 expectLink("mylib", "shared_otherapex", "mylib2", "shared_otherapex")
1932}
1933
Jiyong Park7c2ee712018-12-07 00:42:25 +09001934func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001935 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001936 apex {
1937 name: "myapex",
1938 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001939 native_shared_libs: ["mylib"],
1940 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001941 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001942 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001943 }
1944
1945 apex_key {
1946 name: "myapex.key",
1947 public_key: "testkey.avbpubkey",
1948 private_key: "testkey.pem",
1949 }
1950
1951 prebuilt_etc {
1952 name: "myetc",
1953 src: "myprebuilt",
1954 sub_dir: "foo/bar",
1955 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001956
1957 cc_library {
1958 name: "mylib",
1959 srcs: ["mylib.cpp"],
1960 relative_install_path: "foo/bar",
1961 system_shared_libs: [],
1962 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001963 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001964 }
1965
1966 cc_binary {
1967 name: "mybin",
1968 srcs: ["mylib.cpp"],
1969 relative_install_path: "foo/bar",
1970 system_shared_libs: [],
1971 static_executable: true,
1972 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001973 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001974 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001975 `)
1976
Sundong Ahnabb64432019-10-22 13:58:29 +09001977 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001978 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1979
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001980 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001981 ensureListContains(t, dirs, "etc")
1982 ensureListContains(t, dirs, "etc/foo")
1983 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001984 ensureListContains(t, dirs, "lib64")
1985 ensureListContains(t, dirs, "lib64/foo")
1986 ensureListContains(t, dirs, "lib64/foo/bar")
1987 ensureListContains(t, dirs, "lib")
1988 ensureListContains(t, dirs, "lib/foo")
1989 ensureListContains(t, dirs, "lib/foo/bar")
1990
Jiyong Parkbd13e442019-03-15 18:10:35 +09001991 ensureListContains(t, dirs, "bin")
1992 ensureListContains(t, dirs, "bin/foo")
1993 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001994}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001995
Jooyung Han35155c42020-02-06 17:33:20 +09001996func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1997 ctx, _ := testApex(t, `
1998 apex {
1999 name: "myapex",
2000 key: "myapex.key",
2001 multilib: {
2002 both: {
2003 native_shared_libs: ["mylib"],
2004 binaries: ["mybin"],
2005 },
2006 },
2007 compile_multilib: "both",
2008 native_bridge_supported: true,
2009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
2017 cc_library {
2018 name: "mylib",
2019 relative_install_path: "foo/bar",
2020 system_shared_libs: [],
2021 stl: "none",
2022 apex_available: [ "myapex" ],
2023 native_bridge_supported: true,
2024 }
2025
2026 cc_binary {
2027 name: "mybin",
2028 relative_install_path: "foo/bar",
2029 system_shared_libs: [],
2030 static_executable: true,
2031 stl: "none",
2032 apex_available: [ "myapex" ],
2033 native_bridge_supported: true,
2034 compile_multilib: "both", // default is "first" for binary
2035 multilib: {
2036 lib64: {
2037 suffix: "64",
2038 },
2039 },
2040 }
2041 `, withNativeBridgeEnabled)
2042 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2043 "bin/foo/bar/mybin",
2044 "bin/foo/bar/mybin64",
2045 "bin/arm/foo/bar/mybin",
2046 "bin/arm64/foo/bar/mybin64",
2047 "lib/foo/bar/mylib.so",
2048 "lib/arm/foo/bar/mylib.so",
2049 "lib64/foo/bar/mylib.so",
2050 "lib64/arm64/foo/bar/mylib.so",
2051 })
2052}
2053
Jiyong Parkda6eb592018-12-19 17:12:36 +09002054func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002055 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002056 apex {
2057 name: "myapex",
2058 key: "myapex.key",
2059 native_shared_libs: ["mylib"],
2060 use_vendor: true,
2061 }
2062
2063 apex_key {
2064 name: "myapex.key",
2065 public_key: "testkey.avbpubkey",
2066 private_key: "testkey.pem",
2067 }
2068
2069 cc_library {
2070 name: "mylib",
2071 srcs: ["mylib.cpp"],
2072 shared_libs: ["mylib2"],
2073 system_shared_libs: [],
2074 vendor_available: true,
2075 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002076 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002077 }
2078
2079 cc_library {
2080 name: "mylib2",
2081 srcs: ["mylib.cpp"],
2082 system_shared_libs: [],
2083 vendor_available: true,
2084 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002085 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002086 }
Jooyung Handc782442019-11-01 03:14:38 +09002087 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002088 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002089 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002090
2091 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002092 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002093 for _, implicit := range i.Implicits {
2094 inputsList = append(inputsList, implicit.String())
2095 }
2096 }
2097 inputsString := strings.Join(inputsList, " ")
2098
2099 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08002100 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
2101 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002102
2103 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08002104 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
2105 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002106}
Jiyong Park16e91a02018-12-20 18:18:08 +09002107
Jooyung Han85d61762020-06-24 23:50:26 +09002108func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002109 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2110 apex {
2111 name: "myapex",
2112 key: "myapex.key",
2113 use_vendor: true,
2114 }
2115 apex_key {
2116 name: "myapex.key",
2117 public_key: "testkey.avbpubkey",
2118 private_key: "testkey.pem",
2119 }
2120 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002121 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002122 })
Colin Cross440e0d02020-06-11 11:32:11 -07002123 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002124 testApex(t, `
2125 apex {
2126 name: "myapex",
2127 key: "myapex.key",
2128 use_vendor: true,
2129 }
2130 apex_key {
2131 name: "myapex.key",
2132 public_key: "testkey.avbpubkey",
2133 private_key: "testkey.pem",
2134 }
2135 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002136 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002137 })
2138}
2139
Jooyung Han5c998b92019-06-27 11:30:33 +09002140func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2141 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2142 apex {
2143 name: "myapex",
2144 key: "myapex.key",
2145 native_shared_libs: ["mylib"],
2146 use_vendor: true,
2147 }
2148
2149 apex_key {
2150 name: "myapex.key",
2151 public_key: "testkey.avbpubkey",
2152 private_key: "testkey.pem",
2153 }
2154
2155 cc_library {
2156 name: "mylib",
2157 srcs: ["mylib.cpp"],
2158 system_shared_libs: [],
2159 stl: "none",
2160 }
2161 `)
2162}
2163
Jooyung Han85d61762020-06-24 23:50:26 +09002164func TestVendorApex(t *testing.T) {
2165 ctx, config := testApex(t, `
2166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 binaries: ["mybin"],
2170 vendor: true,
2171 }
2172 apex_key {
2173 name: "myapex.key",
2174 public_key: "testkey.avbpubkey",
2175 private_key: "testkey.pem",
2176 }
2177 cc_binary {
2178 name: "mybin",
2179 vendor: true,
2180 shared_libs: ["libfoo"],
2181 }
2182 cc_library {
2183 name: "libfoo",
2184 proprietary: true,
2185 }
2186 `)
2187
2188 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2189 "bin/mybin",
2190 "lib64/libfoo.so",
2191 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2192 "lib64/libc++.so",
2193 })
2194
2195 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2196 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2197 name := apexBundle.BaseModuleName()
2198 prefix := "TARGET_"
2199 var builder strings.Builder
2200 data.Custom(&builder, name, prefix, "", data)
2201 androidMk := builder.String()
2202 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
2203}
2204
Jooyung Han2ed99d02020-06-24 23:26:26 +09002205func TestAndroidMkWritesCommonProperties(t *testing.T) {
2206 ctx, config := testApex(t, `
2207 apex {
2208 name: "myapex",
2209 key: "myapex.key",
2210 vintf_fragments: ["fragment.xml"],
2211 init_rc: ["init.rc"],
2212 }
2213 apex_key {
2214 name: "myapex.key",
2215 public_key: "testkey.avbpubkey",
2216 private_key: "testkey.pem",
2217 }
2218 cc_binary {
2219 name: "mybin",
2220 }
2221 `)
2222
2223 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2224 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2225 name := apexBundle.BaseModuleName()
2226 prefix := "TARGET_"
2227 var builder strings.Builder
2228 data.Custom(&builder, name, prefix, "", data)
2229 androidMk := builder.String()
2230 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2231 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2232}
2233
Jiyong Park16e91a02018-12-20 18:18:08 +09002234func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002235 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002236 apex {
2237 name: "myapex",
2238 key: "myapex.key",
2239 native_shared_libs: ["mylib"],
2240 }
2241
2242 apex_key {
2243 name: "myapex.key",
2244 public_key: "testkey.avbpubkey",
2245 private_key: "testkey.pem",
2246 }
2247
2248 cc_library {
2249 name: "mylib",
2250 srcs: ["mylib.cpp"],
2251 system_shared_libs: [],
2252 stl: "none",
2253 stubs: {
2254 versions: ["1", "2", "3"],
2255 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002256 apex_available: [
2257 "//apex_available:platform",
2258 "myapex",
2259 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002260 }
2261
2262 cc_binary {
2263 name: "not_in_apex",
2264 srcs: ["mylib.cpp"],
2265 static_libs: ["mylib"],
2266 static_executable: true,
2267 system_shared_libs: [],
2268 stl: "none",
2269 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002270 `)
2271
Colin Cross7113d202019-11-20 16:39:12 -08002272 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002273
2274 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002275 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002276}
Jiyong Park9335a262018-12-24 11:31:58 +09002277
2278func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002279 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002280 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002281 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002282 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002283 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002284 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002285 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002286 }
2287
2288 cc_library {
2289 name: "mylib",
2290 srcs: ["mylib.cpp"],
2291 system_shared_libs: [],
2292 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002293 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002294 }
2295
2296 apex_key {
2297 name: "myapex.key",
2298 public_key: "testkey.avbpubkey",
2299 private_key: "testkey.pem",
2300 }
2301
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002302 android_app_certificate {
2303 name: "myapex.certificate",
2304 certificate: "testkey",
2305 }
2306
2307 android_app_certificate {
2308 name: "myapex.certificate.override",
2309 certificate: "testkey.override",
2310 }
2311
Jiyong Park9335a262018-12-24 11:31:58 +09002312 `)
2313
2314 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002315 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002316
2317 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2318 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2319 "vendor/foo/devkeys/testkey.avbpubkey")
2320 }
2321 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2322 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2323 "vendor/foo/devkeys/testkey.pem")
2324 }
2325
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002326 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002327 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002328 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002329 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002330 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002331 }
2332}
Jiyong Park58e364a2019-01-19 19:24:06 +09002333
Jooyung Hanf121a652019-12-17 14:30:11 +09002334func TestCertificate(t *testing.T) {
2335 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2336 ctx, _ := testApex(t, `
2337 apex {
2338 name: "myapex",
2339 key: "myapex.key",
2340 }
2341 apex_key {
2342 name: "myapex.key",
2343 public_key: "testkey.avbpubkey",
2344 private_key: "testkey.pem",
2345 }`)
2346 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2347 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2348 if actual := rule.Args["certificates"]; actual != expected {
2349 t.Errorf("certificates should be %q, not %q", expected, actual)
2350 }
2351 })
2352 t.Run("override when unspecified", func(t *testing.T) {
2353 ctx, _ := testApex(t, `
2354 apex {
2355 name: "myapex_keytest",
2356 key: "myapex.key",
2357 file_contexts: ":myapex-file_contexts",
2358 }
2359 apex_key {
2360 name: "myapex.key",
2361 public_key: "testkey.avbpubkey",
2362 private_key: "testkey.pem",
2363 }
2364 android_app_certificate {
2365 name: "myapex.certificate.override",
2366 certificate: "testkey.override",
2367 }`)
2368 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2369 expected := "testkey.override.x509.pem testkey.override.pk8"
2370 if actual := rule.Args["certificates"]; actual != expected {
2371 t.Errorf("certificates should be %q, not %q", expected, actual)
2372 }
2373 })
2374 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2375 ctx, _ := testApex(t, `
2376 apex {
2377 name: "myapex",
2378 key: "myapex.key",
2379 certificate: ":myapex.certificate",
2380 }
2381 apex_key {
2382 name: "myapex.key",
2383 public_key: "testkey.avbpubkey",
2384 private_key: "testkey.pem",
2385 }
2386 android_app_certificate {
2387 name: "myapex.certificate",
2388 certificate: "testkey",
2389 }`)
2390 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2391 expected := "testkey.x509.pem testkey.pk8"
2392 if actual := rule.Args["certificates"]; actual != expected {
2393 t.Errorf("certificates should be %q, not %q", expected, actual)
2394 }
2395 })
2396 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2397 ctx, _ := testApex(t, `
2398 apex {
2399 name: "myapex_keytest",
2400 key: "myapex.key",
2401 file_contexts: ":myapex-file_contexts",
2402 certificate: ":myapex.certificate",
2403 }
2404 apex_key {
2405 name: "myapex.key",
2406 public_key: "testkey.avbpubkey",
2407 private_key: "testkey.pem",
2408 }
2409 android_app_certificate {
2410 name: "myapex.certificate.override",
2411 certificate: "testkey.override",
2412 }`)
2413 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2414 expected := "testkey.override.x509.pem testkey.override.pk8"
2415 if actual := rule.Args["certificates"]; actual != expected {
2416 t.Errorf("certificates should be %q, not %q", expected, actual)
2417 }
2418 })
2419 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2420 ctx, _ := testApex(t, `
2421 apex {
2422 name: "myapex",
2423 key: "myapex.key",
2424 certificate: "testkey",
2425 }
2426 apex_key {
2427 name: "myapex.key",
2428 public_key: "testkey.avbpubkey",
2429 private_key: "testkey.pem",
2430 }`)
2431 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2432 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2433 if actual := rule.Args["certificates"]; actual != expected {
2434 t.Errorf("certificates should be %q, not %q", expected, actual)
2435 }
2436 })
2437 t.Run("override when specified as <name>", func(t *testing.T) {
2438 ctx, _ := testApex(t, `
2439 apex {
2440 name: "myapex_keytest",
2441 key: "myapex.key",
2442 file_contexts: ":myapex-file_contexts",
2443 certificate: "testkey",
2444 }
2445 apex_key {
2446 name: "myapex.key",
2447 public_key: "testkey.avbpubkey",
2448 private_key: "testkey.pem",
2449 }
2450 android_app_certificate {
2451 name: "myapex.certificate.override",
2452 certificate: "testkey.override",
2453 }`)
2454 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2455 expected := "testkey.override.x509.pem testkey.override.pk8"
2456 if actual := rule.Args["certificates"]; actual != expected {
2457 t.Errorf("certificates should be %q, not %q", expected, actual)
2458 }
2459 })
2460}
2461
Jiyong Park58e364a2019-01-19 19:24:06 +09002462func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002463 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002464 apex {
2465 name: "myapex",
2466 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002467 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002468 }
2469
2470 apex {
2471 name: "otherapex",
2472 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002473 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002474 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002475 }
2476
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482
2483 cc_library {
2484 name: "mylib",
2485 srcs: ["mylib.cpp"],
2486 system_shared_libs: [],
2487 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002488 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002489 "myapex",
2490 "otherapex",
2491 ],
Jooyung Han24282772020-03-21 23:20:55 +09002492 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002493 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002494 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002495 cc_library {
2496 name: "mylib2",
2497 srcs: ["mylib.cpp"],
2498 system_shared_libs: [],
2499 stl: "none",
2500 apex_available: [
2501 "myapex",
2502 "otherapex",
2503 ],
2504 use_apex_name_macro: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002505 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002506 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002507 `)
2508
Jooyung Hanc87a0592020-03-02 17:44:33 +09002509 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002510 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002511 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002512 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002513
Jooyung Hanccce2f22020-03-07 03:45:53 +09002514 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002515 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2516 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002517 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002519
Jooyung Hanccce2f22020-03-07 03:45:53 +09002520 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002521 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2522 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002523 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002524 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002525
Jooyung Hanc87a0592020-03-02 17:44:33 +09002526 // When cc_library sets use_apex_name_macro: true
2527 // apex variants define additional macro to distinguish which apex variant it is built for
2528
2529 // non-APEX variant does not have __ANDROID_APEX__ defined
2530 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2531 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2532
2533 // APEX variant has __ANDROID_APEX__ defined
2534 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002535 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002536 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2537 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002538
Jooyung Hanc87a0592020-03-02 17:44:33 +09002539 // APEX variant has __ANDROID_APEX__ defined
2540 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002541 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002542 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2543 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002544
2545 // recovery variant does not set __ANDROID_SDK_VERSION__
2546 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2547 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2548 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002549}
Jiyong Park7e636d02019-01-28 16:16:54 +09002550
2551func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002552 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002553 apex {
2554 name: "myapex",
2555 key: "myapex.key",
2556 native_shared_libs: ["mylib"],
2557 }
2558
2559 apex_key {
2560 name: "myapex.key",
2561 public_key: "testkey.avbpubkey",
2562 private_key: "testkey.pem",
2563 }
2564
2565 cc_library_headers {
2566 name: "mylib_headers",
2567 export_include_dirs: ["my_include"],
2568 system_shared_libs: [],
2569 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002570 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002571 }
2572
2573 cc_library {
2574 name: "mylib",
2575 srcs: ["mylib.cpp"],
2576 system_shared_libs: [],
2577 stl: "none",
2578 header_libs: ["mylib_headers"],
2579 export_header_lib_headers: ["mylib_headers"],
2580 stubs: {
2581 versions: ["1", "2", "3"],
2582 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002583 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002584 }
2585
2586 cc_library {
2587 name: "otherlib",
2588 srcs: ["mylib.cpp"],
2589 system_shared_libs: [],
2590 stl: "none",
2591 shared_libs: ["mylib"],
2592 }
2593 `)
2594
Colin Cross7113d202019-11-20 16:39:12 -08002595 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002596
2597 // Ensure that the include path of the header lib is exported to 'otherlib'
2598 ensureContains(t, cFlags, "-Imy_include")
2599}
Alex Light9670d332019-01-29 18:07:33 -08002600
Jiyong Park7cd10e32020-01-14 09:22:18 +09002601type fileInApex struct {
2602 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002603 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002604 isLink bool
2605}
2606
Jooyung Hana57af4a2020-01-23 05:36:59 +00002607func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002608 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002609 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002610 copyCmds := apexRule.Args["copy_commands"]
2611 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002612 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002613 for _, cmd := range strings.Split(copyCmds, "&&") {
2614 cmd = strings.TrimSpace(cmd)
2615 if cmd == "" {
2616 continue
2617 }
2618 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002619 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002620 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002621 switch terms[0] {
2622 case "mkdir":
2623 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002624 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002625 t.Fatal("copyCmds contains invalid cp command", cmd)
2626 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002627 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002628 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002629 isLink = false
2630 case "ln":
2631 if len(terms) != 3 && len(terms) != 4 {
2632 // ln LINK TARGET or ln -s LINK TARGET
2633 t.Fatal("copyCmds contains invalid ln command", cmd)
2634 }
2635 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002636 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002637 isLink = true
2638 default:
2639 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2640 }
2641 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002642 index := strings.Index(dst, imageApexDir)
2643 if index == -1 {
2644 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2645 }
2646 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002647 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002648 }
2649 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002650 return ret
2651}
2652
Jooyung Hana57af4a2020-01-23 05:36:59 +00002653func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2654 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002655 var failed bool
2656 var surplus []string
2657 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002658 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002659 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002660 for _, expected := range files {
2661 if matched, _ := path.Match(expected, file.path); matched {
2662 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002663 mactchFound = true
2664 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002665 }
2666 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002667 if !mactchFound {
2668 surplus = append(surplus, file.path)
2669 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002670 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002671
Jooyung Han31c470b2019-10-18 16:26:59 +09002672 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002673 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002674 t.Log("surplus files", surplus)
2675 failed = true
2676 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002677
2678 if len(files) > len(filesMatched) {
2679 var missing []string
2680 for _, expected := range files {
2681 if !filesMatched[expected] {
2682 missing = append(missing, expected)
2683 }
2684 }
2685 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002686 t.Log("missing files", missing)
2687 failed = true
2688 }
2689 if failed {
2690 t.Fail()
2691 }
2692}
2693
Jooyung Han344d5432019-08-23 11:17:39 +09002694func TestVndkApexCurrent(t *testing.T) {
2695 ctx, _ := testApex(t, `
2696 apex_vndk {
2697 name: "myapex",
2698 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002699 }
2700
2701 apex_key {
2702 name: "myapex.key",
2703 public_key: "testkey.avbpubkey",
2704 private_key: "testkey.pem",
2705 }
2706
2707 cc_library {
2708 name: "libvndk",
2709 srcs: ["mylib.cpp"],
2710 vendor_available: true,
2711 vndk: {
2712 enabled: true,
2713 },
2714 system_shared_libs: [],
2715 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002716 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002717 }
2718
2719 cc_library {
2720 name: "libvndksp",
2721 srcs: ["mylib.cpp"],
2722 vendor_available: true,
2723 vndk: {
2724 enabled: true,
2725 support_system_process: true,
2726 },
2727 system_shared_libs: [],
2728 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002729 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002730 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002731 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002732
Jooyung Hana57af4a2020-01-23 05:36:59 +00002733 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002734 "lib/libvndk.so",
2735 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002736 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002737 "lib64/libvndk.so",
2738 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002739 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002740 "etc/llndk.libraries.VER.txt",
2741 "etc/vndkcore.libraries.VER.txt",
2742 "etc/vndksp.libraries.VER.txt",
2743 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002744 })
Jooyung Han344d5432019-08-23 11:17:39 +09002745}
2746
2747func TestVndkApexWithPrebuilt(t *testing.T) {
2748 ctx, _ := testApex(t, `
2749 apex_vndk {
2750 name: "myapex",
2751 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002752 }
2753
2754 apex_key {
2755 name: "myapex.key",
2756 public_key: "testkey.avbpubkey",
2757 private_key: "testkey.pem",
2758 }
2759
2760 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002761 name: "libvndk",
2762 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002763 vendor_available: true,
2764 vndk: {
2765 enabled: true,
2766 },
2767 system_shared_libs: [],
2768 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002769 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002770 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002771
2772 cc_prebuilt_library_shared {
2773 name: "libvndk.arm",
2774 srcs: ["libvndk.arm.so"],
2775 vendor_available: true,
2776 vndk: {
2777 enabled: true,
2778 },
2779 enabled: false,
2780 arch: {
2781 arm: {
2782 enabled: true,
2783 },
2784 },
2785 system_shared_libs: [],
2786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002787 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002788 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002789 `+vndkLibrariesTxtFiles("current"),
2790 withFiles(map[string][]byte{
2791 "libvndk.so": nil,
2792 "libvndk.arm.so": nil,
2793 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002794
Jooyung Hana57af4a2020-01-23 05:36:59 +00002795 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002796 "lib/libvndk.so",
2797 "lib/libvndk.arm.so",
2798 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002799 "lib/libc++.so",
2800 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002801 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002802 })
Jooyung Han344d5432019-08-23 11:17:39 +09002803}
2804
Jooyung Han39edb6c2019-11-06 16:53:07 +09002805func vndkLibrariesTxtFiles(vers ...string) (result string) {
2806 for _, v := range vers {
2807 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002808 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002809 result += `
2810 vndk_libraries_txt {
2811 name: "` + txt + `.libraries.txt",
2812 }
2813 `
2814 }
2815 } else {
2816 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2817 result += `
2818 prebuilt_etc {
2819 name: "` + txt + `.libraries.` + v + `.txt",
2820 src: "dummy.txt",
2821 }
2822 `
2823 }
2824 }
2825 }
2826 return
2827}
2828
Jooyung Han344d5432019-08-23 11:17:39 +09002829func TestVndkApexVersion(t *testing.T) {
2830 ctx, _ := testApex(t, `
2831 apex_vndk {
2832 name: "myapex_v27",
2833 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002834 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002835 vndk_version: "27",
2836 }
2837
2838 apex_key {
2839 name: "myapex.key",
2840 public_key: "testkey.avbpubkey",
2841 private_key: "testkey.pem",
2842 }
2843
Jooyung Han31c470b2019-10-18 16:26:59 +09002844 vndk_prebuilt_shared {
2845 name: "libvndk27",
2846 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002847 vendor_available: true,
2848 vndk: {
2849 enabled: true,
2850 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002851 target_arch: "arm64",
2852 arch: {
2853 arm: {
2854 srcs: ["libvndk27_arm.so"],
2855 },
2856 arm64: {
2857 srcs: ["libvndk27_arm64.so"],
2858 },
2859 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002860 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002861 }
2862
2863 vndk_prebuilt_shared {
2864 name: "libvndk27",
2865 version: "27",
2866 vendor_available: true,
2867 vndk: {
2868 enabled: true,
2869 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002870 target_arch: "x86_64",
2871 arch: {
2872 x86: {
2873 srcs: ["libvndk27_x86.so"],
2874 },
2875 x86_64: {
2876 srcs: ["libvndk27_x86_64.so"],
2877 },
2878 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002879 }
2880 `+vndkLibrariesTxtFiles("27"),
2881 withFiles(map[string][]byte{
2882 "libvndk27_arm.so": nil,
2883 "libvndk27_arm64.so": nil,
2884 "libvndk27_x86.so": nil,
2885 "libvndk27_x86_64.so": nil,
2886 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002887
Jooyung Hana57af4a2020-01-23 05:36:59 +00002888 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002889 "lib/libvndk27_arm.so",
2890 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002891 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002892 })
Jooyung Han344d5432019-08-23 11:17:39 +09002893}
2894
2895func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2896 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2897 apex_vndk {
2898 name: "myapex_v27",
2899 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002900 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002901 vndk_version: "27",
2902 }
2903 apex_vndk {
2904 name: "myapex_v27_other",
2905 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002906 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002907 vndk_version: "27",
2908 }
2909
2910 apex_key {
2911 name: "myapex.key",
2912 public_key: "testkey.avbpubkey",
2913 private_key: "testkey.pem",
2914 }
2915
2916 cc_library {
2917 name: "libvndk",
2918 srcs: ["mylib.cpp"],
2919 vendor_available: true,
2920 vndk: {
2921 enabled: true,
2922 },
2923 system_shared_libs: [],
2924 stl: "none",
2925 }
2926
2927 vndk_prebuilt_shared {
2928 name: "libvndk",
2929 version: "27",
2930 vendor_available: true,
2931 vndk: {
2932 enabled: true,
2933 },
2934 srcs: ["libvndk.so"],
2935 }
2936 `, withFiles(map[string][]byte{
2937 "libvndk.so": nil,
2938 }))
2939}
2940
Jooyung Han90eee022019-10-01 20:02:42 +09002941func TestVndkApexNameRule(t *testing.T) {
2942 ctx, _ := testApex(t, `
2943 apex_vndk {
2944 name: "myapex",
2945 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002946 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002947 }
2948 apex_vndk {
2949 name: "myapex_v28",
2950 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002951 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002952 vndk_version: "28",
2953 }
2954 apex_key {
2955 name: "myapex.key",
2956 public_key: "testkey.avbpubkey",
2957 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002958 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002959
2960 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002961 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002962 actual := proptools.String(bundle.properties.Apex_name)
2963 if !reflect.DeepEqual(actual, expected) {
2964 t.Errorf("Got '%v', expected '%v'", actual, expected)
2965 }
2966 }
2967
2968 assertApexName("com.android.vndk.vVER", "myapex")
2969 assertApexName("com.android.vndk.v28", "myapex_v28")
2970}
2971
Jooyung Han344d5432019-08-23 11:17:39 +09002972func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2973 ctx, _ := testApex(t, `
2974 apex_vndk {
2975 name: "myapex",
2976 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002977 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "libvndk",
2988 srcs: ["mylib.cpp"],
2989 vendor_available: true,
2990 native_bridge_supported: true,
2991 host_supported: true,
2992 vndk: {
2993 enabled: true,
2994 },
2995 system_shared_libs: [],
2996 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002997 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002998 }
Jooyung Han35155c42020-02-06 17:33:20 +09002999 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003000
Jooyung Hana57af4a2020-01-23 05:36:59 +00003001 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003002 "lib/libvndk.so",
3003 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003004 "lib/libc++.so",
3005 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003006 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003007 })
Jooyung Han344d5432019-08-23 11:17:39 +09003008}
3009
3010func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3011 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3012 apex_vndk {
3013 name: "myapex",
3014 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003015 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003016 native_bridge_supported: true,
3017 }
3018
3019 apex_key {
3020 name: "myapex.key",
3021 public_key: "testkey.avbpubkey",
3022 private_key: "testkey.pem",
3023 }
3024
3025 cc_library {
3026 name: "libvndk",
3027 srcs: ["mylib.cpp"],
3028 vendor_available: true,
3029 native_bridge_supported: true,
3030 host_supported: true,
3031 vndk: {
3032 enabled: true,
3033 },
3034 system_shared_libs: [],
3035 stl: "none",
3036 }
3037 `)
3038}
3039
Jooyung Han31c470b2019-10-18 16:26:59 +09003040func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003041 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003042 apex_vndk {
3043 name: "myapex_v27",
3044 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003045 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003046 vndk_version: "27",
3047 }
3048
3049 apex_key {
3050 name: "myapex.key",
3051 public_key: "testkey.avbpubkey",
3052 private_key: "testkey.pem",
3053 }
3054
3055 vndk_prebuilt_shared {
3056 name: "libvndk27",
3057 version: "27",
3058 target_arch: "arm",
3059 vendor_available: true,
3060 vndk: {
3061 enabled: true,
3062 },
3063 arch: {
3064 arm: {
3065 srcs: ["libvndk27.so"],
3066 }
3067 },
3068 }
3069
3070 vndk_prebuilt_shared {
3071 name: "libvndk27",
3072 version: "27",
3073 target_arch: "arm",
3074 binder32bit: true,
3075 vendor_available: true,
3076 vndk: {
3077 enabled: true,
3078 },
3079 arch: {
3080 arm: {
3081 srcs: ["libvndk27binder32.so"],
3082 }
3083 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003084 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003085 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003086 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003087 withFiles(map[string][]byte{
3088 "libvndk27.so": nil,
3089 "libvndk27binder32.so": nil,
3090 }),
3091 withBinder32bit,
3092 withTargets(map[android.OsType][]android.Target{
3093 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003094 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3095 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003096 },
3097 }),
3098 )
3099
Jooyung Hana57af4a2020-01-23 05:36:59 +00003100 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003101 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003102 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003103 })
3104}
3105
Jooyung Han45a96772020-06-15 14:59:42 +09003106func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3107 ctx, _ := testApex(t, `
3108 apex_vndk {
3109 name: "myapex",
3110 key: "myapex.key",
3111 file_contexts: ":myapex-file_contexts",
3112 }
3113
3114 apex_key {
3115 name: "myapex.key",
3116 public_key: "testkey.avbpubkey",
3117 private_key: "testkey.pem",
3118 }
3119
3120 cc_library {
3121 name: "libz",
3122 vendor_available: true,
3123 vndk: {
3124 enabled: true,
3125 },
3126 stubs: {
3127 symbol_file: "libz.map.txt",
3128 versions: ["30"],
3129 }
3130 }
3131 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3132 "libz.map.txt": nil,
3133 }))
3134
3135 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3136 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3137 ensureListEmpty(t, provideNativeLibs)
3138}
3139
Jooyung Hane1633032019-08-01 17:41:43 +09003140func TestDependenciesInApexManifest(t *testing.T) {
3141 ctx, _ := testApex(t, `
3142 apex {
3143 name: "myapex_nodep",
3144 key: "myapex.key",
3145 native_shared_libs: ["lib_nodep"],
3146 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003147 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003148 }
3149
3150 apex {
3151 name: "myapex_dep",
3152 key: "myapex.key",
3153 native_shared_libs: ["lib_dep"],
3154 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003155 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003156 }
3157
3158 apex {
3159 name: "myapex_provider",
3160 key: "myapex.key",
3161 native_shared_libs: ["libfoo"],
3162 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003163 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003164 }
3165
3166 apex {
3167 name: "myapex_selfcontained",
3168 key: "myapex.key",
3169 native_shared_libs: ["lib_dep", "libfoo"],
3170 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003171 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003172 }
3173
3174 apex_key {
3175 name: "myapex.key",
3176 public_key: "testkey.avbpubkey",
3177 private_key: "testkey.pem",
3178 }
3179
3180 cc_library {
3181 name: "lib_nodep",
3182 srcs: ["mylib.cpp"],
3183 system_shared_libs: [],
3184 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003185 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003186 }
3187
3188 cc_library {
3189 name: "lib_dep",
3190 srcs: ["mylib.cpp"],
3191 shared_libs: ["libfoo"],
3192 system_shared_libs: [],
3193 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003194 apex_available: [
3195 "myapex_dep",
3196 "myapex_provider",
3197 "myapex_selfcontained",
3198 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003199 }
3200
3201 cc_library {
3202 name: "libfoo",
3203 srcs: ["mytest.cpp"],
3204 stubs: {
3205 versions: ["1"],
3206 },
3207 system_shared_libs: [],
3208 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003209 apex_available: [
3210 "myapex_provider",
3211 "myapex_selfcontained",
3212 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003213 }
3214 `)
3215
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003216 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003217 var provideNativeLibs, requireNativeLibs []string
3218
Sundong Ahnabb64432019-10-22 13:58:29 +09003219 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003220 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3221 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003222 ensureListEmpty(t, provideNativeLibs)
3223 ensureListEmpty(t, requireNativeLibs)
3224
Sundong Ahnabb64432019-10-22 13:58:29 +09003225 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003226 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3227 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003228 ensureListEmpty(t, provideNativeLibs)
3229 ensureListContains(t, requireNativeLibs, "libfoo.so")
3230
Sundong Ahnabb64432019-10-22 13:58:29 +09003231 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003232 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3233 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003234 ensureListContains(t, provideNativeLibs, "libfoo.so")
3235 ensureListEmpty(t, requireNativeLibs)
3236
Sundong Ahnabb64432019-10-22 13:58:29 +09003237 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003238 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3239 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003240 ensureListContains(t, provideNativeLibs, "libfoo.so")
3241 ensureListEmpty(t, requireNativeLibs)
3242}
3243
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003244func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003245 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003246 apex {
3247 name: "myapex",
3248 key: "myapex.key",
3249 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003250 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003251 }
3252
3253 apex_key {
3254 name: "myapex.key",
3255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003258
3259 cc_library {
3260 name: "mylib",
3261 srcs: ["mylib.cpp"],
3262 system_shared_libs: [],
3263 stl: "none",
3264 apex_available: [
3265 "//apex_available:platform",
3266 "myapex",
3267 ],
3268 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003269 `)
3270
Sundong Ahnabb64432019-10-22 13:58:29 +09003271 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003272 apexManifestRule := module.Rule("apexManifestRule")
3273 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3274 apexRule := module.Rule("apexRule")
3275 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003276
3277 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3278 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3279 name := apexBundle.BaseModuleName()
3280 prefix := "TARGET_"
3281 var builder strings.Builder
3282 data.Custom(&builder, name, prefix, "", data)
3283 androidMk := builder.String()
3284 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3285 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003286}
3287
Alex Light0851b882019-02-07 13:20:53 -08003288func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003289 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003290 apex {
3291 name: "myapex",
3292 key: "myapex.key",
3293 native_shared_libs: ["mylib_common"],
3294 }
3295
3296 apex_key {
3297 name: "myapex.key",
3298 public_key: "testkey.avbpubkey",
3299 private_key: "testkey.pem",
3300 }
3301
3302 cc_library {
3303 name: "mylib_common",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003307 apex_available: [
3308 "//apex_available:platform",
3309 "myapex",
3310 ],
Alex Light0851b882019-02-07 13:20:53 -08003311 }
3312 `)
3313
Sundong Ahnabb64432019-10-22 13:58:29 +09003314 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003315 apexRule := module.Rule("apexRule")
3316 copyCmds := apexRule.Args["copy_commands"]
3317
3318 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3319 t.Log("Apex was a test apex!")
3320 t.Fail()
3321 }
3322 // Ensure that main rule creates an output
3323 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3324
3325 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003326 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003327
3328 // Ensure that both direct and indirect deps are copied into apex
3329 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3330
Colin Cross7113d202019-11-20 16:39:12 -08003331 // Ensure that the platform variant ends with _shared
3332 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003333
3334 if !android.InAnyApex("mylib_common") {
3335 t.Log("Found mylib_common not in any apex!")
3336 t.Fail()
3337 }
3338}
3339
3340func TestTestApex(t *testing.T) {
3341 if android.InAnyApex("mylib_common_test") {
3342 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!")
3343 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003344 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003345 apex_test {
3346 name: "myapex",
3347 key: "myapex.key",
3348 native_shared_libs: ["mylib_common_test"],
3349 }
3350
3351 apex_key {
3352 name: "myapex.key",
3353 public_key: "testkey.avbpubkey",
3354 private_key: "testkey.pem",
3355 }
3356
3357 cc_library {
3358 name: "mylib_common_test",
3359 srcs: ["mylib.cpp"],
3360 system_shared_libs: [],
3361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003362 // TODO: remove //apex_available:platform
3363 apex_available: [
3364 "//apex_available:platform",
3365 "myapex",
3366 ],
Alex Light0851b882019-02-07 13:20:53 -08003367 }
3368 `)
3369
Sundong Ahnabb64432019-10-22 13:58:29 +09003370 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003371 apexRule := module.Rule("apexRule")
3372 copyCmds := apexRule.Args["copy_commands"]
3373
3374 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3375 t.Log("Apex was not a test apex!")
3376 t.Fail()
3377 }
3378 // Ensure that main rule creates an output
3379 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3380
3381 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003382 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003383
3384 // Ensure that both direct and indirect deps are copied into apex
3385 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3386
Colin Cross7113d202019-11-20 16:39:12 -08003387 // Ensure that the platform variant ends with _shared
3388 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003389}
3390
Alex Light9670d332019-01-29 18:07:33 -08003391func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003392 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003393 apex {
3394 name: "myapex",
3395 key: "myapex.key",
3396 multilib: {
3397 first: {
3398 native_shared_libs: ["mylib_common"],
3399 }
3400 },
3401 target: {
3402 android: {
3403 multilib: {
3404 first: {
3405 native_shared_libs: ["mylib"],
3406 }
3407 }
3408 },
3409 host: {
3410 multilib: {
3411 first: {
3412 native_shared_libs: ["mylib2"],
3413 }
3414 }
3415 }
3416 }
3417 }
3418
3419 apex_key {
3420 name: "myapex.key",
3421 public_key: "testkey.avbpubkey",
3422 private_key: "testkey.pem",
3423 }
3424
3425 cc_library {
3426 name: "mylib",
3427 srcs: ["mylib.cpp"],
3428 system_shared_libs: [],
3429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003430 // TODO: remove //apex_available:platform
3431 apex_available: [
3432 "//apex_available:platform",
3433 "myapex",
3434 ],
Alex Light9670d332019-01-29 18:07:33 -08003435 }
3436
3437 cc_library {
3438 name: "mylib_common",
3439 srcs: ["mylib.cpp"],
3440 system_shared_libs: [],
3441 stl: "none",
3442 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003443 // TODO: remove //apex_available:platform
3444 apex_available: [
3445 "//apex_available:platform",
3446 "myapex",
3447 ],
Alex Light9670d332019-01-29 18:07:33 -08003448 }
3449
3450 cc_library {
3451 name: "mylib2",
3452 srcs: ["mylib.cpp"],
3453 system_shared_libs: [],
3454 stl: "none",
3455 compile_multilib: "first",
3456 }
3457 `)
3458
Sundong Ahnabb64432019-10-22 13:58:29 +09003459 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003460 copyCmds := apexRule.Args["copy_commands"]
3461
3462 // Ensure that main rule creates an output
3463 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3464
3465 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003466 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3467 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3468 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003469
3470 // Ensure that both direct and indirect deps are copied into apex
3471 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3472 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3473 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3474
Colin Cross7113d202019-11-20 16:39:12 -08003475 // Ensure that the platform variant ends with _shared
3476 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3477 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003479}
Jiyong Park04480cf2019-02-06 00:16:29 +09003480
3481func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003482 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003483 apex {
3484 name: "myapex",
3485 key: "myapex.key",
3486 binaries: ["myscript"],
3487 }
3488
3489 apex_key {
3490 name: "myapex.key",
3491 public_key: "testkey.avbpubkey",
3492 private_key: "testkey.pem",
3493 }
3494
3495 sh_binary {
3496 name: "myscript",
3497 src: "mylib.cpp",
3498 filename: "myscript.sh",
3499 sub_dir: "script",
3500 }
3501 `)
3502
Sundong Ahnabb64432019-10-22 13:58:29 +09003503 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003504 copyCmds := apexRule.Args["copy_commands"]
3505
3506 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3507}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003508
Jooyung Han91df2082019-11-20 01:49:42 +09003509func TestApexInVariousPartition(t *testing.T) {
3510 testcases := []struct {
3511 propName, parition, flattenedPartition string
3512 }{
3513 {"", "system", "system_ext"},
3514 {"product_specific: true", "product", "product"},
3515 {"soc_specific: true", "vendor", "vendor"},
3516 {"proprietary: true", "vendor", "vendor"},
3517 {"vendor: true", "vendor", "vendor"},
3518 {"system_ext_specific: true", "system_ext", "system_ext"},
3519 }
3520 for _, tc := range testcases {
3521 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3522 ctx, _ := testApex(t, `
3523 apex {
3524 name: "myapex",
3525 key: "myapex.key",
3526 `+tc.propName+`
3527 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003528
Jooyung Han91df2082019-11-20 01:49:42 +09003529 apex_key {
3530 name: "myapex.key",
3531 public_key: "testkey.avbpubkey",
3532 private_key: "testkey.pem",
3533 }
3534 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003535
Jooyung Han91df2082019-11-20 01:49:42 +09003536 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3537 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3538 actual := apex.installDir.String()
3539 if actual != expected {
3540 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3541 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003542
Jooyung Han91df2082019-11-20 01:49:42 +09003543 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3544 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3545 actual = flattened.installDir.String()
3546 if actual != expected {
3547 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3548 }
3549 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003550 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003551}
Jiyong Park67882562019-03-21 01:11:21 +09003552
Jooyung Han580eb4f2020-06-24 19:33:06 +09003553func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003554 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003555 apex {
3556 name: "myapex",
3557 key: "myapex.key",
3558 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003559
Jooyung Han580eb4f2020-06-24 19:33:06 +09003560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003565 `)
3566 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003567 rule := module.Output("file_contexts")
3568 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3569}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003570
Jooyung Han580eb4f2020-06-24 19:33:06 +09003571func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003572 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003573 apex {
3574 name: "myapex",
3575 key: "myapex.key",
3576 file_contexts: "my_own_file_contexts",
3577 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003578
Jooyung Han580eb4f2020-06-24 19:33:06 +09003579 apex_key {
3580 name: "myapex.key",
3581 public_key: "testkey.avbpubkey",
3582 private_key: "testkey.pem",
3583 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003584 `, withFiles(map[string][]byte{
3585 "my_own_file_contexts": nil,
3586 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003587}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003588
Jooyung Han580eb4f2020-06-24 19:33:06 +09003589func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003590 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003591 apex {
3592 name: "myapex",
3593 key: "myapex.key",
3594 product_specific: true,
3595 file_contexts: "product_specific_file_contexts",
3596 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003597
Jooyung Han580eb4f2020-06-24 19:33:06 +09003598 apex_key {
3599 name: "myapex.key",
3600 public_key: "testkey.avbpubkey",
3601 private_key: "testkey.pem",
3602 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003603 `)
3604
Jooyung Han580eb4f2020-06-24 19:33:06 +09003605 ctx, _ := testApex(t, `
3606 apex {
3607 name: "myapex",
3608 key: "myapex.key",
3609 product_specific: true,
3610 file_contexts: "product_specific_file_contexts",
3611 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003612
Jooyung Han580eb4f2020-06-24 19:33:06 +09003613 apex_key {
3614 name: "myapex.key",
3615 public_key: "testkey.avbpubkey",
3616 private_key: "testkey.pem",
3617 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003618 `, withFiles(map[string][]byte{
3619 "product_specific_file_contexts": nil,
3620 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3622 rule := module.Output("file_contexts")
3623 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3624}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003625
Jooyung Han580eb4f2020-06-24 19:33:06 +09003626func TestFileContexts_SetViaFileGroup(t *testing.T) {
3627 ctx, _ := testApex(t, `
3628 apex {
3629 name: "myapex",
3630 key: "myapex.key",
3631 product_specific: true,
3632 file_contexts: ":my-file-contexts",
3633 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003634
Jooyung Han580eb4f2020-06-24 19:33:06 +09003635 apex_key {
3636 name: "myapex.key",
3637 public_key: "testkey.avbpubkey",
3638 private_key: "testkey.pem",
3639 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003640
Jooyung Han580eb4f2020-06-24 19:33:06 +09003641 filegroup {
3642 name: "my-file-contexts",
3643 srcs: ["product_specific_file_contexts"],
3644 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003645 `, withFiles(map[string][]byte{
3646 "product_specific_file_contexts": nil,
3647 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003648 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3649 rule := module.Output("file_contexts")
3650 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003651}
3652
Jiyong Park67882562019-03-21 01:11:21 +09003653func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003654 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003655 apex_key {
3656 name: "myapex.key",
3657 public_key: ":my.avbpubkey",
3658 private_key: ":my.pem",
3659 product_specific: true,
3660 }
3661
3662 filegroup {
3663 name: "my.avbpubkey",
3664 srcs: ["testkey2.avbpubkey"],
3665 }
3666
3667 filegroup {
3668 name: "my.pem",
3669 srcs: ["testkey2.pem"],
3670 }
3671 `)
3672
3673 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3674 expected_pubkey := "testkey2.avbpubkey"
3675 actual_pubkey := apex_key.public_key_file.String()
3676 if actual_pubkey != expected_pubkey {
3677 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3678 }
3679 expected_privkey := "testkey2.pem"
3680 actual_privkey := apex_key.private_key_file.String()
3681 if actual_privkey != expected_privkey {
3682 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3683 }
3684}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003685
3686func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003687 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003688 prebuilt_apex {
3689 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003690 arch: {
3691 arm64: {
3692 src: "myapex-arm64.apex",
3693 },
3694 arm: {
3695 src: "myapex-arm.apex",
3696 },
3697 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003698 }
3699 `)
3700
3701 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3702
Jiyong Parkc95714e2019-03-29 14:23:10 +09003703 expectedInput := "myapex-arm64.apex"
3704 if prebuilt.inputApex.String() != expectedInput {
3705 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3706 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003707}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003708
3709func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003710 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003711 prebuilt_apex {
3712 name: "myapex",
3713 src: "myapex-arm.apex",
3714 filename: "notmyapex.apex",
3715 }
3716 `)
3717
3718 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3719
3720 expected := "notmyapex.apex"
3721 if p.installFilename != expected {
3722 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3723 }
3724}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003725
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003726func TestPrebuiltOverrides(t *testing.T) {
3727 ctx, config := testApex(t, `
3728 prebuilt_apex {
3729 name: "myapex.prebuilt",
3730 src: "myapex-arm.apex",
3731 overrides: [
3732 "myapex",
3733 ],
3734 }
3735 `)
3736
3737 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3738
3739 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003740 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003741 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003742 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003743 }
3744}
3745
Roland Levillain630846d2019-06-26 12:48:34 +01003746func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003747 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003748 apex_test {
3749 name: "myapex",
3750 key: "myapex.key",
3751 tests: [
3752 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003753 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003754 ],
3755 }
3756
3757 apex_key {
3758 name: "myapex.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
3762
Liz Kammer1c14a212020-05-12 15:26:55 -07003763 filegroup {
3764 name: "fg",
3765 srcs: [
3766 "baz",
3767 "bar/baz"
3768 ],
3769 }
3770
Roland Levillain630846d2019-06-26 12:48:34 +01003771 cc_test {
3772 name: "mytest",
3773 gtest: false,
3774 srcs: ["mytest.cpp"],
3775 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003776 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003777 system_shared_libs: [],
3778 static_executable: true,
3779 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003780 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003781 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003782
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003783 cc_library {
3784 name: "mylib",
3785 srcs: ["mylib.cpp"],
3786 system_shared_libs: [],
3787 stl: "none",
3788 }
3789
Liz Kammer5bd365f2020-05-27 15:15:11 -07003790 filegroup {
3791 name: "fg2",
3792 srcs: [
3793 "testdata/baz"
3794 ],
3795 }
3796
Roland Levillain9b5fde92019-06-28 15:41:19 +01003797 cc_test {
3798 name: "mytests",
3799 gtest: false,
3800 srcs: [
3801 "mytest1.cpp",
3802 "mytest2.cpp",
3803 "mytest3.cpp",
3804 ],
3805 test_per_src: true,
3806 relative_install_path: "test",
3807 system_shared_libs: [],
3808 static_executable: true,
3809 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003810 data: [
3811 ":fg",
3812 ":fg2",
3813 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003814 }
Roland Levillain630846d2019-06-26 12:48:34 +01003815 `)
3816
Sundong Ahnabb64432019-10-22 13:58:29 +09003817 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003818 copyCmds := apexRule.Args["copy_commands"]
3819
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003820 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003821 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003822 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003823
Liz Kammer1c14a212020-05-12 15:26:55 -07003824 //Ensure that test data are copied into apex.
3825 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3826 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3827
Roland Levillain9b5fde92019-06-28 15:41:19 +01003828 // Ensure that test deps built with `test_per_src` are copied into apex.
3829 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3830 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3831 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003832
3833 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003834 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3835 data := android.AndroidMkDataForTest(t, config, "", bundle)
3836 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003837 prefix := "TARGET_"
3838 var builder strings.Builder
3839 data.Custom(&builder, name, prefix, "", data)
3840 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3842 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3843 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3844 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003845 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003846 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003847 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003848
3849 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3850 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3851 data.Custom(&builder, name, prefix, "", data)
3852 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003853 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3854 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003855}
3856
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003857func TestInstallExtraFlattenedApexes(t *testing.T) {
3858 ctx, config := testApex(t, `
3859 apex {
3860 name: "myapex",
3861 key: "myapex.key",
3862 }
3863 apex_key {
3864 name: "myapex.key",
3865 public_key: "testkey.avbpubkey",
3866 private_key: "testkey.pem",
3867 }
3868 `, func(fs map[string][]byte, config android.Config) {
3869 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3870 })
3871 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003872 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003873 mk := android.AndroidMkDataForTest(t, config, "", ab)
3874 var builder strings.Builder
3875 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3876 androidMk := builder.String()
3877 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3878}
3879
Jooyung Han5c998b92019-06-27 11:30:33 +09003880func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003881 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003882 apex {
3883 name: "myapex",
3884 key: "myapex.key",
3885 native_shared_libs: ["mylib"],
3886 uses: ["commonapex"],
3887 }
3888
3889 apex {
3890 name: "commonapex",
3891 key: "myapex.key",
3892 native_shared_libs: ["libcommon"],
3893 provide_cpp_shared_libs: true,
3894 }
3895
3896 apex_key {
3897 name: "myapex.key",
3898 public_key: "testkey.avbpubkey",
3899 private_key: "testkey.pem",
3900 }
3901
3902 cc_library {
3903 name: "mylib",
3904 srcs: ["mylib.cpp"],
3905 shared_libs: ["libcommon"],
3906 system_shared_libs: [],
3907 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003908 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003909 }
3910
3911 cc_library {
3912 name: "libcommon",
3913 srcs: ["mylib_common.cpp"],
3914 system_shared_libs: [],
3915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003916 // TODO: remove //apex_available:platform
3917 apex_available: [
3918 "//apex_available:platform",
3919 "commonapex",
3920 "myapex",
3921 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003922 }
3923 `)
3924
Sundong Ahnabb64432019-10-22 13:58:29 +09003925 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003926 apexRule1 := module1.Rule("apexRule")
3927 copyCmds1 := apexRule1.Args["copy_commands"]
3928
Sundong Ahnabb64432019-10-22 13:58:29 +09003929 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003930 apexRule2 := module2.Rule("apexRule")
3931 copyCmds2 := apexRule2.Args["copy_commands"]
3932
Colin Cross7113d202019-11-20 16:39:12 -08003933 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3934 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003935 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3936 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3937 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3938}
3939
3940func TestApexUsesFailsIfNotProvided(t *testing.T) {
3941 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3942 apex {
3943 name: "myapex",
3944 key: "myapex.key",
3945 uses: ["commonapex"],
3946 }
3947
3948 apex {
3949 name: "commonapex",
3950 key: "myapex.key",
3951 }
3952
3953 apex_key {
3954 name: "myapex.key",
3955 public_key: "testkey.avbpubkey",
3956 private_key: "testkey.pem",
3957 }
3958 `)
3959 testApexError(t, `uses: "commonapex" is not a provider`, `
3960 apex {
3961 name: "myapex",
3962 key: "myapex.key",
3963 uses: ["commonapex"],
3964 }
3965
3966 cc_library {
3967 name: "commonapex",
3968 system_shared_libs: [],
3969 stl: "none",
3970 }
3971
3972 apex_key {
3973 name: "myapex.key",
3974 public_key: "testkey.avbpubkey",
3975 private_key: "testkey.pem",
3976 }
3977 `)
3978}
3979
3980func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3981 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3982 apex {
3983 name: "myapex",
3984 key: "myapex.key",
3985 use_vendor: true,
3986 uses: ["commonapex"],
3987 }
3988
3989 apex {
3990 name: "commonapex",
3991 key: "myapex.key",
3992 provide_cpp_shared_libs: true,
3993 }
3994
3995 apex_key {
3996 name: "myapex.key",
3997 public_key: "testkey.avbpubkey",
3998 private_key: "testkey.pem",
3999 }
Jooyung Handc782442019-11-01 03:14:38 +09004000 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004001 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004002 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004003}
4004
Jooyung Hand48f3c32019-08-23 11:18:57 +09004005func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4006 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4007 apex {
4008 name: "myapex",
4009 key: "myapex.key",
4010 native_shared_libs: ["libfoo"],
4011 }
4012
4013 apex_key {
4014 name: "myapex.key",
4015 public_key: "testkey.avbpubkey",
4016 private_key: "testkey.pem",
4017 }
4018
4019 cc_library {
4020 name: "libfoo",
4021 stl: "none",
4022 system_shared_libs: [],
4023 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004024 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004025 }
4026 `)
4027 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4028 apex {
4029 name: "myapex",
4030 key: "myapex.key",
4031 java_libs: ["myjar"],
4032 }
4033
4034 apex_key {
4035 name: "myapex.key",
4036 public_key: "testkey.avbpubkey",
4037 private_key: "testkey.pem",
4038 }
4039
4040 java_library {
4041 name: "myjar",
4042 srcs: ["foo/bar/MyClass.java"],
4043 sdk_version: "none",
4044 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004045 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004046 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004047 }
4048 `)
4049}
4050
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004051func TestApexWithApps(t *testing.T) {
4052 ctx, _ := testApex(t, `
4053 apex {
4054 name: "myapex",
4055 key: "myapex.key",
4056 apps: [
4057 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004058 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004059 ],
4060 }
4061
4062 apex_key {
4063 name: "myapex.key",
4064 public_key: "testkey.avbpubkey",
4065 private_key: "testkey.pem",
4066 }
4067
4068 android_app {
4069 name: "AppFoo",
4070 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004071 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004072 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004073 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004074 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004075 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004076 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004077
4078 android_app {
4079 name: "AppFooPriv",
4080 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004081 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004082 system_modules: "none",
4083 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004084 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004085 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004086 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004087
4088 cc_library_shared {
4089 name: "libjni",
4090 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004091 shared_libs: ["libfoo"],
4092 stl: "none",
4093 system_shared_libs: [],
4094 apex_available: [ "myapex" ],
4095 sdk_version: "current",
4096 }
4097
4098 cc_library_shared {
4099 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004100 stl: "none",
4101 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004102 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004103 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004104 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004105 `)
4106
Sundong Ahnabb64432019-10-22 13:58:29 +09004107 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004108 apexRule := module.Rule("apexRule")
4109 copyCmds := apexRule.Args["copy_commands"]
4110
4111 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004112 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004113
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004114 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
4115 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004116 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004117 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004118 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004119 // JNI libraries including transitive deps are
4120 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00004121 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004122 // ... embedded inside APK (jnilibs.zip)
4123 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4124 // ... and not directly inside the APEX
4125 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4126 }
Dario Frenicde2a032019-10-27 00:29:22 +01004127}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004128
Dario Frenicde2a032019-10-27 00:29:22 +01004129func TestApexWithAppImports(t *testing.T) {
4130 ctx, _ := testApex(t, `
4131 apex {
4132 name: "myapex",
4133 key: "myapex.key",
4134 apps: [
4135 "AppFooPrebuilt",
4136 "AppFooPrivPrebuilt",
4137 ],
4138 }
4139
4140 apex_key {
4141 name: "myapex.key",
4142 public_key: "testkey.avbpubkey",
4143 private_key: "testkey.pem",
4144 }
4145
4146 android_app_import {
4147 name: "AppFooPrebuilt",
4148 apk: "PrebuiltAppFoo.apk",
4149 presigned: true,
4150 dex_preopt: {
4151 enabled: false,
4152 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004153 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004154 }
4155
4156 android_app_import {
4157 name: "AppFooPrivPrebuilt",
4158 apk: "PrebuiltAppFooPriv.apk",
4159 privileged: true,
4160 presigned: true,
4161 dex_preopt: {
4162 enabled: false,
4163 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004164 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004165 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004166 }
4167 `)
4168
Sundong Ahnabb64432019-10-22 13:58:29 +09004169 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004170 apexRule := module.Rule("apexRule")
4171 copyCmds := apexRule.Args["copy_commands"]
4172
4173 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004174 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4175}
4176
4177func TestApexWithAppImportsPrefer(t *testing.T) {
4178 ctx, _ := testApex(t, `
4179 apex {
4180 name: "myapex",
4181 key: "myapex.key",
4182 apps: [
4183 "AppFoo",
4184 ],
4185 }
4186
4187 apex_key {
4188 name: "myapex.key",
4189 public_key: "testkey.avbpubkey",
4190 private_key: "testkey.pem",
4191 }
4192
4193 android_app {
4194 name: "AppFoo",
4195 srcs: ["foo/bar/MyClass.java"],
4196 sdk_version: "none",
4197 system_modules: "none",
4198 apex_available: [ "myapex" ],
4199 }
4200
4201 android_app_import {
4202 name: "AppFoo",
4203 apk: "AppFooPrebuilt.apk",
4204 filename: "AppFooPrebuilt.apk",
4205 presigned: true,
4206 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004207 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004208 }
4209 `, withFiles(map[string][]byte{
4210 "AppFooPrebuilt.apk": nil,
4211 }))
4212
4213 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4214 "app/AppFoo/AppFooPrebuilt.apk",
4215 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004216}
4217
Dario Freni6f3937c2019-12-20 22:58:03 +00004218func TestApexWithTestHelperApp(t *testing.T) {
4219 ctx, _ := testApex(t, `
4220 apex {
4221 name: "myapex",
4222 key: "myapex.key",
4223 apps: [
4224 "TesterHelpAppFoo",
4225 ],
4226 }
4227
4228 apex_key {
4229 name: "myapex.key",
4230 public_key: "testkey.avbpubkey",
4231 private_key: "testkey.pem",
4232 }
4233
4234 android_test_helper_app {
4235 name: "TesterHelpAppFoo",
4236 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004237 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004238 }
4239
4240 `)
4241
4242 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4243 apexRule := module.Rule("apexRule")
4244 copyCmds := apexRule.Args["copy_commands"]
4245
4246 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4247}
4248
Jooyung Han18020ea2019-11-13 10:50:48 +09004249func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4250 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004251 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004252 apex {
4253 name: "myapex",
4254 key: "myapex.key",
4255 native_shared_libs: ["libfoo"],
4256 }
4257
4258 apex_key {
4259 name: "myapex.key",
4260 public_key: "testkey.avbpubkey",
4261 private_key: "testkey.pem",
4262 }
4263
4264 apex {
4265 name: "otherapex",
4266 key: "myapex.key",
4267 native_shared_libs: ["libfoo"],
4268 }
4269
4270 cc_defaults {
4271 name: "libfoo-defaults",
4272 apex_available: ["otherapex"],
4273 }
4274
4275 cc_library {
4276 name: "libfoo",
4277 defaults: ["libfoo-defaults"],
4278 stl: "none",
4279 system_shared_libs: [],
4280 }`)
4281}
4282
Paul Duffine52e66f2020-03-30 17:54:29 +01004283func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004284 // libfoo is not available to myapex, but only to otherapex
4285 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4286 apex {
4287 name: "myapex",
4288 key: "myapex.key",
4289 native_shared_libs: ["libfoo"],
4290 }
4291
4292 apex_key {
4293 name: "myapex.key",
4294 public_key: "testkey.avbpubkey",
4295 private_key: "testkey.pem",
4296 }
4297
4298 apex {
4299 name: "otherapex",
4300 key: "otherapex.key",
4301 native_shared_libs: ["libfoo"],
4302 }
4303
4304 apex_key {
4305 name: "otherapex.key",
4306 public_key: "testkey.avbpubkey",
4307 private_key: "testkey.pem",
4308 }
4309
4310 cc_library {
4311 name: "libfoo",
4312 stl: "none",
4313 system_shared_libs: [],
4314 apex_available: ["otherapex"],
4315 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004316}
Jiyong Park127b40b2019-09-30 16:04:35 +09004317
Paul Duffine52e66f2020-03-30 17:54:29 +01004318func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004319 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004320 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004321.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004322.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004323.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004324.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004325.*via tag cc\.DependencyTag.*"shared".*
4326.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004327 apex {
4328 name: "myapex",
4329 key: "myapex.key",
4330 native_shared_libs: ["libfoo"],
4331 }
4332
4333 apex_key {
4334 name: "myapex.key",
4335 public_key: "testkey.avbpubkey",
4336 private_key: "testkey.pem",
4337 }
4338
Jiyong Park127b40b2019-09-30 16:04:35 +09004339 cc_library {
4340 name: "libfoo",
4341 stl: "none",
4342 shared_libs: ["libbar"],
4343 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004344 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004345 }
4346
4347 cc_library {
4348 name: "libbar",
4349 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004350 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004351 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004352 apex_available: ["myapex"],
4353 }
4354
4355 cc_library {
4356 name: "libbaz",
4357 stl: "none",
4358 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004359 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004360}
Jiyong Park127b40b2019-09-30 16:04:35 +09004361
Paul Duffine52e66f2020-03-30 17:54:29 +01004362func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004363 testApexError(t, "\"otherapex\" is not a valid module name", `
4364 apex {
4365 name: "myapex",
4366 key: "myapex.key",
4367 native_shared_libs: ["libfoo"],
4368 }
4369
4370 apex_key {
4371 name: "myapex.key",
4372 public_key: "testkey.avbpubkey",
4373 private_key: "testkey.pem",
4374 }
4375
4376 cc_library {
4377 name: "libfoo",
4378 stl: "none",
4379 system_shared_libs: [],
4380 apex_available: ["otherapex"],
4381 }`)
4382
Paul Duffine52e66f2020-03-30 17:54:29 +01004383 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004384 apex {
4385 name: "myapex",
4386 key: "myapex.key",
4387 native_shared_libs: ["libfoo", "libbar"],
4388 }
4389
4390 apex_key {
4391 name: "myapex.key",
4392 public_key: "testkey.avbpubkey",
4393 private_key: "testkey.pem",
4394 }
4395
4396 cc_library {
4397 name: "libfoo",
4398 stl: "none",
4399 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004400 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004401 apex_available: ["myapex"],
4402 }
4403
4404 cc_library {
4405 name: "libbar",
4406 stl: "none",
4407 system_shared_libs: [],
4408 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004409 }
4410
4411 cc_library {
4412 name: "libbaz",
4413 stl: "none",
4414 system_shared_libs: [],
4415 stubs: {
4416 versions: ["10", "20", "30"],
4417 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004418 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004419}
Jiyong Park127b40b2019-09-30 16:04:35 +09004420
Jiyong Park89e850a2020-04-07 16:37:39 +09004421func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004422 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004423 apex {
4424 name: "myapex",
4425 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004426 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004427 }
4428
4429 apex_key {
4430 name: "myapex.key",
4431 public_key: "testkey.avbpubkey",
4432 private_key: "testkey.pem",
4433 }
4434
4435 cc_library {
4436 name: "libfoo",
4437 stl: "none",
4438 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004439 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004440 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004441 }
4442
4443 cc_library {
4444 name: "libfoo2",
4445 stl: "none",
4446 system_shared_libs: [],
4447 shared_libs: ["libbaz"],
4448 apex_available: ["//apex_available:platform"],
4449 }
4450
4451 cc_library {
4452 name: "libbar",
4453 stl: "none",
4454 system_shared_libs: [],
4455 apex_available: ["myapex"],
4456 }
4457
4458 cc_library {
4459 name: "libbaz",
4460 stl: "none",
4461 system_shared_libs: [],
4462 apex_available: ["myapex"],
4463 stubs: {
4464 versions: ["1"],
4465 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004466 }`)
4467
Jiyong Park89e850a2020-04-07 16:37:39 +09004468 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4469 // because it depends on libbar which isn't available to platform
4470 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4471 if libfoo.NotAvailableForPlatform() != true {
4472 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4473 }
4474
4475 // libfoo2 however can be available to platform because it depends on libbaz which provides
4476 // stubs
4477 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4478 if libfoo2.NotAvailableForPlatform() == true {
4479 t.Errorf("%q should be available to platform", libfoo2.String())
4480 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004481}
Jiyong Parka90ca002019-10-07 15:47:24 +09004482
Paul Duffine52e66f2020-03-30 17:54:29 +01004483func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004484 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004485 apex {
4486 name: "myapex",
4487 key: "myapex.key",
4488 native_shared_libs: ["libfoo"],
4489 }
4490
4491 apex_key {
4492 name: "myapex.key",
4493 public_key: "testkey.avbpubkey",
4494 private_key: "testkey.pem",
4495 }
4496
4497 cc_library {
4498 name: "libfoo",
4499 stl: "none",
4500 system_shared_libs: [],
4501 apex_available: ["myapex"],
4502 static: {
4503 apex_available: ["//apex_available:platform"],
4504 },
4505 }`)
4506
Jiyong Park89e850a2020-04-07 16:37:39 +09004507 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4508 if libfooShared.NotAvailableForPlatform() != true {
4509 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4510 }
4511 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4512 if libfooStatic.NotAvailableForPlatform() != false {
4513 t.Errorf("%q should be available to platform", libfooStatic.String())
4514 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004515}
4516
Jiyong Park5d790c32019-11-15 18:40:32 +09004517func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004518 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004519 apex {
4520 name: "myapex",
4521 key: "myapex.key",
4522 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004523 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004524 }
4525
4526 override_apex {
4527 name: "override_myapex",
4528 base: "myapex",
4529 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004530 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004531 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004532 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004533 }
4534
4535 apex_key {
4536 name: "myapex.key",
4537 public_key: "testkey.avbpubkey",
4538 private_key: "testkey.pem",
4539 }
4540
4541 android_app {
4542 name: "app",
4543 srcs: ["foo/bar/MyClass.java"],
4544 package_name: "foo",
4545 sdk_version: "none",
4546 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004547 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004548 }
4549
4550 override_android_app {
4551 name: "override_app",
4552 base: "app",
4553 package_name: "bar",
4554 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004555 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004556
Jiyong Park317645e2019-12-05 13:20:58 +09004557 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4558 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4559 if originalVariant.GetOverriddenBy() != "" {
4560 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4561 }
4562 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4563 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4564 }
4565
Jiyong Park5d790c32019-11-15 18:40:32 +09004566 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4567 apexRule := module.Rule("apexRule")
4568 copyCmds := apexRule.Args["copy_commands"]
4569
4570 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004571 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004572
4573 apexBundle := module.Module().(*apexBundle)
4574 name := apexBundle.Name()
4575 if name != "override_myapex" {
4576 t.Errorf("name should be \"override_myapex\", but was %q", name)
4577 }
4578
Baligh Uddin004d7172020-02-19 21:29:28 -08004579 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4580 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4581 }
4582
Jiyong Park20bacab2020-03-03 11:45:41 +09004583 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004584 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004585
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004586 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4587 var builder strings.Builder
4588 data.Custom(&builder, name, "TARGET_", "", data)
4589 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004590 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004591 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4592 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004593 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004594 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004595 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004596 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4597 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004598}
4599
Jooyung Han214bf372019-11-12 13:03:50 +09004600func TestLegacyAndroid10Support(t *testing.T) {
4601 ctx, _ := testApex(t, `
4602 apex {
4603 name: "myapex",
4604 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004605 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004606 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004607 }
4608
4609 apex_key {
4610 name: "myapex.key",
4611 public_key: "testkey.avbpubkey",
4612 private_key: "testkey.pem",
4613 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004614
4615 cc_library {
4616 name: "mylib",
4617 srcs: ["mylib.cpp"],
4618 stl: "libc++",
4619 system_shared_libs: [],
4620 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004621 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004622 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004623 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004624
4625 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4626 args := module.Rule("apexRule").Args
4627 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004628 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004629
4630 // The copies of the libraries in the apex should have one more dependency than
4631 // the ones outside the apex, namely the unwinder. Ideally we should check
4632 // the dependency names directly here but for some reason the names are blank in
4633 // this test.
4634 for _, lib := range []string{"libc++", "mylib"} {
4635 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4636 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4637 if len(apexImplicits) != len(nonApexImplicits)+1 {
4638 t.Errorf("%q missing unwinder dep", lib)
4639 }
4640 }
Jooyung Han214bf372019-11-12 13:03:50 +09004641}
4642
Paul Duffin9b879592020-05-26 13:21:35 +01004643var filesForSdkLibrary = map[string][]byte{
4644 "api/current.txt": nil,
4645 "api/removed.txt": nil,
4646 "api/system-current.txt": nil,
4647 "api/system-removed.txt": nil,
4648 "api/test-current.txt": nil,
4649 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004650
4651 // For java_sdk_library_import
4652 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004653}
4654
Jooyung Han58f26ab2019-12-18 15:34:32 +09004655func TestJavaSDKLibrary(t *testing.T) {
4656 ctx, _ := testApex(t, `
4657 apex {
4658 name: "myapex",
4659 key: "myapex.key",
4660 java_libs: ["foo"],
4661 }
4662
4663 apex_key {
4664 name: "myapex.key",
4665 public_key: "testkey.avbpubkey",
4666 private_key: "testkey.pem",
4667 }
4668
4669 java_sdk_library {
4670 name: "foo",
4671 srcs: ["a.java"],
4672 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004673 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004674 }
Paul Duffin9b879592020-05-26 13:21:35 +01004675 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004676
4677 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004678 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004679 "javalib/foo.jar",
4680 "etc/permissions/foo.xml",
4681 })
4682 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004683 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4684 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004685}
4686
Paul Duffin9b879592020-05-26 13:21:35 +01004687func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4688 ctx, _ := testApex(t, `
4689 apex {
4690 name: "myapex",
4691 key: "myapex.key",
4692 java_libs: ["foo", "bar"],
4693 }
4694
4695 apex_key {
4696 name: "myapex.key",
4697 public_key: "testkey.avbpubkey",
4698 private_key: "testkey.pem",
4699 }
4700
4701 java_sdk_library {
4702 name: "foo",
4703 srcs: ["a.java"],
4704 api_packages: ["foo"],
4705 apex_available: ["myapex"],
4706 sdk_version: "none",
4707 system_modules: "none",
4708 }
4709
4710 java_library {
4711 name: "bar",
4712 srcs: ["a.java"],
4713 libs: ["foo"],
4714 apex_available: ["myapex"],
4715 sdk_version: "none",
4716 system_modules: "none",
4717 }
4718 `, withFiles(filesForSdkLibrary))
4719
4720 // java_sdk_library installs both impl jar and permission XML
4721 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4722 "javalib/bar.jar",
4723 "javalib/foo.jar",
4724 "etc/permissions/foo.xml",
4725 })
4726
4727 // The bar library should depend on the implementation jar.
4728 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4729 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4730 t.Errorf("expected %q, found %#q", expected, actual)
4731 }
4732}
4733
4734func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4735 ctx, _ := testApex(t, `
4736 apex {
4737 name: "myapex",
4738 key: "myapex.key",
4739 java_libs: ["foo"],
4740 }
4741
4742 apex_key {
4743 name: "myapex.key",
4744 public_key: "testkey.avbpubkey",
4745 private_key: "testkey.pem",
4746 }
4747
4748 java_sdk_library {
4749 name: "foo",
4750 srcs: ["a.java"],
4751 api_packages: ["foo"],
4752 apex_available: ["myapex"],
4753 sdk_version: "none",
4754 system_modules: "none",
4755 }
4756
4757 java_library {
4758 name: "bar",
4759 srcs: ["a.java"],
4760 libs: ["foo"],
4761 sdk_version: "none",
4762 system_modules: "none",
4763 }
4764 `, withFiles(filesForSdkLibrary))
4765
4766 // java_sdk_library installs both impl jar and permission XML
4767 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4768 "javalib/foo.jar",
4769 "etc/permissions/foo.xml",
4770 })
4771
4772 // The bar library should depend on the stubs jar.
4773 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4774 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4775 t.Errorf("expected %q, found %#q", expected, actual)
4776 }
4777}
4778
Paul Duffineedc5d52020-06-12 17:46:39 +01004779func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4780 ctx, _ := testApex(t, ``,
4781 withFiles(map[string][]byte{
4782 "apex/a.java": nil,
4783 "apex/apex_manifest.json": nil,
4784 "apex/Android.bp": []byte(`
4785 package {
4786 default_visibility: ["//visibility:private"],
4787 }
4788
4789 apex {
4790 name: "myapex",
4791 key: "myapex.key",
4792 java_libs: ["foo", "bar"],
4793 }
4794
4795 apex_key {
4796 name: "myapex.key",
4797 public_key: "testkey.avbpubkey",
4798 private_key: "testkey.pem",
4799 }
4800
4801 java_library {
4802 name: "bar",
4803 srcs: ["a.java"],
4804 libs: ["foo"],
4805 apex_available: ["myapex"],
4806 sdk_version: "none",
4807 system_modules: "none",
4808 }
4809`),
4810 "source/a.java": nil,
4811 "source/api/current.txt": nil,
4812 "source/api/removed.txt": nil,
4813 "source/Android.bp": []byte(`
4814 package {
4815 default_visibility: ["//visibility:private"],
4816 }
4817
4818 java_sdk_library {
4819 name: "foo",
4820 visibility: ["//apex"],
4821 srcs: ["a.java"],
4822 api_packages: ["foo"],
4823 apex_available: ["myapex"],
4824 sdk_version: "none",
4825 system_modules: "none",
4826 public: {
4827 enabled: true,
4828 },
4829 }
4830`),
4831 "prebuilt/a.jar": nil,
4832 "prebuilt/Android.bp": []byte(`
4833 package {
4834 default_visibility: ["//visibility:private"],
4835 }
4836
4837 java_sdk_library_import {
4838 name: "foo",
4839 visibility: ["//apex", "//source"],
4840 apex_available: ["myapex"],
4841 prefer: true,
4842 public: {
4843 jars: ["a.jar"],
4844 },
4845 }
4846`),
4847 }),
4848 )
4849
4850 // java_sdk_library installs both impl jar and permission XML
4851 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4852 "javalib/bar.jar",
4853 "javalib/foo.jar",
4854 "etc/permissions/foo.xml",
4855 })
4856
4857 // The bar library should depend on the implementation jar.
4858 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4859 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4860 t.Errorf("expected %q, found %#q", expected, actual)
4861 }
4862}
4863
4864func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
4865 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
4866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 java_libs: ["foo"],
4870 }
4871
4872 apex_key {
4873 name: "myapex.key",
4874 public_key: "testkey.avbpubkey",
4875 private_key: "testkey.pem",
4876 }
4877
4878 java_sdk_library_import {
4879 name: "foo",
4880 apex_available: ["myapex"],
4881 prefer: true,
4882 public: {
4883 jars: ["a.jar"],
4884 },
4885 }
4886
4887 `, withFiles(filesForSdkLibrary))
4888}
4889
atrost6e126252020-01-27 17:01:16 +00004890func TestCompatConfig(t *testing.T) {
4891 ctx, _ := testApex(t, `
4892 apex {
4893 name: "myapex",
4894 key: "myapex.key",
4895 prebuilts: ["myjar-platform-compat-config"],
4896 java_libs: ["myjar"],
4897 }
4898
4899 apex_key {
4900 name: "myapex.key",
4901 public_key: "testkey.avbpubkey",
4902 private_key: "testkey.pem",
4903 }
4904
4905 platform_compat_config {
4906 name: "myjar-platform-compat-config",
4907 src: ":myjar",
4908 }
4909
4910 java_library {
4911 name: "myjar",
4912 srcs: ["foo/bar/MyClass.java"],
4913 sdk_version: "none",
4914 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004915 apex_available: [ "myapex" ],
4916 }
4917 `)
4918 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4919 "etc/compatconfig/myjar-platform-compat-config.xml",
4920 "javalib/myjar.jar",
4921 })
4922}
4923
Jiyong Park479321d2019-12-16 11:47:12 +09004924func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4925 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4926 apex {
4927 name: "myapex",
4928 key: "myapex.key",
4929 java_libs: ["myjar"],
4930 }
4931
4932 apex_key {
4933 name: "myapex.key",
4934 public_key: "testkey.avbpubkey",
4935 private_key: "testkey.pem",
4936 }
4937
4938 java_library {
4939 name: "myjar",
4940 srcs: ["foo/bar/MyClass.java"],
4941 sdk_version: "none",
4942 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004943 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004944 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004945 }
4946 `)
4947}
4948
Jiyong Park7afd1072019-12-30 16:56:33 +09004949func TestCarryRequiredModuleNames(t *testing.T) {
4950 ctx, config := testApex(t, `
4951 apex {
4952 name: "myapex",
4953 key: "myapex.key",
4954 native_shared_libs: ["mylib"],
4955 }
4956
4957 apex_key {
4958 name: "myapex.key",
4959 public_key: "testkey.avbpubkey",
4960 private_key: "testkey.pem",
4961 }
4962
4963 cc_library {
4964 name: "mylib",
4965 srcs: ["mylib.cpp"],
4966 system_shared_libs: [],
4967 stl: "none",
4968 required: ["a", "b"],
4969 host_required: ["c", "d"],
4970 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004971 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004972 }
4973 `)
4974
4975 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4976 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4977 name := apexBundle.BaseModuleName()
4978 prefix := "TARGET_"
4979 var builder strings.Builder
4980 data.Custom(&builder, name, prefix, "", data)
4981 androidMk := builder.String()
4982 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4983 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4984 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4985}
4986
Jiyong Park7cd10e32020-01-14 09:22:18 +09004987func TestSymlinksFromApexToSystem(t *testing.T) {
4988 bp := `
4989 apex {
4990 name: "myapex",
4991 key: "myapex.key",
4992 native_shared_libs: ["mylib"],
4993 java_libs: ["myjar"],
4994 }
4995
Jiyong Park9d677202020-02-19 16:29:35 +09004996 apex {
4997 name: "myapex.updatable",
4998 key: "myapex.key",
4999 native_shared_libs: ["mylib"],
5000 java_libs: ["myjar"],
5001 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005002 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005003 }
5004
Jiyong Park7cd10e32020-01-14 09:22:18 +09005005 apex_key {
5006 name: "myapex.key",
5007 public_key: "testkey.avbpubkey",
5008 private_key: "testkey.pem",
5009 }
5010
5011 cc_library {
5012 name: "mylib",
5013 srcs: ["mylib.cpp"],
5014 shared_libs: ["myotherlib"],
5015 system_shared_libs: [],
5016 stl: "none",
5017 apex_available: [
5018 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005019 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005020 "//apex_available:platform",
5021 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005022 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005023 }
5024
5025 cc_library {
5026 name: "myotherlib",
5027 srcs: ["mylib.cpp"],
5028 system_shared_libs: [],
5029 stl: "none",
5030 apex_available: [
5031 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005032 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005033 "//apex_available:platform",
5034 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005035 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005036 }
5037
5038 java_library {
5039 name: "myjar",
5040 srcs: ["foo/bar/MyClass.java"],
5041 sdk_version: "none",
5042 system_modules: "none",
5043 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005044 apex_available: [
5045 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005046 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005047 "//apex_available:platform",
5048 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005049 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005050 }
5051
5052 java_library {
5053 name: "myotherjar",
5054 srcs: ["foo/bar/MyClass.java"],
5055 sdk_version: "none",
5056 system_modules: "none",
5057 apex_available: [
5058 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005059 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005060 "//apex_available:platform",
5061 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005062 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005063 }
5064 `
5065
5066 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5067 for _, f := range files {
5068 if f.path == file {
5069 if f.isLink {
5070 t.Errorf("%q is not a real file", file)
5071 }
5072 return
5073 }
5074 }
5075 t.Errorf("%q is not found", file)
5076 }
5077
5078 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5079 for _, f := range files {
5080 if f.path == file {
5081 if !f.isLink {
5082 t.Errorf("%q is not a symlink", file)
5083 }
5084 return
5085 }
5086 }
5087 t.Errorf("%q is not found", file)
5088 }
5089
Jiyong Park9d677202020-02-19 16:29:35 +09005090 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5091 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005092 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005093 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005094 ensureRealfileExists(t, files, "javalib/myjar.jar")
5095 ensureRealfileExists(t, files, "lib64/mylib.so")
5096 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5097
Jiyong Park9d677202020-02-19 16:29:35 +09005098 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5099 ensureRealfileExists(t, files, "javalib/myjar.jar")
5100 ensureRealfileExists(t, files, "lib64/mylib.so")
5101 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5102
5103 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005104 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005105 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005106 ensureRealfileExists(t, files, "javalib/myjar.jar")
5107 ensureRealfileExists(t, files, "lib64/mylib.so")
5108 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005109
5110 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5111 ensureRealfileExists(t, files, "javalib/myjar.jar")
5112 ensureRealfileExists(t, files, "lib64/mylib.so")
5113 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005114}
5115
Jooyung Han643adc42020-02-27 13:50:06 +09005116func TestApexWithJniLibs(t *testing.T) {
5117 ctx, _ := testApex(t, `
5118 apex {
5119 name: "myapex",
5120 key: "myapex.key",
5121 jni_libs: ["mylib"],
5122 }
5123
5124 apex_key {
5125 name: "myapex.key",
5126 public_key: "testkey.avbpubkey",
5127 private_key: "testkey.pem",
5128 }
5129
5130 cc_library {
5131 name: "mylib",
5132 srcs: ["mylib.cpp"],
5133 shared_libs: ["mylib2"],
5134 system_shared_libs: [],
5135 stl: "none",
5136 apex_available: [ "myapex" ],
5137 }
5138
5139 cc_library {
5140 name: "mylib2",
5141 srcs: ["mylib.cpp"],
5142 system_shared_libs: [],
5143 stl: "none",
5144 apex_available: [ "myapex" ],
5145 }
5146 `)
5147
5148 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5149 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5150 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5151 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5152 "lib64/mylib.so",
5153 "lib64/mylib2.so",
5154 })
5155}
5156
Jooyung Han49f67012020-04-17 13:43:10 +09005157func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5158 ctx, _ := testApex(t, `
5159 apex {
5160 name: "myapex",
5161 key: "myapex.key",
5162 }
5163 apex_key {
5164 name: "myapex.key",
5165 public_key: "testkey.avbpubkey",
5166 private_key: "testkey.pem",
5167 }
5168 `, func(fs map[string][]byte, config android.Config) {
5169 delete(config.Targets, android.Android)
5170 config.AndroidCommonTarget = android.Target{}
5171 })
5172
5173 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5174 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5175 }
5176}
5177
Jooyung Han643adc42020-02-27 13:50:06 +09005178func TestApexWithJniLibs_Errors(t *testing.T) {
5179 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5180 apex {
5181 name: "myapex",
5182 key: "myapex.key",
5183 jni_libs: ["xxx"],
5184 }
5185
5186 apex_key {
5187 name: "myapex.key",
5188 public_key: "testkey.avbpubkey",
5189 private_key: "testkey.pem",
5190 }
5191
5192 prebuilt_etc {
5193 name: "xxx",
5194 src: "xxx",
5195 }
5196 `, withFiles(map[string][]byte{
5197 "xxx": nil,
5198 }))
5199}
5200
Jiyong Parkbd159612020-02-28 15:22:21 +09005201func TestAppBundle(t *testing.T) {
5202 ctx, _ := testApex(t, `
5203 apex {
5204 name: "myapex",
5205 key: "myapex.key",
5206 apps: ["AppFoo"],
5207 }
5208
5209 apex_key {
5210 name: "myapex.key",
5211 public_key: "testkey.avbpubkey",
5212 private_key: "testkey.pem",
5213 }
5214
5215 android_app {
5216 name: "AppFoo",
5217 srcs: ["foo/bar/MyClass.java"],
5218 sdk_version: "none",
5219 system_modules: "none",
5220 apex_available: [ "myapex" ],
5221 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005222 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005223
5224 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5225 content := bundleConfigRule.Args["content"]
5226
5227 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005228 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09005229}
5230
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005231func TestAppSetBundle(t *testing.T) {
5232 ctx, _ := testApex(t, `
5233 apex {
5234 name: "myapex",
5235 key: "myapex.key",
5236 apps: ["AppSet"],
5237 }
5238
5239 apex_key {
5240 name: "myapex.key",
5241 public_key: "testkey.avbpubkey",
5242 private_key: "testkey.pem",
5243 }
5244
5245 android_app_set {
5246 name: "AppSet",
5247 set: "AppSet.apks",
5248 }`)
5249 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5250 bundleConfigRule := mod.Description("Bundle Config")
5251 content := bundleConfigRule.Args["content"]
5252 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5253 s := mod.Rule("apexRule").Args["copy_commands"]
5254 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5255 if len(copyCmds) != 3 {
5256 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5257 }
5258 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5259 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5260 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5261}
5262
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005263func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005264 t.Helper()
5265
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005266 bp := `
5267 java_library {
5268 name: "some-updatable-apex-lib",
5269 srcs: ["a.java"],
5270 sdk_version: "current",
5271 apex_available: [
5272 "some-updatable-apex",
5273 ],
5274 }
5275
5276 java_library {
5277 name: "some-non-updatable-apex-lib",
5278 srcs: ["a.java"],
5279 apex_available: [
5280 "some-non-updatable-apex",
5281 ],
5282 }
5283
5284 java_library {
5285 name: "some-platform-lib",
5286 srcs: ["a.java"],
5287 sdk_version: "current",
5288 installable: true,
5289 }
5290
5291 java_library {
5292 name: "some-art-lib",
5293 srcs: ["a.java"],
5294 sdk_version: "current",
5295 apex_available: [
5296 "com.android.art.something",
5297 ],
5298 hostdex: true,
5299 }
5300
5301 apex {
5302 name: "some-updatable-apex",
5303 key: "some-updatable-apex.key",
5304 java_libs: ["some-updatable-apex-lib"],
5305 updatable: true,
5306 min_sdk_version: "current",
5307 }
5308
5309 apex {
5310 name: "some-non-updatable-apex",
5311 key: "some-non-updatable-apex.key",
5312 java_libs: ["some-non-updatable-apex-lib"],
5313 }
5314
5315 apex_key {
5316 name: "some-updatable-apex.key",
5317 }
5318
5319 apex_key {
5320 name: "some-non-updatable-apex.key",
5321 }
5322
5323 apex {
5324 name: "com.android.art.something",
5325 key: "com.android.art.something.key",
5326 java_libs: ["some-art-lib"],
5327 updatable: true,
5328 min_sdk_version: "current",
5329 }
5330
5331 apex_key {
5332 name: "com.android.art.something.key",
5333 }
5334
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005335 filegroup {
5336 name: "some-updatable-apex-file_contexts",
5337 srcs: [
5338 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5339 ],
5340 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005341
5342 filegroup {
5343 name: "some-non-updatable-apex-file_contexts",
5344 srcs: [
5345 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5346 ],
5347 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005348 `
5349 bp += cc.GatherRequiredDepsForTest(android.Android)
5350 bp += java.GatherRequiredDepsForTest()
5351 bp += dexpreopt.BpToolModulesForTest()
5352
5353 fs := map[string][]byte{
5354 "a.java": nil,
5355 "a.jar": nil,
5356 "build/make/target/product/security": nil,
5357 "apex_manifest.json": nil,
5358 "AndroidManifest.xml": nil,
5359 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005360 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005361 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5362 "framework/aidl/a.aidl": nil,
5363 }
5364 cc.GatherRequiredFilesForTest(fs)
5365
5366 ctx := android.NewTestArchContext()
5367 ctx.RegisterModuleType("apex", BundleFactory)
5368 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5369 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005370 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005371 cc.RegisterRequiredBuildComponentsForTest(ctx)
5372 java.RegisterJavaBuildComponents(ctx)
5373 java.RegisterSystemModulesBuildComponents(ctx)
5374 java.RegisterAppBuildComponents(ctx)
5375 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005376 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5377 ctx.PreDepsMutators(RegisterPreDepsMutators)
5378 ctx.PostDepsMutators(RegisterPostDepsMutators)
5379
5380 config := android.TestArchConfig(buildDir, nil, bp, fs)
5381 ctx.Register(config)
5382
5383 _ = dexpreopt.GlobalSoongConfigForTests(config)
5384 dexpreopt.RegisterToolModulesForTest(ctx)
5385 pathCtx := android.PathContextForTesting(config)
5386 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5387 transformDexpreoptConfig(dexpreoptConfig)
5388 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5389
5390 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5391 android.FailIfErrored(t, errs)
5392
5393 _, errs = ctx.PrepareBuildActions(config)
5394 if errmsg == "" {
5395 android.FailIfErrored(t, errs)
5396 } else if len(errs) > 0 {
5397 android.FailIfNoMatchingErrors(t, errmsg, errs)
5398 return
5399 } else {
5400 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5401 }
5402}
5403
Jooyung Han548640b2020-04-27 12:10:30 +09005404func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5405 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5406 apex {
5407 name: "myapex",
5408 key: "myapex.key",
5409 updatable: true,
5410 }
5411
5412 apex_key {
5413 name: "myapex.key",
5414 public_key: "testkey.avbpubkey",
5415 private_key: "testkey.pem",
5416 }
5417 `)
5418}
5419
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005420func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005421
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005422 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005423 var transform func(*dexpreopt.GlobalConfig)
5424
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005425 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5426 transform = func(config *dexpreopt.GlobalConfig) {
5427 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
5428 }
5429 testNoUpdatableJarsInBootImage(t, "", transform)
5430 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005431
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005432 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005433 err = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005434 transform = func(config *dexpreopt.GlobalConfig) {
5435 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5436 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005437 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005438 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005439
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005440 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005441 err = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005442 transform = func(config *dexpreopt.GlobalConfig) {
5443 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5444 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005445 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005446 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005447
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005448 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005449 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005450 transform = func(config *dexpreopt.GlobalConfig) {
5451 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5452 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005453 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005454 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005455
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005456 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005457 err = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005458 transform = func(config *dexpreopt.GlobalConfig) {
5459 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5460 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005461 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005462 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005463
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005464 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5465 transform = func(config *dexpreopt.GlobalConfig) {
5466 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5467 }
5468 testNoUpdatableJarsInBootImage(t, "", transform)
5469 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005470
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005471 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005472 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005473 transform = func(config *dexpreopt.GlobalConfig) {
5474 config.ArtApexJars = []string{"platform:nonexistent"}
5475 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005476 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005477 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005478
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005479 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005480 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005481 transform = func(config *dexpreopt.GlobalConfig) {
5482 config.BootJars = []string{"platform:nonexistent"}
5483 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005484 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005485 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005486
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005487 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005488 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005489 transform = func(config *dexpreopt.GlobalConfig) {
5490 config.ArtApexJars = []string{"platform:some-platform-lib"}
5491 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005492 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005493 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005494
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005495 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5496 transform = func(config *dexpreopt.GlobalConfig) {
5497 config.BootJars = []string{"platform:some-platform-lib"}
5498 }
5499 testNoUpdatableJarsInBootImage(t, "", transform)
5500 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005501}
5502
Jiyong Park62304bb2020-04-13 16:19:48 +09005503func TestTestFor(t *testing.T) {
5504 ctx, _ := testApex(t, `
5505 apex {
5506 name: "myapex",
5507 key: "myapex.key",
5508 native_shared_libs: ["mylib", "myprivlib"],
5509 }
5510
5511 apex_key {
5512 name: "myapex.key",
5513 public_key: "testkey.avbpubkey",
5514 private_key: "testkey.pem",
5515 }
5516
5517 cc_library {
5518 name: "mylib",
5519 srcs: ["mylib.cpp"],
5520 system_shared_libs: [],
5521 stl: "none",
5522 stubs: {
5523 versions: ["1"],
5524 },
5525 apex_available: ["myapex"],
5526 }
5527
5528 cc_library {
5529 name: "myprivlib",
5530 srcs: ["mylib.cpp"],
5531 system_shared_libs: [],
5532 stl: "none",
5533 apex_available: ["myapex"],
5534 }
5535
5536
5537 cc_test {
5538 name: "mytest",
5539 gtest: false,
5540 srcs: ["mylib.cpp"],
5541 system_shared_libs: [],
5542 stl: "none",
5543 shared_libs: ["mylib", "myprivlib"],
5544 test_for: ["myapex"]
5545 }
5546 `)
5547
5548 // the test 'mytest' is a test for the apex, therefore is linked to the
5549 // actual implementation of mylib instead of its stub.
5550 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5551 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5552 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5553}
5554
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005555// TODO(jungjw): Move this to proptools
5556func intPtr(i int) *int {
5557 return &i
5558}
5559
5560func TestApexSet(t *testing.T) {
5561 ctx, config := testApex(t, `
5562 apex_set {
5563 name: "myapex",
5564 set: "myapex.apks",
5565 filename: "foo_v2.apex",
5566 overrides: ["foo"],
5567 }
5568 `, func(fs map[string][]byte, config android.Config) {
5569 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5570 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5571 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5572 })
5573
5574 m := ctx.ModuleForTests("myapex", "android_common")
5575
5576 // Check extract_apks tool parameters.
5577 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5578 actual := extractedApex.Args["abis"]
5579 expected := "ARMEABI_V7A,ARM64_V8A"
5580 if actual != expected {
5581 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5582 }
5583 actual = extractedApex.Args["sdk-version"]
5584 expected = "30"
5585 if actual != expected {
5586 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5587 }
5588
5589 a := m.Module().(*ApexSet)
5590 expectedOverrides := []string{"foo"}
5591 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5592 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5593 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5594 }
5595}
5596
Jiyong Park7d95a512020-05-10 15:16:24 +09005597func TestNoStaticLinkingToStubsLib(t *testing.T) {
5598 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5599 apex {
5600 name: "myapex",
5601 key: "myapex.key",
5602 native_shared_libs: ["mylib"],
5603 }
5604
5605 apex_key {
5606 name: "myapex.key",
5607 public_key: "testkey.avbpubkey",
5608 private_key: "testkey.pem",
5609 }
5610
5611 cc_library {
5612 name: "mylib",
5613 srcs: ["mylib.cpp"],
5614 static_libs: ["otherlib"],
5615 system_shared_libs: [],
5616 stl: "none",
5617 apex_available: [ "myapex" ],
5618 }
5619
5620 cc_library {
5621 name: "otherlib",
5622 srcs: ["mylib.cpp"],
5623 system_shared_libs: [],
5624 stl: "none",
5625 stubs: {
5626 versions: ["1", "2", "3"],
5627 },
5628 apex_available: [ "myapex" ],
5629 }
5630 `)
5631}
5632
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005633func TestApexKeysTxt(t *testing.T) {
5634 ctx, _ := testApex(t, `
5635 apex {
5636 name: "myapex",
5637 key: "myapex.key",
5638 }
5639
5640 apex_key {
5641 name: "myapex.key",
5642 public_key: "testkey.avbpubkey",
5643 private_key: "testkey.pem",
5644 }
5645
5646 prebuilt_apex {
5647 name: "myapex",
5648 prefer: true,
5649 arch: {
5650 arm64: {
5651 src: "myapex-arm64.apex",
5652 },
5653 arm: {
5654 src: "myapex-arm.apex",
5655 },
5656 },
5657 }
5658
5659 apex_set {
5660 name: "myapex_set",
5661 set: "myapex.apks",
5662 filename: "myapex_set.apex",
5663 overrides: ["myapex"],
5664 }
5665 `)
5666
5667 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5668 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5669 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park03a7f3e2020-06-18 19:34:42 +09005670 ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005671}
5672
Jooyung Han938b5932020-06-20 12:47:47 +09005673func TestAllowedFiles(t *testing.T) {
5674 ctx, _ := testApex(t, `
5675 apex {
5676 name: "myapex",
5677 key: "myapex.key",
5678 apps: ["app"],
5679 allowed_files: "allowed.txt",
5680 }
5681
5682 apex_key {
5683 name: "myapex.key",
5684 public_key: "testkey.avbpubkey",
5685 private_key: "testkey.pem",
5686 }
5687
5688 android_app {
5689 name: "app",
5690 srcs: ["foo/bar/MyClass.java"],
5691 package_name: "foo",
5692 sdk_version: "none",
5693 system_modules: "none",
5694 apex_available: [ "myapex" ],
5695 }
5696 `, withFiles(map[string][]byte{
5697 "sub/Android.bp": []byte(`
5698 override_apex {
5699 name: "override_myapex",
5700 base: "myapex",
5701 apps: ["override_app"],
5702 allowed_files: ":allowed",
5703 }
5704 // Overridable "path" property should be referenced indirectly
5705 filegroup {
5706 name: "allowed",
5707 srcs: ["allowed.txt"],
5708 }
5709 override_android_app {
5710 name: "override_app",
5711 base: "app",
5712 package_name: "bar",
5713 }
5714 `),
5715 }))
5716
5717 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5718 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5719 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5720 }
5721
5722 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5723 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5724 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5725 }
5726}
5727
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005728func TestMain(m *testing.M) {
5729 run := func() int {
5730 setUp()
5731 defer tearDown()
5732
5733 return m.Run()
5734 }
5735
5736 os.Exit(run())
5737}