blob: d13ec5f9f884801780d13f24e988ef3be4db30f5 [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)
Paul Duffin44f1d842020-06-26 20:17:02 +0100236 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000237 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
238
Paul Duffin021f4e52020-07-30 16:04:17 +0100239 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100240
Paul Duffin021f4e52020-07-30 16:04:17 +0100241 // Register these after the prebuilt mutators have been registered to match what
242 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100243 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
244 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
245
Paul Duffin021f4e52020-07-30 16:04:17 +0100246 cc.RegisterRequiredBuildComponentsForTest(ctx)
247
Colin Cross98be1bb2019-12-13 20:41:13 -0800248 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800249 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
250 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700251 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000252 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700253 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800254 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000255 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000256 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000257 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100258 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900259 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260
Colin Cross98be1bb2019-12-13 20:41:13 -0800261 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
264 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267}
268
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700269func setUp() {
270 var err error
271 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700273 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275}
276
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700278 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279}
280
Jooyung Han643adc42020-02-27 13:50:06 +0900281// ensure that 'result' equals 'expected'
282func ensureEquals(t *testing.T, result string, expected string) {
283 t.Helper()
284 if result != expected {
285 t.Errorf("%q != %q", expected, result)
286 }
287}
288
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289// ensure that 'result' contains 'expected'
290func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900291 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292 if !strings.Contains(result, expected) {
293 t.Errorf("%q is not found in %q", expected, result)
294 }
295}
296
Liz Kammer5bd365f2020-05-27 15:15:11 -0700297// ensure that 'result' contains 'expected' exactly one time
298func ensureContainsOnce(t *testing.T, result string, expected string) {
299 t.Helper()
300 count := strings.Count(result, expected)
301 if count != 1 {
302 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// ensures that 'result' does not contain 'notExpected'
307func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900308 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309 if strings.Contains(result, notExpected) {
310 t.Errorf("%q is found in %q", notExpected, result)
311 }
312}
313
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700314func ensureMatches(t *testing.T, result string, expectedRex string) {
315 ok, err := regexp.MatchString(expectedRex, result)
316 if err != nil {
317 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
318 return
319 }
320 if !ok {
321 t.Errorf("%s does not match regular expession %s", result, expectedRex)
322 }
323}
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900326 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 if !android.InList(expected, result) {
328 t.Errorf("%q is not found in %v", expected, result)
329 }
330}
331
332func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900333 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 if android.InList(notExpected, result) {
335 t.Errorf("%q is found in %v", notExpected, result)
336 }
337}
338
Jooyung Hane1633032019-08-01 17:41:43 +0900339func ensureListEmpty(t *testing.T, result []string) {
340 t.Helper()
341 if len(result) > 0 {
342 t.Errorf("%q is expected to be empty", result)
343 }
344}
345
Jiyong Park25fc6a92018-11-18 18:02:45 +0900346// Minimal test
347func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900348 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900349 apex_defaults {
350 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900351 manifest: ":myapex.manifest",
352 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 key: "myapex.key",
354 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800355 multilib: {
356 both: {
357 binaries: ["foo",],
358 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900359 },
Jiyong Park77acec62020-06-01 21:39:15 +0900360 java_libs: [
361 "myjar",
362 "myjar_dex",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 }
365
Jiyong Park30ca9372019-02-07 16:27:23 +0900366 apex {
367 name: "myapex",
368 defaults: ["myapex-defaults"],
369 }
370
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 apex_key {
372 name: "myapex.key",
373 public_key: "testkey.avbpubkey",
374 private_key: "testkey.pem",
375 }
376
Jiyong Park809bb722019-02-13 21:33:49 +0900377 filegroup {
378 name: "myapex.manifest",
379 srcs: ["apex_manifest.json"],
380 }
381
382 filegroup {
383 name: "myapex.androidmanifest",
384 srcs: ["AndroidManifest.xml"],
385 }
386
Jiyong Park25fc6a92018-11-18 18:02:45 +0900387 cc_library {
388 name: "mylib",
389 srcs: ["mylib.cpp"],
390 shared_libs: ["mylib2"],
391 system_shared_libs: [],
392 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000393 // TODO: remove //apex_available:platform
394 apex_available: [
395 "//apex_available:platform",
396 "myapex",
397 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900398 }
399
Alex Light3d673592019-01-18 14:37:31 -0800400 cc_binary {
401 name: "foo",
402 srcs: ["mylib.cpp"],
403 compile_multilib: "both",
404 multilib: {
405 lib32: {
406 suffix: "32",
407 },
408 lib64: {
409 suffix: "64",
410 },
411 },
412 symlinks: ["foo_link_"],
413 symlink_preferred_arch: true,
414 system_shared_libs: [],
415 static_executable: true,
416 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700417 apex_available: [ "myapex", "com.android.gki.*" ],
418 }
419
420 apex {
421 name: "com.android.gki.fake",
422 binaries: ["foo"],
423 key: "myapex.key",
424 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800425 }
426
Paul Duffindddd5462020-04-07 15:25:44 +0100427 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900428 name: "mylib2",
429 srcs: ["mylib.cpp"],
430 system_shared_libs: [],
431 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900432 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900433 static_libs: ["libstatic"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_prebuilt_library_shared {
442 name: "mylib2",
443 srcs: ["prebuilt.so"],
444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
449 }
450
Jiyong Park9918e1a2020-03-17 19:16:40 +0900451 cc_library_static {
452 name: "libstatic",
453 srcs: ["mylib.cpp"],
454 system_shared_libs: [],
455 stl: "none",
456 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900462 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463
464 java_library {
465 name: "myjar",
466 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900467 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 sdk_version: "none",
469 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900471 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 }
478
Jiyong Park77acec62020-06-01 21:39:15 +0900479 dex_import {
480 name: "myjar_dex",
481 jars: ["prebuilt.jar"],
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 java_library {
489 name: "myotherjar",
490 srcs: ["foo/bar/MyClass.java"],
491 sdk_version: "none",
492 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900499
500 java_library {
501 name: "mysharedjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900506 `)
507
Sundong Ahnabb64432019-10-22 13:58:29 +0900508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900509
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900510 // Make sure that Android.mk is created
511 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
512 data := android.AndroidMkDataForTest(t, config, "", ab)
513 var builder strings.Builder
514 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
515
516 androidMk := builder.String()
517 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
518 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
519
Jiyong Park42cca6c2019-04-01 11:15:50 +0900520 optFlags := apexRule.Args["opt_flags"]
521 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700522 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900523 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 copyCmds := apexRule.Args["copy_commands"]
526
527 // Ensure that main rule creates an output
528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
529
530 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900533 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534
535 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800536 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800540 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
541 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900542 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900543 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900544 // .. but not for java libs
545 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900546 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800547
Colin Cross7113d202019-11-20 16:39:12 -0800548 // Ensure that the platform variant ends with _shared or _common
549 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
554
555 // Ensure that dynamic dependency to java libs are not included
556 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800557
558 // Ensure that all symlinks are present.
559 found_foo_link_64 := false
560 found_foo := false
561 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900562 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800563 if strings.HasSuffix(cmd, "bin/foo") {
564 found_foo = true
565 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
566 found_foo_link_64 = true
567 }
568 }
569 }
570 good := found_foo && found_foo_link_64
571 if !good {
572 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
573 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900574
Sundong Ahnabb64432019-10-22 13:58:29 +0900575 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700576 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900577 if len(noticeInputs) != 3 {
578 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900579 }
580 ensureListContains(t, noticeInputs, "NOTICE")
581 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900582 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900583
Artur Satayeva8bd1132020-04-27 18:07:06 +0100584 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000585 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
586 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
587 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
588 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
589 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100590
591 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000592 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
593 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
594 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800597}
598
Jooyung Hanf21c7972019-12-16 22:32:06 +0900599func TestDefaults(t *testing.T) {
600 ctx, _ := testApex(t, `
601 apex_defaults {
602 name: "myapex-defaults",
603 key: "myapex.key",
604 prebuilts: ["myetc"],
605 native_shared_libs: ["mylib"],
606 java_libs: ["myjar"],
607 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900608 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900609 }
610
611 prebuilt_etc {
612 name: "myetc",
613 src: "myprebuilt",
614 }
615
616 apex {
617 name: "myapex",
618 defaults: ["myapex-defaults"],
619 }
620
621 apex_key {
622 name: "myapex.key",
623 public_key: "testkey.avbpubkey",
624 private_key: "testkey.pem",
625 }
626
627 cc_library {
628 name: "mylib",
629 system_shared_libs: [],
630 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000631 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900632 }
633
634 java_library {
635 name: "myjar",
636 srcs: ["foo/bar/MyClass.java"],
637 sdk_version: "none",
638 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 android_app {
643 name: "AppFoo",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900649
650 runtime_resource_overlay {
651 name: "rro",
652 theme: "blue",
653 }
654
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000656 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 "etc/myetc",
658 "javalib/myjar.jar",
659 "lib64/mylib.so",
660 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900661 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 })
663}
664
Jooyung Han01a3ee22019-11-02 02:52:25 +0900665func TestApexManifest(t *testing.T) {
666 ctx, _ := testApex(t, `
667 apex {
668 name: "myapex",
669 key: "myapex.key",
670 }
671
672 apex_key {
673 name: "myapex.key",
674 public_key: "testkey.avbpubkey",
675 private_key: "testkey.pem",
676 }
677 `)
678
679 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900680 args := module.Rule("apexRule").Args
681 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
682 t.Error("manifest should be apex_manifest.pb, but " + manifest)
683 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900684}
685
Alex Light5098a612018-11-29 17:12:15 -0800686func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700687 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800688 apex {
689 name: "myapex",
690 key: "myapex.key",
691 payload_type: "zip",
692 native_shared_libs: ["mylib"],
693 }
694
695 apex_key {
696 name: "myapex.key",
697 public_key: "testkey.avbpubkey",
698 private_key: "testkey.pem",
699 }
700
701 cc_library {
702 name: "mylib",
703 srcs: ["mylib.cpp"],
704 shared_libs: ["mylib2"],
705 system_shared_libs: [],
706 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000707 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800708 }
709
710 cc_library {
711 name: "mylib2",
712 srcs: ["mylib.cpp"],
713 system_shared_libs: [],
714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000715 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800716 }
717 `)
718
Sundong Ahnabb64432019-10-22 13:58:29 +0900719 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800720 copyCmds := zipApexRule.Args["copy_commands"]
721
722 // Ensure that main rule creates an output
723 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
724
725 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800726 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800727
728 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800729 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800730
731 // Ensure that both direct and indirect deps are copied into apex
732 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
733 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900734}
735
736func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700737 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900738 apex {
739 name: "myapex",
740 key: "myapex.key",
741 native_shared_libs: ["mylib", "mylib3"],
742 }
743
744 apex_key {
745 name: "myapex.key",
746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749
750 cc_library {
751 name: "mylib",
752 srcs: ["mylib.cpp"],
753 shared_libs: ["mylib2", "mylib3"],
754 system_shared_libs: [],
755 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000756 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900757 }
758
759 cc_library {
760 name: "mylib2",
761 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900762 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900763 system_shared_libs: [],
764 stl: "none",
765 stubs: {
766 versions: ["1", "2", "3"],
767 },
768 }
769
770 cc_library {
771 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900772 srcs: ["mylib.cpp"],
773 shared_libs: ["mylib4"],
774 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900775 stl: "none",
776 stubs: {
777 versions: ["10", "11", "12"],
778 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000779 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900781
782 cc_library {
783 name: "mylib4",
784 srcs: ["mylib.cpp"],
785 system_shared_libs: [],
786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000787 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900788 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789 `)
790
Sundong Ahnabb64432019-10-22 13:58:29 +0900791 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900792 copyCmds := apexRule.Args["copy_commands"]
793
794 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800795 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900796
797 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800798 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799
800 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800801 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802
Colin Cross7113d202019-11-20 16:39:12 -0800803 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804
805 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900806 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900808 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809
810 // 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 -0800811 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800813 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900814
815 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900816 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900817 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900818
819 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900820 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900821
Jooyung Hana57af4a2020-01-23 05:36:59 +0000822 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900823 "lib64/mylib.so",
824 "lib64/mylib3.so",
825 "lib64/mylib4.so",
826 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827}
828
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700830 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900831 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900832 name: "myapex2",
833 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900834 native_shared_libs: ["mylib"],
835 }
836
837 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900838 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839 public_key: "testkey.avbpubkey",
840 private_key: "testkey.pem",
841 }
842
843 cc_library {
844 name: "mylib",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900847 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900848 system_shared_libs: [],
849 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000850 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900851 }
852
853 cc_library {
854 name: "libfoo",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["libbar"],
857 system_shared_libs: [],
858 stl: "none",
859 stubs: {
860 versions: ["10", "20", "30"],
861 },
862 }
863
864 cc_library {
865 name: "libbar",
866 srcs: ["mylib.cpp"],
867 system_shared_libs: [],
868 stl: "none",
869 }
870
Jiyong Park678c8812020-02-07 17:25:49 +0900871 cc_library_static {
872 name: "libbaz",
873 srcs: ["mylib.cpp"],
874 system_shared_libs: [],
875 stl: "none",
876 apex_available: [ "myapex2" ],
877 }
878
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900879 `)
880
Jiyong Park83dc74b2020-01-14 18:38:44 +0900881 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900882 copyCmds := apexRule.Args["copy_commands"]
883
884 // Ensure that direct non-stubs dep is always included
885 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
886
887 // Ensure that indirect stubs dep is not included
888 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
889
890 // Ensure that dependency of stubs is not included
891 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
892
Jiyong Park83dc74b2020-01-14 18:38:44 +0900893 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900894
895 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900896 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900897 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900898 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900899
Jiyong Park3ff16992019-12-27 14:11:47 +0900900 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900901
902 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
903 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900904
Artur Satayeva8bd1132020-04-27 18:07:06 +0100905 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000906 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
907 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
908 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900909
Artur Satayeva8bd1132020-04-27 18:07:06 +0100910 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000911 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
912 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
913 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900914}
915
Jooyung Hand3639552019-08-09 12:57:43 +0900916func TestApexWithRuntimeLibsDependency(t *testing.T) {
917 /*
918 myapex
919 |
920 v (runtime_libs)
921 mylib ------+------> libfoo [provides stub]
922 |
923 `------> libbar
924 */
925 ctx, _ := testApex(t, `
926 apex {
927 name: "myapex",
928 key: "myapex.key",
929 native_shared_libs: ["mylib"],
930 }
931
932 apex_key {
933 name: "myapex.key",
934 public_key: "testkey.avbpubkey",
935 private_key: "testkey.pem",
936 }
937
938 cc_library {
939 name: "mylib",
940 srcs: ["mylib.cpp"],
941 runtime_libs: ["libfoo", "libbar"],
942 system_shared_libs: [],
943 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000944 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900945 }
946
947 cc_library {
948 name: "libfoo",
949 srcs: ["mylib.cpp"],
950 system_shared_libs: [],
951 stl: "none",
952 stubs: {
953 versions: ["10", "20", "30"],
954 },
955 }
956
957 cc_library {
958 name: "libbar",
959 srcs: ["mylib.cpp"],
960 system_shared_libs: [],
961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000962 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900963 }
964
965 `)
966
Sundong Ahnabb64432019-10-22 13:58:29 +0900967 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900968 copyCmds := apexRule.Args["copy_commands"]
969
970 // Ensure that direct non-stubs dep is always included
971 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
972
973 // Ensure that indirect stubs dep is not included
974 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
975
976 // Ensure that runtime_libs dep in included
977 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
978
Sundong Ahnabb64432019-10-22 13:58:29 +0900979 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900980 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
981 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900982
983}
984
Jooyung Han8ce8db92020-05-15 19:05:05 +0900985func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
986 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
987 bp := `
988 apex {
989 name: "com.android.runtime",
990 key: "com.android.runtime.key",
991 native_shared_libs: ["libc"],
992 }
993
994 apex_key {
995 name: "com.android.runtime.key",
996 public_key: "testkey.avbpubkey",
997 private_key: "testkey.pem",
998 }
999
1000 cc_library {
1001 name: "libc",
1002 no_libcrt: true,
1003 nocrt: true,
1004 stl: "none",
1005 system_shared_libs: [],
1006 stubs: { versions: ["1"] },
1007 apex_available: ["com.android.runtime"],
1008
1009 sanitize: {
1010 hwaddress: true,
1011 }
1012 }
1013
1014 cc_prebuilt_library_shared {
1015 name: "libclang_rt.hwasan-aarch64-android",
1016 no_libcrt: true,
1017 nocrt: true,
1018 stl: "none",
1019 system_shared_libs: [],
1020 srcs: [""],
1021 stubs: { versions: ["1"] },
1022
1023 sanitize: {
1024 never: true,
1025 },
1026 }
1027 `
1028 // override bp to use hard-coded names: com.android.runtime and libc
1029 fs["Android.bp"] = []byte(bp)
1030 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1031 })
1032
1033 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1034 "lib64/bionic/libc.so",
1035 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1036 })
1037
1038 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1039
1040 installed := hwasan.Description("install libclang_rt.hwasan")
1041 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1042
1043 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1044 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1045 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1046}
1047
1048func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1049 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1050 bp := `
1051 apex {
1052 name: "com.android.runtime",
1053 key: "com.android.runtime.key",
1054 native_shared_libs: ["libc"],
1055 }
1056
1057 apex_key {
1058 name: "com.android.runtime.key",
1059 public_key: "testkey.avbpubkey",
1060 private_key: "testkey.pem",
1061 }
1062
1063 cc_library {
1064 name: "libc",
1065 no_libcrt: true,
1066 nocrt: true,
1067 stl: "none",
1068 system_shared_libs: [],
1069 stubs: { versions: ["1"] },
1070 apex_available: ["com.android.runtime"],
1071 }
1072
1073 cc_prebuilt_library_shared {
1074 name: "libclang_rt.hwasan-aarch64-android",
1075 no_libcrt: true,
1076 nocrt: true,
1077 stl: "none",
1078 system_shared_libs: [],
1079 srcs: [""],
1080 stubs: { versions: ["1"] },
1081
1082 sanitize: {
1083 never: true,
1084 },
1085 }
1086 `
1087 // override bp to use hard-coded names: com.android.runtime and libc
1088 fs["Android.bp"] = []byte(bp)
1089 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1090
1091 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1092 })
1093
1094 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1095 "lib64/bionic/libc.so",
1096 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1097 })
1098
1099 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1100
1101 installed := hwasan.Description("install libclang_rt.hwasan")
1102 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1103
1104 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1105 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1106 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1107}
1108
Jooyung Han61b66e92020-03-21 14:21:46 +00001109func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1110 testcases := []struct {
1111 name string
1112 minSdkVersion string
1113 shouldLink string
1114 shouldNotLink []string
1115 }{
1116 {
Jooyung Han75568392020-03-20 04:29:24 +09001117 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001118 minSdkVersion: "",
Jooyung Han61b66e92020-03-21 14:21:46 +00001119 shouldLink: "30",
1120 shouldNotLink: []string{"29"},
1121 },
1122 {
1123 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001124 minSdkVersion: "min_sdk_version: \"29\",",
Jooyung Han61b66e92020-03-21 14:21:46 +00001125 shouldLink: "29",
1126 shouldNotLink: []string{"30"},
1127 },
1128 }
1129 for _, tc := range testcases {
1130 t.Run(tc.name, func(t *testing.T) {
1131 ctx, _ := testApex(t, `
1132 apex {
1133 name: "myapex",
1134 key: "myapex.key",
1135 use_vendor: true,
1136 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001137 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001138 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001139
Jooyung Han61b66e92020-03-21 14:21:46 +00001140 apex_key {
1141 name: "myapex.key",
1142 public_key: "testkey.avbpubkey",
1143 private_key: "testkey.pem",
1144 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001145
Jooyung Han61b66e92020-03-21 14:21:46 +00001146 cc_library {
1147 name: "mylib",
1148 srcs: ["mylib.cpp"],
1149 vendor_available: true,
1150 shared_libs: ["libbar"],
1151 system_shared_libs: [],
1152 stl: "none",
1153 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001154 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001155 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001156
Jooyung Han61b66e92020-03-21 14:21:46 +00001157 cc_library {
1158 name: "libbar",
1159 srcs: ["mylib.cpp"],
1160 system_shared_libs: [],
1161 stl: "none",
1162 stubs: { versions: ["29","30"] },
1163 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001164
Jooyung Han61b66e92020-03-21 14:21:46 +00001165 llndk_library {
1166 name: "libbar",
1167 symbol_file: "",
1168 }
1169 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001170 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001171 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001172
Jooyung Han61b66e92020-03-21 14:21:46 +00001173 // Ensure that LLNDK dep is not included
1174 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1175 "lib64/mylib.so",
1176 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001177
Jooyung Han61b66e92020-03-21 14:21:46 +00001178 // Ensure that LLNDK dep is required
1179 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1180 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1181 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001182
Jooyung Han61b66e92020-03-21 14:21:46 +00001183 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1184 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1185 for _, ver := range tc.shouldNotLink {
1186 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1187 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001188
Jooyung Han61b66e92020-03-21 14:21:46 +00001189 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1190 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1191 })
1192 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001193}
1194
Jiyong Park25fc6a92018-11-18 18:02:45 +09001195func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001196 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001197 apex {
1198 name: "myapex",
1199 key: "myapex.key",
1200 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1201 }
1202
1203 apex_key {
1204 name: "myapex.key",
1205 public_key: "testkey.avbpubkey",
1206 private_key: "testkey.pem",
1207 }
1208
1209 cc_library {
1210 name: "mylib",
1211 srcs: ["mylib.cpp"],
1212 shared_libs: ["libdl#27"],
1213 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001214 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001215 }
1216
1217 cc_library_shared {
1218 name: "mylib_shared",
1219 srcs: ["mylib.cpp"],
1220 shared_libs: ["libdl#27"],
1221 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001222 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001223 }
1224
1225 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001226 name: "libBootstrap",
1227 srcs: ["mylib.cpp"],
1228 stl: "none",
1229 bootstrap: true,
1230 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001231 `)
1232
Sundong Ahnabb64432019-10-22 13:58:29 +09001233 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001234 copyCmds := apexRule.Args["copy_commands"]
1235
1236 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001237 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001238 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1239 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001240
1241 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001242 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001243
Colin Cross7113d202019-11-20 16:39:12 -08001244 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1245 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1246 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001247
1248 // For dependency to libc
1249 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001250 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001251 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001252 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001253 // ... Cflags from stub is correctly exported to mylib
1254 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1255 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1256
1257 // For dependency to libm
1258 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001259 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001261 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001262 // ... and is not compiling with the stub
1263 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1264 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1265
1266 // For dependency to libdl
1267 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001268 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001269 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001270 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1271 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001272 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001273 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001274 // ... Cflags from stub is correctly exported to mylib
1275 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1276 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001277
1278 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001279 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1280 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1281 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1282 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001283}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001284
Jooyung Han749dc692020-04-15 11:03:39 +09001285func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001286 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001287 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1288 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001289 // 3) (platform) -> liba -> libz : this should be non-stub link
1290 ctx, _ := testApex(t, `
1291 apex {
1292 name: "myapex",
1293 key: "myapex.key",
1294 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001295 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001296 }
1297
1298 apex {
1299 name: "otherapex",
1300 key: "myapex.key",
1301 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001302 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001303 }
1304
1305 apex_key {
1306 name: "myapex.key",
1307 public_key: "testkey.avbpubkey",
1308 private_key: "testkey.pem",
1309 }
1310
1311 cc_library {
1312 name: "libx",
1313 shared_libs: ["liba"],
1314 system_shared_libs: [],
1315 stl: "none",
1316 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001317 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001318 }
1319
1320 cc_library {
1321 name: "liby",
1322 shared_libs: ["liba"],
1323 system_shared_libs: [],
1324 stl: "none",
1325 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001326 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001327 }
1328
1329 cc_library {
1330 name: "liba",
1331 shared_libs: ["libz"],
1332 system_shared_libs: [],
1333 stl: "none",
1334 apex_available: [
1335 "//apex_available:anyapex",
1336 "//apex_available:platform",
1337 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001338 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001339 }
1340
1341 cc_library {
1342 name: "libz",
1343 system_shared_libs: [],
1344 stl: "none",
1345 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001346 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001347 },
1348 }
Jooyung Han749dc692020-04-15 11:03:39 +09001349 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001350
1351 expectLink := func(from, from_variant, to, to_variant string) {
1352 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1353 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1354 }
1355 expectNoLink := func(from, from_variant, to, to_variant string) {
1356 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1357 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1358 }
1359 // platform liba is linked to non-stub version
1360 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001361 // liba in myapex is linked to #28
1362 expectLink("liba", "shared_myapex", "libz", "shared_28")
1363 expectNoLink("liba", "shared_myapex", "libz", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001364 expectNoLink("liba", "shared_myapex", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001365 // liba in otherapex is linked to #30
1366 expectLink("liba", "shared_otherapex", "libz", "shared_30")
1367 expectNoLink("liba", "shared_otherapex", "libz", "shared_28")
Jooyung Han03b51852020-02-26 22:45:42 +09001368 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1369}
1370
Jooyung Hanaed150d2020-04-02 01:41:41 +09001371func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1372 ctx, _ := testApex(t, `
1373 apex {
1374 name: "myapex",
1375 key: "myapex.key",
1376 native_shared_libs: ["libx"],
1377 min_sdk_version: "R",
1378 }
1379
1380 apex_key {
1381 name: "myapex.key",
1382 public_key: "testkey.avbpubkey",
1383 private_key: "testkey.pem",
1384 }
1385
1386 cc_library {
1387 name: "libx",
1388 shared_libs: ["libz"],
1389 system_shared_libs: [],
1390 stl: "none",
1391 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001392 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001393 }
1394
1395 cc_library {
1396 name: "libz",
1397 system_shared_libs: [],
1398 stl: "none",
1399 stubs: {
1400 versions: ["29", "R"],
1401 },
1402 }
1403 `, func(fs map[string][]byte, config android.Config) {
1404 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1405 })
1406
1407 expectLink := func(from, from_variant, to, to_variant string) {
1408 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1409 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1410 }
1411 expectNoLink := func(from, from_variant, to, to_variant string) {
1412 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1413 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1414 }
1415 // 9000 is quite a magic number.
1416 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1417 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1418 // to distinguish them from finalized and future_api(10000)
1419 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1420 // (refer android/api_levels.go)
1421 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1422 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1423 expectNoLink("libx", "shared_myapex", "libz", "shared")
1424}
1425
Jooyung Han749dc692020-04-15 11:03:39 +09001426func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001427 ctx, _ := testApex(t, `
1428 apex {
1429 name: "myapex",
1430 key: "myapex.key",
1431 native_shared_libs: ["libx"],
1432 }
1433
1434 apex_key {
1435 name: "myapex.key",
1436 public_key: "testkey.avbpubkey",
1437 private_key: "testkey.pem",
1438 }
1439
1440 cc_library {
1441 name: "libx",
1442 shared_libs: ["libz"],
1443 system_shared_libs: [],
1444 stl: "none",
1445 apex_available: [ "myapex" ],
1446 }
1447
1448 cc_library {
1449 name: "libz",
1450 system_shared_libs: [],
1451 stl: "none",
1452 stubs: {
1453 versions: ["1", "2"],
1454 },
1455 }
1456 `)
1457
1458 expectLink := func(from, from_variant, to, to_variant string) {
1459 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1460 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1461 }
1462 expectNoLink := func(from, from_variant, to, to_variant string) {
1463 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1464 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1465 }
1466 expectLink("libx", "shared_myapex", "libz", "shared_2")
1467 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1468 expectNoLink("libx", "shared_myapex", "libz", "shared")
1469}
1470
1471func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1472 ctx, _ := testApex(t, `
1473 apex {
1474 name: "myapex",
1475 key: "myapex.key",
1476 native_shared_libs: ["libx"],
1477 }
1478
1479 apex_key {
1480 name: "myapex.key",
1481 public_key: "testkey.avbpubkey",
1482 private_key: "testkey.pem",
1483 }
1484
1485 cc_library {
1486 name: "libx",
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 stubs: {
1491 versions: ["1", "2"],
1492 },
1493 }
1494
1495 cc_library {
1496 name: "libz",
1497 shared_libs: ["libx"],
1498 system_shared_libs: [],
1499 stl: "none",
1500 }
1501 `)
1502
1503 expectLink := func(from, from_variant, to, to_variant string) {
1504 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1505 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1506 }
1507 expectNoLink := func(from, from_variant, to, to_variant string) {
1508 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1509 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1510 }
1511 expectLink("libz", "shared", "libx", "shared_2")
1512 expectNoLink("libz", "shared", "libz", "shared_1")
1513 expectNoLink("libz", "shared", "libz", "shared")
1514}
1515
Jooyung Han75568392020-03-20 04:29:24 +09001516func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001517 ctx, _ := testApex(t, `
1518 apex {
1519 name: "myapex",
1520 key: "myapex.key",
1521 native_shared_libs: ["libx"],
1522 min_sdk_version: "29",
1523 }
1524
1525 apex_key {
1526 name: "myapex.key",
1527 public_key: "testkey.avbpubkey",
1528 private_key: "testkey.pem",
1529 }
1530
1531 cc_library {
1532 name: "libx",
1533 shared_libs: ["libbar"],
1534 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001535 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001536 }
1537
1538 cc_library {
1539 name: "libbar",
1540 stubs: {
1541 versions: ["29", "30"],
1542 },
1543 }
Jooyung Han75568392020-03-20 04:29:24 +09001544 `, func(fs map[string][]byte, config android.Config) {
1545 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1546 })
Jooyung Han03b51852020-02-26 22:45:42 +09001547 expectLink := func(from, from_variant, to, to_variant string) {
1548 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1549 libFlags := ld.Args["libFlags"]
1550 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1551 }
Jooyung Han75568392020-03-20 04:29:24 +09001552 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001553}
1554
Jooyung Han75568392020-03-20 04:29:24 +09001555func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001556 ctx, _ := testApex(t, `
1557 apex {
1558 name: "myapex",
1559 key: "myapex.key",
1560 native_shared_libs: ["libx"],
1561 min_sdk_version: "29",
1562 }
1563
1564 apex_key {
1565 name: "myapex.key",
1566 public_key: "testkey.avbpubkey",
1567 private_key: "testkey.pem",
1568 }
1569
1570 cc_library {
1571 name: "libx",
1572 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001573 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001574 }
Jooyung Han75568392020-03-20 04:29:24 +09001575 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001576
1577 // ensure apex variant of c++ is linked with static unwinder
1578 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1579 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1580 // note that platform variant is not.
1581 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1582 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001583}
1584
Jooyung Han749dc692020-04-15 11:03:39 +09001585func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001586 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001587 apex {
1588 name: "myapex",
1589 key: "myapex.key",
1590 native_shared_libs: ["libx"],
1591 min_sdk_version: "29",
1592 }
1593
1594 apex_key {
1595 name: "myapex.key",
1596 public_key: "testkey.avbpubkey",
1597 private_key: "testkey.pem",
1598 }
1599
1600 cc_library {
1601 name: "libx",
1602 shared_libs: ["libz"],
1603 system_shared_libs: [],
1604 stl: "none",
1605 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001606 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001607 }
1608
1609 cc_library {
1610 name: "libz",
1611 system_shared_libs: [],
1612 stl: "none",
1613 stubs: {
1614 versions: ["30"],
1615 },
1616 }
Jooyung Han75568392020-03-20 04:29:24 +09001617 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001618}
Jooyung Han03b51852020-02-26 22:45:42 +09001619
Jooyung Han749dc692020-04-15 11:03:39 +09001620func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1621 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001622 apex {
1623 name: "myapex",
1624 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001625 native_shared_libs: ["mylib"],
1626 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001627 }
1628
1629 apex_key {
1630 name: "myapex.key",
1631 public_key: "testkey.avbpubkey",
1632 private_key: "testkey.pem",
1633 }
Jooyung Han749dc692020-04-15 11:03:39 +09001634
1635 cc_library {
1636 name: "mylib",
1637 srcs: ["mylib.cpp"],
1638 system_shared_libs: [],
1639 stl: "none",
1640 apex_available: [
1641 "myapex",
1642 ],
1643 min_sdk_version: "30",
1644 }
1645 `)
1646}
1647
1648func TestApexMinSdkVersion_Okay(t *testing.T) {
1649 testApex(t, `
1650 apex {
1651 name: "myapex",
1652 key: "myapex.key",
1653 native_shared_libs: ["libfoo"],
1654 java_libs: ["libbar"],
1655 min_sdk_version: "29",
1656 }
1657
1658 apex_key {
1659 name: "myapex.key",
1660 public_key: "testkey.avbpubkey",
1661 private_key: "testkey.pem",
1662 }
1663
1664 cc_library {
1665 name: "libfoo",
1666 srcs: ["mylib.cpp"],
1667 shared_libs: ["libfoo_dep"],
1668 apex_available: ["myapex"],
1669 min_sdk_version: "29",
1670 }
1671
1672 cc_library {
1673 name: "libfoo_dep",
1674 srcs: ["mylib.cpp"],
1675 apex_available: ["myapex"],
1676 min_sdk_version: "29",
1677 }
1678
1679 java_library {
1680 name: "libbar",
1681 sdk_version: "current",
1682 srcs: ["a.java"],
1683 static_libs: ["libbar_dep"],
1684 apex_available: ["myapex"],
1685 min_sdk_version: "29",
1686 }
1687
1688 java_library {
1689 name: "libbar_dep",
1690 sdk_version: "current",
1691 srcs: ["a.java"],
1692 apex_available: ["myapex"],
1693 min_sdk_version: "29",
1694 }
Jooyung Han03b51852020-02-26 22:45:42 +09001695 `)
1696}
1697
Artur Satayev8cf899a2020-04-15 17:29:42 +01001698func TestJavaStableSdkVersion(t *testing.T) {
1699 testCases := []struct {
1700 name string
1701 expectedError string
1702 bp string
1703 }{
1704 {
1705 name: "Non-updatable apex with non-stable dep",
1706 bp: `
1707 apex {
1708 name: "myapex",
1709 java_libs: ["myjar"],
1710 key: "myapex.key",
1711 }
1712 apex_key {
1713 name: "myapex.key",
1714 public_key: "testkey.avbpubkey",
1715 private_key: "testkey.pem",
1716 }
1717 java_library {
1718 name: "myjar",
1719 srcs: ["foo/bar/MyClass.java"],
1720 sdk_version: "core_platform",
1721 apex_available: ["myapex"],
1722 }
1723 `,
1724 },
1725 {
1726 name: "Updatable apex with stable dep",
1727 bp: `
1728 apex {
1729 name: "myapex",
1730 java_libs: ["myjar"],
1731 key: "myapex.key",
1732 updatable: true,
1733 min_sdk_version: "29",
1734 }
1735 apex_key {
1736 name: "myapex.key",
1737 public_key: "testkey.avbpubkey",
1738 private_key: "testkey.pem",
1739 }
1740 java_library {
1741 name: "myjar",
1742 srcs: ["foo/bar/MyClass.java"],
1743 sdk_version: "current",
1744 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001745 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001746 }
1747 `,
1748 },
1749 {
1750 name: "Updatable apex with non-stable dep",
1751 expectedError: "cannot depend on \"myjar\"",
1752 bp: `
1753 apex {
1754 name: "myapex",
1755 java_libs: ["myjar"],
1756 key: "myapex.key",
1757 updatable: true,
1758 }
1759 apex_key {
1760 name: "myapex.key",
1761 public_key: "testkey.avbpubkey",
1762 private_key: "testkey.pem",
1763 }
1764 java_library {
1765 name: "myjar",
1766 srcs: ["foo/bar/MyClass.java"],
1767 sdk_version: "core_platform",
1768 apex_available: ["myapex"],
1769 }
1770 `,
1771 },
1772 {
1773 name: "Updatable apex with non-stable transitive dep",
1774 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1775 bp: `
1776 apex {
1777 name: "myapex",
1778 java_libs: ["myjar"],
1779 key: "myapex.key",
1780 updatable: true,
1781 }
1782 apex_key {
1783 name: "myapex.key",
1784 public_key: "testkey.avbpubkey",
1785 private_key: "testkey.pem",
1786 }
1787 java_library {
1788 name: "myjar",
1789 srcs: ["foo/bar/MyClass.java"],
1790 sdk_version: "current",
1791 apex_available: ["myapex"],
1792 static_libs: ["transitive-jar"],
1793 }
1794 java_library {
1795 name: "transitive-jar",
1796 srcs: ["foo/bar/MyClass.java"],
1797 sdk_version: "core_platform",
1798 apex_available: ["myapex"],
1799 }
1800 `,
1801 },
1802 }
1803
1804 for _, test := range testCases {
1805 t.Run(test.name, func(t *testing.T) {
1806 if test.expectedError == "" {
1807 testApex(t, test.bp)
1808 } else {
1809 testApexError(t, test.expectedError, test.bp)
1810 }
1811 })
1812 }
1813}
1814
Jooyung Han749dc692020-04-15 11:03:39 +09001815func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1816 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 native_shared_libs: ["mylib"],
1821 min_sdk_version: "29",
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 cc_library {
1831 name: "mylib",
1832 srcs: ["mylib.cpp"],
1833 shared_libs: ["mylib2"],
1834 system_shared_libs: [],
1835 stl: "none",
1836 apex_available: [
1837 "myapex",
1838 ],
1839 min_sdk_version: "29",
1840 }
1841
1842 // indirect part of the apex
1843 cc_library {
1844 name: "mylib2",
1845 srcs: ["mylib.cpp"],
1846 system_shared_libs: [],
1847 stl: "none",
1848 apex_available: [
1849 "myapex",
1850 ],
1851 min_sdk_version: "30",
1852 }
1853 `)
1854}
1855
1856func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1857 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1858 apex {
1859 name: "myapex",
1860 key: "myapex.key",
1861 apps: ["AppFoo"],
1862 min_sdk_version: "29",
1863 }
1864
1865 apex_key {
1866 name: "myapex.key",
1867 public_key: "testkey.avbpubkey",
1868 private_key: "testkey.pem",
1869 }
1870
1871 android_app {
1872 name: "AppFoo",
1873 srcs: ["foo/bar/MyClass.java"],
1874 sdk_version: "current",
1875 min_sdk_version: "29",
1876 system_modules: "none",
1877 stl: "none",
1878 static_libs: ["bar"],
1879 apex_available: [ "myapex" ],
1880 }
1881
1882 java_library {
1883 name: "bar",
1884 sdk_version: "current",
1885 srcs: ["a.java"],
1886 apex_available: [ "myapex" ],
1887 }
1888 `)
1889}
1890
1891func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1892 ctx, _ := testApex(t, `
1893 apex {
1894 name: "myapex",
1895 key: "myapex.key",
1896 native_shared_libs: ["mylib"],
1897 min_sdk_version: "29",
1898 }
1899
1900 apex_key {
1901 name: "myapex.key",
1902 public_key: "testkey.avbpubkey",
1903 private_key: "testkey.pem",
1904 }
1905
1906 // mylib in myapex will link to mylib2#29
1907 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1908 cc_library {
1909 name: "mylib",
1910 srcs: ["mylib.cpp"],
1911 shared_libs: ["mylib2"],
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: ["myapex", "otherapex"],
1915 min_sdk_version: "29",
1916 }
1917
1918 cc_library {
1919 name: "mylib2",
1920 srcs: ["mylib.cpp"],
1921 system_shared_libs: [],
1922 stl: "none",
1923 apex_available: ["otherapex"],
1924 stubs: { versions: ["29", "30"] },
1925 min_sdk_version: "30",
1926 }
1927
1928 apex {
1929 name: "otherapex",
1930 key: "myapex.key",
1931 native_shared_libs: ["mylib", "mylib2"],
1932 min_sdk_version: "30",
1933 }
1934 `)
1935 expectLink := func(from, from_variant, to, to_variant string) {
1936 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1937 libFlags := ld.Args["libFlags"]
1938 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1939 }
1940 expectLink("mylib", "shared_myapex", "mylib2", "shared_29")
1941 expectLink("mylib", "shared_otherapex", "mylib2", "shared_otherapex")
1942}
1943
Jiyong Park7c2ee712018-12-07 00:42:25 +09001944func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001945 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001946 apex {
1947 name: "myapex",
1948 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001949 native_shared_libs: ["mylib"],
1950 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001951 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001952 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 prebuilt_etc {
1962 name: "myetc",
1963 src: "myprebuilt",
1964 sub_dir: "foo/bar",
1965 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001966
1967 cc_library {
1968 name: "mylib",
1969 srcs: ["mylib.cpp"],
1970 relative_install_path: "foo/bar",
1971 system_shared_libs: [],
1972 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001973 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001974 }
1975
1976 cc_binary {
1977 name: "mybin",
1978 srcs: ["mylib.cpp"],
1979 relative_install_path: "foo/bar",
1980 system_shared_libs: [],
1981 static_executable: true,
1982 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001983 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001984 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001985 `)
1986
Sundong Ahnabb64432019-10-22 13:58:29 +09001987 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001988 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1989
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001990 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001991 ensureListContains(t, dirs, "etc")
1992 ensureListContains(t, dirs, "etc/foo")
1993 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001994 ensureListContains(t, dirs, "lib64")
1995 ensureListContains(t, dirs, "lib64/foo")
1996 ensureListContains(t, dirs, "lib64/foo/bar")
1997 ensureListContains(t, dirs, "lib")
1998 ensureListContains(t, dirs, "lib/foo")
1999 ensureListContains(t, dirs, "lib/foo/bar")
2000
Jiyong Parkbd13e442019-03-15 18:10:35 +09002001 ensureListContains(t, dirs, "bin")
2002 ensureListContains(t, dirs, "bin/foo")
2003 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002004}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002005
Jooyung Han35155c42020-02-06 17:33:20 +09002006func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2007 ctx, _ := testApex(t, `
2008 apex {
2009 name: "myapex",
2010 key: "myapex.key",
2011 multilib: {
2012 both: {
2013 native_shared_libs: ["mylib"],
2014 binaries: ["mybin"],
2015 },
2016 },
2017 compile_multilib: "both",
2018 native_bridge_supported: true,
2019 }
2020
2021 apex_key {
2022 name: "myapex.key",
2023 public_key: "testkey.avbpubkey",
2024 private_key: "testkey.pem",
2025 }
2026
2027 cc_library {
2028 name: "mylib",
2029 relative_install_path: "foo/bar",
2030 system_shared_libs: [],
2031 stl: "none",
2032 apex_available: [ "myapex" ],
2033 native_bridge_supported: true,
2034 }
2035
2036 cc_binary {
2037 name: "mybin",
2038 relative_install_path: "foo/bar",
2039 system_shared_libs: [],
2040 static_executable: true,
2041 stl: "none",
2042 apex_available: [ "myapex" ],
2043 native_bridge_supported: true,
2044 compile_multilib: "both", // default is "first" for binary
2045 multilib: {
2046 lib64: {
2047 suffix: "64",
2048 },
2049 },
2050 }
2051 `, withNativeBridgeEnabled)
2052 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2053 "bin/foo/bar/mybin",
2054 "bin/foo/bar/mybin64",
2055 "bin/arm/foo/bar/mybin",
2056 "bin/arm64/foo/bar/mybin64",
2057 "lib/foo/bar/mylib.so",
2058 "lib/arm/foo/bar/mylib.so",
2059 "lib64/foo/bar/mylib.so",
2060 "lib64/arm64/foo/bar/mylib.so",
2061 })
2062}
2063
Jiyong Parkda6eb592018-12-19 17:12:36 +09002064func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002065 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002066 apex {
2067 name: "myapex",
2068 key: "myapex.key",
2069 native_shared_libs: ["mylib"],
2070 use_vendor: true,
2071 }
2072
2073 apex_key {
2074 name: "myapex.key",
2075 public_key: "testkey.avbpubkey",
2076 private_key: "testkey.pem",
2077 }
2078
2079 cc_library {
2080 name: "mylib",
2081 srcs: ["mylib.cpp"],
2082 shared_libs: ["mylib2"],
2083 system_shared_libs: [],
2084 vendor_available: true,
2085 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002086 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002087 }
2088
2089 cc_library {
2090 name: "mylib2",
2091 srcs: ["mylib.cpp"],
2092 system_shared_libs: [],
2093 vendor_available: true,
2094 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002095 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002096 }
Jooyung Handc782442019-11-01 03:14:38 +09002097 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002098 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002099 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002100
2101 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002102 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002103 for _, implicit := range i.Implicits {
2104 inputsList = append(inputsList, implicit.String())
2105 }
2106 }
2107 inputsString := strings.Join(inputsList, " ")
2108
2109 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08002110 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
2111 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002112
2113 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08002114 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
2115 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002116}
Jiyong Park16e91a02018-12-20 18:18:08 +09002117
Jooyung Han85d61762020-06-24 23:50:26 +09002118func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002119 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2120 apex {
2121 name: "myapex",
2122 key: "myapex.key",
2123 use_vendor: true,
2124 }
2125 apex_key {
2126 name: "myapex.key",
2127 public_key: "testkey.avbpubkey",
2128 private_key: "testkey.pem",
2129 }
2130 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002131 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002132 })
Colin Cross440e0d02020-06-11 11:32:11 -07002133 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 use_vendor: true,
2139 }
2140 apex_key {
2141 name: "myapex.key",
2142 public_key: "testkey.avbpubkey",
2143 private_key: "testkey.pem",
2144 }
2145 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002146 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002147 })
2148}
2149
Jooyung Han5c998b92019-06-27 11:30:33 +09002150func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2151 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2152 apex {
2153 name: "myapex",
2154 key: "myapex.key",
2155 native_shared_libs: ["mylib"],
2156 use_vendor: true,
2157 }
2158
2159 apex_key {
2160 name: "myapex.key",
2161 public_key: "testkey.avbpubkey",
2162 private_key: "testkey.pem",
2163 }
2164
2165 cc_library {
2166 name: "mylib",
2167 srcs: ["mylib.cpp"],
2168 system_shared_libs: [],
2169 stl: "none",
2170 }
2171 `)
2172}
2173
Jooyung Han85d61762020-06-24 23:50:26 +09002174func TestVendorApex(t *testing.T) {
2175 ctx, config := testApex(t, `
2176 apex {
2177 name: "myapex",
2178 key: "myapex.key",
2179 binaries: ["mybin"],
2180 vendor: true,
2181 }
2182 apex_key {
2183 name: "myapex.key",
2184 public_key: "testkey.avbpubkey",
2185 private_key: "testkey.pem",
2186 }
2187 cc_binary {
2188 name: "mybin",
2189 vendor: true,
2190 shared_libs: ["libfoo"],
2191 }
2192 cc_library {
2193 name: "libfoo",
2194 proprietary: true,
2195 }
2196 `)
2197
2198 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2199 "bin/mybin",
2200 "lib64/libfoo.so",
2201 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2202 "lib64/libc++.so",
2203 })
2204
2205 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2206 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2207 name := apexBundle.BaseModuleName()
2208 prefix := "TARGET_"
2209 var builder strings.Builder
2210 data.Custom(&builder, name, prefix, "", data)
2211 androidMk := builder.String()
2212 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002213
2214 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2215 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2216 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002217}
2218
Jooyung Handf78e212020-07-22 15:54:47 +09002219func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2220 ctx, _ := testApex(t, `
2221 apex {
2222 name: "myapex",
2223 key: "myapex.key",
2224 binaries: ["mybin"],
2225 vendor: true,
2226 use_vndk_as_stable: true,
2227 }
2228 apex_key {
2229 name: "myapex.key",
2230 public_key: "testkey.avbpubkey",
2231 private_key: "testkey.pem",
2232 }
2233 cc_binary {
2234 name: "mybin",
2235 vendor: true,
2236 shared_libs: ["libvndk", "libvendor"],
2237 }
2238 cc_library {
2239 name: "libvndk",
2240 vndk: {
2241 enabled: true,
2242 },
2243 vendor_available: true,
2244 }
2245 cc_library {
2246 name: "libvendor",
2247 vendor: true,
2248 }
2249 `)
2250
2251 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2252
2253 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_myapex").Rule("ld")
2254 libs := names(ldRule.Args["libFlags"])
2255 // VNDK libs(libvndk/libc++) as they are
2256 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2257 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2258 // non-stable Vendor libs as APEX variants
2259 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_myapex/libvendor.so")
2260
2261 // VNDK libs are not included when use_vndk_as_stable: true
2262 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2263 "bin/mybin",
2264 "lib64/libvendor.so",
2265 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002266
2267 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2268 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2269 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002270}
2271
Jooyung Hanefb184e2020-06-25 17:14:25 +09002272func TestAndroidMk_UseVendorRequired(t *testing.T) {
2273 ctx, config := testApex(t, `
2274 apex {
2275 name: "myapex",
2276 key: "myapex.key",
2277 use_vendor: true,
2278 native_shared_libs: ["mylib"],
2279 }
2280
2281 apex_key {
2282 name: "myapex.key",
2283 public_key: "testkey.avbpubkey",
2284 private_key: "testkey.pem",
2285 }
2286
2287 cc_library {
2288 name: "mylib",
2289 vendor_available: true,
2290 apex_available: ["myapex"],
2291 }
2292 `, func(fs map[string][]byte, config android.Config) {
2293 setUseVendorAllowListForTest(config, []string{"myapex"})
2294 })
2295
2296 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2297 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2298 name := apexBundle.BaseModuleName()
2299 prefix := "TARGET_"
2300 var builder strings.Builder
2301 data.Custom(&builder, name, prefix, "", data)
2302 androidMk := builder.String()
2303 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2304}
2305
2306func TestAndroidMk_VendorApexRequired(t *testing.T) {
2307 ctx, config := testApex(t, `
2308 apex {
2309 name: "myapex",
2310 key: "myapex.key",
2311 vendor: true,
2312 native_shared_libs: ["mylib"],
2313 }
2314
2315 apex_key {
2316 name: "myapex.key",
2317 public_key: "testkey.avbpubkey",
2318 private_key: "testkey.pem",
2319 }
2320
2321 cc_library {
2322 name: "mylib",
2323 vendor_available: true,
2324 }
2325 `)
2326
2327 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2328 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2329 name := apexBundle.BaseModuleName()
2330 prefix := "TARGET_"
2331 var builder strings.Builder
2332 data.Custom(&builder, name, prefix, "", data)
2333 androidMk := builder.String()
2334 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2335}
2336
Jooyung Han2ed99d02020-06-24 23:26:26 +09002337func TestAndroidMkWritesCommonProperties(t *testing.T) {
2338 ctx, config := testApex(t, `
2339 apex {
2340 name: "myapex",
2341 key: "myapex.key",
2342 vintf_fragments: ["fragment.xml"],
2343 init_rc: ["init.rc"],
2344 }
2345 apex_key {
2346 name: "myapex.key",
2347 public_key: "testkey.avbpubkey",
2348 private_key: "testkey.pem",
2349 }
2350 cc_binary {
2351 name: "mybin",
2352 }
2353 `)
2354
2355 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2356 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2357 name := apexBundle.BaseModuleName()
2358 prefix := "TARGET_"
2359 var builder strings.Builder
2360 data.Custom(&builder, name, prefix, "", data)
2361 androidMk := builder.String()
2362 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2363 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2364}
2365
Jiyong Park16e91a02018-12-20 18:18:08 +09002366func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002367 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002368 apex {
2369 name: "myapex",
2370 key: "myapex.key",
2371 native_shared_libs: ["mylib"],
2372 }
2373
2374 apex_key {
2375 name: "myapex.key",
2376 public_key: "testkey.avbpubkey",
2377 private_key: "testkey.pem",
2378 }
2379
2380 cc_library {
2381 name: "mylib",
2382 srcs: ["mylib.cpp"],
2383 system_shared_libs: [],
2384 stl: "none",
2385 stubs: {
2386 versions: ["1", "2", "3"],
2387 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002388 apex_available: [
2389 "//apex_available:platform",
2390 "myapex",
2391 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002392 }
2393
2394 cc_binary {
2395 name: "not_in_apex",
2396 srcs: ["mylib.cpp"],
2397 static_libs: ["mylib"],
2398 static_executable: true,
2399 system_shared_libs: [],
2400 stl: "none",
2401 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002402 `)
2403
Colin Cross7113d202019-11-20 16:39:12 -08002404 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002405
2406 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002407 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002408}
Jiyong Park9335a262018-12-24 11:31:58 +09002409
2410func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002411 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002412 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002413 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002414 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002415 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002416 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002417 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002418 }
2419
2420 cc_library {
2421 name: "mylib",
2422 srcs: ["mylib.cpp"],
2423 system_shared_libs: [],
2424 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002425 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002426 }
2427
2428 apex_key {
2429 name: "myapex.key",
2430 public_key: "testkey.avbpubkey",
2431 private_key: "testkey.pem",
2432 }
2433
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002434 android_app_certificate {
2435 name: "myapex.certificate",
2436 certificate: "testkey",
2437 }
2438
2439 android_app_certificate {
2440 name: "myapex.certificate.override",
2441 certificate: "testkey.override",
2442 }
2443
Jiyong Park9335a262018-12-24 11:31:58 +09002444 `)
2445
2446 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002447 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002448
2449 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2450 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2451 "vendor/foo/devkeys/testkey.avbpubkey")
2452 }
2453 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2454 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2455 "vendor/foo/devkeys/testkey.pem")
2456 }
2457
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002458 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002459 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002460 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002461 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002462 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002463 }
2464}
Jiyong Park58e364a2019-01-19 19:24:06 +09002465
Jooyung Hanf121a652019-12-17 14:30:11 +09002466func TestCertificate(t *testing.T) {
2467 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2468 ctx, _ := testApex(t, `
2469 apex {
2470 name: "myapex",
2471 key: "myapex.key",
2472 }
2473 apex_key {
2474 name: "myapex.key",
2475 public_key: "testkey.avbpubkey",
2476 private_key: "testkey.pem",
2477 }`)
2478 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2479 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2480 if actual := rule.Args["certificates"]; actual != expected {
2481 t.Errorf("certificates should be %q, not %q", expected, actual)
2482 }
2483 })
2484 t.Run("override when unspecified", func(t *testing.T) {
2485 ctx, _ := testApex(t, `
2486 apex {
2487 name: "myapex_keytest",
2488 key: "myapex.key",
2489 file_contexts: ":myapex-file_contexts",
2490 }
2491 apex_key {
2492 name: "myapex.key",
2493 public_key: "testkey.avbpubkey",
2494 private_key: "testkey.pem",
2495 }
2496 android_app_certificate {
2497 name: "myapex.certificate.override",
2498 certificate: "testkey.override",
2499 }`)
2500 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2501 expected := "testkey.override.x509.pem testkey.override.pk8"
2502 if actual := rule.Args["certificates"]; actual != expected {
2503 t.Errorf("certificates should be %q, not %q", expected, actual)
2504 }
2505 })
2506 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2507 ctx, _ := testApex(t, `
2508 apex {
2509 name: "myapex",
2510 key: "myapex.key",
2511 certificate: ":myapex.certificate",
2512 }
2513 apex_key {
2514 name: "myapex.key",
2515 public_key: "testkey.avbpubkey",
2516 private_key: "testkey.pem",
2517 }
2518 android_app_certificate {
2519 name: "myapex.certificate",
2520 certificate: "testkey",
2521 }`)
2522 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2523 expected := "testkey.x509.pem testkey.pk8"
2524 if actual := rule.Args["certificates"]; actual != expected {
2525 t.Errorf("certificates should be %q, not %q", expected, actual)
2526 }
2527 })
2528 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2529 ctx, _ := testApex(t, `
2530 apex {
2531 name: "myapex_keytest",
2532 key: "myapex.key",
2533 file_contexts: ":myapex-file_contexts",
2534 certificate: ":myapex.certificate",
2535 }
2536 apex_key {
2537 name: "myapex.key",
2538 public_key: "testkey.avbpubkey",
2539 private_key: "testkey.pem",
2540 }
2541 android_app_certificate {
2542 name: "myapex.certificate.override",
2543 certificate: "testkey.override",
2544 }`)
2545 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2546 expected := "testkey.override.x509.pem testkey.override.pk8"
2547 if actual := rule.Args["certificates"]; actual != expected {
2548 t.Errorf("certificates should be %q, not %q", expected, actual)
2549 }
2550 })
2551 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2552 ctx, _ := testApex(t, `
2553 apex {
2554 name: "myapex",
2555 key: "myapex.key",
2556 certificate: "testkey",
2557 }
2558 apex_key {
2559 name: "myapex.key",
2560 public_key: "testkey.avbpubkey",
2561 private_key: "testkey.pem",
2562 }`)
2563 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2564 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2565 if actual := rule.Args["certificates"]; actual != expected {
2566 t.Errorf("certificates should be %q, not %q", expected, actual)
2567 }
2568 })
2569 t.Run("override when specified as <name>", func(t *testing.T) {
2570 ctx, _ := testApex(t, `
2571 apex {
2572 name: "myapex_keytest",
2573 key: "myapex.key",
2574 file_contexts: ":myapex-file_contexts",
2575 certificate: "testkey",
2576 }
2577 apex_key {
2578 name: "myapex.key",
2579 public_key: "testkey.avbpubkey",
2580 private_key: "testkey.pem",
2581 }
2582 android_app_certificate {
2583 name: "myapex.certificate.override",
2584 certificate: "testkey.override",
2585 }`)
2586 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2587 expected := "testkey.override.x509.pem testkey.override.pk8"
2588 if actual := rule.Args["certificates"]; actual != expected {
2589 t.Errorf("certificates should be %q, not %q", expected, actual)
2590 }
2591 })
2592}
2593
Jiyong Park58e364a2019-01-19 19:24:06 +09002594func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002595 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002599 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002600 }
2601
2602 apex {
2603 name: "otherapex",
2604 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002605 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002606 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002607 }
2608
2609 apex_key {
2610 name: "myapex.key",
2611 public_key: "testkey.avbpubkey",
2612 private_key: "testkey.pem",
2613 }
2614
2615 cc_library {
2616 name: "mylib",
2617 srcs: ["mylib.cpp"],
2618 system_shared_libs: [],
2619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002621 "myapex",
2622 "otherapex",
2623 ],
Jooyung Han24282772020-03-21 23:20:55 +09002624 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002625 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002626 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002627 cc_library {
2628 name: "mylib2",
2629 srcs: ["mylib.cpp"],
2630 system_shared_libs: [],
2631 stl: "none",
2632 apex_available: [
2633 "myapex",
2634 "otherapex",
2635 ],
2636 use_apex_name_macro: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002637 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002638 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002639 `)
2640
Jooyung Hanc87a0592020-03-02 17:44:33 +09002641 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002642 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002643 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002644 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002645
Jooyung Hanccce2f22020-03-07 03:45:53 +09002646 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002647 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2648 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002649 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002650 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002651
Jooyung Hanccce2f22020-03-07 03:45:53 +09002652 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002653 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2654 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002655 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002656 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002657
Jooyung Hanc87a0592020-03-02 17:44:33 +09002658 // When cc_library sets use_apex_name_macro: true
2659 // apex variants define additional macro to distinguish which apex variant it is built for
2660
2661 // non-APEX variant does not have __ANDROID_APEX__ defined
2662 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2663 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2664
2665 // APEX variant has __ANDROID_APEX__ defined
2666 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002667 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002668 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2669 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002670
Jooyung Hanc87a0592020-03-02 17:44:33 +09002671 // APEX variant has __ANDROID_APEX__ defined
2672 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002673 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002674 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2675 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002676
2677 // recovery variant does not set __ANDROID_SDK_VERSION__
2678 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2679 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2680 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002681}
Jiyong Park7e636d02019-01-28 16:16:54 +09002682
2683func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002684 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002685 apex {
2686 name: "myapex",
2687 key: "myapex.key",
2688 native_shared_libs: ["mylib"],
2689 }
2690
2691 apex_key {
2692 name: "myapex.key",
2693 public_key: "testkey.avbpubkey",
2694 private_key: "testkey.pem",
2695 }
2696
2697 cc_library_headers {
2698 name: "mylib_headers",
2699 export_include_dirs: ["my_include"],
2700 system_shared_libs: [],
2701 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002702 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002703 }
2704
2705 cc_library {
2706 name: "mylib",
2707 srcs: ["mylib.cpp"],
2708 system_shared_libs: [],
2709 stl: "none",
2710 header_libs: ["mylib_headers"],
2711 export_header_lib_headers: ["mylib_headers"],
2712 stubs: {
2713 versions: ["1", "2", "3"],
2714 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002715 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002716 }
2717
2718 cc_library {
2719 name: "otherlib",
2720 srcs: ["mylib.cpp"],
2721 system_shared_libs: [],
2722 stl: "none",
2723 shared_libs: ["mylib"],
2724 }
2725 `)
2726
Colin Cross7113d202019-11-20 16:39:12 -08002727 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002728
2729 // Ensure that the include path of the header lib is exported to 'otherlib'
2730 ensureContains(t, cFlags, "-Imy_include")
2731}
Alex Light9670d332019-01-29 18:07:33 -08002732
Jiyong Park7cd10e32020-01-14 09:22:18 +09002733type fileInApex struct {
2734 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002735 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002736 isLink bool
2737}
2738
Jooyung Hana57af4a2020-01-23 05:36:59 +00002739func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002740 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002741 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002742 copyCmds := apexRule.Args["copy_commands"]
2743 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002744 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002745 for _, cmd := range strings.Split(copyCmds, "&&") {
2746 cmd = strings.TrimSpace(cmd)
2747 if cmd == "" {
2748 continue
2749 }
2750 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002751 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002752 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002753 switch terms[0] {
2754 case "mkdir":
2755 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002756 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002757 t.Fatal("copyCmds contains invalid cp command", cmd)
2758 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002759 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002760 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002761 isLink = false
2762 case "ln":
2763 if len(terms) != 3 && len(terms) != 4 {
2764 // ln LINK TARGET or ln -s LINK TARGET
2765 t.Fatal("copyCmds contains invalid ln command", cmd)
2766 }
2767 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002768 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002769 isLink = true
2770 default:
2771 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2772 }
2773 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002774 index := strings.Index(dst, imageApexDir)
2775 if index == -1 {
2776 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2777 }
2778 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002779 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002780 }
2781 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002782 return ret
2783}
2784
Jooyung Hana57af4a2020-01-23 05:36:59 +00002785func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2786 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002787 var failed bool
2788 var surplus []string
2789 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002790 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002791 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002792 for _, expected := range files {
2793 if matched, _ := path.Match(expected, file.path); matched {
2794 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002795 mactchFound = true
2796 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002797 }
2798 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002799 if !mactchFound {
2800 surplus = append(surplus, file.path)
2801 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002802 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002803
Jooyung Han31c470b2019-10-18 16:26:59 +09002804 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002805 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002806 t.Log("surplus files", surplus)
2807 failed = true
2808 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002809
2810 if len(files) > len(filesMatched) {
2811 var missing []string
2812 for _, expected := range files {
2813 if !filesMatched[expected] {
2814 missing = append(missing, expected)
2815 }
2816 }
2817 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002818 t.Log("missing files", missing)
2819 failed = true
2820 }
2821 if failed {
2822 t.Fail()
2823 }
2824}
2825
Jooyung Han344d5432019-08-23 11:17:39 +09002826func TestVndkApexCurrent(t *testing.T) {
2827 ctx, _ := testApex(t, `
2828 apex_vndk {
2829 name: "myapex",
2830 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002831 }
2832
2833 apex_key {
2834 name: "myapex.key",
2835 public_key: "testkey.avbpubkey",
2836 private_key: "testkey.pem",
2837 }
2838
2839 cc_library {
2840 name: "libvndk",
2841 srcs: ["mylib.cpp"],
2842 vendor_available: true,
2843 vndk: {
2844 enabled: true,
2845 },
2846 system_shared_libs: [],
2847 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002848 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002849 }
2850
2851 cc_library {
2852 name: "libvndksp",
2853 srcs: ["mylib.cpp"],
2854 vendor_available: true,
2855 vndk: {
2856 enabled: true,
2857 support_system_process: true,
2858 },
2859 system_shared_libs: [],
2860 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002861 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002862 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002863 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002864
Jooyung Hana57af4a2020-01-23 05:36:59 +00002865 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002866 "lib/libvndk.so",
2867 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002868 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002869 "lib64/libvndk.so",
2870 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002871 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002872 "etc/llndk.libraries.VER.txt",
2873 "etc/vndkcore.libraries.VER.txt",
2874 "etc/vndksp.libraries.VER.txt",
2875 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002876 })
Jooyung Han344d5432019-08-23 11:17:39 +09002877}
2878
2879func TestVndkApexWithPrebuilt(t *testing.T) {
2880 ctx, _ := testApex(t, `
2881 apex_vndk {
2882 name: "myapex",
2883 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002884 }
2885
2886 apex_key {
2887 name: "myapex.key",
2888 public_key: "testkey.avbpubkey",
2889 private_key: "testkey.pem",
2890 }
2891
2892 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002893 name: "libvndk",
2894 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002895 vendor_available: true,
2896 vndk: {
2897 enabled: true,
2898 },
2899 system_shared_libs: [],
2900 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002901 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002902 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002903
2904 cc_prebuilt_library_shared {
2905 name: "libvndk.arm",
2906 srcs: ["libvndk.arm.so"],
2907 vendor_available: true,
2908 vndk: {
2909 enabled: true,
2910 },
2911 enabled: false,
2912 arch: {
2913 arm: {
2914 enabled: true,
2915 },
2916 },
2917 system_shared_libs: [],
2918 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002919 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002920 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002921 `+vndkLibrariesTxtFiles("current"),
2922 withFiles(map[string][]byte{
2923 "libvndk.so": nil,
2924 "libvndk.arm.so": nil,
2925 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002926
Jooyung Hana57af4a2020-01-23 05:36:59 +00002927 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002928 "lib/libvndk.so",
2929 "lib/libvndk.arm.so",
2930 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002931 "lib/libc++.so",
2932 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002933 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002934 })
Jooyung Han344d5432019-08-23 11:17:39 +09002935}
2936
Jooyung Han39edb6c2019-11-06 16:53:07 +09002937func vndkLibrariesTxtFiles(vers ...string) (result string) {
2938 for _, v := range vers {
2939 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002940 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002941 result += `
2942 vndk_libraries_txt {
2943 name: "` + txt + `.libraries.txt",
2944 }
2945 `
2946 }
2947 } else {
2948 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2949 result += `
2950 prebuilt_etc {
2951 name: "` + txt + `.libraries.` + v + `.txt",
2952 src: "dummy.txt",
2953 }
2954 `
2955 }
2956 }
2957 }
2958 return
2959}
2960
Jooyung Han344d5432019-08-23 11:17:39 +09002961func TestVndkApexVersion(t *testing.T) {
2962 ctx, _ := testApex(t, `
2963 apex_vndk {
2964 name: "myapex_v27",
2965 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002966 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002967 vndk_version: "27",
2968 }
2969
2970 apex_key {
2971 name: "myapex.key",
2972 public_key: "testkey.avbpubkey",
2973 private_key: "testkey.pem",
2974 }
2975
Jooyung Han31c470b2019-10-18 16:26:59 +09002976 vndk_prebuilt_shared {
2977 name: "libvndk27",
2978 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002979 vendor_available: true,
2980 vndk: {
2981 enabled: true,
2982 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002983 target_arch: "arm64",
2984 arch: {
2985 arm: {
2986 srcs: ["libvndk27_arm.so"],
2987 },
2988 arm64: {
2989 srcs: ["libvndk27_arm64.so"],
2990 },
2991 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002992 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002993 }
2994
2995 vndk_prebuilt_shared {
2996 name: "libvndk27",
2997 version: "27",
2998 vendor_available: true,
2999 vndk: {
3000 enabled: true,
3001 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003002 target_arch: "x86_64",
3003 arch: {
3004 x86: {
3005 srcs: ["libvndk27_x86.so"],
3006 },
3007 x86_64: {
3008 srcs: ["libvndk27_x86_64.so"],
3009 },
3010 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003011 }
3012 `+vndkLibrariesTxtFiles("27"),
3013 withFiles(map[string][]byte{
3014 "libvndk27_arm.so": nil,
3015 "libvndk27_arm64.so": nil,
3016 "libvndk27_x86.so": nil,
3017 "libvndk27_x86_64.so": nil,
3018 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003019
Jooyung Hana57af4a2020-01-23 05:36:59 +00003020 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003021 "lib/libvndk27_arm.so",
3022 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003023 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003024 })
Jooyung Han344d5432019-08-23 11:17:39 +09003025}
3026
3027func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3028 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3029 apex_vndk {
3030 name: "myapex_v27",
3031 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003032 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003033 vndk_version: "27",
3034 }
3035 apex_vndk {
3036 name: "myapex_v27_other",
3037 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003038 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003039 vndk_version: "27",
3040 }
3041
3042 apex_key {
3043 name: "myapex.key",
3044 public_key: "testkey.avbpubkey",
3045 private_key: "testkey.pem",
3046 }
3047
3048 cc_library {
3049 name: "libvndk",
3050 srcs: ["mylib.cpp"],
3051 vendor_available: true,
3052 vndk: {
3053 enabled: true,
3054 },
3055 system_shared_libs: [],
3056 stl: "none",
3057 }
3058
3059 vndk_prebuilt_shared {
3060 name: "libvndk",
3061 version: "27",
3062 vendor_available: true,
3063 vndk: {
3064 enabled: true,
3065 },
3066 srcs: ["libvndk.so"],
3067 }
3068 `, withFiles(map[string][]byte{
3069 "libvndk.so": nil,
3070 }))
3071}
3072
Jooyung Han90eee022019-10-01 20:02:42 +09003073func TestVndkApexNameRule(t *testing.T) {
3074 ctx, _ := testApex(t, `
3075 apex_vndk {
3076 name: "myapex",
3077 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003078 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003079 }
3080 apex_vndk {
3081 name: "myapex_v28",
3082 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003083 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003084 vndk_version: "28",
3085 }
3086 apex_key {
3087 name: "myapex.key",
3088 public_key: "testkey.avbpubkey",
3089 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003090 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003091
3092 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003093 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003094 actual := proptools.String(bundle.properties.Apex_name)
3095 if !reflect.DeepEqual(actual, expected) {
3096 t.Errorf("Got '%v', expected '%v'", actual, expected)
3097 }
3098 }
3099
3100 assertApexName("com.android.vndk.vVER", "myapex")
3101 assertApexName("com.android.vndk.v28", "myapex_v28")
3102}
3103
Jooyung Han344d5432019-08-23 11:17:39 +09003104func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3105 ctx, _ := testApex(t, `
3106 apex_vndk {
3107 name: "myapex",
3108 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003109 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003110 }
3111
3112 apex_key {
3113 name: "myapex.key",
3114 public_key: "testkey.avbpubkey",
3115 private_key: "testkey.pem",
3116 }
3117
3118 cc_library {
3119 name: "libvndk",
3120 srcs: ["mylib.cpp"],
3121 vendor_available: true,
3122 native_bridge_supported: true,
3123 host_supported: true,
3124 vndk: {
3125 enabled: true,
3126 },
3127 system_shared_libs: [],
3128 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003129 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003130 }
Jooyung Han35155c42020-02-06 17:33:20 +09003131 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003132
Jooyung Hana57af4a2020-01-23 05:36:59 +00003133 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003134 "lib/libvndk.so",
3135 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003136 "lib/libc++.so",
3137 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003138 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003139 })
Jooyung Han344d5432019-08-23 11:17:39 +09003140}
3141
3142func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3143 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3144 apex_vndk {
3145 name: "myapex",
3146 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003147 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003148 native_bridge_supported: true,
3149 }
3150
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156
3157 cc_library {
3158 name: "libvndk",
3159 srcs: ["mylib.cpp"],
3160 vendor_available: true,
3161 native_bridge_supported: true,
3162 host_supported: true,
3163 vndk: {
3164 enabled: true,
3165 },
3166 system_shared_libs: [],
3167 stl: "none",
3168 }
3169 `)
3170}
3171
Jooyung Han31c470b2019-10-18 16:26:59 +09003172func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003173 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003174 apex_vndk {
3175 name: "myapex_v27",
3176 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003177 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003178 vndk_version: "27",
3179 }
3180
3181 apex_key {
3182 name: "myapex.key",
3183 public_key: "testkey.avbpubkey",
3184 private_key: "testkey.pem",
3185 }
3186
3187 vndk_prebuilt_shared {
3188 name: "libvndk27",
3189 version: "27",
3190 target_arch: "arm",
3191 vendor_available: true,
3192 vndk: {
3193 enabled: true,
3194 },
3195 arch: {
3196 arm: {
3197 srcs: ["libvndk27.so"],
3198 }
3199 },
3200 }
3201
3202 vndk_prebuilt_shared {
3203 name: "libvndk27",
3204 version: "27",
3205 target_arch: "arm",
3206 binder32bit: true,
3207 vendor_available: true,
3208 vndk: {
3209 enabled: true,
3210 },
3211 arch: {
3212 arm: {
3213 srcs: ["libvndk27binder32.so"],
3214 }
3215 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003216 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003217 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003218 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003219 withFiles(map[string][]byte{
3220 "libvndk27.so": nil,
3221 "libvndk27binder32.so": nil,
3222 }),
3223 withBinder32bit,
3224 withTargets(map[android.OsType][]android.Target{
3225 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003226 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3227 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003228 },
3229 }),
3230 )
3231
Jooyung Hana57af4a2020-01-23 05:36:59 +00003232 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003233 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003234 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003235 })
3236}
3237
Jooyung Han45a96772020-06-15 14:59:42 +09003238func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3239 ctx, _ := testApex(t, `
3240 apex_vndk {
3241 name: "myapex",
3242 key: "myapex.key",
3243 file_contexts: ":myapex-file_contexts",
3244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
3252 cc_library {
3253 name: "libz",
3254 vendor_available: true,
3255 vndk: {
3256 enabled: true,
3257 },
3258 stubs: {
3259 symbol_file: "libz.map.txt",
3260 versions: ["30"],
3261 }
3262 }
3263 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3264 "libz.map.txt": nil,
3265 }))
3266
3267 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3268 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3269 ensureListEmpty(t, provideNativeLibs)
3270}
3271
Jooyung Hane1633032019-08-01 17:41:43 +09003272func TestDependenciesInApexManifest(t *testing.T) {
3273 ctx, _ := testApex(t, `
3274 apex {
3275 name: "myapex_nodep",
3276 key: "myapex.key",
3277 native_shared_libs: ["lib_nodep"],
3278 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003279 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003280 }
3281
3282 apex {
3283 name: "myapex_dep",
3284 key: "myapex.key",
3285 native_shared_libs: ["lib_dep"],
3286 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003287 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003288 }
3289
3290 apex {
3291 name: "myapex_provider",
3292 key: "myapex.key",
3293 native_shared_libs: ["libfoo"],
3294 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003295 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003296 }
3297
3298 apex {
3299 name: "myapex_selfcontained",
3300 key: "myapex.key",
3301 native_shared_libs: ["lib_dep", "libfoo"],
3302 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003303 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003304 }
3305
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }
3311
3312 cc_library {
3313 name: "lib_nodep",
3314 srcs: ["mylib.cpp"],
3315 system_shared_libs: [],
3316 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003317 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003318 }
3319
3320 cc_library {
3321 name: "lib_dep",
3322 srcs: ["mylib.cpp"],
3323 shared_libs: ["libfoo"],
3324 system_shared_libs: [],
3325 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003326 apex_available: [
3327 "myapex_dep",
3328 "myapex_provider",
3329 "myapex_selfcontained",
3330 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003331 }
3332
3333 cc_library {
3334 name: "libfoo",
3335 srcs: ["mytest.cpp"],
3336 stubs: {
3337 versions: ["1"],
3338 },
3339 system_shared_libs: [],
3340 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003341 apex_available: [
3342 "myapex_provider",
3343 "myapex_selfcontained",
3344 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003345 }
3346 `)
3347
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003348 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003349 var provideNativeLibs, requireNativeLibs []string
3350
Sundong Ahnabb64432019-10-22 13:58:29 +09003351 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003352 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3353 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003354 ensureListEmpty(t, provideNativeLibs)
3355 ensureListEmpty(t, requireNativeLibs)
3356
Sundong Ahnabb64432019-10-22 13:58:29 +09003357 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003358 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3359 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003360 ensureListEmpty(t, provideNativeLibs)
3361 ensureListContains(t, requireNativeLibs, "libfoo.so")
3362
Sundong Ahnabb64432019-10-22 13:58:29 +09003363 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003364 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3365 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003366 ensureListContains(t, provideNativeLibs, "libfoo.so")
3367 ensureListEmpty(t, requireNativeLibs)
3368
Sundong Ahnabb64432019-10-22 13:58:29 +09003369 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003370 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3371 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003372 ensureListContains(t, provideNativeLibs, "libfoo.so")
3373 ensureListEmpty(t, requireNativeLibs)
3374}
3375
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003376func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003377 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003378 apex {
3379 name: "myapex",
3380 key: "myapex.key",
3381 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003382 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003383 }
3384
3385 apex_key {
3386 name: "myapex.key",
3387 public_key: "testkey.avbpubkey",
3388 private_key: "testkey.pem",
3389 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003390
3391 cc_library {
3392 name: "mylib",
3393 srcs: ["mylib.cpp"],
3394 system_shared_libs: [],
3395 stl: "none",
3396 apex_available: [
3397 "//apex_available:platform",
3398 "myapex",
3399 ],
3400 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003401 `)
3402
Sundong Ahnabb64432019-10-22 13:58:29 +09003403 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003404 apexManifestRule := module.Rule("apexManifestRule")
3405 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3406 apexRule := module.Rule("apexRule")
3407 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003408
3409 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3410 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3411 name := apexBundle.BaseModuleName()
3412 prefix := "TARGET_"
3413 var builder strings.Builder
3414 data.Custom(&builder, name, prefix, "", data)
3415 androidMk := builder.String()
3416 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3417 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003418}
3419
Alex Light0851b882019-02-07 13:20:53 -08003420func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003421 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003422 apex {
3423 name: "myapex",
3424 key: "myapex.key",
3425 native_shared_libs: ["mylib_common"],
3426 }
3427
3428 apex_key {
3429 name: "myapex.key",
3430 public_key: "testkey.avbpubkey",
3431 private_key: "testkey.pem",
3432 }
3433
3434 cc_library {
3435 name: "mylib_common",
3436 srcs: ["mylib.cpp"],
3437 system_shared_libs: [],
3438 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003439 apex_available: [
3440 "//apex_available:platform",
3441 "myapex",
3442 ],
Alex Light0851b882019-02-07 13:20:53 -08003443 }
3444 `)
3445
Sundong Ahnabb64432019-10-22 13:58:29 +09003446 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003447 apexRule := module.Rule("apexRule")
3448 copyCmds := apexRule.Args["copy_commands"]
3449
3450 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3451 t.Log("Apex was a test apex!")
3452 t.Fail()
3453 }
3454 // Ensure that main rule creates an output
3455 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3456
3457 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003458 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003459
3460 // Ensure that both direct and indirect deps are copied into apex
3461 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3462
Colin Cross7113d202019-11-20 16:39:12 -08003463 // Ensure that the platform variant ends with _shared
3464 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003465
3466 if !android.InAnyApex("mylib_common") {
3467 t.Log("Found mylib_common not in any apex!")
3468 t.Fail()
3469 }
3470}
3471
3472func TestTestApex(t *testing.T) {
3473 if android.InAnyApex("mylib_common_test") {
3474 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!")
3475 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003476 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003477 apex_test {
3478 name: "myapex",
3479 key: "myapex.key",
3480 native_shared_libs: ["mylib_common_test"],
3481 }
3482
3483 apex_key {
3484 name: "myapex.key",
3485 public_key: "testkey.avbpubkey",
3486 private_key: "testkey.pem",
3487 }
3488
3489 cc_library {
3490 name: "mylib_common_test",
3491 srcs: ["mylib.cpp"],
3492 system_shared_libs: [],
3493 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003494 // TODO: remove //apex_available:platform
3495 apex_available: [
3496 "//apex_available:platform",
3497 "myapex",
3498 ],
Alex Light0851b882019-02-07 13:20:53 -08003499 }
3500 `)
3501
Sundong Ahnabb64432019-10-22 13:58:29 +09003502 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003503 apexRule := module.Rule("apexRule")
3504 copyCmds := apexRule.Args["copy_commands"]
3505
3506 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3507 t.Log("Apex was not a test apex!")
3508 t.Fail()
3509 }
3510 // Ensure that main rule creates an output
3511 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3512
3513 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003514 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003515
3516 // Ensure that both direct and indirect deps are copied into apex
3517 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3518
Colin Cross7113d202019-11-20 16:39:12 -08003519 // Ensure that the platform variant ends with _shared
3520 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003521}
3522
Alex Light9670d332019-01-29 18:07:33 -08003523func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003524 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003525 apex {
3526 name: "myapex",
3527 key: "myapex.key",
3528 multilib: {
3529 first: {
3530 native_shared_libs: ["mylib_common"],
3531 }
3532 },
3533 target: {
3534 android: {
3535 multilib: {
3536 first: {
3537 native_shared_libs: ["mylib"],
3538 }
3539 }
3540 },
3541 host: {
3542 multilib: {
3543 first: {
3544 native_shared_libs: ["mylib2"],
3545 }
3546 }
3547 }
3548 }
3549 }
3550
3551 apex_key {
3552 name: "myapex.key",
3553 public_key: "testkey.avbpubkey",
3554 private_key: "testkey.pem",
3555 }
3556
3557 cc_library {
3558 name: "mylib",
3559 srcs: ["mylib.cpp"],
3560 system_shared_libs: [],
3561 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003562 // TODO: remove //apex_available:platform
3563 apex_available: [
3564 "//apex_available:platform",
3565 "myapex",
3566 ],
Alex Light9670d332019-01-29 18:07:33 -08003567 }
3568
3569 cc_library {
3570 name: "mylib_common",
3571 srcs: ["mylib.cpp"],
3572 system_shared_libs: [],
3573 stl: "none",
3574 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003575 // TODO: remove //apex_available:platform
3576 apex_available: [
3577 "//apex_available:platform",
3578 "myapex",
3579 ],
Alex Light9670d332019-01-29 18:07:33 -08003580 }
3581
3582 cc_library {
3583 name: "mylib2",
3584 srcs: ["mylib.cpp"],
3585 system_shared_libs: [],
3586 stl: "none",
3587 compile_multilib: "first",
3588 }
3589 `)
3590
Sundong Ahnabb64432019-10-22 13:58:29 +09003591 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003592 copyCmds := apexRule.Args["copy_commands"]
3593
3594 // Ensure that main rule creates an output
3595 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3596
3597 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003598 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3599 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3600 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003601
3602 // Ensure that both direct and indirect deps are copied into apex
3603 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3604 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3605 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3606
Colin Cross7113d202019-11-20 16:39:12 -08003607 // Ensure that the platform variant ends with _shared
3608 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3609 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3610 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003611}
Jiyong Park04480cf2019-02-06 00:16:29 +09003612
3613func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003614 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003615 apex {
3616 name: "myapex",
3617 key: "myapex.key",
3618 binaries: ["myscript"],
3619 }
3620
3621 apex_key {
3622 name: "myapex.key",
3623 public_key: "testkey.avbpubkey",
3624 private_key: "testkey.pem",
3625 }
3626
3627 sh_binary {
3628 name: "myscript",
3629 src: "mylib.cpp",
3630 filename: "myscript.sh",
3631 sub_dir: "script",
3632 }
3633 `)
3634
Sundong Ahnabb64432019-10-22 13:58:29 +09003635 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003636 copyCmds := apexRule.Args["copy_commands"]
3637
3638 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3639}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003640
Jooyung Han91df2082019-11-20 01:49:42 +09003641func TestApexInVariousPartition(t *testing.T) {
3642 testcases := []struct {
3643 propName, parition, flattenedPartition string
3644 }{
3645 {"", "system", "system_ext"},
3646 {"product_specific: true", "product", "product"},
3647 {"soc_specific: true", "vendor", "vendor"},
3648 {"proprietary: true", "vendor", "vendor"},
3649 {"vendor: true", "vendor", "vendor"},
3650 {"system_ext_specific: true", "system_ext", "system_ext"},
3651 }
3652 for _, tc := range testcases {
3653 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3654 ctx, _ := testApex(t, `
3655 apex {
3656 name: "myapex",
3657 key: "myapex.key",
3658 `+tc.propName+`
3659 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003660
Jooyung Han91df2082019-11-20 01:49:42 +09003661 apex_key {
3662 name: "myapex.key",
3663 public_key: "testkey.avbpubkey",
3664 private_key: "testkey.pem",
3665 }
3666 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003667
Jooyung Han91df2082019-11-20 01:49:42 +09003668 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3669 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3670 actual := apex.installDir.String()
3671 if actual != expected {
3672 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3673 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003674
Jooyung Han91df2082019-11-20 01:49:42 +09003675 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3676 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3677 actual = flattened.installDir.String()
3678 if actual != expected {
3679 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3680 }
3681 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003682 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003683}
Jiyong Park67882562019-03-21 01:11:21 +09003684
Jooyung Han580eb4f2020-06-24 19:33:06 +09003685func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003686 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003687 apex {
3688 name: "myapex",
3689 key: "myapex.key",
3690 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003691
Jooyung Han580eb4f2020-06-24 19:33:06 +09003692 apex_key {
3693 name: "myapex.key",
3694 public_key: "testkey.avbpubkey",
3695 private_key: "testkey.pem",
3696 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003697 `)
3698 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003699 rule := module.Output("file_contexts")
3700 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3701}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003702
Jooyung Han580eb4f2020-06-24 19:33:06 +09003703func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003704 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003705 apex {
3706 name: "myapex",
3707 key: "myapex.key",
3708 file_contexts: "my_own_file_contexts",
3709 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003710
Jooyung Han580eb4f2020-06-24 19:33:06 +09003711 apex_key {
3712 name: "myapex.key",
3713 public_key: "testkey.avbpubkey",
3714 private_key: "testkey.pem",
3715 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003716 `, withFiles(map[string][]byte{
3717 "my_own_file_contexts": nil,
3718 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003719}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003720
Jooyung Han580eb4f2020-06-24 19:33:06 +09003721func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003722 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003723 apex {
3724 name: "myapex",
3725 key: "myapex.key",
3726 product_specific: true,
3727 file_contexts: "product_specific_file_contexts",
3728 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003729
Jooyung Han580eb4f2020-06-24 19:33:06 +09003730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003735 `)
3736
Jooyung Han580eb4f2020-06-24 19:33:06 +09003737 ctx, _ := testApex(t, `
3738 apex {
3739 name: "myapex",
3740 key: "myapex.key",
3741 product_specific: true,
3742 file_contexts: "product_specific_file_contexts",
3743 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003744
Jooyung Han580eb4f2020-06-24 19:33:06 +09003745 apex_key {
3746 name: "myapex.key",
3747 public_key: "testkey.avbpubkey",
3748 private_key: "testkey.pem",
3749 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003750 `, withFiles(map[string][]byte{
3751 "product_specific_file_contexts": nil,
3752 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003753 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3754 rule := module.Output("file_contexts")
3755 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3756}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003757
Jooyung Han580eb4f2020-06-24 19:33:06 +09003758func TestFileContexts_SetViaFileGroup(t *testing.T) {
3759 ctx, _ := testApex(t, `
3760 apex {
3761 name: "myapex",
3762 key: "myapex.key",
3763 product_specific: true,
3764 file_contexts: ":my-file-contexts",
3765 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003766
Jooyung Han580eb4f2020-06-24 19:33:06 +09003767 apex_key {
3768 name: "myapex.key",
3769 public_key: "testkey.avbpubkey",
3770 private_key: "testkey.pem",
3771 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003772
Jooyung Han580eb4f2020-06-24 19:33:06 +09003773 filegroup {
3774 name: "my-file-contexts",
3775 srcs: ["product_specific_file_contexts"],
3776 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003777 `, withFiles(map[string][]byte{
3778 "product_specific_file_contexts": nil,
3779 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003780 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3781 rule := module.Output("file_contexts")
3782 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003783}
3784
Jiyong Park67882562019-03-21 01:11:21 +09003785func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003786 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003787 apex_key {
3788 name: "myapex.key",
3789 public_key: ":my.avbpubkey",
3790 private_key: ":my.pem",
3791 product_specific: true,
3792 }
3793
3794 filegroup {
3795 name: "my.avbpubkey",
3796 srcs: ["testkey2.avbpubkey"],
3797 }
3798
3799 filegroup {
3800 name: "my.pem",
3801 srcs: ["testkey2.pem"],
3802 }
3803 `)
3804
3805 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3806 expected_pubkey := "testkey2.avbpubkey"
3807 actual_pubkey := apex_key.public_key_file.String()
3808 if actual_pubkey != expected_pubkey {
3809 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3810 }
3811 expected_privkey := "testkey2.pem"
3812 actual_privkey := apex_key.private_key_file.String()
3813 if actual_privkey != expected_privkey {
3814 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3815 }
3816}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003817
3818func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003819 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003820 prebuilt_apex {
3821 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003822 arch: {
3823 arm64: {
3824 src: "myapex-arm64.apex",
3825 },
3826 arm: {
3827 src: "myapex-arm.apex",
3828 },
3829 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003830 }
3831 `)
3832
3833 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3834
Jiyong Parkc95714e2019-03-29 14:23:10 +09003835 expectedInput := "myapex-arm64.apex"
3836 if prebuilt.inputApex.String() != expectedInput {
3837 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3838 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003839}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003840
3841func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003842 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003843 prebuilt_apex {
3844 name: "myapex",
3845 src: "myapex-arm.apex",
3846 filename: "notmyapex.apex",
3847 }
3848 `)
3849
3850 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3851
3852 expected := "notmyapex.apex"
3853 if p.installFilename != expected {
3854 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3855 }
3856}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003857
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003858func TestPrebuiltOverrides(t *testing.T) {
3859 ctx, config := testApex(t, `
3860 prebuilt_apex {
3861 name: "myapex.prebuilt",
3862 src: "myapex-arm.apex",
3863 overrides: [
3864 "myapex",
3865 ],
3866 }
3867 `)
3868
3869 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3870
3871 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003872 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003873 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003874 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003875 }
3876}
3877
Roland Levillain630846d2019-06-26 12:48:34 +01003878func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003879 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003880 apex_test {
3881 name: "myapex",
3882 key: "myapex.key",
3883 tests: [
3884 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003885 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003886 ],
3887 }
3888
3889 apex_key {
3890 name: "myapex.key",
3891 public_key: "testkey.avbpubkey",
3892 private_key: "testkey.pem",
3893 }
3894
Liz Kammer1c14a212020-05-12 15:26:55 -07003895 filegroup {
3896 name: "fg",
3897 srcs: [
3898 "baz",
3899 "bar/baz"
3900 ],
3901 }
3902
Roland Levillain630846d2019-06-26 12:48:34 +01003903 cc_test {
3904 name: "mytest",
3905 gtest: false,
3906 srcs: ["mytest.cpp"],
3907 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003908 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003909 system_shared_libs: [],
3910 static_executable: true,
3911 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003912 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003913 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003914
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003915 cc_library {
3916 name: "mylib",
3917 srcs: ["mylib.cpp"],
3918 system_shared_libs: [],
3919 stl: "none",
3920 }
3921
Liz Kammer5bd365f2020-05-27 15:15:11 -07003922 filegroup {
3923 name: "fg2",
3924 srcs: [
3925 "testdata/baz"
3926 ],
3927 }
3928
Roland Levillain9b5fde92019-06-28 15:41:19 +01003929 cc_test {
3930 name: "mytests",
3931 gtest: false,
3932 srcs: [
3933 "mytest1.cpp",
3934 "mytest2.cpp",
3935 "mytest3.cpp",
3936 ],
3937 test_per_src: true,
3938 relative_install_path: "test",
3939 system_shared_libs: [],
3940 static_executable: true,
3941 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003942 data: [
3943 ":fg",
3944 ":fg2",
3945 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003946 }
Roland Levillain630846d2019-06-26 12:48:34 +01003947 `)
3948
Sundong Ahnabb64432019-10-22 13:58:29 +09003949 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003950 copyCmds := apexRule.Args["copy_commands"]
3951
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003952 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003953 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003954 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003955
Liz Kammer1c14a212020-05-12 15:26:55 -07003956 //Ensure that test data are copied into apex.
3957 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3958 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3959
Roland Levillain9b5fde92019-06-28 15:41:19 +01003960 // Ensure that test deps built with `test_per_src` are copied into apex.
3961 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3962 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3963 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003964
3965 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003966 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3967 data := android.AndroidMkDataForTest(t, config, "", bundle)
3968 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003969 prefix := "TARGET_"
3970 var builder strings.Builder
3971 data.Custom(&builder, name, prefix, "", data)
3972 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003973 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3974 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3975 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3976 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003977 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003978 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003979 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003980
3981 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3982 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3983 data.Custom(&builder, name, prefix, "", data)
3984 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003985 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3986 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003987}
3988
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003989func TestInstallExtraFlattenedApexes(t *testing.T) {
3990 ctx, config := testApex(t, `
3991 apex {
3992 name: "myapex",
3993 key: "myapex.key",
3994 }
3995 apex_key {
3996 name: "myapex.key",
3997 public_key: "testkey.avbpubkey",
3998 private_key: "testkey.pem",
3999 }
4000 `, func(fs map[string][]byte, config android.Config) {
4001 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4002 })
4003 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004004 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004005 mk := android.AndroidMkDataForTest(t, config, "", ab)
4006 var builder strings.Builder
4007 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4008 androidMk := builder.String()
4009 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4010}
4011
Jooyung Han5c998b92019-06-27 11:30:33 +09004012func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004013 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004014 apex {
4015 name: "myapex",
4016 key: "myapex.key",
4017 native_shared_libs: ["mylib"],
4018 uses: ["commonapex"],
4019 }
4020
4021 apex {
4022 name: "commonapex",
4023 key: "myapex.key",
4024 native_shared_libs: ["libcommon"],
4025 provide_cpp_shared_libs: true,
4026 }
4027
4028 apex_key {
4029 name: "myapex.key",
4030 public_key: "testkey.avbpubkey",
4031 private_key: "testkey.pem",
4032 }
4033
4034 cc_library {
4035 name: "mylib",
4036 srcs: ["mylib.cpp"],
4037 shared_libs: ["libcommon"],
4038 system_shared_libs: [],
4039 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004040 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004041 }
4042
4043 cc_library {
4044 name: "libcommon",
4045 srcs: ["mylib_common.cpp"],
4046 system_shared_libs: [],
4047 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004048 // TODO: remove //apex_available:platform
4049 apex_available: [
4050 "//apex_available:platform",
4051 "commonapex",
4052 "myapex",
4053 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004054 }
4055 `)
4056
Sundong Ahnabb64432019-10-22 13:58:29 +09004057 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004058 apexRule1 := module1.Rule("apexRule")
4059 copyCmds1 := apexRule1.Args["copy_commands"]
4060
Sundong Ahnabb64432019-10-22 13:58:29 +09004061 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004062 apexRule2 := module2.Rule("apexRule")
4063 copyCmds2 := apexRule2.Args["copy_commands"]
4064
Colin Cross7113d202019-11-20 16:39:12 -08004065 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
4066 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09004067 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4068 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4069 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4070}
4071
4072func TestApexUsesFailsIfNotProvided(t *testing.T) {
4073 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4074 apex {
4075 name: "myapex",
4076 key: "myapex.key",
4077 uses: ["commonapex"],
4078 }
4079
4080 apex {
4081 name: "commonapex",
4082 key: "myapex.key",
4083 }
4084
4085 apex_key {
4086 name: "myapex.key",
4087 public_key: "testkey.avbpubkey",
4088 private_key: "testkey.pem",
4089 }
4090 `)
4091 testApexError(t, `uses: "commonapex" is not a provider`, `
4092 apex {
4093 name: "myapex",
4094 key: "myapex.key",
4095 uses: ["commonapex"],
4096 }
4097
4098 cc_library {
4099 name: "commonapex",
4100 system_shared_libs: [],
4101 stl: "none",
4102 }
4103
4104 apex_key {
4105 name: "myapex.key",
4106 public_key: "testkey.avbpubkey",
4107 private_key: "testkey.pem",
4108 }
4109 `)
4110}
4111
4112func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4113 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4114 apex {
4115 name: "myapex",
4116 key: "myapex.key",
4117 use_vendor: true,
4118 uses: ["commonapex"],
4119 }
4120
4121 apex {
4122 name: "commonapex",
4123 key: "myapex.key",
4124 provide_cpp_shared_libs: true,
4125 }
4126
4127 apex_key {
4128 name: "myapex.key",
4129 public_key: "testkey.avbpubkey",
4130 private_key: "testkey.pem",
4131 }
Jooyung Handc782442019-11-01 03:14:38 +09004132 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004133 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004134 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004135}
4136
Jooyung Hand48f3c32019-08-23 11:18:57 +09004137func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4138 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4139 apex {
4140 name: "myapex",
4141 key: "myapex.key",
4142 native_shared_libs: ["libfoo"],
4143 }
4144
4145 apex_key {
4146 name: "myapex.key",
4147 public_key: "testkey.avbpubkey",
4148 private_key: "testkey.pem",
4149 }
4150
4151 cc_library {
4152 name: "libfoo",
4153 stl: "none",
4154 system_shared_libs: [],
4155 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004156 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004157 }
4158 `)
4159 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4160 apex {
4161 name: "myapex",
4162 key: "myapex.key",
4163 java_libs: ["myjar"],
4164 }
4165
4166 apex_key {
4167 name: "myapex.key",
4168 public_key: "testkey.avbpubkey",
4169 private_key: "testkey.pem",
4170 }
4171
4172 java_library {
4173 name: "myjar",
4174 srcs: ["foo/bar/MyClass.java"],
4175 sdk_version: "none",
4176 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004177 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004178 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004179 }
4180 `)
4181}
4182
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004183func TestApexWithApps(t *testing.T) {
4184 ctx, _ := testApex(t, `
4185 apex {
4186 name: "myapex",
4187 key: "myapex.key",
4188 apps: [
4189 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004190 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004191 ],
4192 }
4193
4194 apex_key {
4195 name: "myapex.key",
4196 public_key: "testkey.avbpubkey",
4197 private_key: "testkey.pem",
4198 }
4199
4200 android_app {
4201 name: "AppFoo",
4202 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004203 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004204 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004205 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004206 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004207 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004208 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004209
4210 android_app {
4211 name: "AppFooPriv",
4212 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004213 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004214 system_modules: "none",
4215 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004216 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004217 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004218 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004219
4220 cc_library_shared {
4221 name: "libjni",
4222 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004223 shared_libs: ["libfoo"],
4224 stl: "none",
4225 system_shared_libs: [],
4226 apex_available: [ "myapex" ],
4227 sdk_version: "current",
4228 }
4229
4230 cc_library_shared {
4231 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004232 stl: "none",
4233 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004234 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004235 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004236 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004237 `)
4238
Sundong Ahnabb64432019-10-22 13:58:29 +09004239 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004240 apexRule := module.Rule("apexRule")
4241 copyCmds := apexRule.Args["copy_commands"]
4242
4243 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004244 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004245
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004246 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
4247 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004248 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004249 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004250 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004251 // JNI libraries including transitive deps are
4252 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00004253 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004254 // ... embedded inside APK (jnilibs.zip)
4255 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4256 // ... and not directly inside the APEX
4257 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4258 }
Dario Frenicde2a032019-10-27 00:29:22 +01004259}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004260
Dario Frenicde2a032019-10-27 00:29:22 +01004261func TestApexWithAppImports(t *testing.T) {
4262 ctx, _ := testApex(t, `
4263 apex {
4264 name: "myapex",
4265 key: "myapex.key",
4266 apps: [
4267 "AppFooPrebuilt",
4268 "AppFooPrivPrebuilt",
4269 ],
4270 }
4271
4272 apex_key {
4273 name: "myapex.key",
4274 public_key: "testkey.avbpubkey",
4275 private_key: "testkey.pem",
4276 }
4277
4278 android_app_import {
4279 name: "AppFooPrebuilt",
4280 apk: "PrebuiltAppFoo.apk",
4281 presigned: true,
4282 dex_preopt: {
4283 enabled: false,
4284 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004285 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004286 }
4287
4288 android_app_import {
4289 name: "AppFooPrivPrebuilt",
4290 apk: "PrebuiltAppFooPriv.apk",
4291 privileged: true,
4292 presigned: true,
4293 dex_preopt: {
4294 enabled: false,
4295 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004296 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004297 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004298 }
4299 `)
4300
Sundong Ahnabb64432019-10-22 13:58:29 +09004301 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004302 apexRule := module.Rule("apexRule")
4303 copyCmds := apexRule.Args["copy_commands"]
4304
4305 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004306 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4307}
4308
4309func TestApexWithAppImportsPrefer(t *testing.T) {
4310 ctx, _ := testApex(t, `
4311 apex {
4312 name: "myapex",
4313 key: "myapex.key",
4314 apps: [
4315 "AppFoo",
4316 ],
4317 }
4318
4319 apex_key {
4320 name: "myapex.key",
4321 public_key: "testkey.avbpubkey",
4322 private_key: "testkey.pem",
4323 }
4324
4325 android_app {
4326 name: "AppFoo",
4327 srcs: ["foo/bar/MyClass.java"],
4328 sdk_version: "none",
4329 system_modules: "none",
4330 apex_available: [ "myapex" ],
4331 }
4332
4333 android_app_import {
4334 name: "AppFoo",
4335 apk: "AppFooPrebuilt.apk",
4336 filename: "AppFooPrebuilt.apk",
4337 presigned: true,
4338 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004339 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004340 }
4341 `, withFiles(map[string][]byte{
4342 "AppFooPrebuilt.apk": nil,
4343 }))
4344
4345 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4346 "app/AppFoo/AppFooPrebuilt.apk",
4347 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004348}
4349
Dario Freni6f3937c2019-12-20 22:58:03 +00004350func TestApexWithTestHelperApp(t *testing.T) {
4351 ctx, _ := testApex(t, `
4352 apex {
4353 name: "myapex",
4354 key: "myapex.key",
4355 apps: [
4356 "TesterHelpAppFoo",
4357 ],
4358 }
4359
4360 apex_key {
4361 name: "myapex.key",
4362 public_key: "testkey.avbpubkey",
4363 private_key: "testkey.pem",
4364 }
4365
4366 android_test_helper_app {
4367 name: "TesterHelpAppFoo",
4368 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004369 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004370 }
4371
4372 `)
4373
4374 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4375 apexRule := module.Rule("apexRule")
4376 copyCmds := apexRule.Args["copy_commands"]
4377
4378 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4379}
4380
Jooyung Han18020ea2019-11-13 10:50:48 +09004381func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4382 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004383 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004384 apex {
4385 name: "myapex",
4386 key: "myapex.key",
4387 native_shared_libs: ["libfoo"],
4388 }
4389
4390 apex_key {
4391 name: "myapex.key",
4392 public_key: "testkey.avbpubkey",
4393 private_key: "testkey.pem",
4394 }
4395
4396 apex {
4397 name: "otherapex",
4398 key: "myapex.key",
4399 native_shared_libs: ["libfoo"],
4400 }
4401
4402 cc_defaults {
4403 name: "libfoo-defaults",
4404 apex_available: ["otherapex"],
4405 }
4406
4407 cc_library {
4408 name: "libfoo",
4409 defaults: ["libfoo-defaults"],
4410 stl: "none",
4411 system_shared_libs: [],
4412 }`)
4413}
4414
Paul Duffine52e66f2020-03-30 17:54:29 +01004415func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004416 // libfoo is not available to myapex, but only to otherapex
4417 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4418 apex {
4419 name: "myapex",
4420 key: "myapex.key",
4421 native_shared_libs: ["libfoo"],
4422 }
4423
4424 apex_key {
4425 name: "myapex.key",
4426 public_key: "testkey.avbpubkey",
4427 private_key: "testkey.pem",
4428 }
4429
4430 apex {
4431 name: "otherapex",
4432 key: "otherapex.key",
4433 native_shared_libs: ["libfoo"],
4434 }
4435
4436 apex_key {
4437 name: "otherapex.key",
4438 public_key: "testkey.avbpubkey",
4439 private_key: "testkey.pem",
4440 }
4441
4442 cc_library {
4443 name: "libfoo",
4444 stl: "none",
4445 system_shared_libs: [],
4446 apex_available: ["otherapex"],
4447 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004448}
Jiyong Park127b40b2019-09-30 16:04:35 +09004449
Paul Duffine52e66f2020-03-30 17:54:29 +01004450func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004451 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004452 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004453.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004454.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004455.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004456.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004457.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004458.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004459 apex {
4460 name: "myapex",
4461 key: "myapex.key",
4462 native_shared_libs: ["libfoo"],
4463 }
4464
4465 apex_key {
4466 name: "myapex.key",
4467 public_key: "testkey.avbpubkey",
4468 private_key: "testkey.pem",
4469 }
4470
Jiyong Park127b40b2019-09-30 16:04:35 +09004471 cc_library {
4472 name: "libfoo",
4473 stl: "none",
4474 shared_libs: ["libbar"],
4475 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004476 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004477 }
4478
4479 cc_library {
4480 name: "libbar",
4481 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004482 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004483 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004484 apex_available: ["myapex"],
4485 }
4486
4487 cc_library {
4488 name: "libbaz",
4489 stl: "none",
4490 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004491 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004492}
Jiyong Park127b40b2019-09-30 16:04:35 +09004493
Paul Duffine52e66f2020-03-30 17:54:29 +01004494func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004495 testApexError(t, "\"otherapex\" is not a valid module name", `
4496 apex {
4497 name: "myapex",
4498 key: "myapex.key",
4499 native_shared_libs: ["libfoo"],
4500 }
4501
4502 apex_key {
4503 name: "myapex.key",
4504 public_key: "testkey.avbpubkey",
4505 private_key: "testkey.pem",
4506 }
4507
4508 cc_library {
4509 name: "libfoo",
4510 stl: "none",
4511 system_shared_libs: [],
4512 apex_available: ["otherapex"],
4513 }`)
4514
Paul Duffine52e66f2020-03-30 17:54:29 +01004515 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004516 apex {
4517 name: "myapex",
4518 key: "myapex.key",
4519 native_shared_libs: ["libfoo", "libbar"],
4520 }
4521
4522 apex_key {
4523 name: "myapex.key",
4524 public_key: "testkey.avbpubkey",
4525 private_key: "testkey.pem",
4526 }
4527
4528 cc_library {
4529 name: "libfoo",
4530 stl: "none",
4531 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004532 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004533 apex_available: ["myapex"],
4534 }
4535
4536 cc_library {
4537 name: "libbar",
4538 stl: "none",
4539 system_shared_libs: [],
4540 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004541 }
4542
4543 cc_library {
4544 name: "libbaz",
4545 stl: "none",
4546 system_shared_libs: [],
4547 stubs: {
4548 versions: ["10", "20", "30"],
4549 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004550 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004551}
Jiyong Park127b40b2019-09-30 16:04:35 +09004552
Jiyong Park89e850a2020-04-07 16:37:39 +09004553func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004554 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004555 apex {
4556 name: "myapex",
4557 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004558 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004559 }
4560
4561 apex_key {
4562 name: "myapex.key",
4563 public_key: "testkey.avbpubkey",
4564 private_key: "testkey.pem",
4565 }
4566
4567 cc_library {
4568 name: "libfoo",
4569 stl: "none",
4570 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004571 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004572 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004573 }
4574
4575 cc_library {
4576 name: "libfoo2",
4577 stl: "none",
4578 system_shared_libs: [],
4579 shared_libs: ["libbaz"],
4580 apex_available: ["//apex_available:platform"],
4581 }
4582
4583 cc_library {
4584 name: "libbar",
4585 stl: "none",
4586 system_shared_libs: [],
4587 apex_available: ["myapex"],
4588 }
4589
4590 cc_library {
4591 name: "libbaz",
4592 stl: "none",
4593 system_shared_libs: [],
4594 apex_available: ["myapex"],
4595 stubs: {
4596 versions: ["1"],
4597 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004598 }`)
4599
Jiyong Park89e850a2020-04-07 16:37:39 +09004600 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4601 // because it depends on libbar which isn't available to platform
4602 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4603 if libfoo.NotAvailableForPlatform() != true {
4604 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4605 }
4606
4607 // libfoo2 however can be available to platform because it depends on libbaz which provides
4608 // stubs
4609 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4610 if libfoo2.NotAvailableForPlatform() == true {
4611 t.Errorf("%q should be available to platform", libfoo2.String())
4612 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004613}
Jiyong Parka90ca002019-10-07 15:47:24 +09004614
Paul Duffine52e66f2020-03-30 17:54:29 +01004615func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004616 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004617 apex {
4618 name: "myapex",
4619 key: "myapex.key",
4620 native_shared_libs: ["libfoo"],
4621 }
4622
4623 apex_key {
4624 name: "myapex.key",
4625 public_key: "testkey.avbpubkey",
4626 private_key: "testkey.pem",
4627 }
4628
4629 cc_library {
4630 name: "libfoo",
4631 stl: "none",
4632 system_shared_libs: [],
4633 apex_available: ["myapex"],
4634 static: {
4635 apex_available: ["//apex_available:platform"],
4636 },
4637 }`)
4638
Jiyong Park89e850a2020-04-07 16:37:39 +09004639 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4640 if libfooShared.NotAvailableForPlatform() != true {
4641 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4642 }
4643 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4644 if libfooStatic.NotAvailableForPlatform() != false {
4645 t.Errorf("%q should be available to platform", libfooStatic.String())
4646 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004647}
4648
Jiyong Park5d790c32019-11-15 18:40:32 +09004649func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004650 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004651 apex {
4652 name: "myapex",
4653 key: "myapex.key",
4654 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004655 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004656 }
4657
4658 override_apex {
4659 name: "override_myapex",
4660 base: "myapex",
4661 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004662 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004663 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004664 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004665 }
4666
4667 apex_key {
4668 name: "myapex.key",
4669 public_key: "testkey.avbpubkey",
4670 private_key: "testkey.pem",
4671 }
4672
4673 android_app {
4674 name: "app",
4675 srcs: ["foo/bar/MyClass.java"],
4676 package_name: "foo",
4677 sdk_version: "none",
4678 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004679 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004680 }
4681
4682 override_android_app {
4683 name: "override_app",
4684 base: "app",
4685 package_name: "bar",
4686 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004687 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004688
Jiyong Park317645e2019-12-05 13:20:58 +09004689 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4690 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4691 if originalVariant.GetOverriddenBy() != "" {
4692 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4693 }
4694 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4695 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4696 }
4697
Jiyong Park5d790c32019-11-15 18:40:32 +09004698 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4699 apexRule := module.Rule("apexRule")
4700 copyCmds := apexRule.Args["copy_commands"]
4701
4702 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004703 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004704
4705 apexBundle := module.Module().(*apexBundle)
4706 name := apexBundle.Name()
4707 if name != "override_myapex" {
4708 t.Errorf("name should be \"override_myapex\", but was %q", name)
4709 }
4710
Baligh Uddin004d7172020-02-19 21:29:28 -08004711 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4712 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4713 }
4714
Jiyong Park20bacab2020-03-03 11:45:41 +09004715 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004716 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004717
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004718 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4719 var builder strings.Builder
4720 data.Custom(&builder, name, "TARGET_", "", data)
4721 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004722 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004723 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4724 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004725 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004726 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004727 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004728 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4729 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004730}
4731
Jooyung Han214bf372019-11-12 13:03:50 +09004732func TestLegacyAndroid10Support(t *testing.T) {
4733 ctx, _ := testApex(t, `
4734 apex {
4735 name: "myapex",
4736 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004737 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004738 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004739 }
4740
4741 apex_key {
4742 name: "myapex.key",
4743 public_key: "testkey.avbpubkey",
4744 private_key: "testkey.pem",
4745 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004746
4747 cc_library {
4748 name: "mylib",
4749 srcs: ["mylib.cpp"],
4750 stl: "libc++",
4751 system_shared_libs: [],
4752 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004753 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004754 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004755 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004756
4757 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4758 args := module.Rule("apexRule").Args
4759 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004760 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004761
4762 // The copies of the libraries in the apex should have one more dependency than
4763 // the ones outside the apex, namely the unwinder. Ideally we should check
4764 // the dependency names directly here but for some reason the names are blank in
4765 // this test.
4766 for _, lib := range []string{"libc++", "mylib"} {
4767 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4768 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4769 if len(apexImplicits) != len(nonApexImplicits)+1 {
4770 t.Errorf("%q missing unwinder dep", lib)
4771 }
4772 }
Jooyung Han214bf372019-11-12 13:03:50 +09004773}
4774
Paul Duffin9b879592020-05-26 13:21:35 +01004775var filesForSdkLibrary = map[string][]byte{
4776 "api/current.txt": nil,
4777 "api/removed.txt": nil,
4778 "api/system-current.txt": nil,
4779 "api/system-removed.txt": nil,
4780 "api/test-current.txt": nil,
4781 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004782
4783 // For java_sdk_library_import
4784 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004785}
4786
Jooyung Han58f26ab2019-12-18 15:34:32 +09004787func TestJavaSDKLibrary(t *testing.T) {
4788 ctx, _ := testApex(t, `
4789 apex {
4790 name: "myapex",
4791 key: "myapex.key",
4792 java_libs: ["foo"],
4793 }
4794
4795 apex_key {
4796 name: "myapex.key",
4797 public_key: "testkey.avbpubkey",
4798 private_key: "testkey.pem",
4799 }
4800
4801 java_sdk_library {
4802 name: "foo",
4803 srcs: ["a.java"],
4804 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004805 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004806 }
Paul Duffin9b879592020-05-26 13:21:35 +01004807 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004808
4809 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004810 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004811 "javalib/foo.jar",
4812 "etc/permissions/foo.xml",
4813 })
4814 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004815 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4816 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004817}
4818
Paul Duffin9b879592020-05-26 13:21:35 +01004819func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4820 ctx, _ := testApex(t, `
4821 apex {
4822 name: "myapex",
4823 key: "myapex.key",
4824 java_libs: ["foo", "bar"],
4825 }
4826
4827 apex_key {
4828 name: "myapex.key",
4829 public_key: "testkey.avbpubkey",
4830 private_key: "testkey.pem",
4831 }
4832
4833 java_sdk_library {
4834 name: "foo",
4835 srcs: ["a.java"],
4836 api_packages: ["foo"],
4837 apex_available: ["myapex"],
4838 sdk_version: "none",
4839 system_modules: "none",
4840 }
4841
4842 java_library {
4843 name: "bar",
4844 srcs: ["a.java"],
4845 libs: ["foo"],
4846 apex_available: ["myapex"],
4847 sdk_version: "none",
4848 system_modules: "none",
4849 }
4850 `, withFiles(filesForSdkLibrary))
4851
4852 // java_sdk_library installs both impl jar and permission XML
4853 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4854 "javalib/bar.jar",
4855 "javalib/foo.jar",
4856 "etc/permissions/foo.xml",
4857 })
4858
4859 // The bar library should depend on the implementation jar.
4860 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4861 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4862 t.Errorf("expected %q, found %#q", expected, actual)
4863 }
4864}
4865
4866func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4867 ctx, _ := testApex(t, `
4868 apex {
4869 name: "myapex",
4870 key: "myapex.key",
4871 java_libs: ["foo"],
4872 }
4873
4874 apex_key {
4875 name: "myapex.key",
4876 public_key: "testkey.avbpubkey",
4877 private_key: "testkey.pem",
4878 }
4879
4880 java_sdk_library {
4881 name: "foo",
4882 srcs: ["a.java"],
4883 api_packages: ["foo"],
4884 apex_available: ["myapex"],
4885 sdk_version: "none",
4886 system_modules: "none",
4887 }
4888
4889 java_library {
4890 name: "bar",
4891 srcs: ["a.java"],
4892 libs: ["foo"],
4893 sdk_version: "none",
4894 system_modules: "none",
4895 }
4896 `, withFiles(filesForSdkLibrary))
4897
4898 // java_sdk_library installs both impl jar and permission XML
4899 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4900 "javalib/foo.jar",
4901 "etc/permissions/foo.xml",
4902 })
4903
4904 // The bar library should depend on the stubs jar.
4905 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4906 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4907 t.Errorf("expected %q, found %#q", expected, actual)
4908 }
4909}
4910
Paul Duffineedc5d52020-06-12 17:46:39 +01004911func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4912 ctx, _ := testApex(t, ``,
4913 withFiles(map[string][]byte{
4914 "apex/a.java": nil,
4915 "apex/apex_manifest.json": nil,
4916 "apex/Android.bp": []byte(`
4917 package {
4918 default_visibility: ["//visibility:private"],
4919 }
4920
4921 apex {
4922 name: "myapex",
4923 key: "myapex.key",
4924 java_libs: ["foo", "bar"],
4925 }
4926
4927 apex_key {
4928 name: "myapex.key",
4929 public_key: "testkey.avbpubkey",
4930 private_key: "testkey.pem",
4931 }
4932
4933 java_library {
4934 name: "bar",
4935 srcs: ["a.java"],
4936 libs: ["foo"],
4937 apex_available: ["myapex"],
4938 sdk_version: "none",
4939 system_modules: "none",
4940 }
4941`),
4942 "source/a.java": nil,
4943 "source/api/current.txt": nil,
4944 "source/api/removed.txt": nil,
4945 "source/Android.bp": []byte(`
4946 package {
4947 default_visibility: ["//visibility:private"],
4948 }
4949
4950 java_sdk_library {
4951 name: "foo",
4952 visibility: ["//apex"],
4953 srcs: ["a.java"],
4954 api_packages: ["foo"],
4955 apex_available: ["myapex"],
4956 sdk_version: "none",
4957 system_modules: "none",
4958 public: {
4959 enabled: true,
4960 },
4961 }
4962`),
4963 "prebuilt/a.jar": nil,
4964 "prebuilt/Android.bp": []byte(`
4965 package {
4966 default_visibility: ["//visibility:private"],
4967 }
4968
4969 java_sdk_library_import {
4970 name: "foo",
4971 visibility: ["//apex", "//source"],
4972 apex_available: ["myapex"],
4973 prefer: true,
4974 public: {
4975 jars: ["a.jar"],
4976 },
4977 }
4978`),
4979 }),
4980 )
4981
4982 // java_sdk_library installs both impl jar and permission XML
4983 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4984 "javalib/bar.jar",
4985 "javalib/foo.jar",
4986 "etc/permissions/foo.xml",
4987 })
4988
4989 // The bar library should depend on the implementation jar.
4990 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4991 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4992 t.Errorf("expected %q, found %#q", expected, actual)
4993 }
4994}
4995
4996func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
4997 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
4998 apex {
4999 name: "myapex",
5000 key: "myapex.key",
5001 java_libs: ["foo"],
5002 }
5003
5004 apex_key {
5005 name: "myapex.key",
5006 public_key: "testkey.avbpubkey",
5007 private_key: "testkey.pem",
5008 }
5009
5010 java_sdk_library_import {
5011 name: "foo",
5012 apex_available: ["myapex"],
5013 prefer: true,
5014 public: {
5015 jars: ["a.jar"],
5016 },
5017 }
5018
5019 `, withFiles(filesForSdkLibrary))
5020}
5021
atrost6e126252020-01-27 17:01:16 +00005022func TestCompatConfig(t *testing.T) {
5023 ctx, _ := testApex(t, `
5024 apex {
5025 name: "myapex",
5026 key: "myapex.key",
5027 prebuilts: ["myjar-platform-compat-config"],
5028 java_libs: ["myjar"],
5029 }
5030
5031 apex_key {
5032 name: "myapex.key",
5033 public_key: "testkey.avbpubkey",
5034 private_key: "testkey.pem",
5035 }
5036
5037 platform_compat_config {
5038 name: "myjar-platform-compat-config",
5039 src: ":myjar",
5040 }
5041
5042 java_library {
5043 name: "myjar",
5044 srcs: ["foo/bar/MyClass.java"],
5045 sdk_version: "none",
5046 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005047 apex_available: [ "myapex" ],
5048 }
5049 `)
5050 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5051 "etc/compatconfig/myjar-platform-compat-config.xml",
5052 "javalib/myjar.jar",
5053 })
5054}
5055
Jiyong Park479321d2019-12-16 11:47:12 +09005056func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5057 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5058 apex {
5059 name: "myapex",
5060 key: "myapex.key",
5061 java_libs: ["myjar"],
5062 }
5063
5064 apex_key {
5065 name: "myapex.key",
5066 public_key: "testkey.avbpubkey",
5067 private_key: "testkey.pem",
5068 }
5069
5070 java_library {
5071 name: "myjar",
5072 srcs: ["foo/bar/MyClass.java"],
5073 sdk_version: "none",
5074 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005075 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005076 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005077 }
5078 `)
5079}
5080
Jiyong Park7afd1072019-12-30 16:56:33 +09005081func TestCarryRequiredModuleNames(t *testing.T) {
5082 ctx, config := testApex(t, `
5083 apex {
5084 name: "myapex",
5085 key: "myapex.key",
5086 native_shared_libs: ["mylib"],
5087 }
5088
5089 apex_key {
5090 name: "myapex.key",
5091 public_key: "testkey.avbpubkey",
5092 private_key: "testkey.pem",
5093 }
5094
5095 cc_library {
5096 name: "mylib",
5097 srcs: ["mylib.cpp"],
5098 system_shared_libs: [],
5099 stl: "none",
5100 required: ["a", "b"],
5101 host_required: ["c", "d"],
5102 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005103 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005104 }
5105 `)
5106
5107 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5108 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5109 name := apexBundle.BaseModuleName()
5110 prefix := "TARGET_"
5111 var builder strings.Builder
5112 data.Custom(&builder, name, prefix, "", data)
5113 androidMk := builder.String()
5114 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5115 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5116 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5117}
5118
Jiyong Park7cd10e32020-01-14 09:22:18 +09005119func TestSymlinksFromApexToSystem(t *testing.T) {
5120 bp := `
5121 apex {
5122 name: "myapex",
5123 key: "myapex.key",
5124 native_shared_libs: ["mylib"],
5125 java_libs: ["myjar"],
5126 }
5127
Jiyong Park9d677202020-02-19 16:29:35 +09005128 apex {
5129 name: "myapex.updatable",
5130 key: "myapex.key",
5131 native_shared_libs: ["mylib"],
5132 java_libs: ["myjar"],
5133 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005134 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005135 }
5136
Jiyong Park7cd10e32020-01-14 09:22:18 +09005137 apex_key {
5138 name: "myapex.key",
5139 public_key: "testkey.avbpubkey",
5140 private_key: "testkey.pem",
5141 }
5142
5143 cc_library {
5144 name: "mylib",
5145 srcs: ["mylib.cpp"],
5146 shared_libs: ["myotherlib"],
5147 system_shared_libs: [],
5148 stl: "none",
5149 apex_available: [
5150 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005151 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005152 "//apex_available:platform",
5153 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005154 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005155 }
5156
5157 cc_library {
5158 name: "myotherlib",
5159 srcs: ["mylib.cpp"],
5160 system_shared_libs: [],
5161 stl: "none",
5162 apex_available: [
5163 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005164 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005165 "//apex_available:platform",
5166 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005167 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005168 }
5169
5170 java_library {
5171 name: "myjar",
5172 srcs: ["foo/bar/MyClass.java"],
5173 sdk_version: "none",
5174 system_modules: "none",
5175 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005176 apex_available: [
5177 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005178 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005179 "//apex_available:platform",
5180 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005181 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005182 }
5183
5184 java_library {
5185 name: "myotherjar",
5186 srcs: ["foo/bar/MyClass.java"],
5187 sdk_version: "none",
5188 system_modules: "none",
5189 apex_available: [
5190 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005191 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005192 "//apex_available:platform",
5193 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005194 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005195 }
5196 `
5197
5198 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5199 for _, f := range files {
5200 if f.path == file {
5201 if f.isLink {
5202 t.Errorf("%q is not a real file", file)
5203 }
5204 return
5205 }
5206 }
5207 t.Errorf("%q is not found", file)
5208 }
5209
5210 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5211 for _, f := range files {
5212 if f.path == file {
5213 if !f.isLink {
5214 t.Errorf("%q is not a symlink", file)
5215 }
5216 return
5217 }
5218 }
5219 t.Errorf("%q is not found", file)
5220 }
5221
Jiyong Park9d677202020-02-19 16:29:35 +09005222 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5223 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005224 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005225 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005226 ensureRealfileExists(t, files, "javalib/myjar.jar")
5227 ensureRealfileExists(t, files, "lib64/mylib.so")
5228 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5229
Jiyong Park9d677202020-02-19 16:29:35 +09005230 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5231 ensureRealfileExists(t, files, "javalib/myjar.jar")
5232 ensureRealfileExists(t, files, "lib64/mylib.so")
5233 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5234
5235 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005236 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005237 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005238 ensureRealfileExists(t, files, "javalib/myjar.jar")
5239 ensureRealfileExists(t, files, "lib64/mylib.so")
5240 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005241
5242 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5243 ensureRealfileExists(t, files, "javalib/myjar.jar")
5244 ensureRealfileExists(t, files, "lib64/mylib.so")
5245 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005246}
5247
Yo Chiange8128052020-07-23 20:09:18 +08005248func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5249 ctx, config := testApex(t, `
5250 apex {
5251 name: "myapex",
5252 key: "myapex.key",
5253 native_shared_libs: ["mylib"],
5254 }
5255
5256 apex_key {
5257 name: "myapex.key",
5258 public_key: "testkey.avbpubkey",
5259 private_key: "testkey.pem",
5260 }
5261
5262 cc_library_shared {
5263 name: "mylib",
5264 srcs: ["mylib.cpp"],
5265 shared_libs: ["myotherlib"],
5266 system_shared_libs: [],
5267 stl: "none",
5268 apex_available: [
5269 "myapex",
5270 "//apex_available:platform",
5271 ],
5272 }
5273
5274 cc_prebuilt_library_shared {
5275 name: "myotherlib",
5276 srcs: ["prebuilt.so"],
5277 system_shared_libs: [],
5278 stl: "none",
5279 apex_available: [
5280 "myapex",
5281 "//apex_available:platform",
5282 ],
5283 }
5284 `)
5285
5286 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5287 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5288 var builder strings.Builder
5289 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5290 androidMk := builder.String()
5291 // `myotherlib` is added to `myapex` as symlink
5292 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5293 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5294 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5295 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5296 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5297}
5298
Jooyung Han643adc42020-02-27 13:50:06 +09005299func TestApexWithJniLibs(t *testing.T) {
5300 ctx, _ := testApex(t, `
5301 apex {
5302 name: "myapex",
5303 key: "myapex.key",
5304 jni_libs: ["mylib"],
5305 }
5306
5307 apex_key {
5308 name: "myapex.key",
5309 public_key: "testkey.avbpubkey",
5310 private_key: "testkey.pem",
5311 }
5312
5313 cc_library {
5314 name: "mylib",
5315 srcs: ["mylib.cpp"],
5316 shared_libs: ["mylib2"],
5317 system_shared_libs: [],
5318 stl: "none",
5319 apex_available: [ "myapex" ],
5320 }
5321
5322 cc_library {
5323 name: "mylib2",
5324 srcs: ["mylib.cpp"],
5325 system_shared_libs: [],
5326 stl: "none",
5327 apex_available: [ "myapex" ],
5328 }
5329 `)
5330
5331 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5332 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5333 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5334 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5335 "lib64/mylib.so",
5336 "lib64/mylib2.so",
5337 })
5338}
5339
Jooyung Han49f67012020-04-17 13:43:10 +09005340func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5341 ctx, _ := testApex(t, `
5342 apex {
5343 name: "myapex",
5344 key: "myapex.key",
5345 }
5346 apex_key {
5347 name: "myapex.key",
5348 public_key: "testkey.avbpubkey",
5349 private_key: "testkey.pem",
5350 }
5351 `, func(fs map[string][]byte, config android.Config) {
5352 delete(config.Targets, android.Android)
5353 config.AndroidCommonTarget = android.Target{}
5354 })
5355
5356 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5357 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5358 }
5359}
5360
Jooyung Han643adc42020-02-27 13:50:06 +09005361func TestApexWithJniLibs_Errors(t *testing.T) {
5362 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5363 apex {
5364 name: "myapex",
5365 key: "myapex.key",
5366 jni_libs: ["xxx"],
5367 }
5368
5369 apex_key {
5370 name: "myapex.key",
5371 public_key: "testkey.avbpubkey",
5372 private_key: "testkey.pem",
5373 }
5374
5375 prebuilt_etc {
5376 name: "xxx",
5377 src: "xxx",
5378 }
5379 `, withFiles(map[string][]byte{
5380 "xxx": nil,
5381 }))
5382}
5383
Jiyong Parkbd159612020-02-28 15:22:21 +09005384func TestAppBundle(t *testing.T) {
5385 ctx, _ := testApex(t, `
5386 apex {
5387 name: "myapex",
5388 key: "myapex.key",
5389 apps: ["AppFoo"],
5390 }
5391
5392 apex_key {
5393 name: "myapex.key",
5394 public_key: "testkey.avbpubkey",
5395 private_key: "testkey.pem",
5396 }
5397
5398 android_app {
5399 name: "AppFoo",
5400 srcs: ["foo/bar/MyClass.java"],
5401 sdk_version: "none",
5402 system_modules: "none",
5403 apex_available: [ "myapex" ],
5404 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005405 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005406
5407 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5408 content := bundleConfigRule.Args["content"]
5409
5410 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005411 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 +09005412}
5413
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005414func TestAppSetBundle(t *testing.T) {
5415 ctx, _ := testApex(t, `
5416 apex {
5417 name: "myapex",
5418 key: "myapex.key",
5419 apps: ["AppSet"],
5420 }
5421
5422 apex_key {
5423 name: "myapex.key",
5424 public_key: "testkey.avbpubkey",
5425 private_key: "testkey.pem",
5426 }
5427
5428 android_app_set {
5429 name: "AppSet",
5430 set: "AppSet.apks",
5431 }`)
5432 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5433 bundleConfigRule := mod.Description("Bundle Config")
5434 content := bundleConfigRule.Args["content"]
5435 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5436 s := mod.Rule("apexRule").Args["copy_commands"]
5437 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5438 if len(copyCmds) != 3 {
5439 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5440 }
5441 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5442 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5443 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5444}
5445
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005446func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005447 t.Helper()
5448
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005449 bp := `
5450 java_library {
5451 name: "some-updatable-apex-lib",
5452 srcs: ["a.java"],
5453 sdk_version: "current",
5454 apex_available: [
5455 "some-updatable-apex",
5456 ],
5457 }
5458
5459 java_library {
5460 name: "some-non-updatable-apex-lib",
5461 srcs: ["a.java"],
5462 apex_available: [
5463 "some-non-updatable-apex",
5464 ],
5465 }
5466
5467 java_library {
5468 name: "some-platform-lib",
5469 srcs: ["a.java"],
5470 sdk_version: "current",
5471 installable: true,
5472 }
5473
5474 java_library {
5475 name: "some-art-lib",
5476 srcs: ["a.java"],
5477 sdk_version: "current",
5478 apex_available: [
5479 "com.android.art.something",
5480 ],
5481 hostdex: true,
5482 }
5483
5484 apex {
5485 name: "some-updatable-apex",
5486 key: "some-updatable-apex.key",
5487 java_libs: ["some-updatable-apex-lib"],
5488 updatable: true,
5489 min_sdk_version: "current",
5490 }
5491
5492 apex {
5493 name: "some-non-updatable-apex",
5494 key: "some-non-updatable-apex.key",
5495 java_libs: ["some-non-updatable-apex-lib"],
5496 }
5497
5498 apex_key {
5499 name: "some-updatable-apex.key",
5500 }
5501
5502 apex_key {
5503 name: "some-non-updatable-apex.key",
5504 }
5505
5506 apex {
5507 name: "com.android.art.something",
5508 key: "com.android.art.something.key",
5509 java_libs: ["some-art-lib"],
5510 updatable: true,
5511 min_sdk_version: "current",
5512 }
5513
5514 apex_key {
5515 name: "com.android.art.something.key",
5516 }
5517
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005518 filegroup {
5519 name: "some-updatable-apex-file_contexts",
5520 srcs: [
5521 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5522 ],
5523 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005524
5525 filegroup {
5526 name: "some-non-updatable-apex-file_contexts",
5527 srcs: [
5528 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5529 ],
5530 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005531 `
5532 bp += cc.GatherRequiredDepsForTest(android.Android)
5533 bp += java.GatherRequiredDepsForTest()
5534 bp += dexpreopt.BpToolModulesForTest()
5535
5536 fs := map[string][]byte{
5537 "a.java": nil,
5538 "a.jar": nil,
5539 "build/make/target/product/security": nil,
5540 "apex_manifest.json": nil,
5541 "AndroidManifest.xml": nil,
5542 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005543 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005544 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5545 "framework/aidl/a.aidl": nil,
5546 }
5547 cc.GatherRequiredFilesForTest(fs)
5548
5549 ctx := android.NewTestArchContext()
5550 ctx.RegisterModuleType("apex", BundleFactory)
5551 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5552 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005553 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005554 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005555 cc.RegisterRequiredBuildComponentsForTest(ctx)
5556 java.RegisterJavaBuildComponents(ctx)
5557 java.RegisterSystemModulesBuildComponents(ctx)
5558 java.RegisterAppBuildComponents(ctx)
5559 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005560 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5561 ctx.PreDepsMutators(RegisterPreDepsMutators)
5562 ctx.PostDepsMutators(RegisterPostDepsMutators)
5563
5564 config := android.TestArchConfig(buildDir, nil, bp, fs)
5565 ctx.Register(config)
5566
5567 _ = dexpreopt.GlobalSoongConfigForTests(config)
5568 dexpreopt.RegisterToolModulesForTest(ctx)
5569 pathCtx := android.PathContextForTesting(config)
5570 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5571 transformDexpreoptConfig(dexpreoptConfig)
5572 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5573
5574 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5575 android.FailIfErrored(t, errs)
5576
5577 _, errs = ctx.PrepareBuildActions(config)
5578 if errmsg == "" {
5579 android.FailIfErrored(t, errs)
5580 } else if len(errs) > 0 {
5581 android.FailIfNoMatchingErrors(t, errmsg, errs)
5582 return
5583 } else {
5584 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5585 }
5586}
5587
Jooyung Han548640b2020-04-27 12:10:30 +09005588func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5589 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5590 apex {
5591 name: "myapex",
5592 key: "myapex.key",
5593 updatable: true,
5594 }
5595
5596 apex_key {
5597 name: "myapex.key",
5598 public_key: "testkey.avbpubkey",
5599 private_key: "testkey.pem",
5600 }
5601 `)
5602}
5603
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005604func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005605 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005606 var transform func(*dexpreopt.GlobalConfig)
5607
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005608 config := android.TestArchConfig(buildDir, nil, "", nil)
5609 ctx := android.PathContextForTesting(config)
5610
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005611 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5612 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005613 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005614 }
5615 testNoUpdatableJarsInBootImage(t, "", transform)
5616 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005617
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005618 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005619 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 +01005620 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005621 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005622 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005623 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005624 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005625
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005626 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 -07005627 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 +01005628 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005629 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005630 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005631 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005632 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005633
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005634 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 -07005635 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005636 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005637 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005638 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005639 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005640 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005641
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005642 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 -07005643 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 +01005644 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005645 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005646 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005647 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005648 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005649
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005650 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5651 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005652 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005653 }
5654 testNoUpdatableJarsInBootImage(t, "", transform)
5655 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005656
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005657 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005658 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005659 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005660 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005661 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005662 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005663 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005664
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005665 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005666 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005667 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005668 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005669 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005670 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005671 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005672
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005673 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005674 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005675 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005676 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005677 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005678 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005679 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005680
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005681 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5682 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005683 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005684 }
5685 testNoUpdatableJarsInBootImage(t, "", transform)
5686 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005687}
5688
Jiyong Park62304bb2020-04-13 16:19:48 +09005689func TestTestFor(t *testing.T) {
5690 ctx, _ := testApex(t, `
5691 apex {
5692 name: "myapex",
5693 key: "myapex.key",
5694 native_shared_libs: ["mylib", "myprivlib"],
5695 }
5696
5697 apex_key {
5698 name: "myapex.key",
5699 public_key: "testkey.avbpubkey",
5700 private_key: "testkey.pem",
5701 }
5702
5703 cc_library {
5704 name: "mylib",
5705 srcs: ["mylib.cpp"],
5706 system_shared_libs: [],
5707 stl: "none",
5708 stubs: {
5709 versions: ["1"],
5710 },
5711 apex_available: ["myapex"],
5712 }
5713
5714 cc_library {
5715 name: "myprivlib",
5716 srcs: ["mylib.cpp"],
5717 system_shared_libs: [],
5718 stl: "none",
5719 apex_available: ["myapex"],
5720 }
5721
5722
5723 cc_test {
5724 name: "mytest",
5725 gtest: false,
5726 srcs: ["mylib.cpp"],
5727 system_shared_libs: [],
5728 stl: "none",
5729 shared_libs: ["mylib", "myprivlib"],
5730 test_for: ["myapex"]
5731 }
5732 `)
5733
5734 // the test 'mytest' is a test for the apex, therefore is linked to the
5735 // actual implementation of mylib instead of its stub.
5736 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5737 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5738 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5739}
5740
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005741// TODO(jungjw): Move this to proptools
5742func intPtr(i int) *int {
5743 return &i
5744}
5745
5746func TestApexSet(t *testing.T) {
5747 ctx, config := testApex(t, `
5748 apex_set {
5749 name: "myapex",
5750 set: "myapex.apks",
5751 filename: "foo_v2.apex",
5752 overrides: ["foo"],
5753 }
5754 `, func(fs map[string][]byte, config android.Config) {
5755 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5756 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5757 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5758 })
5759
5760 m := ctx.ModuleForTests("myapex", "android_common")
5761
5762 // Check extract_apks tool parameters.
5763 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5764 actual := extractedApex.Args["abis"]
5765 expected := "ARMEABI_V7A,ARM64_V8A"
5766 if actual != expected {
5767 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5768 }
5769 actual = extractedApex.Args["sdk-version"]
5770 expected = "30"
5771 if actual != expected {
5772 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5773 }
5774
5775 a := m.Module().(*ApexSet)
5776 expectedOverrides := []string{"foo"}
5777 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5778 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5779 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5780 }
5781}
5782
Jiyong Park7d95a512020-05-10 15:16:24 +09005783func TestNoStaticLinkingToStubsLib(t *testing.T) {
5784 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5785 apex {
5786 name: "myapex",
5787 key: "myapex.key",
5788 native_shared_libs: ["mylib"],
5789 }
5790
5791 apex_key {
5792 name: "myapex.key",
5793 public_key: "testkey.avbpubkey",
5794 private_key: "testkey.pem",
5795 }
5796
5797 cc_library {
5798 name: "mylib",
5799 srcs: ["mylib.cpp"],
5800 static_libs: ["otherlib"],
5801 system_shared_libs: [],
5802 stl: "none",
5803 apex_available: [ "myapex" ],
5804 }
5805
5806 cc_library {
5807 name: "otherlib",
5808 srcs: ["mylib.cpp"],
5809 system_shared_libs: [],
5810 stl: "none",
5811 stubs: {
5812 versions: ["1", "2", "3"],
5813 },
5814 apex_available: [ "myapex" ],
5815 }
5816 `)
5817}
5818
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005819func TestApexKeysTxt(t *testing.T) {
5820 ctx, _ := testApex(t, `
5821 apex {
5822 name: "myapex",
5823 key: "myapex.key",
5824 }
5825
5826 apex_key {
5827 name: "myapex.key",
5828 public_key: "testkey.avbpubkey",
5829 private_key: "testkey.pem",
5830 }
5831
5832 prebuilt_apex {
5833 name: "myapex",
5834 prefer: true,
5835 arch: {
5836 arm64: {
5837 src: "myapex-arm64.apex",
5838 },
5839 arm: {
5840 src: "myapex-arm.apex",
5841 },
5842 },
5843 }
5844
5845 apex_set {
5846 name: "myapex_set",
5847 set: "myapex.apks",
5848 filename: "myapex_set.apex",
5849 overrides: ["myapex"],
5850 }
5851 `)
5852
5853 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5854 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5855 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 +09005856 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 +09005857}
5858
Jooyung Han938b5932020-06-20 12:47:47 +09005859func TestAllowedFiles(t *testing.T) {
5860 ctx, _ := testApex(t, `
5861 apex {
5862 name: "myapex",
5863 key: "myapex.key",
5864 apps: ["app"],
5865 allowed_files: "allowed.txt",
5866 }
5867
5868 apex_key {
5869 name: "myapex.key",
5870 public_key: "testkey.avbpubkey",
5871 private_key: "testkey.pem",
5872 }
5873
5874 android_app {
5875 name: "app",
5876 srcs: ["foo/bar/MyClass.java"],
5877 package_name: "foo",
5878 sdk_version: "none",
5879 system_modules: "none",
5880 apex_available: [ "myapex" ],
5881 }
5882 `, withFiles(map[string][]byte{
5883 "sub/Android.bp": []byte(`
5884 override_apex {
5885 name: "override_myapex",
5886 base: "myapex",
5887 apps: ["override_app"],
5888 allowed_files: ":allowed",
5889 }
5890 // Overridable "path" property should be referenced indirectly
5891 filegroup {
5892 name: "allowed",
5893 srcs: ["allowed.txt"],
5894 }
5895 override_android_app {
5896 name: "override_app",
5897 base: "app",
5898 package_name: "bar",
5899 }
5900 `),
5901 }))
5902
5903 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5904 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5905 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5906 }
5907
5908 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5909 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5910 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5911 }
5912}
5913
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005914func TestNonPreferredPrebuiltDependency(t *testing.T) {
5915 _, _ = testApex(t, `
5916 apex {
5917 name: "myapex",
5918 key: "myapex.key",
5919 native_shared_libs: ["mylib"],
5920 }
5921
5922 apex_key {
5923 name: "myapex.key",
5924 public_key: "testkey.avbpubkey",
5925 private_key: "testkey.pem",
5926 }
5927
5928 cc_library {
5929 name: "mylib",
5930 srcs: ["mylib.cpp"],
5931 stubs: {
5932 versions: ["10000"],
5933 },
5934 apex_available: ["myapex"],
5935 }
5936
5937 cc_prebuilt_library_shared {
5938 name: "mylib",
5939 prefer: false,
5940 srcs: ["prebuilt.so"],
5941 stubs: {
5942 versions: ["10000"],
5943 },
5944 apex_available: ["myapex"],
5945 }
5946 `)
5947}
5948
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005949func TestMain(m *testing.M) {
5950 run := func() int {
5951 setUp()
5952 defer tearDown()
5953
5954 return m.Run()
5955 }
5956
5957 os.Exit(run())
5958}