blob: bfd7dfe6af1503689beff6ec7e766dbbce1d0b5b [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",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000417 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800418 }
419
Paul Duffindddd5462020-04-07 15:25:44 +0100420 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900421 name: "mylib2",
422 srcs: ["mylib.cpp"],
423 system_shared_libs: [],
424 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900425 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900426 static_libs: ["libstatic"],
427 // TODO: remove //apex_available:platform
428 apex_available: [
429 "//apex_available:platform",
430 "myapex",
431 ],
432 }
433
Paul Duffindddd5462020-04-07 15:25:44 +0100434 cc_prebuilt_library_shared {
435 name: "mylib2",
436 srcs: ["prebuilt.so"],
437 // TODO: remove //apex_available:platform
438 apex_available: [
439 "//apex_available:platform",
440 "myapex",
441 ],
442 }
443
Jiyong Park9918e1a2020-03-17 19:16:40 +0900444 cc_library_static {
445 name: "libstatic",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
449 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900455 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900456
457 java_library {
458 name: "myjar",
459 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900460 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461 sdk_version: "none",
462 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900464 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000465 // TODO: remove //apex_available:platform
466 apex_available: [
467 "//apex_available:platform",
468 "myapex",
469 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 }
471
Jiyong Park77acec62020-06-01 21:39:15 +0900472 dex_import {
473 name: "myjar_dex",
474 jars: ["prebuilt.jar"],
475 apex_available: [
476 "//apex_available:platform",
477 "myapex",
478 ],
479 }
480
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 java_library {
482 name: "myotherjar",
483 srcs: ["foo/bar/MyClass.java"],
484 sdk_version: "none",
485 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900486 // TODO: remove //apex_available:platform
487 apex_available: [
488 "//apex_available:platform",
489 "myapex",
490 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900492
493 java_library {
494 name: "mysharedjar",
495 srcs: ["foo/bar/MyClass.java"],
496 sdk_version: "none",
497 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900498 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900499 `)
500
Sundong Ahnabb64432019-10-22 13:58:29 +0900501 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900502
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900503 // Make sure that Android.mk is created
504 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
505 data := android.AndroidMkDataForTest(t, config, "", ab)
506 var builder strings.Builder
507 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
508
509 androidMk := builder.String()
510 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
511 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
512
Jiyong Park42cca6c2019-04-01 11:15:50 +0900513 optFlags := apexRule.Args["opt_flags"]
514 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700515 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900516 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900517
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 copyCmds := apexRule.Args["copy_commands"]
519
520 // Ensure that main rule creates an output
521 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
522
523 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800524 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900525 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900526 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527
528 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800529 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900530 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900531
532 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800533 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
534 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900535 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900536 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900537 // .. but not for java libs
538 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900539 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800540
Colin Cross7113d202019-11-20 16:39:12 -0800541 // Ensure that the platform variant ends with _shared or _common
542 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
547
548 // Ensure that dynamic dependency to java libs are not included
549 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800550
551 // Ensure that all symlinks are present.
552 found_foo_link_64 := false
553 found_foo := false
554 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900555 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800556 if strings.HasSuffix(cmd, "bin/foo") {
557 found_foo = true
558 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
559 found_foo_link_64 = true
560 }
561 }
562 }
563 good := found_foo && found_foo_link_64
564 if !good {
565 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
566 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900567
Sundong Ahnabb64432019-10-22 13:58:29 +0900568 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700569 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900570 if len(noticeInputs) != 3 {
571 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900572 }
573 ensureListContains(t, noticeInputs, "NOTICE")
574 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900575 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900576
Artur Satayeva8bd1132020-04-27 18:07:06 +0100577 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000578 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
579 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
580 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
581 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
582 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100583
584 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000585 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
586 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
587 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
588 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
589 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800590}
591
Jooyung Hanf21c7972019-12-16 22:32:06 +0900592func TestDefaults(t *testing.T) {
593 ctx, _ := testApex(t, `
594 apex_defaults {
595 name: "myapex-defaults",
596 key: "myapex.key",
597 prebuilts: ["myetc"],
598 native_shared_libs: ["mylib"],
599 java_libs: ["myjar"],
600 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900601 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900602 }
603
604 prebuilt_etc {
605 name: "myetc",
606 src: "myprebuilt",
607 }
608
609 apex {
610 name: "myapex",
611 defaults: ["myapex-defaults"],
612 }
613
614 apex_key {
615 name: "myapex.key",
616 public_key: "testkey.avbpubkey",
617 private_key: "testkey.pem",
618 }
619
620 cc_library {
621 name: "mylib",
622 system_shared_libs: [],
623 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000624 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900625 }
626
627 java_library {
628 name: "myjar",
629 srcs: ["foo/bar/MyClass.java"],
630 sdk_version: "none",
631 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000632 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900633 }
634
635 android_app {
636 name: "AppFoo",
637 srcs: ["foo/bar/MyClass.java"],
638 sdk_version: "none",
639 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900642
643 runtime_resource_overlay {
644 name: "rro",
645 theme: "blue",
646 }
647
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000649 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 "etc/myetc",
651 "javalib/myjar.jar",
652 "lib64/mylib.so",
653 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900654 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 })
656}
657
Jooyung Han01a3ee22019-11-02 02:52:25 +0900658func TestApexManifest(t *testing.T) {
659 ctx, _ := testApex(t, `
660 apex {
661 name: "myapex",
662 key: "myapex.key",
663 }
664
665 apex_key {
666 name: "myapex.key",
667 public_key: "testkey.avbpubkey",
668 private_key: "testkey.pem",
669 }
670 `)
671
672 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900673 args := module.Rule("apexRule").Args
674 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
675 t.Error("manifest should be apex_manifest.pb, but " + manifest)
676 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900677}
678
Alex Light5098a612018-11-29 17:12:15 -0800679func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700680 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800681 apex {
682 name: "myapex",
683 key: "myapex.key",
684 payload_type: "zip",
685 native_shared_libs: ["mylib"],
686 }
687
688 apex_key {
689 name: "myapex.key",
690 public_key: "testkey.avbpubkey",
691 private_key: "testkey.pem",
692 }
693
694 cc_library {
695 name: "mylib",
696 srcs: ["mylib.cpp"],
697 shared_libs: ["mylib2"],
698 system_shared_libs: [],
699 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000700 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800701 }
702
703 cc_library {
704 name: "mylib2",
705 srcs: ["mylib.cpp"],
706 system_shared_libs: [],
707 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000708 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800709 }
710 `)
711
Sundong Ahnabb64432019-10-22 13:58:29 +0900712 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800713 copyCmds := zipApexRule.Args["copy_commands"]
714
715 // Ensure that main rule creates an output
716 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
717
718 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800719 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800720
721 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800722 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800723
724 // Ensure that both direct and indirect deps are copied into apex
725 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
726 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900727}
728
729func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700730 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900731 apex {
732 name: "myapex",
733 key: "myapex.key",
734 native_shared_libs: ["mylib", "mylib3"],
735 }
736
737 apex_key {
738 name: "myapex.key",
739 public_key: "testkey.avbpubkey",
740 private_key: "testkey.pem",
741 }
742
743 cc_library {
744 name: "mylib",
745 srcs: ["mylib.cpp"],
746 shared_libs: ["mylib2", "mylib3"],
747 system_shared_libs: [],
748 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000749 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900750 }
751
752 cc_library {
753 name: "mylib2",
754 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900755 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900756 system_shared_libs: [],
757 stl: "none",
758 stubs: {
759 versions: ["1", "2", "3"],
760 },
761 }
762
763 cc_library {
764 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900765 srcs: ["mylib.cpp"],
766 shared_libs: ["mylib4"],
767 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900768 stl: "none",
769 stubs: {
770 versions: ["10", "11", "12"],
771 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000772 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900774
775 cc_library {
776 name: "mylib4",
777 srcs: ["mylib.cpp"],
778 system_shared_libs: [],
779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000780 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900781 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900782 `)
783
Sundong Ahnabb64432019-10-22 13:58:29 +0900784 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785 copyCmds := apexRule.Args["copy_commands"]
786
787 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800788 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789
790 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800791 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900792
793 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800794 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900795
Colin Cross7113d202019-11-20 16:39:12 -0800796 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797
798 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900799 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900800 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900801 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802
803 // 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 -0800804 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900805 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800806 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900807
808 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900809 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900810 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900811
812 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900813 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900814
Jooyung Hana57af4a2020-01-23 05:36:59 +0000815 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900816 "lib64/mylib.so",
817 "lib64/mylib3.so",
818 "lib64/mylib4.so",
819 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900820}
821
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900822func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700823 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900824 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900825 name: "myapex2",
826 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900827 native_shared_libs: ["mylib"],
828 }
829
830 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900831 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900832 public_key: "testkey.avbpubkey",
833 private_key: "testkey.pem",
834 }
835
836 cc_library {
837 name: "mylib",
838 srcs: ["mylib.cpp"],
839 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900840 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900841 system_shared_libs: [],
842 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000843 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900844 }
845
846 cc_library {
847 name: "libfoo",
848 srcs: ["mylib.cpp"],
849 shared_libs: ["libbar"],
850 system_shared_libs: [],
851 stl: "none",
852 stubs: {
853 versions: ["10", "20", "30"],
854 },
855 }
856
857 cc_library {
858 name: "libbar",
859 srcs: ["mylib.cpp"],
860 system_shared_libs: [],
861 stl: "none",
862 }
863
Jiyong Park678c8812020-02-07 17:25:49 +0900864 cc_library_static {
865 name: "libbaz",
866 srcs: ["mylib.cpp"],
867 system_shared_libs: [],
868 stl: "none",
869 apex_available: [ "myapex2" ],
870 }
871
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900872 `)
873
Jiyong Park83dc74b2020-01-14 18:38:44 +0900874 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900875 copyCmds := apexRule.Args["copy_commands"]
876
877 // Ensure that direct non-stubs dep is always included
878 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
879
880 // Ensure that indirect stubs dep is not included
881 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
882
883 // Ensure that dependency of stubs is not included
884 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
885
Jiyong Park83dc74b2020-01-14 18:38:44 +0900886 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900887
888 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900889 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900890 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900891 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892
Jiyong Park3ff16992019-12-27 14:11:47 +0900893 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900894
895 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
896 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900897
Artur Satayeva8bd1132020-04-27 18:07:06 +0100898 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000899 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
900 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
901 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900902
Artur Satayeva8bd1132020-04-27 18:07:06 +0100903 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000904 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
905 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
906 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900907}
908
Jooyung Hand3639552019-08-09 12:57:43 +0900909func TestApexWithRuntimeLibsDependency(t *testing.T) {
910 /*
911 myapex
912 |
913 v (runtime_libs)
914 mylib ------+------> libfoo [provides stub]
915 |
916 `------> libbar
917 */
918 ctx, _ := testApex(t, `
919 apex {
920 name: "myapex",
921 key: "myapex.key",
922 native_shared_libs: ["mylib"],
923 }
924
925 apex_key {
926 name: "myapex.key",
927 public_key: "testkey.avbpubkey",
928 private_key: "testkey.pem",
929 }
930
931 cc_library {
932 name: "mylib",
933 srcs: ["mylib.cpp"],
934 runtime_libs: ["libfoo", "libbar"],
935 system_shared_libs: [],
936 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000937 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900938 }
939
940 cc_library {
941 name: "libfoo",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
945 stubs: {
946 versions: ["10", "20", "30"],
947 },
948 }
949
950 cc_library {
951 name: "libbar",
952 srcs: ["mylib.cpp"],
953 system_shared_libs: [],
954 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000955 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900956 }
957
958 `)
959
Sundong Ahnabb64432019-10-22 13:58:29 +0900960 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900961 copyCmds := apexRule.Args["copy_commands"]
962
963 // Ensure that direct non-stubs dep is always included
964 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
965
966 // Ensure that indirect stubs dep is not included
967 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
968
969 // Ensure that runtime_libs dep in included
970 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
971
Sundong Ahnabb64432019-10-22 13:58:29 +0900972 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900973 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
974 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900975
976}
977
Jooyung Han8ce8db92020-05-15 19:05:05 +0900978func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
979 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
980 bp := `
981 apex {
982 name: "com.android.runtime",
983 key: "com.android.runtime.key",
984 native_shared_libs: ["libc"],
985 }
986
987 apex_key {
988 name: "com.android.runtime.key",
989 public_key: "testkey.avbpubkey",
990 private_key: "testkey.pem",
991 }
992
993 cc_library {
994 name: "libc",
995 no_libcrt: true,
996 nocrt: true,
997 stl: "none",
998 system_shared_libs: [],
999 stubs: { versions: ["1"] },
1000 apex_available: ["com.android.runtime"],
1001
1002 sanitize: {
1003 hwaddress: true,
1004 }
1005 }
1006
1007 cc_prebuilt_library_shared {
1008 name: "libclang_rt.hwasan-aarch64-android",
1009 no_libcrt: true,
1010 nocrt: true,
1011 stl: "none",
1012 system_shared_libs: [],
1013 srcs: [""],
1014 stubs: { versions: ["1"] },
1015
1016 sanitize: {
1017 never: true,
1018 },
1019 }
1020 `
1021 // override bp to use hard-coded names: com.android.runtime and libc
1022 fs["Android.bp"] = []byte(bp)
1023 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1024 })
1025
1026 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1027 "lib64/bionic/libc.so",
1028 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1029 })
1030
1031 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1032
1033 installed := hwasan.Description("install libclang_rt.hwasan")
1034 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1035
1036 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1037 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1038 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1039}
1040
1041func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1042 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1043 bp := `
1044 apex {
1045 name: "com.android.runtime",
1046 key: "com.android.runtime.key",
1047 native_shared_libs: ["libc"],
1048 }
1049
1050 apex_key {
1051 name: "com.android.runtime.key",
1052 public_key: "testkey.avbpubkey",
1053 private_key: "testkey.pem",
1054 }
1055
1056 cc_library {
1057 name: "libc",
1058 no_libcrt: true,
1059 nocrt: true,
1060 stl: "none",
1061 system_shared_libs: [],
1062 stubs: { versions: ["1"] },
1063 apex_available: ["com.android.runtime"],
1064 }
1065
1066 cc_prebuilt_library_shared {
1067 name: "libclang_rt.hwasan-aarch64-android",
1068 no_libcrt: true,
1069 nocrt: true,
1070 stl: "none",
1071 system_shared_libs: [],
1072 srcs: [""],
1073 stubs: { versions: ["1"] },
1074
1075 sanitize: {
1076 never: true,
1077 },
1078 }
1079 `
1080 // override bp to use hard-coded names: com.android.runtime and libc
1081 fs["Android.bp"] = []byte(bp)
1082 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1083
1084 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1085 })
1086
1087 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1088 "lib64/bionic/libc.so",
1089 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1090 })
1091
1092 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1093
1094 installed := hwasan.Description("install libclang_rt.hwasan")
1095 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1096
1097 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1098 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1099 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1100}
1101
Jooyung Han61b66e92020-03-21 14:21:46 +00001102func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1103 testcases := []struct {
1104 name string
1105 minSdkVersion string
1106 shouldLink string
1107 shouldNotLink []string
1108 }{
1109 {
Jooyung Han75568392020-03-20 04:29:24 +09001110 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001111 minSdkVersion: "",
Jooyung Han61b66e92020-03-21 14:21:46 +00001112 shouldLink: "30",
1113 shouldNotLink: []string{"29"},
1114 },
1115 {
1116 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001117 minSdkVersion: "min_sdk_version: \"29\",",
Jooyung Han61b66e92020-03-21 14:21:46 +00001118 shouldLink: "29",
1119 shouldNotLink: []string{"30"},
1120 },
1121 }
1122 for _, tc := range testcases {
1123 t.Run(tc.name, func(t *testing.T) {
1124 ctx, _ := testApex(t, `
1125 apex {
1126 name: "myapex",
1127 key: "myapex.key",
1128 use_vendor: true,
1129 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001130 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001131 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001132
Jooyung Han61b66e92020-03-21 14:21:46 +00001133 apex_key {
1134 name: "myapex.key",
1135 public_key: "testkey.avbpubkey",
1136 private_key: "testkey.pem",
1137 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001138
Jooyung Han61b66e92020-03-21 14:21:46 +00001139 cc_library {
1140 name: "mylib",
1141 srcs: ["mylib.cpp"],
1142 vendor_available: true,
1143 shared_libs: ["libbar"],
1144 system_shared_libs: [],
1145 stl: "none",
1146 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001147 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001148 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001149
Jooyung Han61b66e92020-03-21 14:21:46 +00001150 cc_library {
1151 name: "libbar",
1152 srcs: ["mylib.cpp"],
1153 system_shared_libs: [],
1154 stl: "none",
1155 stubs: { versions: ["29","30"] },
1156 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001157
Jooyung Han61b66e92020-03-21 14:21:46 +00001158 llndk_library {
1159 name: "libbar",
1160 symbol_file: "",
1161 }
1162 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001163 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001164 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001165
Jooyung Han61b66e92020-03-21 14:21:46 +00001166 // Ensure that LLNDK dep is not included
1167 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1168 "lib64/mylib.so",
1169 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001170
Jooyung Han61b66e92020-03-21 14:21:46 +00001171 // Ensure that LLNDK dep is required
1172 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1173 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1174 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001175
Jooyung Han61b66e92020-03-21 14:21:46 +00001176 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1177 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1178 for _, ver := range tc.shouldNotLink {
1179 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1180 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001181
Jooyung Han61b66e92020-03-21 14:21:46 +00001182 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1183 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1184 })
1185 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001186}
1187
Jiyong Park25fc6a92018-11-18 18:02:45 +09001188func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001189 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001190 apex {
1191 name: "myapex",
1192 key: "myapex.key",
1193 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1194 }
1195
1196 apex_key {
1197 name: "myapex.key",
1198 public_key: "testkey.avbpubkey",
1199 private_key: "testkey.pem",
1200 }
1201
1202 cc_library {
1203 name: "mylib",
1204 srcs: ["mylib.cpp"],
1205 shared_libs: ["libdl#27"],
1206 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001207 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001208 }
1209
1210 cc_library_shared {
1211 name: "mylib_shared",
1212 srcs: ["mylib.cpp"],
1213 shared_libs: ["libdl#27"],
1214 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001215 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001216 }
1217
1218 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001219 name: "libBootstrap",
1220 srcs: ["mylib.cpp"],
1221 stl: "none",
1222 bootstrap: true,
1223 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001224 `)
1225
Sundong Ahnabb64432019-10-22 13:58:29 +09001226 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001227 copyCmds := apexRule.Args["copy_commands"]
1228
1229 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001230 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001231 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1232 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001233
1234 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001235 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001236
Colin Cross7113d202019-11-20 16:39:12 -08001237 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1238 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1239 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001240
1241 // For dependency to libc
1242 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001243 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001244 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001245 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001246 // ... Cflags from stub is correctly exported to mylib
1247 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1248 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1249
1250 // For dependency to libm
1251 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001252 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001253 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001254 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001255 // ... and is not compiling with the stub
1256 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1257 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1258
1259 // For dependency to libdl
1260 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001261 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001262 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001263 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1264 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001265 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001266 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001267 // ... Cflags from stub is correctly exported to mylib
1268 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1269 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001270
1271 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001272 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1273 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1274 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1275 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001276}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001277
Jooyung Han749dc692020-04-15 11:03:39 +09001278func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001279 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001280 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1281 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001282 // 3) (platform) -> liba -> libz : this should be non-stub link
1283 ctx, _ := testApex(t, `
1284 apex {
1285 name: "myapex",
1286 key: "myapex.key",
1287 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001288 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001289 }
1290
1291 apex {
1292 name: "otherapex",
1293 key: "myapex.key",
1294 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001295 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001296 }
1297
1298 apex_key {
1299 name: "myapex.key",
1300 public_key: "testkey.avbpubkey",
1301 private_key: "testkey.pem",
1302 }
1303
1304 cc_library {
1305 name: "libx",
1306 shared_libs: ["liba"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001310 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001311 }
1312
1313 cc_library {
1314 name: "liby",
1315 shared_libs: ["liba"],
1316 system_shared_libs: [],
1317 stl: "none",
1318 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001319 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001320 }
1321
1322 cc_library {
1323 name: "liba",
1324 shared_libs: ["libz"],
1325 system_shared_libs: [],
1326 stl: "none",
1327 apex_available: [
1328 "//apex_available:anyapex",
1329 "//apex_available:platform",
1330 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001331 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001332 }
1333
1334 cc_library {
1335 name: "libz",
1336 system_shared_libs: [],
1337 stl: "none",
1338 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001339 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001340 },
1341 }
Jooyung Han749dc692020-04-15 11:03:39 +09001342 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001343
1344 expectLink := func(from, from_variant, to, to_variant string) {
1345 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1346 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1347 }
1348 expectNoLink := func(from, from_variant, to, to_variant string) {
1349 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1350 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1351 }
1352 // platform liba is linked to non-stub version
1353 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001354 // liba in myapex is linked to #28
1355 expectLink("liba", "shared_myapex", "libz", "shared_28")
1356 expectNoLink("liba", "shared_myapex", "libz", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001357 expectNoLink("liba", "shared_myapex", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001358 // liba in otherapex is linked to #30
1359 expectLink("liba", "shared_otherapex", "libz", "shared_30")
1360 expectNoLink("liba", "shared_otherapex", "libz", "shared_28")
Jooyung Han03b51852020-02-26 22:45:42 +09001361 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1362}
1363
Jooyung Hanaed150d2020-04-02 01:41:41 +09001364func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1365 ctx, _ := testApex(t, `
1366 apex {
1367 name: "myapex",
1368 key: "myapex.key",
1369 native_shared_libs: ["libx"],
1370 min_sdk_version: "R",
1371 }
1372
1373 apex_key {
1374 name: "myapex.key",
1375 public_key: "testkey.avbpubkey",
1376 private_key: "testkey.pem",
1377 }
1378
1379 cc_library {
1380 name: "libx",
1381 shared_libs: ["libz"],
1382 system_shared_libs: [],
1383 stl: "none",
1384 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001385 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001386 }
1387
1388 cc_library {
1389 name: "libz",
1390 system_shared_libs: [],
1391 stl: "none",
1392 stubs: {
1393 versions: ["29", "R"],
1394 },
1395 }
1396 `, func(fs map[string][]byte, config android.Config) {
1397 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1398 })
1399
1400 expectLink := func(from, from_variant, to, to_variant string) {
1401 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1402 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1403 }
1404 expectNoLink := func(from, from_variant, to, to_variant string) {
1405 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1406 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1407 }
1408 // 9000 is quite a magic number.
1409 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1410 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1411 // to distinguish them from finalized and future_api(10000)
1412 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1413 // (refer android/api_levels.go)
1414 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1415 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1416 expectNoLink("libx", "shared_myapex", "libz", "shared")
1417}
1418
Jooyung Han749dc692020-04-15 11:03:39 +09001419func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001420 ctx, _ := testApex(t, `
1421 apex {
1422 name: "myapex",
1423 key: "myapex.key",
1424 native_shared_libs: ["libx"],
1425 }
1426
1427 apex_key {
1428 name: "myapex.key",
1429 public_key: "testkey.avbpubkey",
1430 private_key: "testkey.pem",
1431 }
1432
1433 cc_library {
1434 name: "libx",
1435 shared_libs: ["libz"],
1436 system_shared_libs: [],
1437 stl: "none",
1438 apex_available: [ "myapex" ],
1439 }
1440
1441 cc_library {
1442 name: "libz",
1443 system_shared_libs: [],
1444 stl: "none",
1445 stubs: {
1446 versions: ["1", "2"],
1447 },
1448 }
1449 `)
1450
1451 expectLink := func(from, from_variant, to, to_variant string) {
1452 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1453 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1454 }
1455 expectNoLink := func(from, from_variant, to, to_variant string) {
1456 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1457 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1458 }
1459 expectLink("libx", "shared_myapex", "libz", "shared_2")
1460 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1461 expectNoLink("libx", "shared_myapex", "libz", "shared")
1462}
1463
1464func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1465 ctx, _ := testApex(t, `
1466 apex {
1467 name: "myapex",
1468 key: "myapex.key",
1469 native_shared_libs: ["libx"],
1470 }
1471
1472 apex_key {
1473 name: "myapex.key",
1474 public_key: "testkey.avbpubkey",
1475 private_key: "testkey.pem",
1476 }
1477
1478 cc_library {
1479 name: "libx",
1480 system_shared_libs: [],
1481 stl: "none",
1482 apex_available: [ "myapex" ],
1483 stubs: {
1484 versions: ["1", "2"],
1485 },
1486 }
1487
1488 cc_library {
1489 name: "libz",
1490 shared_libs: ["libx"],
1491 system_shared_libs: [],
1492 stl: "none",
1493 }
1494 `)
1495
1496 expectLink := func(from, from_variant, to, to_variant string) {
1497 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1498 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1499 }
1500 expectNoLink := func(from, from_variant, to, to_variant string) {
1501 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1502 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1503 }
1504 expectLink("libz", "shared", "libx", "shared_2")
1505 expectNoLink("libz", "shared", "libz", "shared_1")
1506 expectNoLink("libz", "shared", "libz", "shared")
1507}
1508
Jooyung Han75568392020-03-20 04:29:24 +09001509func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001510 ctx, _ := testApex(t, `
1511 apex {
1512 name: "myapex",
1513 key: "myapex.key",
1514 native_shared_libs: ["libx"],
1515 min_sdk_version: "29",
1516 }
1517
1518 apex_key {
1519 name: "myapex.key",
1520 public_key: "testkey.avbpubkey",
1521 private_key: "testkey.pem",
1522 }
1523
1524 cc_library {
1525 name: "libx",
1526 shared_libs: ["libbar"],
1527 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001528 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001529 }
1530
1531 cc_library {
1532 name: "libbar",
1533 stubs: {
1534 versions: ["29", "30"],
1535 },
1536 }
Jooyung Han75568392020-03-20 04:29:24 +09001537 `, func(fs map[string][]byte, config android.Config) {
1538 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1539 })
Jooyung Han03b51852020-02-26 22:45:42 +09001540 expectLink := func(from, from_variant, to, to_variant string) {
1541 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1542 libFlags := ld.Args["libFlags"]
1543 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1544 }
Jooyung Han75568392020-03-20 04:29:24 +09001545 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001546}
1547
Jooyung Han75568392020-03-20 04:29:24 +09001548func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001549 ctx, _ := testApex(t, `
1550 apex {
1551 name: "myapex",
1552 key: "myapex.key",
1553 native_shared_libs: ["libx"],
1554 min_sdk_version: "29",
1555 }
1556
1557 apex_key {
1558 name: "myapex.key",
1559 public_key: "testkey.avbpubkey",
1560 private_key: "testkey.pem",
1561 }
1562
1563 cc_library {
1564 name: "libx",
1565 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001566 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001567 }
Jooyung Han75568392020-03-20 04:29:24 +09001568 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001569
1570 // ensure apex variant of c++ is linked with static unwinder
1571 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1572 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1573 // note that platform variant is not.
1574 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1575 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001576}
1577
Jooyung Han749dc692020-04-15 11:03:39 +09001578func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001579 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001580 apex {
1581 name: "myapex",
1582 key: "myapex.key",
1583 native_shared_libs: ["libx"],
1584 min_sdk_version: "29",
1585 }
1586
1587 apex_key {
1588 name: "myapex.key",
1589 public_key: "testkey.avbpubkey",
1590 private_key: "testkey.pem",
1591 }
1592
1593 cc_library {
1594 name: "libx",
1595 shared_libs: ["libz"],
1596 system_shared_libs: [],
1597 stl: "none",
1598 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001599 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001600 }
1601
1602 cc_library {
1603 name: "libz",
1604 system_shared_libs: [],
1605 stl: "none",
1606 stubs: {
1607 versions: ["30"],
1608 },
1609 }
Jooyung Han75568392020-03-20 04:29:24 +09001610 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001611}
Jooyung Han03b51852020-02-26 22:45:42 +09001612
Jooyung Han749dc692020-04-15 11:03:39 +09001613func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1614 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001615 apex {
1616 name: "myapex",
1617 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001618 native_shared_libs: ["mylib"],
1619 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001620 }
1621
1622 apex_key {
1623 name: "myapex.key",
1624 public_key: "testkey.avbpubkey",
1625 private_key: "testkey.pem",
1626 }
Jooyung Han749dc692020-04-15 11:03:39 +09001627
1628 cc_library {
1629 name: "mylib",
1630 srcs: ["mylib.cpp"],
1631 system_shared_libs: [],
1632 stl: "none",
1633 apex_available: [
1634 "myapex",
1635 ],
1636 min_sdk_version: "30",
1637 }
1638 `)
1639}
1640
1641func TestApexMinSdkVersion_Okay(t *testing.T) {
1642 testApex(t, `
1643 apex {
1644 name: "myapex",
1645 key: "myapex.key",
1646 native_shared_libs: ["libfoo"],
1647 java_libs: ["libbar"],
1648 min_sdk_version: "29",
1649 }
1650
1651 apex_key {
1652 name: "myapex.key",
1653 public_key: "testkey.avbpubkey",
1654 private_key: "testkey.pem",
1655 }
1656
1657 cc_library {
1658 name: "libfoo",
1659 srcs: ["mylib.cpp"],
1660 shared_libs: ["libfoo_dep"],
1661 apex_available: ["myapex"],
1662 min_sdk_version: "29",
1663 }
1664
1665 cc_library {
1666 name: "libfoo_dep",
1667 srcs: ["mylib.cpp"],
1668 apex_available: ["myapex"],
1669 min_sdk_version: "29",
1670 }
1671
1672 java_library {
1673 name: "libbar",
1674 sdk_version: "current",
1675 srcs: ["a.java"],
1676 static_libs: ["libbar_dep"],
1677 apex_available: ["myapex"],
1678 min_sdk_version: "29",
1679 }
1680
1681 java_library {
1682 name: "libbar_dep",
1683 sdk_version: "current",
1684 srcs: ["a.java"],
1685 apex_available: ["myapex"],
1686 min_sdk_version: "29",
1687 }
Jooyung Han03b51852020-02-26 22:45:42 +09001688 `)
1689}
1690
Artur Satayev8cf899a2020-04-15 17:29:42 +01001691func TestJavaStableSdkVersion(t *testing.T) {
1692 testCases := []struct {
1693 name string
1694 expectedError string
1695 bp string
1696 }{
1697 {
1698 name: "Non-updatable apex with non-stable dep",
1699 bp: `
1700 apex {
1701 name: "myapex",
1702 java_libs: ["myjar"],
1703 key: "myapex.key",
1704 }
1705 apex_key {
1706 name: "myapex.key",
1707 public_key: "testkey.avbpubkey",
1708 private_key: "testkey.pem",
1709 }
1710 java_library {
1711 name: "myjar",
1712 srcs: ["foo/bar/MyClass.java"],
1713 sdk_version: "core_platform",
1714 apex_available: ["myapex"],
1715 }
1716 `,
1717 },
1718 {
1719 name: "Updatable apex with stable dep",
1720 bp: `
1721 apex {
1722 name: "myapex",
1723 java_libs: ["myjar"],
1724 key: "myapex.key",
1725 updatable: true,
1726 min_sdk_version: "29",
1727 }
1728 apex_key {
1729 name: "myapex.key",
1730 public_key: "testkey.avbpubkey",
1731 private_key: "testkey.pem",
1732 }
1733 java_library {
1734 name: "myjar",
1735 srcs: ["foo/bar/MyClass.java"],
1736 sdk_version: "current",
1737 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001739 }
1740 `,
1741 },
1742 {
1743 name: "Updatable apex with non-stable dep",
1744 expectedError: "cannot depend on \"myjar\"",
1745 bp: `
1746 apex {
1747 name: "myapex",
1748 java_libs: ["myjar"],
1749 key: "myapex.key",
1750 updatable: true,
1751 }
1752 apex_key {
1753 name: "myapex.key",
1754 public_key: "testkey.avbpubkey",
1755 private_key: "testkey.pem",
1756 }
1757 java_library {
1758 name: "myjar",
1759 srcs: ["foo/bar/MyClass.java"],
1760 sdk_version: "core_platform",
1761 apex_available: ["myapex"],
1762 }
1763 `,
1764 },
1765 {
1766 name: "Updatable apex with non-stable transitive dep",
1767 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1768 bp: `
1769 apex {
1770 name: "myapex",
1771 java_libs: ["myjar"],
1772 key: "myapex.key",
1773 updatable: true,
1774 }
1775 apex_key {
1776 name: "myapex.key",
1777 public_key: "testkey.avbpubkey",
1778 private_key: "testkey.pem",
1779 }
1780 java_library {
1781 name: "myjar",
1782 srcs: ["foo/bar/MyClass.java"],
1783 sdk_version: "current",
1784 apex_available: ["myapex"],
1785 static_libs: ["transitive-jar"],
1786 }
1787 java_library {
1788 name: "transitive-jar",
1789 srcs: ["foo/bar/MyClass.java"],
1790 sdk_version: "core_platform",
1791 apex_available: ["myapex"],
1792 }
1793 `,
1794 },
1795 }
1796
1797 for _, test := range testCases {
1798 t.Run(test.name, func(t *testing.T) {
1799 if test.expectedError == "" {
1800 testApex(t, test.bp)
1801 } else {
1802 testApexError(t, test.expectedError, test.bp)
1803 }
1804 })
1805 }
1806}
1807
Jooyung Han749dc692020-04-15 11:03:39 +09001808func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1809 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1810 apex {
1811 name: "myapex",
1812 key: "myapex.key",
1813 native_shared_libs: ["mylib"],
1814 min_sdk_version: "29",
1815 }
1816
1817 apex_key {
1818 name: "myapex.key",
1819 public_key: "testkey.avbpubkey",
1820 private_key: "testkey.pem",
1821 }
1822
1823 cc_library {
1824 name: "mylib",
1825 srcs: ["mylib.cpp"],
1826 shared_libs: ["mylib2"],
1827 system_shared_libs: [],
1828 stl: "none",
1829 apex_available: [
1830 "myapex",
1831 ],
1832 min_sdk_version: "29",
1833 }
1834
1835 // indirect part of the apex
1836 cc_library {
1837 name: "mylib2",
1838 srcs: ["mylib.cpp"],
1839 system_shared_libs: [],
1840 stl: "none",
1841 apex_available: [
1842 "myapex",
1843 ],
1844 min_sdk_version: "30",
1845 }
1846 `)
1847}
1848
1849func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1850 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1851 apex {
1852 name: "myapex",
1853 key: "myapex.key",
1854 apps: ["AppFoo"],
1855 min_sdk_version: "29",
1856 }
1857
1858 apex_key {
1859 name: "myapex.key",
1860 public_key: "testkey.avbpubkey",
1861 private_key: "testkey.pem",
1862 }
1863
1864 android_app {
1865 name: "AppFoo",
1866 srcs: ["foo/bar/MyClass.java"],
1867 sdk_version: "current",
1868 min_sdk_version: "29",
1869 system_modules: "none",
1870 stl: "none",
1871 static_libs: ["bar"],
1872 apex_available: [ "myapex" ],
1873 }
1874
1875 java_library {
1876 name: "bar",
1877 sdk_version: "current",
1878 srcs: ["a.java"],
1879 apex_available: [ "myapex" ],
1880 }
1881 `)
1882}
1883
1884func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1885 ctx, _ := testApex(t, `
1886 apex {
1887 name: "myapex",
1888 key: "myapex.key",
1889 native_shared_libs: ["mylib"],
1890 min_sdk_version: "29",
1891 }
1892
1893 apex_key {
1894 name: "myapex.key",
1895 public_key: "testkey.avbpubkey",
1896 private_key: "testkey.pem",
1897 }
1898
1899 // mylib in myapex will link to mylib2#29
1900 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1901 cc_library {
1902 name: "mylib",
1903 srcs: ["mylib.cpp"],
1904 shared_libs: ["mylib2"],
1905 system_shared_libs: [],
1906 stl: "none",
1907 apex_available: ["myapex", "otherapex"],
1908 min_sdk_version: "29",
1909 }
1910
1911 cc_library {
1912 name: "mylib2",
1913 srcs: ["mylib.cpp"],
1914 system_shared_libs: [],
1915 stl: "none",
1916 apex_available: ["otherapex"],
1917 stubs: { versions: ["29", "30"] },
1918 min_sdk_version: "30",
1919 }
1920
1921 apex {
1922 name: "otherapex",
1923 key: "myapex.key",
1924 native_shared_libs: ["mylib", "mylib2"],
1925 min_sdk_version: "30",
1926 }
1927 `)
1928 expectLink := func(from, from_variant, to, to_variant string) {
1929 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1930 libFlags := ld.Args["libFlags"]
1931 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1932 }
1933 expectLink("mylib", "shared_myapex", "mylib2", "shared_29")
1934 expectLink("mylib", "shared_otherapex", "mylib2", "shared_otherapex")
1935}
1936
Jiyong Park7c2ee712018-12-07 00:42:25 +09001937func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001938 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001939 apex {
1940 name: "myapex",
1941 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001942 native_shared_libs: ["mylib"],
1943 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001944 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001945 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001946 }
1947
1948 apex_key {
1949 name: "myapex.key",
1950 public_key: "testkey.avbpubkey",
1951 private_key: "testkey.pem",
1952 }
1953
1954 prebuilt_etc {
1955 name: "myetc",
1956 src: "myprebuilt",
1957 sub_dir: "foo/bar",
1958 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001959
1960 cc_library {
1961 name: "mylib",
1962 srcs: ["mylib.cpp"],
1963 relative_install_path: "foo/bar",
1964 system_shared_libs: [],
1965 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001966 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001967 }
1968
1969 cc_binary {
1970 name: "mybin",
1971 srcs: ["mylib.cpp"],
1972 relative_install_path: "foo/bar",
1973 system_shared_libs: [],
1974 static_executable: true,
1975 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001976 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001977 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001978 `)
1979
Sundong Ahnabb64432019-10-22 13:58:29 +09001980 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001981 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1982
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001983 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001984 ensureListContains(t, dirs, "etc")
1985 ensureListContains(t, dirs, "etc/foo")
1986 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001987 ensureListContains(t, dirs, "lib64")
1988 ensureListContains(t, dirs, "lib64/foo")
1989 ensureListContains(t, dirs, "lib64/foo/bar")
1990 ensureListContains(t, dirs, "lib")
1991 ensureListContains(t, dirs, "lib/foo")
1992 ensureListContains(t, dirs, "lib/foo/bar")
1993
Jiyong Parkbd13e442019-03-15 18:10:35 +09001994 ensureListContains(t, dirs, "bin")
1995 ensureListContains(t, dirs, "bin/foo")
1996 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001997}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001998
Jooyung Han35155c42020-02-06 17:33:20 +09001999func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2000 ctx, _ := testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 multilib: {
2005 both: {
2006 native_shared_libs: ["mylib"],
2007 binaries: ["mybin"],
2008 },
2009 },
2010 compile_multilib: "both",
2011 native_bridge_supported: true,
2012 }
2013
2014 apex_key {
2015 name: "myapex.key",
2016 public_key: "testkey.avbpubkey",
2017 private_key: "testkey.pem",
2018 }
2019
2020 cc_library {
2021 name: "mylib",
2022 relative_install_path: "foo/bar",
2023 system_shared_libs: [],
2024 stl: "none",
2025 apex_available: [ "myapex" ],
2026 native_bridge_supported: true,
2027 }
2028
2029 cc_binary {
2030 name: "mybin",
2031 relative_install_path: "foo/bar",
2032 system_shared_libs: [],
2033 static_executable: true,
2034 stl: "none",
2035 apex_available: [ "myapex" ],
2036 native_bridge_supported: true,
2037 compile_multilib: "both", // default is "first" for binary
2038 multilib: {
2039 lib64: {
2040 suffix: "64",
2041 },
2042 },
2043 }
2044 `, withNativeBridgeEnabled)
2045 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2046 "bin/foo/bar/mybin",
2047 "bin/foo/bar/mybin64",
2048 "bin/arm/foo/bar/mybin",
2049 "bin/arm64/foo/bar/mybin64",
2050 "lib/foo/bar/mylib.so",
2051 "lib/arm/foo/bar/mylib.so",
2052 "lib64/foo/bar/mylib.so",
2053 "lib64/arm64/foo/bar/mylib.so",
2054 })
2055}
2056
Jiyong Parkda6eb592018-12-19 17:12:36 +09002057func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002058 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002059 apex {
2060 name: "myapex",
2061 key: "myapex.key",
2062 native_shared_libs: ["mylib"],
2063 use_vendor: true,
2064 }
2065
2066 apex_key {
2067 name: "myapex.key",
2068 public_key: "testkey.avbpubkey",
2069 private_key: "testkey.pem",
2070 }
2071
2072 cc_library {
2073 name: "mylib",
2074 srcs: ["mylib.cpp"],
2075 shared_libs: ["mylib2"],
2076 system_shared_libs: [],
2077 vendor_available: true,
2078 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002079 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002080 }
2081
2082 cc_library {
2083 name: "mylib2",
2084 srcs: ["mylib.cpp"],
2085 system_shared_libs: [],
2086 vendor_available: true,
2087 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002088 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002089 }
Jooyung Handc782442019-11-01 03:14:38 +09002090 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002091 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002092 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002093
2094 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002095 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002096 for _, implicit := range i.Implicits {
2097 inputsList = append(inputsList, implicit.String())
2098 }
2099 }
2100 inputsString := strings.Join(inputsList, " ")
2101
2102 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08002103 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
2104 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002105
2106 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08002107 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
2108 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002109}
Jiyong Park16e91a02018-12-20 18:18:08 +09002110
Jooyung Han85d61762020-06-24 23:50:26 +09002111func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002112 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2113 apex {
2114 name: "myapex",
2115 key: "myapex.key",
2116 use_vendor: true,
2117 }
2118 apex_key {
2119 name: "myapex.key",
2120 public_key: "testkey.avbpubkey",
2121 private_key: "testkey.pem",
2122 }
2123 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002124 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002125 })
Colin Cross440e0d02020-06-11 11:32:11 -07002126 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002127 testApex(t, `
2128 apex {
2129 name: "myapex",
2130 key: "myapex.key",
2131 use_vendor: true,
2132 }
2133 apex_key {
2134 name: "myapex.key",
2135 public_key: "testkey.avbpubkey",
2136 private_key: "testkey.pem",
2137 }
2138 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002139 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002140 })
2141}
2142
Jooyung Han5c998b92019-06-27 11:30:33 +09002143func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2144 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2145 apex {
2146 name: "myapex",
2147 key: "myapex.key",
2148 native_shared_libs: ["mylib"],
2149 use_vendor: true,
2150 }
2151
2152 apex_key {
2153 name: "myapex.key",
2154 public_key: "testkey.avbpubkey",
2155 private_key: "testkey.pem",
2156 }
2157
2158 cc_library {
2159 name: "mylib",
2160 srcs: ["mylib.cpp"],
2161 system_shared_libs: [],
2162 stl: "none",
2163 }
2164 `)
2165}
2166
Jooyung Han85d61762020-06-24 23:50:26 +09002167func TestVendorApex(t *testing.T) {
2168 ctx, config := testApex(t, `
2169 apex {
2170 name: "myapex",
2171 key: "myapex.key",
2172 binaries: ["mybin"],
2173 vendor: true,
2174 }
2175 apex_key {
2176 name: "myapex.key",
2177 public_key: "testkey.avbpubkey",
2178 private_key: "testkey.pem",
2179 }
2180 cc_binary {
2181 name: "mybin",
2182 vendor: true,
2183 shared_libs: ["libfoo"],
2184 }
2185 cc_library {
2186 name: "libfoo",
2187 proprietary: true,
2188 }
2189 `)
2190
2191 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2192 "bin/mybin",
2193 "lib64/libfoo.so",
2194 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2195 "lib64/libc++.so",
2196 })
2197
2198 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2199 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2200 name := apexBundle.BaseModuleName()
2201 prefix := "TARGET_"
2202 var builder strings.Builder
2203 data.Custom(&builder, name, prefix, "", data)
2204 androidMk := builder.String()
2205 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002206
2207 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2208 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2209 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002210}
2211
Jooyung Handf78e212020-07-22 15:54:47 +09002212func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2213 ctx, _ := testApex(t, `
2214 apex {
2215 name: "myapex",
2216 key: "myapex.key",
2217 binaries: ["mybin"],
2218 vendor: true,
2219 use_vndk_as_stable: true,
2220 }
2221 apex_key {
2222 name: "myapex.key",
2223 public_key: "testkey.avbpubkey",
2224 private_key: "testkey.pem",
2225 }
2226 cc_binary {
2227 name: "mybin",
2228 vendor: true,
2229 shared_libs: ["libvndk", "libvendor"],
2230 }
2231 cc_library {
2232 name: "libvndk",
2233 vndk: {
2234 enabled: true,
2235 },
2236 vendor_available: true,
2237 }
2238 cc_library {
2239 name: "libvendor",
2240 vendor: true,
2241 }
2242 `)
2243
2244 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2245
2246 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_myapex").Rule("ld")
2247 libs := names(ldRule.Args["libFlags"])
2248 // VNDK libs(libvndk/libc++) as they are
2249 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2250 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2251 // non-stable Vendor libs as APEX variants
2252 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_myapex/libvendor.so")
2253
2254 // VNDK libs are not included when use_vndk_as_stable: true
2255 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2256 "bin/mybin",
2257 "lib64/libvendor.so",
2258 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002259
2260 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2261 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2262 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002263}
2264
Jooyung Hanefb184e2020-06-25 17:14:25 +09002265func TestAndroidMk_UseVendorRequired(t *testing.T) {
2266 ctx, config := testApex(t, `
2267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 use_vendor: true,
2271 native_shared_libs: ["mylib"],
2272 }
2273
2274 apex_key {
2275 name: "myapex.key",
2276 public_key: "testkey.avbpubkey",
2277 private_key: "testkey.pem",
2278 }
2279
2280 cc_library {
2281 name: "mylib",
2282 vendor_available: true,
2283 apex_available: ["myapex"],
2284 }
2285 `, func(fs map[string][]byte, config android.Config) {
2286 setUseVendorAllowListForTest(config, []string{"myapex"})
2287 })
2288
2289 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2290 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2291 name := apexBundle.BaseModuleName()
2292 prefix := "TARGET_"
2293 var builder strings.Builder
2294 data.Custom(&builder, name, prefix, "", data)
2295 androidMk := builder.String()
2296 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2297}
2298
2299func TestAndroidMk_VendorApexRequired(t *testing.T) {
2300 ctx, config := testApex(t, `
2301 apex {
2302 name: "myapex",
2303 key: "myapex.key",
2304 vendor: true,
2305 native_shared_libs: ["mylib"],
2306 }
2307
2308 apex_key {
2309 name: "myapex.key",
2310 public_key: "testkey.avbpubkey",
2311 private_key: "testkey.pem",
2312 }
2313
2314 cc_library {
2315 name: "mylib",
2316 vendor_available: true,
2317 }
2318 `)
2319
2320 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2321 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2322 name := apexBundle.BaseModuleName()
2323 prefix := "TARGET_"
2324 var builder strings.Builder
2325 data.Custom(&builder, name, prefix, "", data)
2326 androidMk := builder.String()
2327 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2328}
2329
Jooyung Han2ed99d02020-06-24 23:26:26 +09002330func TestAndroidMkWritesCommonProperties(t *testing.T) {
2331 ctx, config := testApex(t, `
2332 apex {
2333 name: "myapex",
2334 key: "myapex.key",
2335 vintf_fragments: ["fragment.xml"],
2336 init_rc: ["init.rc"],
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 cc_binary {
2344 name: "mybin",
2345 }
2346 `)
2347
2348 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2349 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2350 name := apexBundle.BaseModuleName()
2351 prefix := "TARGET_"
2352 var builder strings.Builder
2353 data.Custom(&builder, name, prefix, "", data)
2354 androidMk := builder.String()
2355 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2356 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2357}
2358
Jiyong Park16e91a02018-12-20 18:18:08 +09002359func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002360 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 native_shared_libs: ["mylib"],
2365 }
2366
2367 apex_key {
2368 name: "myapex.key",
2369 public_key: "testkey.avbpubkey",
2370 private_key: "testkey.pem",
2371 }
2372
2373 cc_library {
2374 name: "mylib",
2375 srcs: ["mylib.cpp"],
2376 system_shared_libs: [],
2377 stl: "none",
2378 stubs: {
2379 versions: ["1", "2", "3"],
2380 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002381 apex_available: [
2382 "//apex_available:platform",
2383 "myapex",
2384 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002385 }
2386
2387 cc_binary {
2388 name: "not_in_apex",
2389 srcs: ["mylib.cpp"],
2390 static_libs: ["mylib"],
2391 static_executable: true,
2392 system_shared_libs: [],
2393 stl: "none",
2394 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002395 `)
2396
Colin Cross7113d202019-11-20 16:39:12 -08002397 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002398
2399 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002400 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002401}
Jiyong Park9335a262018-12-24 11:31:58 +09002402
2403func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002404 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002405 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002406 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002407 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002408 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002409 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002410 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002411 }
2412
2413 cc_library {
2414 name: "mylib",
2415 srcs: ["mylib.cpp"],
2416 system_shared_libs: [],
2417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002418 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002419 }
2420
2421 apex_key {
2422 name: "myapex.key",
2423 public_key: "testkey.avbpubkey",
2424 private_key: "testkey.pem",
2425 }
2426
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002427 android_app_certificate {
2428 name: "myapex.certificate",
2429 certificate: "testkey",
2430 }
2431
2432 android_app_certificate {
2433 name: "myapex.certificate.override",
2434 certificate: "testkey.override",
2435 }
2436
Jiyong Park9335a262018-12-24 11:31:58 +09002437 `)
2438
2439 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002440 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002441
2442 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2443 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2444 "vendor/foo/devkeys/testkey.avbpubkey")
2445 }
2446 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2447 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2448 "vendor/foo/devkeys/testkey.pem")
2449 }
2450
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002451 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002452 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002453 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002454 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002455 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002456 }
2457}
Jiyong Park58e364a2019-01-19 19:24:06 +09002458
Jooyung Hanf121a652019-12-17 14:30:11 +09002459func TestCertificate(t *testing.T) {
2460 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2461 ctx, _ := testApex(t, `
2462 apex {
2463 name: "myapex",
2464 key: "myapex.key",
2465 }
2466 apex_key {
2467 name: "myapex.key",
2468 public_key: "testkey.avbpubkey",
2469 private_key: "testkey.pem",
2470 }`)
2471 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2472 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2473 if actual := rule.Args["certificates"]; actual != expected {
2474 t.Errorf("certificates should be %q, not %q", expected, actual)
2475 }
2476 })
2477 t.Run("override when unspecified", func(t *testing.T) {
2478 ctx, _ := testApex(t, `
2479 apex {
2480 name: "myapex_keytest",
2481 key: "myapex.key",
2482 file_contexts: ":myapex-file_contexts",
2483 }
2484 apex_key {
2485 name: "myapex.key",
2486 public_key: "testkey.avbpubkey",
2487 private_key: "testkey.pem",
2488 }
2489 android_app_certificate {
2490 name: "myapex.certificate.override",
2491 certificate: "testkey.override",
2492 }`)
2493 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2494 expected := "testkey.override.x509.pem testkey.override.pk8"
2495 if actual := rule.Args["certificates"]; actual != expected {
2496 t.Errorf("certificates should be %q, not %q", expected, actual)
2497 }
2498 })
2499 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2500 ctx, _ := testApex(t, `
2501 apex {
2502 name: "myapex",
2503 key: "myapex.key",
2504 certificate: ":myapex.certificate",
2505 }
2506 apex_key {
2507 name: "myapex.key",
2508 public_key: "testkey.avbpubkey",
2509 private_key: "testkey.pem",
2510 }
2511 android_app_certificate {
2512 name: "myapex.certificate",
2513 certificate: "testkey",
2514 }`)
2515 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2516 expected := "testkey.x509.pem testkey.pk8"
2517 if actual := rule.Args["certificates"]; actual != expected {
2518 t.Errorf("certificates should be %q, not %q", expected, actual)
2519 }
2520 })
2521 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2522 ctx, _ := testApex(t, `
2523 apex {
2524 name: "myapex_keytest",
2525 key: "myapex.key",
2526 file_contexts: ":myapex-file_contexts",
2527 certificate: ":myapex.certificate",
2528 }
2529 apex_key {
2530 name: "myapex.key",
2531 public_key: "testkey.avbpubkey",
2532 private_key: "testkey.pem",
2533 }
2534 android_app_certificate {
2535 name: "myapex.certificate.override",
2536 certificate: "testkey.override",
2537 }`)
2538 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2539 expected := "testkey.override.x509.pem testkey.override.pk8"
2540 if actual := rule.Args["certificates"]; actual != expected {
2541 t.Errorf("certificates should be %q, not %q", expected, actual)
2542 }
2543 })
2544 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2545 ctx, _ := testApex(t, `
2546 apex {
2547 name: "myapex",
2548 key: "myapex.key",
2549 certificate: "testkey",
2550 }
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }`)
2556 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2557 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2558 if actual := rule.Args["certificates"]; actual != expected {
2559 t.Errorf("certificates should be %q, not %q", expected, actual)
2560 }
2561 })
2562 t.Run("override when specified as <name>", func(t *testing.T) {
2563 ctx, _ := testApex(t, `
2564 apex {
2565 name: "myapex_keytest",
2566 key: "myapex.key",
2567 file_contexts: ":myapex-file_contexts",
2568 certificate: "testkey",
2569 }
2570 apex_key {
2571 name: "myapex.key",
2572 public_key: "testkey.avbpubkey",
2573 private_key: "testkey.pem",
2574 }
2575 android_app_certificate {
2576 name: "myapex.certificate.override",
2577 certificate: "testkey.override",
2578 }`)
2579 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2580 expected := "testkey.override.x509.pem testkey.override.pk8"
2581 if actual := rule.Args["certificates"]; actual != expected {
2582 t.Errorf("certificates should be %q, not %q", expected, actual)
2583 }
2584 })
2585}
2586
Jiyong Park58e364a2019-01-19 19:24:06 +09002587func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002588 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002589 apex {
2590 name: "myapex",
2591 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002592 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002593 }
2594
2595 apex {
2596 name: "otherapex",
2597 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002598 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002599 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002600 }
2601
2602 apex_key {
2603 name: "myapex.key",
2604 public_key: "testkey.avbpubkey",
2605 private_key: "testkey.pem",
2606 }
2607
2608 cc_library {
2609 name: "mylib",
2610 srcs: ["mylib.cpp"],
2611 system_shared_libs: [],
2612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002613 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002614 "myapex",
2615 "otherapex",
2616 ],
Jooyung Han24282772020-03-21 23:20:55 +09002617 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002618 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002619 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002620 cc_library {
2621 name: "mylib2",
2622 srcs: ["mylib.cpp"],
2623 system_shared_libs: [],
2624 stl: "none",
2625 apex_available: [
2626 "myapex",
2627 "otherapex",
2628 ],
2629 use_apex_name_macro: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002630 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002631 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002632 `)
2633
Jooyung Hanc87a0592020-03-02 17:44:33 +09002634 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002635 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002636 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002637 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002638
Jooyung Hanccce2f22020-03-07 03:45:53 +09002639 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002640 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2641 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002642 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002643 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002644
Jooyung Hanccce2f22020-03-07 03:45:53 +09002645 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002646 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2647 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002648 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002649 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002650
Jooyung Hanc87a0592020-03-02 17:44:33 +09002651 // When cc_library sets use_apex_name_macro: true
2652 // apex variants define additional macro to distinguish which apex variant it is built for
2653
2654 // non-APEX variant does not have __ANDROID_APEX__ defined
2655 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2656 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2657
2658 // APEX variant has __ANDROID_APEX__ defined
2659 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002660 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002661 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2662 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002663
Jooyung Hanc87a0592020-03-02 17:44:33 +09002664 // APEX variant has __ANDROID_APEX__ defined
2665 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002666 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002667 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2668 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002669
2670 // recovery variant does not set __ANDROID_SDK_VERSION__
2671 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2672 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2673 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002674}
Jiyong Park7e636d02019-01-28 16:16:54 +09002675
2676func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002677 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002678 apex {
2679 name: "myapex",
2680 key: "myapex.key",
2681 native_shared_libs: ["mylib"],
2682 }
2683
2684 apex_key {
2685 name: "myapex.key",
2686 public_key: "testkey.avbpubkey",
2687 private_key: "testkey.pem",
2688 }
2689
2690 cc_library_headers {
2691 name: "mylib_headers",
2692 export_include_dirs: ["my_include"],
2693 system_shared_libs: [],
2694 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002695 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002696 }
2697
2698 cc_library {
2699 name: "mylib",
2700 srcs: ["mylib.cpp"],
2701 system_shared_libs: [],
2702 stl: "none",
2703 header_libs: ["mylib_headers"],
2704 export_header_lib_headers: ["mylib_headers"],
2705 stubs: {
2706 versions: ["1", "2", "3"],
2707 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002708 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002709 }
2710
2711 cc_library {
2712 name: "otherlib",
2713 srcs: ["mylib.cpp"],
2714 system_shared_libs: [],
2715 stl: "none",
2716 shared_libs: ["mylib"],
2717 }
2718 `)
2719
Colin Cross7113d202019-11-20 16:39:12 -08002720 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002721
2722 // Ensure that the include path of the header lib is exported to 'otherlib'
2723 ensureContains(t, cFlags, "-Imy_include")
2724}
Alex Light9670d332019-01-29 18:07:33 -08002725
Jiyong Park7cd10e32020-01-14 09:22:18 +09002726type fileInApex struct {
2727 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002728 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002729 isLink bool
2730}
2731
Jooyung Hana57af4a2020-01-23 05:36:59 +00002732func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002733 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002734 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002735 copyCmds := apexRule.Args["copy_commands"]
2736 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002737 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002738 for _, cmd := range strings.Split(copyCmds, "&&") {
2739 cmd = strings.TrimSpace(cmd)
2740 if cmd == "" {
2741 continue
2742 }
2743 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002744 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002745 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002746 switch terms[0] {
2747 case "mkdir":
2748 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002749 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002750 t.Fatal("copyCmds contains invalid cp command", cmd)
2751 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002752 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002753 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002754 isLink = false
2755 case "ln":
2756 if len(terms) != 3 && len(terms) != 4 {
2757 // ln LINK TARGET or ln -s LINK TARGET
2758 t.Fatal("copyCmds contains invalid ln command", cmd)
2759 }
2760 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002761 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002762 isLink = true
2763 default:
2764 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2765 }
2766 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002767 index := strings.Index(dst, imageApexDir)
2768 if index == -1 {
2769 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2770 }
2771 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002772 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002773 }
2774 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002775 return ret
2776}
2777
Jooyung Hana57af4a2020-01-23 05:36:59 +00002778func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2779 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002780 var failed bool
2781 var surplus []string
2782 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002783 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002784 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002785 for _, expected := range files {
2786 if matched, _ := path.Match(expected, file.path); matched {
2787 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002788 mactchFound = true
2789 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002790 }
2791 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002792 if !mactchFound {
2793 surplus = append(surplus, file.path)
2794 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002795 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002796
Jooyung Han31c470b2019-10-18 16:26:59 +09002797 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002798 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002799 t.Log("surplus files", surplus)
2800 failed = true
2801 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002802
2803 if len(files) > len(filesMatched) {
2804 var missing []string
2805 for _, expected := range files {
2806 if !filesMatched[expected] {
2807 missing = append(missing, expected)
2808 }
2809 }
2810 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002811 t.Log("missing files", missing)
2812 failed = true
2813 }
2814 if failed {
2815 t.Fail()
2816 }
2817}
2818
Jooyung Han344d5432019-08-23 11:17:39 +09002819func TestVndkApexCurrent(t *testing.T) {
2820 ctx, _ := testApex(t, `
2821 apex_vndk {
2822 name: "myapex",
2823 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002824 }
2825
2826 apex_key {
2827 name: "myapex.key",
2828 public_key: "testkey.avbpubkey",
2829 private_key: "testkey.pem",
2830 }
2831
2832 cc_library {
2833 name: "libvndk",
2834 srcs: ["mylib.cpp"],
2835 vendor_available: true,
2836 vndk: {
2837 enabled: true,
2838 },
2839 system_shared_libs: [],
2840 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002841 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002842 }
2843
2844 cc_library {
2845 name: "libvndksp",
2846 srcs: ["mylib.cpp"],
2847 vendor_available: true,
2848 vndk: {
2849 enabled: true,
2850 support_system_process: true,
2851 },
2852 system_shared_libs: [],
2853 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002854 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002855 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002856 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002857
Jooyung Hana57af4a2020-01-23 05:36:59 +00002858 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002859 "lib/libvndk.so",
2860 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002861 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002862 "lib64/libvndk.so",
2863 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002864 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002865 "etc/llndk.libraries.VER.txt",
2866 "etc/vndkcore.libraries.VER.txt",
2867 "etc/vndksp.libraries.VER.txt",
2868 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002869 })
Jooyung Han344d5432019-08-23 11:17:39 +09002870}
2871
2872func TestVndkApexWithPrebuilt(t *testing.T) {
2873 ctx, _ := testApex(t, `
2874 apex_vndk {
2875 name: "myapex",
2876 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002877 }
2878
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884
2885 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002886 name: "libvndk",
2887 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002888 vendor_available: true,
2889 vndk: {
2890 enabled: true,
2891 },
2892 system_shared_libs: [],
2893 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002894 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002895 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002896
2897 cc_prebuilt_library_shared {
2898 name: "libvndk.arm",
2899 srcs: ["libvndk.arm.so"],
2900 vendor_available: true,
2901 vndk: {
2902 enabled: true,
2903 },
2904 enabled: false,
2905 arch: {
2906 arm: {
2907 enabled: true,
2908 },
2909 },
2910 system_shared_libs: [],
2911 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002912 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002913 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002914 `+vndkLibrariesTxtFiles("current"),
2915 withFiles(map[string][]byte{
2916 "libvndk.so": nil,
2917 "libvndk.arm.so": nil,
2918 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002919
Jooyung Hana57af4a2020-01-23 05:36:59 +00002920 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002921 "lib/libvndk.so",
2922 "lib/libvndk.arm.so",
2923 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002924 "lib/libc++.so",
2925 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002926 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002927 })
Jooyung Han344d5432019-08-23 11:17:39 +09002928}
2929
Jooyung Han39edb6c2019-11-06 16:53:07 +09002930func vndkLibrariesTxtFiles(vers ...string) (result string) {
2931 for _, v := range vers {
2932 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002933 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002934 result += `
2935 vndk_libraries_txt {
2936 name: "` + txt + `.libraries.txt",
2937 }
2938 `
2939 }
2940 } else {
2941 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2942 result += `
2943 prebuilt_etc {
2944 name: "` + txt + `.libraries.` + v + `.txt",
2945 src: "dummy.txt",
2946 }
2947 `
2948 }
2949 }
2950 }
2951 return
2952}
2953
Jooyung Han344d5432019-08-23 11:17:39 +09002954func TestVndkApexVersion(t *testing.T) {
2955 ctx, _ := testApex(t, `
2956 apex_vndk {
2957 name: "myapex_v27",
2958 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002959 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002960 vndk_version: "27",
2961 }
2962
2963 apex_key {
2964 name: "myapex.key",
2965 public_key: "testkey.avbpubkey",
2966 private_key: "testkey.pem",
2967 }
2968
Jooyung Han31c470b2019-10-18 16:26:59 +09002969 vndk_prebuilt_shared {
2970 name: "libvndk27",
2971 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002972 vendor_available: true,
2973 vndk: {
2974 enabled: true,
2975 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002976 target_arch: "arm64",
2977 arch: {
2978 arm: {
2979 srcs: ["libvndk27_arm.so"],
2980 },
2981 arm64: {
2982 srcs: ["libvndk27_arm64.so"],
2983 },
2984 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002985 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002986 }
2987
2988 vndk_prebuilt_shared {
2989 name: "libvndk27",
2990 version: "27",
2991 vendor_available: true,
2992 vndk: {
2993 enabled: true,
2994 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002995 target_arch: "x86_64",
2996 arch: {
2997 x86: {
2998 srcs: ["libvndk27_x86.so"],
2999 },
3000 x86_64: {
3001 srcs: ["libvndk27_x86_64.so"],
3002 },
3003 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003004 }
3005 `+vndkLibrariesTxtFiles("27"),
3006 withFiles(map[string][]byte{
3007 "libvndk27_arm.so": nil,
3008 "libvndk27_arm64.so": nil,
3009 "libvndk27_x86.so": nil,
3010 "libvndk27_x86_64.so": nil,
3011 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003012
Jooyung Hana57af4a2020-01-23 05:36:59 +00003013 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003014 "lib/libvndk27_arm.so",
3015 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003016 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003017 })
Jooyung Han344d5432019-08-23 11:17:39 +09003018}
3019
3020func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3021 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3022 apex_vndk {
3023 name: "myapex_v27",
3024 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003025 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003026 vndk_version: "27",
3027 }
3028 apex_vndk {
3029 name: "myapex_v27_other",
3030 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003031 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003032 vndk_version: "27",
3033 }
3034
3035 apex_key {
3036 name: "myapex.key",
3037 public_key: "testkey.avbpubkey",
3038 private_key: "testkey.pem",
3039 }
3040
3041 cc_library {
3042 name: "libvndk",
3043 srcs: ["mylib.cpp"],
3044 vendor_available: true,
3045 vndk: {
3046 enabled: true,
3047 },
3048 system_shared_libs: [],
3049 stl: "none",
3050 }
3051
3052 vndk_prebuilt_shared {
3053 name: "libvndk",
3054 version: "27",
3055 vendor_available: true,
3056 vndk: {
3057 enabled: true,
3058 },
3059 srcs: ["libvndk.so"],
3060 }
3061 `, withFiles(map[string][]byte{
3062 "libvndk.so": nil,
3063 }))
3064}
3065
Jooyung Han90eee022019-10-01 20:02:42 +09003066func TestVndkApexNameRule(t *testing.T) {
3067 ctx, _ := testApex(t, `
3068 apex_vndk {
3069 name: "myapex",
3070 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003071 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003072 }
3073 apex_vndk {
3074 name: "myapex_v28",
3075 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003076 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003077 vndk_version: "28",
3078 }
3079 apex_key {
3080 name: "myapex.key",
3081 public_key: "testkey.avbpubkey",
3082 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003083 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003084
3085 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003086 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003087 actual := proptools.String(bundle.properties.Apex_name)
3088 if !reflect.DeepEqual(actual, expected) {
3089 t.Errorf("Got '%v', expected '%v'", actual, expected)
3090 }
3091 }
3092
3093 assertApexName("com.android.vndk.vVER", "myapex")
3094 assertApexName("com.android.vndk.v28", "myapex_v28")
3095}
3096
Jooyung Han344d5432019-08-23 11:17:39 +09003097func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3098 ctx, _ := testApex(t, `
3099 apex_vndk {
3100 name: "myapex",
3101 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003102 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003103 }
3104
3105 apex_key {
3106 name: "myapex.key",
3107 public_key: "testkey.avbpubkey",
3108 private_key: "testkey.pem",
3109 }
3110
3111 cc_library {
3112 name: "libvndk",
3113 srcs: ["mylib.cpp"],
3114 vendor_available: true,
3115 native_bridge_supported: true,
3116 host_supported: true,
3117 vndk: {
3118 enabled: true,
3119 },
3120 system_shared_libs: [],
3121 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003122 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003123 }
Jooyung Han35155c42020-02-06 17:33:20 +09003124 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003125
Jooyung Hana57af4a2020-01-23 05:36:59 +00003126 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003127 "lib/libvndk.so",
3128 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003129 "lib/libc++.so",
3130 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003131 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003132 })
Jooyung Han344d5432019-08-23 11:17:39 +09003133}
3134
3135func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3136 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3137 apex_vndk {
3138 name: "myapex",
3139 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003140 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003141 native_bridge_supported: true,
3142 }
3143
3144 apex_key {
3145 name: "myapex.key",
3146 public_key: "testkey.avbpubkey",
3147 private_key: "testkey.pem",
3148 }
3149
3150 cc_library {
3151 name: "libvndk",
3152 srcs: ["mylib.cpp"],
3153 vendor_available: true,
3154 native_bridge_supported: true,
3155 host_supported: true,
3156 vndk: {
3157 enabled: true,
3158 },
3159 system_shared_libs: [],
3160 stl: "none",
3161 }
3162 `)
3163}
3164
Jooyung Han31c470b2019-10-18 16:26:59 +09003165func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003166 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003167 apex_vndk {
3168 name: "myapex_v27",
3169 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003170 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003171 vndk_version: "27",
3172 }
3173
3174 apex_key {
3175 name: "myapex.key",
3176 public_key: "testkey.avbpubkey",
3177 private_key: "testkey.pem",
3178 }
3179
3180 vndk_prebuilt_shared {
3181 name: "libvndk27",
3182 version: "27",
3183 target_arch: "arm",
3184 vendor_available: true,
3185 vndk: {
3186 enabled: true,
3187 },
3188 arch: {
3189 arm: {
3190 srcs: ["libvndk27.so"],
3191 }
3192 },
3193 }
3194
3195 vndk_prebuilt_shared {
3196 name: "libvndk27",
3197 version: "27",
3198 target_arch: "arm",
3199 binder32bit: true,
3200 vendor_available: true,
3201 vndk: {
3202 enabled: true,
3203 },
3204 arch: {
3205 arm: {
3206 srcs: ["libvndk27binder32.so"],
3207 }
3208 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003209 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003210 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003211 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003212 withFiles(map[string][]byte{
3213 "libvndk27.so": nil,
3214 "libvndk27binder32.so": nil,
3215 }),
3216 withBinder32bit,
3217 withTargets(map[android.OsType][]android.Target{
3218 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003219 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3220 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003221 },
3222 }),
3223 )
3224
Jooyung Hana57af4a2020-01-23 05:36:59 +00003225 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003226 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003227 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003228 })
3229}
3230
Jooyung Han45a96772020-06-15 14:59:42 +09003231func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3232 ctx, _ := testApex(t, `
3233 apex_vndk {
3234 name: "myapex",
3235 key: "myapex.key",
3236 file_contexts: ":myapex-file_contexts",
3237 }
3238
3239 apex_key {
3240 name: "myapex.key",
3241 public_key: "testkey.avbpubkey",
3242 private_key: "testkey.pem",
3243 }
3244
3245 cc_library {
3246 name: "libz",
3247 vendor_available: true,
3248 vndk: {
3249 enabled: true,
3250 },
3251 stubs: {
3252 symbol_file: "libz.map.txt",
3253 versions: ["30"],
3254 }
3255 }
3256 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3257 "libz.map.txt": nil,
3258 }))
3259
3260 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3261 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3262 ensureListEmpty(t, provideNativeLibs)
3263}
3264
Jooyung Hane1633032019-08-01 17:41:43 +09003265func TestDependenciesInApexManifest(t *testing.T) {
3266 ctx, _ := testApex(t, `
3267 apex {
3268 name: "myapex_nodep",
3269 key: "myapex.key",
3270 native_shared_libs: ["lib_nodep"],
3271 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003272 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003273 }
3274
3275 apex {
3276 name: "myapex_dep",
3277 key: "myapex.key",
3278 native_shared_libs: ["lib_dep"],
3279 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003280 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003281 }
3282
3283 apex {
3284 name: "myapex_provider",
3285 key: "myapex.key",
3286 native_shared_libs: ["libfoo"],
3287 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003288 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003289 }
3290
3291 apex {
3292 name: "myapex_selfcontained",
3293 key: "myapex.key",
3294 native_shared_libs: ["lib_dep", "libfoo"],
3295 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003296 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003297 }
3298
3299 apex_key {
3300 name: "myapex.key",
3301 public_key: "testkey.avbpubkey",
3302 private_key: "testkey.pem",
3303 }
3304
3305 cc_library {
3306 name: "lib_nodep",
3307 srcs: ["mylib.cpp"],
3308 system_shared_libs: [],
3309 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003310 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003311 }
3312
3313 cc_library {
3314 name: "lib_dep",
3315 srcs: ["mylib.cpp"],
3316 shared_libs: ["libfoo"],
3317 system_shared_libs: [],
3318 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003319 apex_available: [
3320 "myapex_dep",
3321 "myapex_provider",
3322 "myapex_selfcontained",
3323 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003324 }
3325
3326 cc_library {
3327 name: "libfoo",
3328 srcs: ["mytest.cpp"],
3329 stubs: {
3330 versions: ["1"],
3331 },
3332 system_shared_libs: [],
3333 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003334 apex_available: [
3335 "myapex_provider",
3336 "myapex_selfcontained",
3337 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003338 }
3339 `)
3340
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003341 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003342 var provideNativeLibs, requireNativeLibs []string
3343
Sundong Ahnabb64432019-10-22 13:58:29 +09003344 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003345 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3346 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003347 ensureListEmpty(t, provideNativeLibs)
3348 ensureListEmpty(t, requireNativeLibs)
3349
Sundong Ahnabb64432019-10-22 13:58:29 +09003350 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003351 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3352 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003353 ensureListEmpty(t, provideNativeLibs)
3354 ensureListContains(t, requireNativeLibs, "libfoo.so")
3355
Sundong Ahnabb64432019-10-22 13:58:29 +09003356 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003357 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3358 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003359 ensureListContains(t, provideNativeLibs, "libfoo.so")
3360 ensureListEmpty(t, requireNativeLibs)
3361
Sundong Ahnabb64432019-10-22 13:58:29 +09003362 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003363 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3364 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003365 ensureListContains(t, provideNativeLibs, "libfoo.so")
3366 ensureListEmpty(t, requireNativeLibs)
3367}
3368
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003369func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003370 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003371 apex {
3372 name: "myapex",
3373 key: "myapex.key",
3374 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003375 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003376 }
3377
3378 apex_key {
3379 name: "myapex.key",
3380 public_key: "testkey.avbpubkey",
3381 private_key: "testkey.pem",
3382 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003383
3384 cc_library {
3385 name: "mylib",
3386 srcs: ["mylib.cpp"],
3387 system_shared_libs: [],
3388 stl: "none",
3389 apex_available: [
3390 "//apex_available:platform",
3391 "myapex",
3392 ],
3393 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003394 `)
3395
Sundong Ahnabb64432019-10-22 13:58:29 +09003396 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003397 apexManifestRule := module.Rule("apexManifestRule")
3398 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3399 apexRule := module.Rule("apexRule")
3400 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003401
3402 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3403 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3404 name := apexBundle.BaseModuleName()
3405 prefix := "TARGET_"
3406 var builder strings.Builder
3407 data.Custom(&builder, name, prefix, "", data)
3408 androidMk := builder.String()
3409 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3410 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003411}
3412
Alex Light0851b882019-02-07 13:20:53 -08003413func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003414 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003415 apex {
3416 name: "myapex",
3417 key: "myapex.key",
3418 native_shared_libs: ["mylib_common"],
3419 }
3420
3421 apex_key {
3422 name: "myapex.key",
3423 public_key: "testkey.avbpubkey",
3424 private_key: "testkey.pem",
3425 }
3426
3427 cc_library {
3428 name: "mylib_common",
3429 srcs: ["mylib.cpp"],
3430 system_shared_libs: [],
3431 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003432 apex_available: [
3433 "//apex_available:platform",
3434 "myapex",
3435 ],
Alex Light0851b882019-02-07 13:20:53 -08003436 }
3437 `)
3438
Sundong Ahnabb64432019-10-22 13:58:29 +09003439 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003440 apexRule := module.Rule("apexRule")
3441 copyCmds := apexRule.Args["copy_commands"]
3442
3443 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3444 t.Log("Apex was a test apex!")
3445 t.Fail()
3446 }
3447 // Ensure that main rule creates an output
3448 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3449
3450 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003451 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003452
3453 // Ensure that both direct and indirect deps are copied into apex
3454 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3455
Colin Cross7113d202019-11-20 16:39:12 -08003456 // Ensure that the platform variant ends with _shared
3457 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003458
3459 if !android.InAnyApex("mylib_common") {
3460 t.Log("Found mylib_common not in any apex!")
3461 t.Fail()
3462 }
3463}
3464
3465func TestTestApex(t *testing.T) {
3466 if android.InAnyApex("mylib_common_test") {
3467 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!")
3468 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003469 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003470 apex_test {
3471 name: "myapex",
3472 key: "myapex.key",
3473 native_shared_libs: ["mylib_common_test"],
3474 }
3475
3476 apex_key {
3477 name: "myapex.key",
3478 public_key: "testkey.avbpubkey",
3479 private_key: "testkey.pem",
3480 }
3481
3482 cc_library {
3483 name: "mylib_common_test",
3484 srcs: ["mylib.cpp"],
3485 system_shared_libs: [],
3486 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003487 // TODO: remove //apex_available:platform
3488 apex_available: [
3489 "//apex_available:platform",
3490 "myapex",
3491 ],
Alex Light0851b882019-02-07 13:20:53 -08003492 }
3493 `)
3494
Sundong Ahnabb64432019-10-22 13:58:29 +09003495 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003496 apexRule := module.Rule("apexRule")
3497 copyCmds := apexRule.Args["copy_commands"]
3498
3499 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3500 t.Log("Apex was not a test apex!")
3501 t.Fail()
3502 }
3503 // Ensure that main rule creates an output
3504 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3505
3506 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003507 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003508
3509 // Ensure that both direct and indirect deps are copied into apex
3510 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3511
Colin Cross7113d202019-11-20 16:39:12 -08003512 // Ensure that the platform variant ends with _shared
3513 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003514}
3515
Alex Light9670d332019-01-29 18:07:33 -08003516func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003517 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003518 apex {
3519 name: "myapex",
3520 key: "myapex.key",
3521 multilib: {
3522 first: {
3523 native_shared_libs: ["mylib_common"],
3524 }
3525 },
3526 target: {
3527 android: {
3528 multilib: {
3529 first: {
3530 native_shared_libs: ["mylib"],
3531 }
3532 }
3533 },
3534 host: {
3535 multilib: {
3536 first: {
3537 native_shared_libs: ["mylib2"],
3538 }
3539 }
3540 }
3541 }
3542 }
3543
3544 apex_key {
3545 name: "myapex.key",
3546 public_key: "testkey.avbpubkey",
3547 private_key: "testkey.pem",
3548 }
3549
3550 cc_library {
3551 name: "mylib",
3552 srcs: ["mylib.cpp"],
3553 system_shared_libs: [],
3554 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003555 // TODO: remove //apex_available:platform
3556 apex_available: [
3557 "//apex_available:platform",
3558 "myapex",
3559 ],
Alex Light9670d332019-01-29 18:07:33 -08003560 }
3561
3562 cc_library {
3563 name: "mylib_common",
3564 srcs: ["mylib.cpp"],
3565 system_shared_libs: [],
3566 stl: "none",
3567 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003568 // TODO: remove //apex_available:platform
3569 apex_available: [
3570 "//apex_available:platform",
3571 "myapex",
3572 ],
Alex Light9670d332019-01-29 18:07:33 -08003573 }
3574
3575 cc_library {
3576 name: "mylib2",
3577 srcs: ["mylib.cpp"],
3578 system_shared_libs: [],
3579 stl: "none",
3580 compile_multilib: "first",
3581 }
3582 `)
3583
Sundong Ahnabb64432019-10-22 13:58:29 +09003584 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003585 copyCmds := apexRule.Args["copy_commands"]
3586
3587 // Ensure that main rule creates an output
3588 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3589
3590 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003591 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3592 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3593 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003594
3595 // Ensure that both direct and indirect deps are copied into apex
3596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3597 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3598 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3599
Colin Cross7113d202019-11-20 16:39:12 -08003600 // Ensure that the platform variant ends with _shared
3601 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3602 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3603 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003604}
Jiyong Park04480cf2019-02-06 00:16:29 +09003605
3606func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003607 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003608 apex {
3609 name: "myapex",
3610 key: "myapex.key",
3611 binaries: ["myscript"],
3612 }
3613
3614 apex_key {
3615 name: "myapex.key",
3616 public_key: "testkey.avbpubkey",
3617 private_key: "testkey.pem",
3618 }
3619
3620 sh_binary {
3621 name: "myscript",
3622 src: "mylib.cpp",
3623 filename: "myscript.sh",
3624 sub_dir: "script",
3625 }
3626 `)
3627
Sundong Ahnabb64432019-10-22 13:58:29 +09003628 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003629 copyCmds := apexRule.Args["copy_commands"]
3630
3631 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3632}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003633
Jooyung Han91df2082019-11-20 01:49:42 +09003634func TestApexInVariousPartition(t *testing.T) {
3635 testcases := []struct {
3636 propName, parition, flattenedPartition string
3637 }{
3638 {"", "system", "system_ext"},
3639 {"product_specific: true", "product", "product"},
3640 {"soc_specific: true", "vendor", "vendor"},
3641 {"proprietary: true", "vendor", "vendor"},
3642 {"vendor: true", "vendor", "vendor"},
3643 {"system_ext_specific: true", "system_ext", "system_ext"},
3644 }
3645 for _, tc := range testcases {
3646 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3647 ctx, _ := testApex(t, `
3648 apex {
3649 name: "myapex",
3650 key: "myapex.key",
3651 `+tc.propName+`
3652 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003653
Jooyung Han91df2082019-11-20 01:49:42 +09003654 apex_key {
3655 name: "myapex.key",
3656 public_key: "testkey.avbpubkey",
3657 private_key: "testkey.pem",
3658 }
3659 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003660
Jooyung Han91df2082019-11-20 01:49:42 +09003661 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3662 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3663 actual := apex.installDir.String()
3664 if actual != expected {
3665 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3666 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003667
Jooyung Han91df2082019-11-20 01:49:42 +09003668 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3669 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3670 actual = flattened.installDir.String()
3671 if actual != expected {
3672 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3673 }
3674 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003675 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003676}
Jiyong Park67882562019-03-21 01:11:21 +09003677
Jooyung Han580eb4f2020-06-24 19:33:06 +09003678func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003679 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003680 apex {
3681 name: "myapex",
3682 key: "myapex.key",
3683 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003684
Jooyung Han580eb4f2020-06-24 19:33:06 +09003685 apex_key {
3686 name: "myapex.key",
3687 public_key: "testkey.avbpubkey",
3688 private_key: "testkey.pem",
3689 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003690 `)
3691 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003692 rule := module.Output("file_contexts")
3693 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3694}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003695
Jooyung Han580eb4f2020-06-24 19:33:06 +09003696func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003697 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003698 apex {
3699 name: "myapex",
3700 key: "myapex.key",
3701 file_contexts: "my_own_file_contexts",
3702 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003703
Jooyung Han580eb4f2020-06-24 19:33:06 +09003704 apex_key {
3705 name: "myapex.key",
3706 public_key: "testkey.avbpubkey",
3707 private_key: "testkey.pem",
3708 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003709 `, withFiles(map[string][]byte{
3710 "my_own_file_contexts": nil,
3711 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003712}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003713
Jooyung Han580eb4f2020-06-24 19:33:06 +09003714func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003715 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003716 apex {
3717 name: "myapex",
3718 key: "myapex.key",
3719 product_specific: true,
3720 file_contexts: "product_specific_file_contexts",
3721 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003722
Jooyung Han580eb4f2020-06-24 19:33:06 +09003723 apex_key {
3724 name: "myapex.key",
3725 public_key: "testkey.avbpubkey",
3726 private_key: "testkey.pem",
3727 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003728 `)
3729
Jooyung Han580eb4f2020-06-24 19:33:06 +09003730 ctx, _ := testApex(t, `
3731 apex {
3732 name: "myapex",
3733 key: "myapex.key",
3734 product_specific: true,
3735 file_contexts: "product_specific_file_contexts",
3736 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003737
Jooyung Han580eb4f2020-06-24 19:33:06 +09003738 apex_key {
3739 name: "myapex.key",
3740 public_key: "testkey.avbpubkey",
3741 private_key: "testkey.pem",
3742 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003743 `, withFiles(map[string][]byte{
3744 "product_specific_file_contexts": nil,
3745 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003746 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3747 rule := module.Output("file_contexts")
3748 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3749}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003750
Jooyung Han580eb4f2020-06-24 19:33:06 +09003751func TestFileContexts_SetViaFileGroup(t *testing.T) {
3752 ctx, _ := testApex(t, `
3753 apex {
3754 name: "myapex",
3755 key: "myapex.key",
3756 product_specific: true,
3757 file_contexts: ":my-file-contexts",
3758 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003759
Jooyung Han580eb4f2020-06-24 19:33:06 +09003760 apex_key {
3761 name: "myapex.key",
3762 public_key: "testkey.avbpubkey",
3763 private_key: "testkey.pem",
3764 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003765
Jooyung Han580eb4f2020-06-24 19:33:06 +09003766 filegroup {
3767 name: "my-file-contexts",
3768 srcs: ["product_specific_file_contexts"],
3769 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003770 `, withFiles(map[string][]byte{
3771 "product_specific_file_contexts": nil,
3772 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003773 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3774 rule := module.Output("file_contexts")
3775 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003776}
3777
Jiyong Park67882562019-03-21 01:11:21 +09003778func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003779 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003780 apex_key {
3781 name: "myapex.key",
3782 public_key: ":my.avbpubkey",
3783 private_key: ":my.pem",
3784 product_specific: true,
3785 }
3786
3787 filegroup {
3788 name: "my.avbpubkey",
3789 srcs: ["testkey2.avbpubkey"],
3790 }
3791
3792 filegroup {
3793 name: "my.pem",
3794 srcs: ["testkey2.pem"],
3795 }
3796 `)
3797
3798 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3799 expected_pubkey := "testkey2.avbpubkey"
3800 actual_pubkey := apex_key.public_key_file.String()
3801 if actual_pubkey != expected_pubkey {
3802 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3803 }
3804 expected_privkey := "testkey2.pem"
3805 actual_privkey := apex_key.private_key_file.String()
3806 if actual_privkey != expected_privkey {
3807 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3808 }
3809}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003810
3811func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003812 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003813 prebuilt_apex {
3814 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003815 arch: {
3816 arm64: {
3817 src: "myapex-arm64.apex",
3818 },
3819 arm: {
3820 src: "myapex-arm.apex",
3821 },
3822 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003823 }
3824 `)
3825
3826 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3827
Jiyong Parkc95714e2019-03-29 14:23:10 +09003828 expectedInput := "myapex-arm64.apex"
3829 if prebuilt.inputApex.String() != expectedInput {
3830 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3831 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003832}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003833
3834func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003835 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003836 prebuilt_apex {
3837 name: "myapex",
3838 src: "myapex-arm.apex",
3839 filename: "notmyapex.apex",
3840 }
3841 `)
3842
3843 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3844
3845 expected := "notmyapex.apex"
3846 if p.installFilename != expected {
3847 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3848 }
3849}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003850
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003851func TestPrebuiltOverrides(t *testing.T) {
3852 ctx, config := testApex(t, `
3853 prebuilt_apex {
3854 name: "myapex.prebuilt",
3855 src: "myapex-arm.apex",
3856 overrides: [
3857 "myapex",
3858 ],
3859 }
3860 `)
3861
3862 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3863
3864 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003865 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003866 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003867 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003868 }
3869}
3870
Roland Levillain630846d2019-06-26 12:48:34 +01003871func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003872 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003873 apex_test {
3874 name: "myapex",
3875 key: "myapex.key",
3876 tests: [
3877 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003878 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003879 ],
3880 }
3881
3882 apex_key {
3883 name: "myapex.key",
3884 public_key: "testkey.avbpubkey",
3885 private_key: "testkey.pem",
3886 }
3887
Liz Kammer1c14a212020-05-12 15:26:55 -07003888 filegroup {
3889 name: "fg",
3890 srcs: [
3891 "baz",
3892 "bar/baz"
3893 ],
3894 }
3895
Roland Levillain630846d2019-06-26 12:48:34 +01003896 cc_test {
3897 name: "mytest",
3898 gtest: false,
3899 srcs: ["mytest.cpp"],
3900 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003901 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003902 system_shared_libs: [],
3903 static_executable: true,
3904 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003905 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003906 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003907
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003908 cc_library {
3909 name: "mylib",
3910 srcs: ["mylib.cpp"],
3911 system_shared_libs: [],
3912 stl: "none",
3913 }
3914
Liz Kammer5bd365f2020-05-27 15:15:11 -07003915 filegroup {
3916 name: "fg2",
3917 srcs: [
3918 "testdata/baz"
3919 ],
3920 }
3921
Roland Levillain9b5fde92019-06-28 15:41:19 +01003922 cc_test {
3923 name: "mytests",
3924 gtest: false,
3925 srcs: [
3926 "mytest1.cpp",
3927 "mytest2.cpp",
3928 "mytest3.cpp",
3929 ],
3930 test_per_src: true,
3931 relative_install_path: "test",
3932 system_shared_libs: [],
3933 static_executable: true,
3934 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003935 data: [
3936 ":fg",
3937 ":fg2",
3938 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003939 }
Roland Levillain630846d2019-06-26 12:48:34 +01003940 `)
3941
Sundong Ahnabb64432019-10-22 13:58:29 +09003942 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003943 copyCmds := apexRule.Args["copy_commands"]
3944
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003945 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003946 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003947 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003948
Liz Kammer1c14a212020-05-12 15:26:55 -07003949 //Ensure that test data are copied into apex.
3950 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3951 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3952
Roland Levillain9b5fde92019-06-28 15:41:19 +01003953 // Ensure that test deps built with `test_per_src` are copied into apex.
3954 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3955 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3956 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003957
3958 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003959 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3960 data := android.AndroidMkDataForTest(t, config, "", bundle)
3961 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003962 prefix := "TARGET_"
3963 var builder strings.Builder
3964 data.Custom(&builder, name, prefix, "", data)
3965 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003966 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3967 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3968 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3969 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003970 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003971 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003972 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003973
3974 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3975 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3976 data.Custom(&builder, name, prefix, "", data)
3977 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003978 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3979 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003980}
3981
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003982func TestInstallExtraFlattenedApexes(t *testing.T) {
3983 ctx, config := testApex(t, `
3984 apex {
3985 name: "myapex",
3986 key: "myapex.key",
3987 }
3988 apex_key {
3989 name: "myapex.key",
3990 public_key: "testkey.avbpubkey",
3991 private_key: "testkey.pem",
3992 }
3993 `, func(fs map[string][]byte, config android.Config) {
3994 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3995 })
3996 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003997 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003998 mk := android.AndroidMkDataForTest(t, config, "", ab)
3999 var builder strings.Builder
4000 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4001 androidMk := builder.String()
4002 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4003}
4004
Jooyung Han5c998b92019-06-27 11:30:33 +09004005func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004006 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004007 apex {
4008 name: "myapex",
4009 key: "myapex.key",
4010 native_shared_libs: ["mylib"],
4011 uses: ["commonapex"],
4012 }
4013
4014 apex {
4015 name: "commonapex",
4016 key: "myapex.key",
4017 native_shared_libs: ["libcommon"],
4018 provide_cpp_shared_libs: true,
4019 }
4020
4021 apex_key {
4022 name: "myapex.key",
4023 public_key: "testkey.avbpubkey",
4024 private_key: "testkey.pem",
4025 }
4026
4027 cc_library {
4028 name: "mylib",
4029 srcs: ["mylib.cpp"],
4030 shared_libs: ["libcommon"],
4031 system_shared_libs: [],
4032 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004033 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004034 }
4035
4036 cc_library {
4037 name: "libcommon",
4038 srcs: ["mylib_common.cpp"],
4039 system_shared_libs: [],
4040 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004041 // TODO: remove //apex_available:platform
4042 apex_available: [
4043 "//apex_available:platform",
4044 "commonapex",
4045 "myapex",
4046 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004047 }
4048 `)
4049
Sundong Ahnabb64432019-10-22 13:58:29 +09004050 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004051 apexRule1 := module1.Rule("apexRule")
4052 copyCmds1 := apexRule1.Args["copy_commands"]
4053
Sundong Ahnabb64432019-10-22 13:58:29 +09004054 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004055 apexRule2 := module2.Rule("apexRule")
4056 copyCmds2 := apexRule2.Args["copy_commands"]
4057
Colin Cross7113d202019-11-20 16:39:12 -08004058 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
4059 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09004060 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4061 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4062 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4063}
4064
4065func TestApexUsesFailsIfNotProvided(t *testing.T) {
4066 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4067 apex {
4068 name: "myapex",
4069 key: "myapex.key",
4070 uses: ["commonapex"],
4071 }
4072
4073 apex {
4074 name: "commonapex",
4075 key: "myapex.key",
4076 }
4077
4078 apex_key {
4079 name: "myapex.key",
4080 public_key: "testkey.avbpubkey",
4081 private_key: "testkey.pem",
4082 }
4083 `)
4084 testApexError(t, `uses: "commonapex" is not a provider`, `
4085 apex {
4086 name: "myapex",
4087 key: "myapex.key",
4088 uses: ["commonapex"],
4089 }
4090
4091 cc_library {
4092 name: "commonapex",
4093 system_shared_libs: [],
4094 stl: "none",
4095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
4102 `)
4103}
4104
4105func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4106 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4107 apex {
4108 name: "myapex",
4109 key: "myapex.key",
4110 use_vendor: true,
4111 uses: ["commonapex"],
4112 }
4113
4114 apex {
4115 name: "commonapex",
4116 key: "myapex.key",
4117 provide_cpp_shared_libs: true,
4118 }
4119
4120 apex_key {
4121 name: "myapex.key",
4122 public_key: "testkey.avbpubkey",
4123 private_key: "testkey.pem",
4124 }
Jooyung Handc782442019-11-01 03:14:38 +09004125 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004126 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004127 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004128}
4129
Jooyung Hand48f3c32019-08-23 11:18:57 +09004130func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4131 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4132 apex {
4133 name: "myapex",
4134 key: "myapex.key",
4135 native_shared_libs: ["libfoo"],
4136 }
4137
4138 apex_key {
4139 name: "myapex.key",
4140 public_key: "testkey.avbpubkey",
4141 private_key: "testkey.pem",
4142 }
4143
4144 cc_library {
4145 name: "libfoo",
4146 stl: "none",
4147 system_shared_libs: [],
4148 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004149 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004150 }
4151 `)
4152 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4153 apex {
4154 name: "myapex",
4155 key: "myapex.key",
4156 java_libs: ["myjar"],
4157 }
4158
4159 apex_key {
4160 name: "myapex.key",
4161 public_key: "testkey.avbpubkey",
4162 private_key: "testkey.pem",
4163 }
4164
4165 java_library {
4166 name: "myjar",
4167 srcs: ["foo/bar/MyClass.java"],
4168 sdk_version: "none",
4169 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004170 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004171 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004172 }
4173 `)
4174}
4175
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004176func TestApexWithApps(t *testing.T) {
4177 ctx, _ := testApex(t, `
4178 apex {
4179 name: "myapex",
4180 key: "myapex.key",
4181 apps: [
4182 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004183 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004184 ],
4185 }
4186
4187 apex_key {
4188 name: "myapex.key",
4189 public_key: "testkey.avbpubkey",
4190 private_key: "testkey.pem",
4191 }
4192
4193 android_app {
4194 name: "AppFoo",
4195 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004196 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004197 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004198 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004199 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004200 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004201 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004202
4203 android_app {
4204 name: "AppFooPriv",
4205 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004206 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004207 system_modules: "none",
4208 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004209 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004210 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004211 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004212
4213 cc_library_shared {
4214 name: "libjni",
4215 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004216 shared_libs: ["libfoo"],
4217 stl: "none",
4218 system_shared_libs: [],
4219 apex_available: [ "myapex" ],
4220 sdk_version: "current",
4221 }
4222
4223 cc_library_shared {
4224 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004225 stl: "none",
4226 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004227 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004228 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004229 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004230 `)
4231
Sundong Ahnabb64432019-10-22 13:58:29 +09004232 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004233 apexRule := module.Rule("apexRule")
4234 copyCmds := apexRule.Args["copy_commands"]
4235
4236 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004237 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004238
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004239 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
4240 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004241 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004242 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004243 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004244 // JNI libraries including transitive deps are
4245 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00004246 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004247 // ... embedded inside APK (jnilibs.zip)
4248 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4249 // ... and not directly inside the APEX
4250 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4251 }
Dario Frenicde2a032019-10-27 00:29:22 +01004252}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004253
Dario Frenicde2a032019-10-27 00:29:22 +01004254func TestApexWithAppImports(t *testing.T) {
4255 ctx, _ := testApex(t, `
4256 apex {
4257 name: "myapex",
4258 key: "myapex.key",
4259 apps: [
4260 "AppFooPrebuilt",
4261 "AppFooPrivPrebuilt",
4262 ],
4263 }
4264
4265 apex_key {
4266 name: "myapex.key",
4267 public_key: "testkey.avbpubkey",
4268 private_key: "testkey.pem",
4269 }
4270
4271 android_app_import {
4272 name: "AppFooPrebuilt",
4273 apk: "PrebuiltAppFoo.apk",
4274 presigned: true,
4275 dex_preopt: {
4276 enabled: false,
4277 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004278 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004279 }
4280
4281 android_app_import {
4282 name: "AppFooPrivPrebuilt",
4283 apk: "PrebuiltAppFooPriv.apk",
4284 privileged: true,
4285 presigned: true,
4286 dex_preopt: {
4287 enabled: false,
4288 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004289 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004290 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004291 }
4292 `)
4293
Sundong Ahnabb64432019-10-22 13:58:29 +09004294 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004295 apexRule := module.Rule("apexRule")
4296 copyCmds := apexRule.Args["copy_commands"]
4297
4298 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004299 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4300}
4301
4302func TestApexWithAppImportsPrefer(t *testing.T) {
4303 ctx, _ := testApex(t, `
4304 apex {
4305 name: "myapex",
4306 key: "myapex.key",
4307 apps: [
4308 "AppFoo",
4309 ],
4310 }
4311
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317
4318 android_app {
4319 name: "AppFoo",
4320 srcs: ["foo/bar/MyClass.java"],
4321 sdk_version: "none",
4322 system_modules: "none",
4323 apex_available: [ "myapex" ],
4324 }
4325
4326 android_app_import {
4327 name: "AppFoo",
4328 apk: "AppFooPrebuilt.apk",
4329 filename: "AppFooPrebuilt.apk",
4330 presigned: true,
4331 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004332 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004333 }
4334 `, withFiles(map[string][]byte{
4335 "AppFooPrebuilt.apk": nil,
4336 }))
4337
4338 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4339 "app/AppFoo/AppFooPrebuilt.apk",
4340 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004341}
4342
Dario Freni6f3937c2019-12-20 22:58:03 +00004343func TestApexWithTestHelperApp(t *testing.T) {
4344 ctx, _ := testApex(t, `
4345 apex {
4346 name: "myapex",
4347 key: "myapex.key",
4348 apps: [
4349 "TesterHelpAppFoo",
4350 ],
4351 }
4352
4353 apex_key {
4354 name: "myapex.key",
4355 public_key: "testkey.avbpubkey",
4356 private_key: "testkey.pem",
4357 }
4358
4359 android_test_helper_app {
4360 name: "TesterHelpAppFoo",
4361 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004362 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004363 }
4364
4365 `)
4366
4367 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4368 apexRule := module.Rule("apexRule")
4369 copyCmds := apexRule.Args["copy_commands"]
4370
4371 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4372}
4373
Jooyung Han18020ea2019-11-13 10:50:48 +09004374func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4375 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004376 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004377 apex {
4378 name: "myapex",
4379 key: "myapex.key",
4380 native_shared_libs: ["libfoo"],
4381 }
4382
4383 apex_key {
4384 name: "myapex.key",
4385 public_key: "testkey.avbpubkey",
4386 private_key: "testkey.pem",
4387 }
4388
4389 apex {
4390 name: "otherapex",
4391 key: "myapex.key",
4392 native_shared_libs: ["libfoo"],
4393 }
4394
4395 cc_defaults {
4396 name: "libfoo-defaults",
4397 apex_available: ["otherapex"],
4398 }
4399
4400 cc_library {
4401 name: "libfoo",
4402 defaults: ["libfoo-defaults"],
4403 stl: "none",
4404 system_shared_libs: [],
4405 }`)
4406}
4407
Paul Duffine52e66f2020-03-30 17:54:29 +01004408func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004409 // libfoo is not available to myapex, but only to otherapex
4410 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4411 apex {
4412 name: "myapex",
4413 key: "myapex.key",
4414 native_shared_libs: ["libfoo"],
4415 }
4416
4417 apex_key {
4418 name: "myapex.key",
4419 public_key: "testkey.avbpubkey",
4420 private_key: "testkey.pem",
4421 }
4422
4423 apex {
4424 name: "otherapex",
4425 key: "otherapex.key",
4426 native_shared_libs: ["libfoo"],
4427 }
4428
4429 apex_key {
4430 name: "otherapex.key",
4431 public_key: "testkey.avbpubkey",
4432 private_key: "testkey.pem",
4433 }
4434
4435 cc_library {
4436 name: "libfoo",
4437 stl: "none",
4438 system_shared_libs: [],
4439 apex_available: ["otherapex"],
4440 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004441}
Jiyong Park127b40b2019-09-30 16:04:35 +09004442
Paul Duffine52e66f2020-03-30 17:54:29 +01004443func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004444 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004445 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004446.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004447.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004448.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004449.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004450.*via tag cc\.DependencyTag.*"shared".*
4451.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004452 apex {
4453 name: "myapex",
4454 key: "myapex.key",
4455 native_shared_libs: ["libfoo"],
4456 }
4457
4458 apex_key {
4459 name: "myapex.key",
4460 public_key: "testkey.avbpubkey",
4461 private_key: "testkey.pem",
4462 }
4463
Jiyong Park127b40b2019-09-30 16:04:35 +09004464 cc_library {
4465 name: "libfoo",
4466 stl: "none",
4467 shared_libs: ["libbar"],
4468 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004469 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004470 }
4471
4472 cc_library {
4473 name: "libbar",
4474 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004475 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004476 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004477 apex_available: ["myapex"],
4478 }
4479
4480 cc_library {
4481 name: "libbaz",
4482 stl: "none",
4483 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004484 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004485}
Jiyong Park127b40b2019-09-30 16:04:35 +09004486
Paul Duffine52e66f2020-03-30 17:54:29 +01004487func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004488 testApexError(t, "\"otherapex\" is not a valid module name", `
4489 apex {
4490 name: "myapex",
4491 key: "myapex.key",
4492 native_shared_libs: ["libfoo"],
4493 }
4494
4495 apex_key {
4496 name: "myapex.key",
4497 public_key: "testkey.avbpubkey",
4498 private_key: "testkey.pem",
4499 }
4500
4501 cc_library {
4502 name: "libfoo",
4503 stl: "none",
4504 system_shared_libs: [],
4505 apex_available: ["otherapex"],
4506 }`)
4507
Paul Duffine52e66f2020-03-30 17:54:29 +01004508 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004509 apex {
4510 name: "myapex",
4511 key: "myapex.key",
4512 native_shared_libs: ["libfoo", "libbar"],
4513 }
4514
4515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
4520
4521 cc_library {
4522 name: "libfoo",
4523 stl: "none",
4524 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004525 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004526 apex_available: ["myapex"],
4527 }
4528
4529 cc_library {
4530 name: "libbar",
4531 stl: "none",
4532 system_shared_libs: [],
4533 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004534 }
4535
4536 cc_library {
4537 name: "libbaz",
4538 stl: "none",
4539 system_shared_libs: [],
4540 stubs: {
4541 versions: ["10", "20", "30"],
4542 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004543 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004544}
Jiyong Park127b40b2019-09-30 16:04:35 +09004545
Jiyong Park89e850a2020-04-07 16:37:39 +09004546func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004547 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004548 apex {
4549 name: "myapex",
4550 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004551 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004552 }
4553
4554 apex_key {
4555 name: "myapex.key",
4556 public_key: "testkey.avbpubkey",
4557 private_key: "testkey.pem",
4558 }
4559
4560 cc_library {
4561 name: "libfoo",
4562 stl: "none",
4563 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004564 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004565 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004566 }
4567
4568 cc_library {
4569 name: "libfoo2",
4570 stl: "none",
4571 system_shared_libs: [],
4572 shared_libs: ["libbaz"],
4573 apex_available: ["//apex_available:platform"],
4574 }
4575
4576 cc_library {
4577 name: "libbar",
4578 stl: "none",
4579 system_shared_libs: [],
4580 apex_available: ["myapex"],
4581 }
4582
4583 cc_library {
4584 name: "libbaz",
4585 stl: "none",
4586 system_shared_libs: [],
4587 apex_available: ["myapex"],
4588 stubs: {
4589 versions: ["1"],
4590 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004591 }`)
4592
Jiyong Park89e850a2020-04-07 16:37:39 +09004593 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4594 // because it depends on libbar which isn't available to platform
4595 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4596 if libfoo.NotAvailableForPlatform() != true {
4597 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4598 }
4599
4600 // libfoo2 however can be available to platform because it depends on libbaz which provides
4601 // stubs
4602 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4603 if libfoo2.NotAvailableForPlatform() == true {
4604 t.Errorf("%q should be available to platform", libfoo2.String())
4605 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004606}
Jiyong Parka90ca002019-10-07 15:47:24 +09004607
Paul Duffine52e66f2020-03-30 17:54:29 +01004608func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004609 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004610 apex {
4611 name: "myapex",
4612 key: "myapex.key",
4613 native_shared_libs: ["libfoo"],
4614 }
4615
4616 apex_key {
4617 name: "myapex.key",
4618 public_key: "testkey.avbpubkey",
4619 private_key: "testkey.pem",
4620 }
4621
4622 cc_library {
4623 name: "libfoo",
4624 stl: "none",
4625 system_shared_libs: [],
4626 apex_available: ["myapex"],
4627 static: {
4628 apex_available: ["//apex_available:platform"],
4629 },
4630 }`)
4631
Jiyong Park89e850a2020-04-07 16:37:39 +09004632 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4633 if libfooShared.NotAvailableForPlatform() != true {
4634 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4635 }
4636 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4637 if libfooStatic.NotAvailableForPlatform() != false {
4638 t.Errorf("%q should be available to platform", libfooStatic.String())
4639 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004640}
4641
Jiyong Park5d790c32019-11-15 18:40:32 +09004642func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004643 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004644 apex {
4645 name: "myapex",
4646 key: "myapex.key",
4647 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004648 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004649 }
4650
4651 override_apex {
4652 name: "override_myapex",
4653 base: "myapex",
4654 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004655 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004656 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004657 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004658 }
4659
4660 apex_key {
4661 name: "myapex.key",
4662 public_key: "testkey.avbpubkey",
4663 private_key: "testkey.pem",
4664 }
4665
4666 android_app {
4667 name: "app",
4668 srcs: ["foo/bar/MyClass.java"],
4669 package_name: "foo",
4670 sdk_version: "none",
4671 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004672 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004673 }
4674
4675 override_android_app {
4676 name: "override_app",
4677 base: "app",
4678 package_name: "bar",
4679 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004680 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004681
Jiyong Park317645e2019-12-05 13:20:58 +09004682 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4683 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4684 if originalVariant.GetOverriddenBy() != "" {
4685 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4686 }
4687 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4688 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4689 }
4690
Jiyong Park5d790c32019-11-15 18:40:32 +09004691 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4692 apexRule := module.Rule("apexRule")
4693 copyCmds := apexRule.Args["copy_commands"]
4694
4695 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004696 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004697
4698 apexBundle := module.Module().(*apexBundle)
4699 name := apexBundle.Name()
4700 if name != "override_myapex" {
4701 t.Errorf("name should be \"override_myapex\", but was %q", name)
4702 }
4703
Baligh Uddin004d7172020-02-19 21:29:28 -08004704 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4705 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4706 }
4707
Jiyong Park20bacab2020-03-03 11:45:41 +09004708 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004709 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004710
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004711 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4712 var builder strings.Builder
4713 data.Custom(&builder, name, "TARGET_", "", data)
4714 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004715 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004716 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4717 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004718 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004719 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004720 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004721 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4722 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004723}
4724
Jooyung Han214bf372019-11-12 13:03:50 +09004725func TestLegacyAndroid10Support(t *testing.T) {
4726 ctx, _ := testApex(t, `
4727 apex {
4728 name: "myapex",
4729 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004730 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004731 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004732 }
4733
4734 apex_key {
4735 name: "myapex.key",
4736 public_key: "testkey.avbpubkey",
4737 private_key: "testkey.pem",
4738 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004739
4740 cc_library {
4741 name: "mylib",
4742 srcs: ["mylib.cpp"],
4743 stl: "libc++",
4744 system_shared_libs: [],
4745 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004746 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004747 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004748 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004749
4750 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4751 args := module.Rule("apexRule").Args
4752 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004753 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004754
4755 // The copies of the libraries in the apex should have one more dependency than
4756 // the ones outside the apex, namely the unwinder. Ideally we should check
4757 // the dependency names directly here but for some reason the names are blank in
4758 // this test.
4759 for _, lib := range []string{"libc++", "mylib"} {
4760 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4761 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4762 if len(apexImplicits) != len(nonApexImplicits)+1 {
4763 t.Errorf("%q missing unwinder dep", lib)
4764 }
4765 }
Jooyung Han214bf372019-11-12 13:03:50 +09004766}
4767
Paul Duffin9b879592020-05-26 13:21:35 +01004768var filesForSdkLibrary = map[string][]byte{
4769 "api/current.txt": nil,
4770 "api/removed.txt": nil,
4771 "api/system-current.txt": nil,
4772 "api/system-removed.txt": nil,
4773 "api/test-current.txt": nil,
4774 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004775
4776 // For java_sdk_library_import
4777 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004778}
4779
Jooyung Han58f26ab2019-12-18 15:34:32 +09004780func TestJavaSDKLibrary(t *testing.T) {
4781 ctx, _ := testApex(t, `
4782 apex {
4783 name: "myapex",
4784 key: "myapex.key",
4785 java_libs: ["foo"],
4786 }
4787
4788 apex_key {
4789 name: "myapex.key",
4790 public_key: "testkey.avbpubkey",
4791 private_key: "testkey.pem",
4792 }
4793
4794 java_sdk_library {
4795 name: "foo",
4796 srcs: ["a.java"],
4797 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004798 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004799 }
Paul Duffin9b879592020-05-26 13:21:35 +01004800 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004801
4802 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004803 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004804 "javalib/foo.jar",
4805 "etc/permissions/foo.xml",
4806 })
4807 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004808 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4809 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004810}
4811
Paul Duffin9b879592020-05-26 13:21:35 +01004812func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4813 ctx, _ := testApex(t, `
4814 apex {
4815 name: "myapex",
4816 key: "myapex.key",
4817 java_libs: ["foo", "bar"],
4818 }
4819
4820 apex_key {
4821 name: "myapex.key",
4822 public_key: "testkey.avbpubkey",
4823 private_key: "testkey.pem",
4824 }
4825
4826 java_sdk_library {
4827 name: "foo",
4828 srcs: ["a.java"],
4829 api_packages: ["foo"],
4830 apex_available: ["myapex"],
4831 sdk_version: "none",
4832 system_modules: "none",
4833 }
4834
4835 java_library {
4836 name: "bar",
4837 srcs: ["a.java"],
4838 libs: ["foo"],
4839 apex_available: ["myapex"],
4840 sdk_version: "none",
4841 system_modules: "none",
4842 }
4843 `, withFiles(filesForSdkLibrary))
4844
4845 // java_sdk_library installs both impl jar and permission XML
4846 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4847 "javalib/bar.jar",
4848 "javalib/foo.jar",
4849 "etc/permissions/foo.xml",
4850 })
4851
4852 // The bar library should depend on the implementation jar.
4853 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4854 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4855 t.Errorf("expected %q, found %#q", expected, actual)
4856 }
4857}
4858
4859func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4860 ctx, _ := testApex(t, `
4861 apex {
4862 name: "myapex",
4863 key: "myapex.key",
4864 java_libs: ["foo"],
4865 }
4866
4867 apex_key {
4868 name: "myapex.key",
4869 public_key: "testkey.avbpubkey",
4870 private_key: "testkey.pem",
4871 }
4872
4873 java_sdk_library {
4874 name: "foo",
4875 srcs: ["a.java"],
4876 api_packages: ["foo"],
4877 apex_available: ["myapex"],
4878 sdk_version: "none",
4879 system_modules: "none",
4880 }
4881
4882 java_library {
4883 name: "bar",
4884 srcs: ["a.java"],
4885 libs: ["foo"],
4886 sdk_version: "none",
4887 system_modules: "none",
4888 }
4889 `, withFiles(filesForSdkLibrary))
4890
4891 // java_sdk_library installs both impl jar and permission XML
4892 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4893 "javalib/foo.jar",
4894 "etc/permissions/foo.xml",
4895 })
4896
4897 // The bar library should depend on the stubs jar.
4898 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4899 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4900 t.Errorf("expected %q, found %#q", expected, actual)
4901 }
4902}
4903
Paul Duffineedc5d52020-06-12 17:46:39 +01004904func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4905 ctx, _ := testApex(t, ``,
4906 withFiles(map[string][]byte{
4907 "apex/a.java": nil,
4908 "apex/apex_manifest.json": nil,
4909 "apex/Android.bp": []byte(`
4910 package {
4911 default_visibility: ["//visibility:private"],
4912 }
4913
4914 apex {
4915 name: "myapex",
4916 key: "myapex.key",
4917 java_libs: ["foo", "bar"],
4918 }
4919
4920 apex_key {
4921 name: "myapex.key",
4922 public_key: "testkey.avbpubkey",
4923 private_key: "testkey.pem",
4924 }
4925
4926 java_library {
4927 name: "bar",
4928 srcs: ["a.java"],
4929 libs: ["foo"],
4930 apex_available: ["myapex"],
4931 sdk_version: "none",
4932 system_modules: "none",
4933 }
4934`),
4935 "source/a.java": nil,
4936 "source/api/current.txt": nil,
4937 "source/api/removed.txt": nil,
4938 "source/Android.bp": []byte(`
4939 package {
4940 default_visibility: ["//visibility:private"],
4941 }
4942
4943 java_sdk_library {
4944 name: "foo",
4945 visibility: ["//apex"],
4946 srcs: ["a.java"],
4947 api_packages: ["foo"],
4948 apex_available: ["myapex"],
4949 sdk_version: "none",
4950 system_modules: "none",
4951 public: {
4952 enabled: true,
4953 },
4954 }
4955`),
4956 "prebuilt/a.jar": nil,
4957 "prebuilt/Android.bp": []byte(`
4958 package {
4959 default_visibility: ["//visibility:private"],
4960 }
4961
4962 java_sdk_library_import {
4963 name: "foo",
4964 visibility: ["//apex", "//source"],
4965 apex_available: ["myapex"],
4966 prefer: true,
4967 public: {
4968 jars: ["a.jar"],
4969 },
4970 }
4971`),
4972 }),
4973 )
4974
4975 // java_sdk_library installs both impl jar and permission XML
4976 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4977 "javalib/bar.jar",
4978 "javalib/foo.jar",
4979 "etc/permissions/foo.xml",
4980 })
4981
4982 // The bar library should depend on the implementation jar.
4983 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4984 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4985 t.Errorf("expected %q, found %#q", expected, actual)
4986 }
4987}
4988
4989func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
4990 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
4991 apex {
4992 name: "myapex",
4993 key: "myapex.key",
4994 java_libs: ["foo"],
4995 }
4996
4997 apex_key {
4998 name: "myapex.key",
4999 public_key: "testkey.avbpubkey",
5000 private_key: "testkey.pem",
5001 }
5002
5003 java_sdk_library_import {
5004 name: "foo",
5005 apex_available: ["myapex"],
5006 prefer: true,
5007 public: {
5008 jars: ["a.jar"],
5009 },
5010 }
5011
5012 `, withFiles(filesForSdkLibrary))
5013}
5014
atrost6e126252020-01-27 17:01:16 +00005015func TestCompatConfig(t *testing.T) {
5016 ctx, _ := testApex(t, `
5017 apex {
5018 name: "myapex",
5019 key: "myapex.key",
5020 prebuilts: ["myjar-platform-compat-config"],
5021 java_libs: ["myjar"],
5022 }
5023
5024 apex_key {
5025 name: "myapex.key",
5026 public_key: "testkey.avbpubkey",
5027 private_key: "testkey.pem",
5028 }
5029
5030 platform_compat_config {
5031 name: "myjar-platform-compat-config",
5032 src: ":myjar",
5033 }
5034
5035 java_library {
5036 name: "myjar",
5037 srcs: ["foo/bar/MyClass.java"],
5038 sdk_version: "none",
5039 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005040 apex_available: [ "myapex" ],
5041 }
5042 `)
5043 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5044 "etc/compatconfig/myjar-platform-compat-config.xml",
5045 "javalib/myjar.jar",
5046 })
5047}
5048
Jiyong Park479321d2019-12-16 11:47:12 +09005049func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5050 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5051 apex {
5052 name: "myapex",
5053 key: "myapex.key",
5054 java_libs: ["myjar"],
5055 }
5056
5057 apex_key {
5058 name: "myapex.key",
5059 public_key: "testkey.avbpubkey",
5060 private_key: "testkey.pem",
5061 }
5062
5063 java_library {
5064 name: "myjar",
5065 srcs: ["foo/bar/MyClass.java"],
5066 sdk_version: "none",
5067 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005068 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005069 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005070 }
5071 `)
5072}
5073
Jiyong Park7afd1072019-12-30 16:56:33 +09005074func TestCarryRequiredModuleNames(t *testing.T) {
5075 ctx, config := testApex(t, `
5076 apex {
5077 name: "myapex",
5078 key: "myapex.key",
5079 native_shared_libs: ["mylib"],
5080 }
5081
5082 apex_key {
5083 name: "myapex.key",
5084 public_key: "testkey.avbpubkey",
5085 private_key: "testkey.pem",
5086 }
5087
5088 cc_library {
5089 name: "mylib",
5090 srcs: ["mylib.cpp"],
5091 system_shared_libs: [],
5092 stl: "none",
5093 required: ["a", "b"],
5094 host_required: ["c", "d"],
5095 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005096 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005097 }
5098 `)
5099
5100 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5101 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5102 name := apexBundle.BaseModuleName()
5103 prefix := "TARGET_"
5104 var builder strings.Builder
5105 data.Custom(&builder, name, prefix, "", data)
5106 androidMk := builder.String()
5107 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5108 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5109 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5110}
5111
Jiyong Park7cd10e32020-01-14 09:22:18 +09005112func TestSymlinksFromApexToSystem(t *testing.T) {
5113 bp := `
5114 apex {
5115 name: "myapex",
5116 key: "myapex.key",
5117 native_shared_libs: ["mylib"],
5118 java_libs: ["myjar"],
5119 }
5120
Jiyong Park9d677202020-02-19 16:29:35 +09005121 apex {
5122 name: "myapex.updatable",
5123 key: "myapex.key",
5124 native_shared_libs: ["mylib"],
5125 java_libs: ["myjar"],
5126 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005127 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005128 }
5129
Jiyong Park7cd10e32020-01-14 09:22:18 +09005130 apex_key {
5131 name: "myapex.key",
5132 public_key: "testkey.avbpubkey",
5133 private_key: "testkey.pem",
5134 }
5135
5136 cc_library {
5137 name: "mylib",
5138 srcs: ["mylib.cpp"],
5139 shared_libs: ["myotherlib"],
5140 system_shared_libs: [],
5141 stl: "none",
5142 apex_available: [
5143 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005144 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005145 "//apex_available:platform",
5146 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005147 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005148 }
5149
5150 cc_library {
5151 name: "myotherlib",
5152 srcs: ["mylib.cpp"],
5153 system_shared_libs: [],
5154 stl: "none",
5155 apex_available: [
5156 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005157 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005158 "//apex_available:platform",
5159 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005160 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005161 }
5162
5163 java_library {
5164 name: "myjar",
5165 srcs: ["foo/bar/MyClass.java"],
5166 sdk_version: "none",
5167 system_modules: "none",
5168 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005169 apex_available: [
5170 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005171 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005172 "//apex_available:platform",
5173 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005174 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005175 }
5176
5177 java_library {
5178 name: "myotherjar",
5179 srcs: ["foo/bar/MyClass.java"],
5180 sdk_version: "none",
5181 system_modules: "none",
5182 apex_available: [
5183 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005184 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005185 "//apex_available:platform",
5186 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005187 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005188 }
5189 `
5190
5191 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5192 for _, f := range files {
5193 if f.path == file {
5194 if f.isLink {
5195 t.Errorf("%q is not a real file", file)
5196 }
5197 return
5198 }
5199 }
5200 t.Errorf("%q is not found", file)
5201 }
5202
5203 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5204 for _, f := range files {
5205 if f.path == file {
5206 if !f.isLink {
5207 t.Errorf("%q is not a symlink", file)
5208 }
5209 return
5210 }
5211 }
5212 t.Errorf("%q is not found", file)
5213 }
5214
Jiyong Park9d677202020-02-19 16:29:35 +09005215 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5216 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005217 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005218 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005219 ensureRealfileExists(t, files, "javalib/myjar.jar")
5220 ensureRealfileExists(t, files, "lib64/mylib.so")
5221 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5222
Jiyong Park9d677202020-02-19 16:29:35 +09005223 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5224 ensureRealfileExists(t, files, "javalib/myjar.jar")
5225 ensureRealfileExists(t, files, "lib64/mylib.so")
5226 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5227
5228 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005229 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005230 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005231 ensureRealfileExists(t, files, "javalib/myjar.jar")
5232 ensureRealfileExists(t, files, "lib64/mylib.so")
5233 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005234
5235 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5236 ensureRealfileExists(t, files, "javalib/myjar.jar")
5237 ensureRealfileExists(t, files, "lib64/mylib.so")
5238 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005239}
5240
Yo Chiange8128052020-07-23 20:09:18 +08005241func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5242 ctx, config := testApex(t, `
5243 apex {
5244 name: "myapex",
5245 key: "myapex.key",
5246 native_shared_libs: ["mylib"],
5247 }
5248
5249 apex_key {
5250 name: "myapex.key",
5251 public_key: "testkey.avbpubkey",
5252 private_key: "testkey.pem",
5253 }
5254
5255 cc_library_shared {
5256 name: "mylib",
5257 srcs: ["mylib.cpp"],
5258 shared_libs: ["myotherlib"],
5259 system_shared_libs: [],
5260 stl: "none",
5261 apex_available: [
5262 "myapex",
5263 "//apex_available:platform",
5264 ],
5265 }
5266
5267 cc_prebuilt_library_shared {
5268 name: "myotherlib",
5269 srcs: ["prebuilt.so"],
5270 system_shared_libs: [],
5271 stl: "none",
5272 apex_available: [
5273 "myapex",
5274 "//apex_available:platform",
5275 ],
5276 }
5277 `)
5278
5279 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5280 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5281 var builder strings.Builder
5282 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5283 androidMk := builder.String()
5284 // `myotherlib` is added to `myapex` as symlink
5285 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5286 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5287 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5288 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5289 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5290}
5291
Jooyung Han643adc42020-02-27 13:50:06 +09005292func TestApexWithJniLibs(t *testing.T) {
5293 ctx, _ := testApex(t, `
5294 apex {
5295 name: "myapex",
5296 key: "myapex.key",
5297 jni_libs: ["mylib"],
5298 }
5299
5300 apex_key {
5301 name: "myapex.key",
5302 public_key: "testkey.avbpubkey",
5303 private_key: "testkey.pem",
5304 }
5305
5306 cc_library {
5307 name: "mylib",
5308 srcs: ["mylib.cpp"],
5309 shared_libs: ["mylib2"],
5310 system_shared_libs: [],
5311 stl: "none",
5312 apex_available: [ "myapex" ],
5313 }
5314
5315 cc_library {
5316 name: "mylib2",
5317 srcs: ["mylib.cpp"],
5318 system_shared_libs: [],
5319 stl: "none",
5320 apex_available: [ "myapex" ],
5321 }
5322 `)
5323
5324 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5325 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5326 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5327 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5328 "lib64/mylib.so",
5329 "lib64/mylib2.so",
5330 })
5331}
5332
Jooyung Han49f67012020-04-17 13:43:10 +09005333func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5334 ctx, _ := testApex(t, `
5335 apex {
5336 name: "myapex",
5337 key: "myapex.key",
5338 }
5339 apex_key {
5340 name: "myapex.key",
5341 public_key: "testkey.avbpubkey",
5342 private_key: "testkey.pem",
5343 }
5344 `, func(fs map[string][]byte, config android.Config) {
5345 delete(config.Targets, android.Android)
5346 config.AndroidCommonTarget = android.Target{}
5347 })
5348
5349 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5350 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5351 }
5352}
5353
Jooyung Han643adc42020-02-27 13:50:06 +09005354func TestApexWithJniLibs_Errors(t *testing.T) {
5355 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5356 apex {
5357 name: "myapex",
5358 key: "myapex.key",
5359 jni_libs: ["xxx"],
5360 }
5361
5362 apex_key {
5363 name: "myapex.key",
5364 public_key: "testkey.avbpubkey",
5365 private_key: "testkey.pem",
5366 }
5367
5368 prebuilt_etc {
5369 name: "xxx",
5370 src: "xxx",
5371 }
5372 `, withFiles(map[string][]byte{
5373 "xxx": nil,
5374 }))
5375}
5376
Jiyong Parkbd159612020-02-28 15:22:21 +09005377func TestAppBundle(t *testing.T) {
5378 ctx, _ := testApex(t, `
5379 apex {
5380 name: "myapex",
5381 key: "myapex.key",
5382 apps: ["AppFoo"],
5383 }
5384
5385 apex_key {
5386 name: "myapex.key",
5387 public_key: "testkey.avbpubkey",
5388 private_key: "testkey.pem",
5389 }
5390
5391 android_app {
5392 name: "AppFoo",
5393 srcs: ["foo/bar/MyClass.java"],
5394 sdk_version: "none",
5395 system_modules: "none",
5396 apex_available: [ "myapex" ],
5397 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005398 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005399
5400 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5401 content := bundleConfigRule.Args["content"]
5402
5403 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005404 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 +09005405}
5406
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005407func TestAppSetBundle(t *testing.T) {
5408 ctx, _ := testApex(t, `
5409 apex {
5410 name: "myapex",
5411 key: "myapex.key",
5412 apps: ["AppSet"],
5413 }
5414
5415 apex_key {
5416 name: "myapex.key",
5417 public_key: "testkey.avbpubkey",
5418 private_key: "testkey.pem",
5419 }
5420
5421 android_app_set {
5422 name: "AppSet",
5423 set: "AppSet.apks",
5424 }`)
5425 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5426 bundleConfigRule := mod.Description("Bundle Config")
5427 content := bundleConfigRule.Args["content"]
5428 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5429 s := mod.Rule("apexRule").Args["copy_commands"]
5430 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5431 if len(copyCmds) != 3 {
5432 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5433 }
5434 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5435 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5436 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5437}
5438
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005439func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005440 t.Helper()
5441
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005442 bp := `
5443 java_library {
5444 name: "some-updatable-apex-lib",
5445 srcs: ["a.java"],
5446 sdk_version: "current",
5447 apex_available: [
5448 "some-updatable-apex",
5449 ],
5450 }
5451
5452 java_library {
5453 name: "some-non-updatable-apex-lib",
5454 srcs: ["a.java"],
5455 apex_available: [
5456 "some-non-updatable-apex",
5457 ],
5458 }
5459
5460 java_library {
5461 name: "some-platform-lib",
5462 srcs: ["a.java"],
5463 sdk_version: "current",
5464 installable: true,
5465 }
5466
5467 java_library {
5468 name: "some-art-lib",
5469 srcs: ["a.java"],
5470 sdk_version: "current",
5471 apex_available: [
5472 "com.android.art.something",
5473 ],
5474 hostdex: true,
5475 }
5476
5477 apex {
5478 name: "some-updatable-apex",
5479 key: "some-updatable-apex.key",
5480 java_libs: ["some-updatable-apex-lib"],
5481 updatable: true,
5482 min_sdk_version: "current",
5483 }
5484
5485 apex {
5486 name: "some-non-updatable-apex",
5487 key: "some-non-updatable-apex.key",
5488 java_libs: ["some-non-updatable-apex-lib"],
5489 }
5490
5491 apex_key {
5492 name: "some-updatable-apex.key",
5493 }
5494
5495 apex_key {
5496 name: "some-non-updatable-apex.key",
5497 }
5498
5499 apex {
5500 name: "com.android.art.something",
5501 key: "com.android.art.something.key",
5502 java_libs: ["some-art-lib"],
5503 updatable: true,
5504 min_sdk_version: "current",
5505 }
5506
5507 apex_key {
5508 name: "com.android.art.something.key",
5509 }
5510
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005511 filegroup {
5512 name: "some-updatable-apex-file_contexts",
5513 srcs: [
5514 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5515 ],
5516 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005517
5518 filegroup {
5519 name: "some-non-updatable-apex-file_contexts",
5520 srcs: [
5521 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5522 ],
5523 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005524 `
5525 bp += cc.GatherRequiredDepsForTest(android.Android)
5526 bp += java.GatherRequiredDepsForTest()
5527 bp += dexpreopt.BpToolModulesForTest()
5528
5529 fs := map[string][]byte{
5530 "a.java": nil,
5531 "a.jar": nil,
5532 "build/make/target/product/security": nil,
5533 "apex_manifest.json": nil,
5534 "AndroidManifest.xml": nil,
5535 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005536 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005537 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5538 "framework/aidl/a.aidl": nil,
5539 }
5540 cc.GatherRequiredFilesForTest(fs)
5541
5542 ctx := android.NewTestArchContext()
5543 ctx.RegisterModuleType("apex", BundleFactory)
5544 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5545 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005546 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005547 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005548 cc.RegisterRequiredBuildComponentsForTest(ctx)
5549 java.RegisterJavaBuildComponents(ctx)
5550 java.RegisterSystemModulesBuildComponents(ctx)
5551 java.RegisterAppBuildComponents(ctx)
5552 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005553 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5554 ctx.PreDepsMutators(RegisterPreDepsMutators)
5555 ctx.PostDepsMutators(RegisterPostDepsMutators)
5556
5557 config := android.TestArchConfig(buildDir, nil, bp, fs)
5558 ctx.Register(config)
5559
5560 _ = dexpreopt.GlobalSoongConfigForTests(config)
5561 dexpreopt.RegisterToolModulesForTest(ctx)
5562 pathCtx := android.PathContextForTesting(config)
5563 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5564 transformDexpreoptConfig(dexpreoptConfig)
5565 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5566
5567 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5568 android.FailIfErrored(t, errs)
5569
5570 _, errs = ctx.PrepareBuildActions(config)
5571 if errmsg == "" {
5572 android.FailIfErrored(t, errs)
5573 } else if len(errs) > 0 {
5574 android.FailIfNoMatchingErrors(t, errmsg, errs)
5575 return
5576 } else {
5577 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5578 }
5579}
5580
Jooyung Han548640b2020-04-27 12:10:30 +09005581func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5582 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5583 apex {
5584 name: "myapex",
5585 key: "myapex.key",
5586 updatable: true,
5587 }
5588
5589 apex_key {
5590 name: "myapex.key",
5591 public_key: "testkey.avbpubkey",
5592 private_key: "testkey.pem",
5593 }
5594 `)
5595}
5596
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005597func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005598
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005599 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005600 var transform func(*dexpreopt.GlobalConfig)
5601
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005602 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5603 transform = func(config *dexpreopt.GlobalConfig) {
5604 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
5605 }
5606 testNoUpdatableJarsInBootImage(t, "", transform)
5607 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005608
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005609 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005610 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 +01005611 transform = func(config *dexpreopt.GlobalConfig) {
5612 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5613 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005614 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005615 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005616
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005617 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 -07005618 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 +01005619 transform = func(config *dexpreopt.GlobalConfig) {
5620 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5621 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005622 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005623 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005624
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005625 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 -07005626 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005627 transform = func(config *dexpreopt.GlobalConfig) {
5628 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5629 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005630 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005631 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005632
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005633 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 -07005634 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 +01005635 transform = func(config *dexpreopt.GlobalConfig) {
5636 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5637 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005638 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005639 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005640
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005641 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5642 transform = func(config *dexpreopt.GlobalConfig) {
5643 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5644 }
5645 testNoUpdatableJarsInBootImage(t, "", transform)
5646 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005647
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005648 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005649 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005650 transform = func(config *dexpreopt.GlobalConfig) {
5651 config.ArtApexJars = []string{"platform:nonexistent"}
5652 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005653 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005654 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005655
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005656 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005657 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005658 transform = func(config *dexpreopt.GlobalConfig) {
5659 config.BootJars = []string{"platform:nonexistent"}
5660 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005661 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005662 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005663
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005664 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005665 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005666 transform = func(config *dexpreopt.GlobalConfig) {
5667 config.ArtApexJars = []string{"platform:some-platform-lib"}
5668 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005669 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005670 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005671
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005672 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5673 transform = func(config *dexpreopt.GlobalConfig) {
5674 config.BootJars = []string{"platform:some-platform-lib"}
5675 }
5676 testNoUpdatableJarsInBootImage(t, "", transform)
5677 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005678}
5679
Jiyong Park62304bb2020-04-13 16:19:48 +09005680func TestTestFor(t *testing.T) {
5681 ctx, _ := testApex(t, `
5682 apex {
5683 name: "myapex",
5684 key: "myapex.key",
5685 native_shared_libs: ["mylib", "myprivlib"],
5686 }
5687
5688 apex_key {
5689 name: "myapex.key",
5690 public_key: "testkey.avbpubkey",
5691 private_key: "testkey.pem",
5692 }
5693
5694 cc_library {
5695 name: "mylib",
5696 srcs: ["mylib.cpp"],
5697 system_shared_libs: [],
5698 stl: "none",
5699 stubs: {
5700 versions: ["1"],
5701 },
5702 apex_available: ["myapex"],
5703 }
5704
5705 cc_library {
5706 name: "myprivlib",
5707 srcs: ["mylib.cpp"],
5708 system_shared_libs: [],
5709 stl: "none",
5710 apex_available: ["myapex"],
5711 }
5712
5713
5714 cc_test {
5715 name: "mytest",
5716 gtest: false,
5717 srcs: ["mylib.cpp"],
5718 system_shared_libs: [],
5719 stl: "none",
5720 shared_libs: ["mylib", "myprivlib"],
5721 test_for: ["myapex"]
5722 }
5723 `)
5724
5725 // the test 'mytest' is a test for the apex, therefore is linked to the
5726 // actual implementation of mylib instead of its stub.
5727 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5728 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5729 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5730}
5731
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005732// TODO(jungjw): Move this to proptools
5733func intPtr(i int) *int {
5734 return &i
5735}
5736
5737func TestApexSet(t *testing.T) {
5738 ctx, config := testApex(t, `
5739 apex_set {
5740 name: "myapex",
5741 set: "myapex.apks",
5742 filename: "foo_v2.apex",
5743 overrides: ["foo"],
5744 }
5745 `, func(fs map[string][]byte, config android.Config) {
5746 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5747 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5748 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5749 })
5750
5751 m := ctx.ModuleForTests("myapex", "android_common")
5752
5753 // Check extract_apks tool parameters.
5754 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5755 actual := extractedApex.Args["abis"]
5756 expected := "ARMEABI_V7A,ARM64_V8A"
5757 if actual != expected {
5758 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5759 }
5760 actual = extractedApex.Args["sdk-version"]
5761 expected = "30"
5762 if actual != expected {
5763 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5764 }
5765
5766 a := m.Module().(*ApexSet)
5767 expectedOverrides := []string{"foo"}
5768 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5769 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5770 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5771 }
5772}
5773
Jiyong Park7d95a512020-05-10 15:16:24 +09005774func TestNoStaticLinkingToStubsLib(t *testing.T) {
5775 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5776 apex {
5777 name: "myapex",
5778 key: "myapex.key",
5779 native_shared_libs: ["mylib"],
5780 }
5781
5782 apex_key {
5783 name: "myapex.key",
5784 public_key: "testkey.avbpubkey",
5785 private_key: "testkey.pem",
5786 }
5787
5788 cc_library {
5789 name: "mylib",
5790 srcs: ["mylib.cpp"],
5791 static_libs: ["otherlib"],
5792 system_shared_libs: [],
5793 stl: "none",
5794 apex_available: [ "myapex" ],
5795 }
5796
5797 cc_library {
5798 name: "otherlib",
5799 srcs: ["mylib.cpp"],
5800 system_shared_libs: [],
5801 stl: "none",
5802 stubs: {
5803 versions: ["1", "2", "3"],
5804 },
5805 apex_available: [ "myapex" ],
5806 }
5807 `)
5808}
5809
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005810func TestApexKeysTxt(t *testing.T) {
5811 ctx, _ := testApex(t, `
5812 apex {
5813 name: "myapex",
5814 key: "myapex.key",
5815 }
5816
5817 apex_key {
5818 name: "myapex.key",
5819 public_key: "testkey.avbpubkey",
5820 private_key: "testkey.pem",
5821 }
5822
5823 prebuilt_apex {
5824 name: "myapex",
5825 prefer: true,
5826 arch: {
5827 arm64: {
5828 src: "myapex-arm64.apex",
5829 },
5830 arm: {
5831 src: "myapex-arm.apex",
5832 },
5833 },
5834 }
5835
5836 apex_set {
5837 name: "myapex_set",
5838 set: "myapex.apks",
5839 filename: "myapex_set.apex",
5840 overrides: ["myapex"],
5841 }
5842 `)
5843
5844 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5845 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5846 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 +09005847 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 +09005848}
5849
Jooyung Han938b5932020-06-20 12:47:47 +09005850func TestAllowedFiles(t *testing.T) {
5851 ctx, _ := testApex(t, `
5852 apex {
5853 name: "myapex",
5854 key: "myapex.key",
5855 apps: ["app"],
5856 allowed_files: "allowed.txt",
5857 }
5858
5859 apex_key {
5860 name: "myapex.key",
5861 public_key: "testkey.avbpubkey",
5862 private_key: "testkey.pem",
5863 }
5864
5865 android_app {
5866 name: "app",
5867 srcs: ["foo/bar/MyClass.java"],
5868 package_name: "foo",
5869 sdk_version: "none",
5870 system_modules: "none",
5871 apex_available: [ "myapex" ],
5872 }
5873 `, withFiles(map[string][]byte{
5874 "sub/Android.bp": []byte(`
5875 override_apex {
5876 name: "override_myapex",
5877 base: "myapex",
5878 apps: ["override_app"],
5879 allowed_files: ":allowed",
5880 }
5881 // Overridable "path" property should be referenced indirectly
5882 filegroup {
5883 name: "allowed",
5884 srcs: ["allowed.txt"],
5885 }
5886 override_android_app {
5887 name: "override_app",
5888 base: "app",
5889 package_name: "bar",
5890 }
5891 `),
5892 }))
5893
5894 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5895 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5896 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5897 }
5898
5899 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5900 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5901 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5902 }
5903}
5904
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005905func TestNonPreferredPrebuiltDependency(t *testing.T) {
5906 _, _ = testApex(t, `
5907 apex {
5908 name: "myapex",
5909 key: "myapex.key",
5910 native_shared_libs: ["mylib"],
5911 }
5912
5913 apex_key {
5914 name: "myapex.key",
5915 public_key: "testkey.avbpubkey",
5916 private_key: "testkey.pem",
5917 }
5918
5919 cc_library {
5920 name: "mylib",
5921 srcs: ["mylib.cpp"],
5922 stubs: {
5923 versions: ["10000"],
5924 },
5925 apex_available: ["myapex"],
5926 }
5927
5928 cc_prebuilt_library_shared {
5929 name: "mylib",
5930 prefer: false,
5931 srcs: ["prebuilt.so"],
5932 stubs: {
5933 versions: ["10000"],
5934 },
5935 apex_available: ["myapex"],
5936 }
5937 `)
5938}
5939
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005940func TestMain(m *testing.M) {
5941 run := func() int {
5942 setUp()
5943 defer tearDown()
5944
5945 return m.Run()
5946 }
5947
5948 os.Exit(run())
5949}