blob: 0959a49ec7af90ed2f879753e1ff486ba15bf22f [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 Duffin77980a82019-12-19 16:01:36 +0000239 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100240
241 // Register this after the prebuilt mutators have been registered (in
242 // cc.RegisterRequiredBuildComponentsForTest) to match what happens at runtime.
243 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
244 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
245
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800247 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
248 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700249 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000250 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700251 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800252 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000253 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000254 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000255 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100256 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900257 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800258
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800261
262 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265}
266
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700267func setUp() {
268 var err error
269 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273}
274
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700276 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jooyung Han643adc42020-02-27 13:50:06 +0900279// ensure that 'result' equals 'expected'
280func ensureEquals(t *testing.T, result string, expected string) {
281 t.Helper()
282 if result != expected {
283 t.Errorf("%q != %q", expected, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287// ensure that 'result' contains 'expected'
288func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if !strings.Contains(result, expected) {
291 t.Errorf("%q is not found in %q", expected, result)
292 }
293}
294
Liz Kammer5bd365f2020-05-27 15:15:11 -0700295// ensure that 'result' contains 'expected' exactly one time
296func ensureContainsOnce(t *testing.T, result string, expected string) {
297 t.Helper()
298 count := strings.Count(result, expected)
299 if count != 1 {
300 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
301 }
302}
303
Jiyong Park25fc6a92018-11-18 18:02:45 +0900304// ensures that 'result' does not contain 'notExpected'
305func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900306 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307 if strings.Contains(result, notExpected) {
308 t.Errorf("%q is found in %q", notExpected, result)
309 }
310}
311
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700312func ensureMatches(t *testing.T, result string, expectedRex string) {
313 ok, err := regexp.MatchString(expectedRex, result)
314 if err != nil {
315 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
316 return
317 }
318 if !ok {
319 t.Errorf("%s does not match regular expession %s", result, expectedRex)
320 }
321}
322
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900324 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 if !android.InList(expected, result) {
326 t.Errorf("%q is not found in %v", expected, result)
327 }
328}
329
330func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900331 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 if android.InList(notExpected, result) {
333 t.Errorf("%q is found in %v", notExpected, result)
334 }
335}
336
Jooyung Hane1633032019-08-01 17:41:43 +0900337func ensureListEmpty(t *testing.T, result []string) {
338 t.Helper()
339 if len(result) > 0 {
340 t.Errorf("%q is expected to be empty", result)
341 }
342}
343
Jiyong Park25fc6a92018-11-18 18:02:45 +0900344// Minimal test
345func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900346 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900347 apex_defaults {
348 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900349 manifest: ":myapex.manifest",
350 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900351 key: "myapex.key",
352 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800353 multilib: {
354 both: {
355 binaries: ["foo",],
356 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900357 },
Jiyong Park77acec62020-06-01 21:39:15 +0900358 java_libs: [
359 "myjar",
360 "myjar_dex",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 }
363
Jiyong Park30ca9372019-02-07 16:27:23 +0900364 apex {
365 name: "myapex",
366 defaults: ["myapex-defaults"],
367 }
368
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 apex_key {
370 name: "myapex.key",
371 public_key: "testkey.avbpubkey",
372 private_key: "testkey.pem",
373 }
374
Jiyong Park809bb722019-02-13 21:33:49 +0900375 filegroup {
376 name: "myapex.manifest",
377 srcs: ["apex_manifest.json"],
378 }
379
380 filegroup {
381 name: "myapex.androidmanifest",
382 srcs: ["AndroidManifest.xml"],
383 }
384
Jiyong Park25fc6a92018-11-18 18:02:45 +0900385 cc_library {
386 name: "mylib",
387 srcs: ["mylib.cpp"],
388 shared_libs: ["mylib2"],
389 system_shared_libs: [],
390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000391 // TODO: remove //apex_available:platform
392 apex_available: [
393 "//apex_available:platform",
394 "myapex",
395 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900396 }
397
Alex Light3d673592019-01-18 14:37:31 -0800398 cc_binary {
399 name: "foo",
400 srcs: ["mylib.cpp"],
401 compile_multilib: "both",
402 multilib: {
403 lib32: {
404 suffix: "32",
405 },
406 lib64: {
407 suffix: "64",
408 },
409 },
410 symlinks: ["foo_link_"],
411 symlink_preferred_arch: true,
412 system_shared_libs: [],
413 static_executable: true,
414 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000415 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800416 }
417
Paul Duffindddd5462020-04-07 15:25:44 +0100418 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900419 name: "mylib2",
420 srcs: ["mylib.cpp"],
421 system_shared_libs: [],
422 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900423 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900424 static_libs: ["libstatic"],
425 // TODO: remove //apex_available:platform
426 apex_available: [
427 "//apex_available:platform",
428 "myapex",
429 ],
430 }
431
Paul Duffindddd5462020-04-07 15:25:44 +0100432 cc_prebuilt_library_shared {
433 name: "mylib2",
434 srcs: ["prebuilt.so"],
435 // TODO: remove //apex_available:platform
436 apex_available: [
437 "//apex_available:platform",
438 "myapex",
439 ],
440 }
441
Jiyong Park9918e1a2020-03-17 19:16:40 +0900442 cc_library_static {
443 name: "libstatic",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
447 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900453 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900454
455 java_library {
456 name: "myjar",
457 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900458 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900459 sdk_version: "none",
460 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900462 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000463 // TODO: remove //apex_available:platform
464 apex_available: [
465 "//apex_available:platform",
466 "myapex",
467 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 }
469
Jiyong Park77acec62020-06-01 21:39:15 +0900470 dex_import {
471 name: "myjar_dex",
472 jars: ["prebuilt.jar"],
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
477 }
478
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 java_library {
480 name: "myotherjar",
481 srcs: ["foo/bar/MyClass.java"],
482 sdk_version: "none",
483 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900490
491 java_library {
492 name: "mysharedjar",
493 srcs: ["foo/bar/MyClass.java"],
494 sdk_version: "none",
495 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900496 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900497 `)
498
Sundong Ahnabb64432019-10-22 13:58:29 +0900499 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900500
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900501 // Make sure that Android.mk is created
502 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
503 data := android.AndroidMkDataForTest(t, config, "", ab)
504 var builder strings.Builder
505 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
506
507 androidMk := builder.String()
508 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
509 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
510
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511 optFlags := apexRule.Args["opt_flags"]
512 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700513 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900514 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900515
Jiyong Park25fc6a92018-11-18 18:02:45 +0900516 copyCmds := apexRule.Args["copy_commands"]
517
518 // Ensure that main rule creates an output
519 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
520
521 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800522 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900523 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900524 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525
526 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800527 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900528 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900529
530 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800531 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
532 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900533 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900534 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900535 // .. but not for java libs
536 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900537 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800538
Colin Cross7113d202019-11-20 16:39:12 -0800539 // Ensure that the platform variant ends with _shared or _common
540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
541 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
543 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
545
546 // Ensure that dynamic dependency to java libs are not included
547 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800548
549 // Ensure that all symlinks are present.
550 found_foo_link_64 := false
551 found_foo := false
552 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900553 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800554 if strings.HasSuffix(cmd, "bin/foo") {
555 found_foo = true
556 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
557 found_foo_link_64 = true
558 }
559 }
560 }
561 good := found_foo && found_foo_link_64
562 if !good {
563 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
564 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900565
Sundong Ahnabb64432019-10-22 13:58:29 +0900566 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700567 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900568 if len(noticeInputs) != 3 {
569 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900570 }
571 ensureListContains(t, noticeInputs, "NOTICE")
572 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900573 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900574
Artur Satayeva8bd1132020-04-27 18:07:06 +0100575 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000576 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
577 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
578 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
579 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
580 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100581
582 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000583 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
584 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
585 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
586 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
587 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800588}
589
Jooyung Hanf21c7972019-12-16 22:32:06 +0900590func TestDefaults(t *testing.T) {
591 ctx, _ := testApex(t, `
592 apex_defaults {
593 name: "myapex-defaults",
594 key: "myapex.key",
595 prebuilts: ["myetc"],
596 native_shared_libs: ["mylib"],
597 java_libs: ["myjar"],
598 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900599 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900600 }
601
602 prebuilt_etc {
603 name: "myetc",
604 src: "myprebuilt",
605 }
606
607 apex {
608 name: "myapex",
609 defaults: ["myapex-defaults"],
610 }
611
612 apex_key {
613 name: "myapex.key",
614 public_key: "testkey.avbpubkey",
615 private_key: "testkey.pem",
616 }
617
618 cc_library {
619 name: "mylib",
620 system_shared_libs: [],
621 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000622 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 java_library {
626 name: "myjar",
627 srcs: ["foo/bar/MyClass.java"],
628 sdk_version: "none",
629 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000630 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900631 }
632
633 android_app {
634 name: "AppFoo",
635 srcs: ["foo/bar/MyClass.java"],
636 sdk_version: "none",
637 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000638 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900639 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900640
641 runtime_resource_overlay {
642 name: "rro",
643 theme: "blue",
644 }
645
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000647 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 "etc/myetc",
649 "javalib/myjar.jar",
650 "lib64/mylib.so",
651 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900652 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 })
654}
655
Jooyung Han01a3ee22019-11-02 02:52:25 +0900656func TestApexManifest(t *testing.T) {
657 ctx, _ := testApex(t, `
658 apex {
659 name: "myapex",
660 key: "myapex.key",
661 }
662
663 apex_key {
664 name: "myapex.key",
665 public_key: "testkey.avbpubkey",
666 private_key: "testkey.pem",
667 }
668 `)
669
670 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900671 args := module.Rule("apexRule").Args
672 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
673 t.Error("manifest should be apex_manifest.pb, but " + manifest)
674 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900675}
676
Alex Light5098a612018-11-29 17:12:15 -0800677func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700678 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800679 apex {
680 name: "myapex",
681 key: "myapex.key",
682 payload_type: "zip",
683 native_shared_libs: ["mylib"],
684 }
685
686 apex_key {
687 name: "myapex.key",
688 public_key: "testkey.avbpubkey",
689 private_key: "testkey.pem",
690 }
691
692 cc_library {
693 name: "mylib",
694 srcs: ["mylib.cpp"],
695 shared_libs: ["mylib2"],
696 system_shared_libs: [],
697 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000698 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800699 }
700
701 cc_library {
702 name: "mylib2",
703 srcs: ["mylib.cpp"],
704 system_shared_libs: [],
705 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000706 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800707 }
708 `)
709
Sundong Ahnabb64432019-10-22 13:58:29 +0900710 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800711 copyCmds := zipApexRule.Args["copy_commands"]
712
713 // Ensure that main rule creates an output
714 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
715
716 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800717 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800718
719 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800720 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800721
722 // Ensure that both direct and indirect deps are copied into apex
723 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
724 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900725}
726
727func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700728 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900729 apex {
730 name: "myapex",
731 key: "myapex.key",
732 native_shared_libs: ["mylib", "mylib3"],
733 }
734
735 apex_key {
736 name: "myapex.key",
737 public_key: "testkey.avbpubkey",
738 private_key: "testkey.pem",
739 }
740
741 cc_library {
742 name: "mylib",
743 srcs: ["mylib.cpp"],
744 shared_libs: ["mylib2", "mylib3"],
745 system_shared_libs: [],
746 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000747 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748 }
749
750 cc_library {
751 name: "mylib2",
752 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900753 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900754 system_shared_libs: [],
755 stl: "none",
756 stubs: {
757 versions: ["1", "2", "3"],
758 },
759 }
760
761 cc_library {
762 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900763 srcs: ["mylib.cpp"],
764 shared_libs: ["mylib4"],
765 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900766 stl: "none",
767 stubs: {
768 versions: ["10", "11", "12"],
769 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000770 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900771 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900772
773 cc_library {
774 name: "mylib4",
775 srcs: ["mylib.cpp"],
776 system_shared_libs: [],
777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000778 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900779 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780 `)
781
Sundong Ahnabb64432019-10-22 13:58:29 +0900782 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900783 copyCmds := apexRule.Args["copy_commands"]
784
785 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800786 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900787
788 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800789 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790
791 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800792 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900793
Colin Cross7113d202019-11-20 16:39:12 -0800794 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900795
796 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900797 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900798 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900799 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900800
801 // 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 -0800802 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900803 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800804 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900805
806 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900807 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900808 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900809
810 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900811 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900812
Jooyung Hana57af4a2020-01-23 05:36:59 +0000813 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900814 "lib64/mylib.so",
815 "lib64/mylib3.so",
816 "lib64/mylib4.so",
817 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900818}
819
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900820func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700821 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900822 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900823 name: "myapex2",
824 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900825 native_shared_libs: ["mylib"],
826 }
827
828 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900829 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900830 public_key: "testkey.avbpubkey",
831 private_key: "testkey.pem",
832 }
833
834 cc_library {
835 name: "mylib",
836 srcs: ["mylib.cpp"],
837 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900838 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839 system_shared_libs: [],
840 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000841 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900842 }
843
844 cc_library {
845 name: "libfoo",
846 srcs: ["mylib.cpp"],
847 shared_libs: ["libbar"],
848 system_shared_libs: [],
849 stl: "none",
850 stubs: {
851 versions: ["10", "20", "30"],
852 },
853 }
854
855 cc_library {
856 name: "libbar",
857 srcs: ["mylib.cpp"],
858 system_shared_libs: [],
859 stl: "none",
860 }
861
Jiyong Park678c8812020-02-07 17:25:49 +0900862 cc_library_static {
863 name: "libbaz",
864 srcs: ["mylib.cpp"],
865 system_shared_libs: [],
866 stl: "none",
867 apex_available: [ "myapex2" ],
868 }
869
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900870 `)
871
Jiyong Park83dc74b2020-01-14 18:38:44 +0900872 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900873 copyCmds := apexRule.Args["copy_commands"]
874
875 // Ensure that direct non-stubs dep is always included
876 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
877
878 // Ensure that indirect stubs dep is not included
879 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
880
881 // Ensure that dependency of stubs is not included
882 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
883
Jiyong Park83dc74b2020-01-14 18:38:44 +0900884 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900885
886 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900887 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900888 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900889 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900890
Jiyong Park3ff16992019-12-27 14:11:47 +0900891 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892
893 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
894 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900895
Artur Satayeva8bd1132020-04-27 18:07:06 +0100896 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000897 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
898 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
899 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900900
Artur Satayeva8bd1132020-04-27 18:07:06 +0100901 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000902 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
903 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
904 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900905}
906
Jooyung Hand3639552019-08-09 12:57:43 +0900907func TestApexWithRuntimeLibsDependency(t *testing.T) {
908 /*
909 myapex
910 |
911 v (runtime_libs)
912 mylib ------+------> libfoo [provides stub]
913 |
914 `------> libbar
915 */
916 ctx, _ := testApex(t, `
917 apex {
918 name: "myapex",
919 key: "myapex.key",
920 native_shared_libs: ["mylib"],
921 }
922
923 apex_key {
924 name: "myapex.key",
925 public_key: "testkey.avbpubkey",
926 private_key: "testkey.pem",
927 }
928
929 cc_library {
930 name: "mylib",
931 srcs: ["mylib.cpp"],
932 runtime_libs: ["libfoo", "libbar"],
933 system_shared_libs: [],
934 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000935 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900936 }
937
938 cc_library {
939 name: "libfoo",
940 srcs: ["mylib.cpp"],
941 system_shared_libs: [],
942 stl: "none",
943 stubs: {
944 versions: ["10", "20", "30"],
945 },
946 }
947
948 cc_library {
949 name: "libbar",
950 srcs: ["mylib.cpp"],
951 system_shared_libs: [],
952 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000953 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900954 }
955
956 `)
957
Sundong Ahnabb64432019-10-22 13:58:29 +0900958 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900959 copyCmds := apexRule.Args["copy_commands"]
960
961 // Ensure that direct non-stubs dep is always included
962 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
963
964 // Ensure that indirect stubs dep is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
966
967 // Ensure that runtime_libs dep in included
968 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
969
Sundong Ahnabb64432019-10-22 13:58:29 +0900970 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900971 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900973
974}
975
Jooyung Han8ce8db92020-05-15 19:05:05 +0900976func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
977 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
978 bp := `
979 apex {
980 name: "com.android.runtime",
981 key: "com.android.runtime.key",
982 native_shared_libs: ["libc"],
983 }
984
985 apex_key {
986 name: "com.android.runtime.key",
987 public_key: "testkey.avbpubkey",
988 private_key: "testkey.pem",
989 }
990
991 cc_library {
992 name: "libc",
993 no_libcrt: true,
994 nocrt: true,
995 stl: "none",
996 system_shared_libs: [],
997 stubs: { versions: ["1"] },
998 apex_available: ["com.android.runtime"],
999
1000 sanitize: {
1001 hwaddress: true,
1002 }
1003 }
1004
1005 cc_prebuilt_library_shared {
1006 name: "libclang_rt.hwasan-aarch64-android",
1007 no_libcrt: true,
1008 nocrt: true,
1009 stl: "none",
1010 system_shared_libs: [],
1011 srcs: [""],
1012 stubs: { versions: ["1"] },
1013
1014 sanitize: {
1015 never: true,
1016 },
1017 }
1018 `
1019 // override bp to use hard-coded names: com.android.runtime and libc
1020 fs["Android.bp"] = []byte(bp)
1021 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1022 })
1023
1024 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1025 "lib64/bionic/libc.so",
1026 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1027 })
1028
1029 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1030
1031 installed := hwasan.Description("install libclang_rt.hwasan")
1032 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1033
1034 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1035 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1036 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1037}
1038
1039func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1040 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1041 bp := `
1042 apex {
1043 name: "com.android.runtime",
1044 key: "com.android.runtime.key",
1045 native_shared_libs: ["libc"],
1046 }
1047
1048 apex_key {
1049 name: "com.android.runtime.key",
1050 public_key: "testkey.avbpubkey",
1051 private_key: "testkey.pem",
1052 }
1053
1054 cc_library {
1055 name: "libc",
1056 no_libcrt: true,
1057 nocrt: true,
1058 stl: "none",
1059 system_shared_libs: [],
1060 stubs: { versions: ["1"] },
1061 apex_available: ["com.android.runtime"],
1062 }
1063
1064 cc_prebuilt_library_shared {
1065 name: "libclang_rt.hwasan-aarch64-android",
1066 no_libcrt: true,
1067 nocrt: true,
1068 stl: "none",
1069 system_shared_libs: [],
1070 srcs: [""],
1071 stubs: { versions: ["1"] },
1072
1073 sanitize: {
1074 never: true,
1075 },
1076 }
1077 `
1078 // override bp to use hard-coded names: com.android.runtime and libc
1079 fs["Android.bp"] = []byte(bp)
1080 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1081
1082 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1083 })
1084
1085 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1086 "lib64/bionic/libc.so",
1087 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1088 })
1089
1090 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1091
1092 installed := hwasan.Description("install libclang_rt.hwasan")
1093 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1094
1095 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1096 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1097 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1098}
1099
Jooyung Han61b66e92020-03-21 14:21:46 +00001100func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1101 testcases := []struct {
1102 name string
1103 minSdkVersion string
1104 shouldLink string
1105 shouldNotLink []string
1106 }{
1107 {
Jooyung Han75568392020-03-20 04:29:24 +09001108 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001109 minSdkVersion: "",
Jooyung Han61b66e92020-03-21 14:21:46 +00001110 shouldLink: "30",
1111 shouldNotLink: []string{"29"},
1112 },
1113 {
1114 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001115 minSdkVersion: "min_sdk_version: \"29\",",
Jooyung Han61b66e92020-03-21 14:21:46 +00001116 shouldLink: "29",
1117 shouldNotLink: []string{"30"},
1118 },
1119 }
1120 for _, tc := range testcases {
1121 t.Run(tc.name, func(t *testing.T) {
1122 ctx, _ := testApex(t, `
1123 apex {
1124 name: "myapex",
1125 key: "myapex.key",
1126 use_vendor: true,
1127 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001128 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001129 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001130
Jooyung Han61b66e92020-03-21 14:21:46 +00001131 apex_key {
1132 name: "myapex.key",
1133 public_key: "testkey.avbpubkey",
1134 private_key: "testkey.pem",
1135 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001136
Jooyung Han61b66e92020-03-21 14:21:46 +00001137 cc_library {
1138 name: "mylib",
1139 srcs: ["mylib.cpp"],
1140 vendor_available: true,
1141 shared_libs: ["libbar"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001145 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001146 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001147
Jooyung Han61b66e92020-03-21 14:21:46 +00001148 cc_library {
1149 name: "libbar",
1150 srcs: ["mylib.cpp"],
1151 system_shared_libs: [],
1152 stl: "none",
1153 stubs: { versions: ["29","30"] },
1154 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001155
Jooyung Han61b66e92020-03-21 14:21:46 +00001156 llndk_library {
1157 name: "libbar",
1158 symbol_file: "",
1159 }
1160 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001161 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001162 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001163
Jooyung Han61b66e92020-03-21 14:21:46 +00001164 // Ensure that LLNDK dep is not included
1165 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1166 "lib64/mylib.so",
1167 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001168
Jooyung Han61b66e92020-03-21 14:21:46 +00001169 // Ensure that LLNDK dep is required
1170 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1171 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1172 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001173
Jooyung Han61b66e92020-03-21 14:21:46 +00001174 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1175 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1176 for _, ver := range tc.shouldNotLink {
1177 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1178 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001179
Jooyung Han61b66e92020-03-21 14:21:46 +00001180 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1181 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1182 })
1183 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001184}
1185
Jiyong Park25fc6a92018-11-18 18:02:45 +09001186func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001187 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001188 apex {
1189 name: "myapex",
1190 key: "myapex.key",
1191 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1192 }
1193
1194 apex_key {
1195 name: "myapex.key",
1196 public_key: "testkey.avbpubkey",
1197 private_key: "testkey.pem",
1198 }
1199
1200 cc_library {
1201 name: "mylib",
1202 srcs: ["mylib.cpp"],
1203 shared_libs: ["libdl#27"],
1204 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001205 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001206 }
1207
1208 cc_library_shared {
1209 name: "mylib_shared",
1210 srcs: ["mylib.cpp"],
1211 shared_libs: ["libdl#27"],
1212 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001213 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001214 }
1215
1216 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001217 name: "libBootstrap",
1218 srcs: ["mylib.cpp"],
1219 stl: "none",
1220 bootstrap: true,
1221 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001222 `)
1223
Sundong Ahnabb64432019-10-22 13:58:29 +09001224 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001225 copyCmds := apexRule.Args["copy_commands"]
1226
1227 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001228 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001229 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1230 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001231
1232 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001233 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001234
Colin Cross7113d202019-11-20 16:39:12 -08001235 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1236 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1237 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001238
1239 // For dependency to libc
1240 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001241 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001242 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001243 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001244 // ... Cflags from stub is correctly exported to mylib
1245 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1246 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1247
1248 // For dependency to libm
1249 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001250 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001251 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001252 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001253 // ... and is not compiling with the stub
1254 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1255 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1256
1257 // For dependency to libdl
1258 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001259 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001261 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1262 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001263 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001264 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001265 // ... Cflags from stub is correctly exported to mylib
1266 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1267 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001268
1269 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001270 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1271 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1272 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1273 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001274}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001275
Jooyung Han749dc692020-04-15 11:03:39 +09001276func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001277 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001278 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1279 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001280 // 3) (platform) -> liba -> libz : this should be non-stub link
1281 ctx, _ := testApex(t, `
1282 apex {
1283 name: "myapex",
1284 key: "myapex.key",
1285 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001286 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001287 }
1288
1289 apex {
1290 name: "otherapex",
1291 key: "myapex.key",
1292 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001293 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001294 }
1295
1296 apex_key {
1297 name: "myapex.key",
1298 public_key: "testkey.avbpubkey",
1299 private_key: "testkey.pem",
1300 }
1301
1302 cc_library {
1303 name: "libx",
1304 shared_libs: ["liba"],
1305 system_shared_libs: [],
1306 stl: "none",
1307 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001308 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001309 }
1310
1311 cc_library {
1312 name: "liby",
1313 shared_libs: ["liba"],
1314 system_shared_libs: [],
1315 stl: "none",
1316 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001317 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001318 }
1319
1320 cc_library {
1321 name: "liba",
1322 shared_libs: ["libz"],
1323 system_shared_libs: [],
1324 stl: "none",
1325 apex_available: [
1326 "//apex_available:anyapex",
1327 "//apex_available:platform",
1328 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001329 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001330 }
1331
1332 cc_library {
1333 name: "libz",
1334 system_shared_libs: [],
1335 stl: "none",
1336 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001337 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001338 },
1339 }
Jooyung Han749dc692020-04-15 11:03:39 +09001340 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001341
1342 expectLink := func(from, from_variant, to, to_variant string) {
1343 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1344 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1345 }
1346 expectNoLink := func(from, from_variant, to, to_variant string) {
1347 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1348 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1349 }
1350 // platform liba is linked to non-stub version
1351 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001352 // liba in myapex is linked to #28
1353 expectLink("liba", "shared_myapex", "libz", "shared_28")
1354 expectNoLink("liba", "shared_myapex", "libz", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001355 expectNoLink("liba", "shared_myapex", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001356 // liba in otherapex is linked to #30
1357 expectLink("liba", "shared_otherapex", "libz", "shared_30")
1358 expectNoLink("liba", "shared_otherapex", "libz", "shared_28")
Jooyung Han03b51852020-02-26 22:45:42 +09001359 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1360}
1361
Jooyung Hanaed150d2020-04-02 01:41:41 +09001362func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1363 ctx, _ := testApex(t, `
1364 apex {
1365 name: "myapex",
1366 key: "myapex.key",
1367 native_shared_libs: ["libx"],
1368 min_sdk_version: "R",
1369 }
1370
1371 apex_key {
1372 name: "myapex.key",
1373 public_key: "testkey.avbpubkey",
1374 private_key: "testkey.pem",
1375 }
1376
1377 cc_library {
1378 name: "libx",
1379 shared_libs: ["libz"],
1380 system_shared_libs: [],
1381 stl: "none",
1382 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001383 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001384 }
1385
1386 cc_library {
1387 name: "libz",
1388 system_shared_libs: [],
1389 stl: "none",
1390 stubs: {
1391 versions: ["29", "R"],
1392 },
1393 }
1394 `, func(fs map[string][]byte, config android.Config) {
1395 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1396 })
1397
1398 expectLink := func(from, from_variant, to, to_variant string) {
1399 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1400 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1401 }
1402 expectNoLink := func(from, from_variant, to, to_variant string) {
1403 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1404 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1405 }
1406 // 9000 is quite a magic number.
1407 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1408 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1409 // to distinguish them from finalized and future_api(10000)
1410 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1411 // (refer android/api_levels.go)
1412 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1413 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1414 expectNoLink("libx", "shared_myapex", "libz", "shared")
1415}
1416
Jooyung Han749dc692020-04-15 11:03:39 +09001417func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001418 ctx, _ := testApex(t, `
1419 apex {
1420 name: "myapex",
1421 key: "myapex.key",
1422 native_shared_libs: ["libx"],
1423 }
1424
1425 apex_key {
1426 name: "myapex.key",
1427 public_key: "testkey.avbpubkey",
1428 private_key: "testkey.pem",
1429 }
1430
1431 cc_library {
1432 name: "libx",
1433 shared_libs: ["libz"],
1434 system_shared_libs: [],
1435 stl: "none",
1436 apex_available: [ "myapex" ],
1437 }
1438
1439 cc_library {
1440 name: "libz",
1441 system_shared_libs: [],
1442 stl: "none",
1443 stubs: {
1444 versions: ["1", "2"],
1445 },
1446 }
1447 `)
1448
1449 expectLink := func(from, from_variant, to, to_variant string) {
1450 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1451 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1452 }
1453 expectNoLink := func(from, from_variant, to, to_variant string) {
1454 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1455 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1456 }
1457 expectLink("libx", "shared_myapex", "libz", "shared_2")
1458 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1459 expectNoLink("libx", "shared_myapex", "libz", "shared")
1460}
1461
1462func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1463 ctx, _ := testApex(t, `
1464 apex {
1465 name: "myapex",
1466 key: "myapex.key",
1467 native_shared_libs: ["libx"],
1468 }
1469
1470 apex_key {
1471 name: "myapex.key",
1472 public_key: "testkey.avbpubkey",
1473 private_key: "testkey.pem",
1474 }
1475
1476 cc_library {
1477 name: "libx",
1478 system_shared_libs: [],
1479 stl: "none",
1480 apex_available: [ "myapex" ],
1481 stubs: {
1482 versions: ["1", "2"],
1483 },
1484 }
1485
1486 cc_library {
1487 name: "libz",
1488 shared_libs: ["libx"],
1489 system_shared_libs: [],
1490 stl: "none",
1491 }
1492 `)
1493
1494 expectLink := func(from, from_variant, to, to_variant string) {
1495 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1496 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1497 }
1498 expectNoLink := func(from, from_variant, to, to_variant string) {
1499 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1500 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1501 }
1502 expectLink("libz", "shared", "libx", "shared_2")
1503 expectNoLink("libz", "shared", "libz", "shared_1")
1504 expectNoLink("libz", "shared", "libz", "shared")
1505}
1506
Jooyung Han75568392020-03-20 04:29:24 +09001507func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001508 ctx, _ := testApex(t, `
1509 apex {
1510 name: "myapex",
1511 key: "myapex.key",
1512 native_shared_libs: ["libx"],
1513 min_sdk_version: "29",
1514 }
1515
1516 apex_key {
1517 name: "myapex.key",
1518 public_key: "testkey.avbpubkey",
1519 private_key: "testkey.pem",
1520 }
1521
1522 cc_library {
1523 name: "libx",
1524 shared_libs: ["libbar"],
1525 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001526 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001527 }
1528
1529 cc_library {
1530 name: "libbar",
1531 stubs: {
1532 versions: ["29", "30"],
1533 },
1534 }
Jooyung Han75568392020-03-20 04:29:24 +09001535 `, func(fs map[string][]byte, config android.Config) {
1536 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1537 })
Jooyung Han03b51852020-02-26 22:45:42 +09001538 expectLink := func(from, from_variant, to, to_variant string) {
1539 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1540 libFlags := ld.Args["libFlags"]
1541 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1542 }
Jooyung Han75568392020-03-20 04:29:24 +09001543 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001544}
1545
Jooyung Han75568392020-03-20 04:29:24 +09001546func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001547 ctx, _ := testApex(t, `
1548 apex {
1549 name: "myapex",
1550 key: "myapex.key",
1551 native_shared_libs: ["libx"],
1552 min_sdk_version: "29",
1553 }
1554
1555 apex_key {
1556 name: "myapex.key",
1557 public_key: "testkey.avbpubkey",
1558 private_key: "testkey.pem",
1559 }
1560
1561 cc_library {
1562 name: "libx",
1563 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001564 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001565 }
Jooyung Han75568392020-03-20 04:29:24 +09001566 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001567
1568 // ensure apex variant of c++ is linked with static unwinder
1569 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1570 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1571 // note that platform variant is not.
1572 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1573 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001574}
1575
Jooyung Han749dc692020-04-15 11:03:39 +09001576func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001577 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001578 apex {
1579 name: "myapex",
1580 key: "myapex.key",
1581 native_shared_libs: ["libx"],
1582 min_sdk_version: "29",
1583 }
1584
1585 apex_key {
1586 name: "myapex.key",
1587 public_key: "testkey.avbpubkey",
1588 private_key: "testkey.pem",
1589 }
1590
1591 cc_library {
1592 name: "libx",
1593 shared_libs: ["libz"],
1594 system_shared_libs: [],
1595 stl: "none",
1596 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001597 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001598 }
1599
1600 cc_library {
1601 name: "libz",
1602 system_shared_libs: [],
1603 stl: "none",
1604 stubs: {
1605 versions: ["30"],
1606 },
1607 }
Jooyung Han75568392020-03-20 04:29:24 +09001608 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001609}
Jooyung Han03b51852020-02-26 22:45:42 +09001610
Jooyung Han749dc692020-04-15 11:03:39 +09001611func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1612 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001613 apex {
1614 name: "myapex",
1615 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001616 native_shared_libs: ["mylib"],
1617 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001618 }
1619
1620 apex_key {
1621 name: "myapex.key",
1622 public_key: "testkey.avbpubkey",
1623 private_key: "testkey.pem",
1624 }
Jooyung Han749dc692020-04-15 11:03:39 +09001625
1626 cc_library {
1627 name: "mylib",
1628 srcs: ["mylib.cpp"],
1629 system_shared_libs: [],
1630 stl: "none",
1631 apex_available: [
1632 "myapex",
1633 ],
1634 min_sdk_version: "30",
1635 }
1636 `)
1637}
1638
1639func TestApexMinSdkVersion_Okay(t *testing.T) {
1640 testApex(t, `
1641 apex {
1642 name: "myapex",
1643 key: "myapex.key",
1644 native_shared_libs: ["libfoo"],
1645 java_libs: ["libbar"],
1646 min_sdk_version: "29",
1647 }
1648
1649 apex_key {
1650 name: "myapex.key",
1651 public_key: "testkey.avbpubkey",
1652 private_key: "testkey.pem",
1653 }
1654
1655 cc_library {
1656 name: "libfoo",
1657 srcs: ["mylib.cpp"],
1658 shared_libs: ["libfoo_dep"],
1659 apex_available: ["myapex"],
1660 min_sdk_version: "29",
1661 }
1662
1663 cc_library {
1664 name: "libfoo_dep",
1665 srcs: ["mylib.cpp"],
1666 apex_available: ["myapex"],
1667 min_sdk_version: "29",
1668 }
1669
1670 java_library {
1671 name: "libbar",
1672 sdk_version: "current",
1673 srcs: ["a.java"],
1674 static_libs: ["libbar_dep"],
1675 apex_available: ["myapex"],
1676 min_sdk_version: "29",
1677 }
1678
1679 java_library {
1680 name: "libbar_dep",
1681 sdk_version: "current",
1682 srcs: ["a.java"],
1683 apex_available: ["myapex"],
1684 min_sdk_version: "29",
1685 }
Jooyung Han03b51852020-02-26 22:45:42 +09001686 `)
1687}
1688
Artur Satayev8cf899a2020-04-15 17:29:42 +01001689func TestJavaStableSdkVersion(t *testing.T) {
1690 testCases := []struct {
1691 name string
1692 expectedError string
1693 bp string
1694 }{
1695 {
1696 name: "Non-updatable apex with non-stable dep",
1697 bp: `
1698 apex {
1699 name: "myapex",
1700 java_libs: ["myjar"],
1701 key: "myapex.key",
1702 }
1703 apex_key {
1704 name: "myapex.key",
1705 public_key: "testkey.avbpubkey",
1706 private_key: "testkey.pem",
1707 }
1708 java_library {
1709 name: "myjar",
1710 srcs: ["foo/bar/MyClass.java"],
1711 sdk_version: "core_platform",
1712 apex_available: ["myapex"],
1713 }
1714 `,
1715 },
1716 {
1717 name: "Updatable apex with stable dep",
1718 bp: `
1719 apex {
1720 name: "myapex",
1721 java_libs: ["myjar"],
1722 key: "myapex.key",
1723 updatable: true,
1724 min_sdk_version: "29",
1725 }
1726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
1731 java_library {
1732 name: "myjar",
1733 srcs: ["foo/bar/MyClass.java"],
1734 sdk_version: "current",
1735 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001736 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001737 }
1738 `,
1739 },
1740 {
1741 name: "Updatable apex with non-stable dep",
1742 expectedError: "cannot depend on \"myjar\"",
1743 bp: `
1744 apex {
1745 name: "myapex",
1746 java_libs: ["myjar"],
1747 key: "myapex.key",
1748 updatable: true,
1749 }
1750 apex_key {
1751 name: "myapex.key",
1752 public_key: "testkey.avbpubkey",
1753 private_key: "testkey.pem",
1754 }
1755 java_library {
1756 name: "myjar",
1757 srcs: ["foo/bar/MyClass.java"],
1758 sdk_version: "core_platform",
1759 apex_available: ["myapex"],
1760 }
1761 `,
1762 },
1763 {
1764 name: "Updatable apex with non-stable transitive dep",
1765 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1766 bp: `
1767 apex {
1768 name: "myapex",
1769 java_libs: ["myjar"],
1770 key: "myapex.key",
1771 updatable: true,
1772 }
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778 java_library {
1779 name: "myjar",
1780 srcs: ["foo/bar/MyClass.java"],
1781 sdk_version: "current",
1782 apex_available: ["myapex"],
1783 static_libs: ["transitive-jar"],
1784 }
1785 java_library {
1786 name: "transitive-jar",
1787 srcs: ["foo/bar/MyClass.java"],
1788 sdk_version: "core_platform",
1789 apex_available: ["myapex"],
1790 }
1791 `,
1792 },
1793 }
1794
1795 for _, test := range testCases {
1796 t.Run(test.name, func(t *testing.T) {
1797 if test.expectedError == "" {
1798 testApex(t, test.bp)
1799 } else {
1800 testApexError(t, test.expectedError, test.bp)
1801 }
1802 })
1803 }
1804}
1805
Jooyung Han749dc692020-04-15 11:03:39 +09001806func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1807 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1808 apex {
1809 name: "myapex",
1810 key: "myapex.key",
1811 native_shared_libs: ["mylib"],
1812 min_sdk_version: "29",
1813 }
1814
1815 apex_key {
1816 name: "myapex.key",
1817 public_key: "testkey.avbpubkey",
1818 private_key: "testkey.pem",
1819 }
1820
1821 cc_library {
1822 name: "mylib",
1823 srcs: ["mylib.cpp"],
1824 shared_libs: ["mylib2"],
1825 system_shared_libs: [],
1826 stl: "none",
1827 apex_available: [
1828 "myapex",
1829 ],
1830 min_sdk_version: "29",
1831 }
1832
1833 // indirect part of the apex
1834 cc_library {
1835 name: "mylib2",
1836 srcs: ["mylib.cpp"],
1837 system_shared_libs: [],
1838 stl: "none",
1839 apex_available: [
1840 "myapex",
1841 ],
1842 min_sdk_version: "30",
1843 }
1844 `)
1845}
1846
1847func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1848 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1849 apex {
1850 name: "myapex",
1851 key: "myapex.key",
1852 apps: ["AppFoo"],
1853 min_sdk_version: "29",
1854 }
1855
1856 apex_key {
1857 name: "myapex.key",
1858 public_key: "testkey.avbpubkey",
1859 private_key: "testkey.pem",
1860 }
1861
1862 android_app {
1863 name: "AppFoo",
1864 srcs: ["foo/bar/MyClass.java"],
1865 sdk_version: "current",
1866 min_sdk_version: "29",
1867 system_modules: "none",
1868 stl: "none",
1869 static_libs: ["bar"],
1870 apex_available: [ "myapex" ],
1871 }
1872
1873 java_library {
1874 name: "bar",
1875 sdk_version: "current",
1876 srcs: ["a.java"],
1877 apex_available: [ "myapex" ],
1878 }
1879 `)
1880}
1881
1882func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1883 ctx, _ := testApex(t, `
1884 apex {
1885 name: "myapex",
1886 key: "myapex.key",
1887 native_shared_libs: ["mylib"],
1888 min_sdk_version: "29",
1889 }
1890
1891 apex_key {
1892 name: "myapex.key",
1893 public_key: "testkey.avbpubkey",
1894 private_key: "testkey.pem",
1895 }
1896
1897 // mylib in myapex will link to mylib2#29
1898 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1899 cc_library {
1900 name: "mylib",
1901 srcs: ["mylib.cpp"],
1902 shared_libs: ["mylib2"],
1903 system_shared_libs: [],
1904 stl: "none",
1905 apex_available: ["myapex", "otherapex"],
1906 min_sdk_version: "29",
1907 }
1908
1909 cc_library {
1910 name: "mylib2",
1911 srcs: ["mylib.cpp"],
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: ["otherapex"],
1915 stubs: { versions: ["29", "30"] },
1916 min_sdk_version: "30",
1917 }
1918
1919 apex {
1920 name: "otherapex",
1921 key: "myapex.key",
1922 native_shared_libs: ["mylib", "mylib2"],
1923 min_sdk_version: "30",
1924 }
1925 `)
1926 expectLink := func(from, from_variant, to, to_variant string) {
1927 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1928 libFlags := ld.Args["libFlags"]
1929 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930 }
1931 expectLink("mylib", "shared_myapex", "mylib2", "shared_29")
1932 expectLink("mylib", "shared_otherapex", "mylib2", "shared_otherapex")
1933}
1934
Jiyong Park7c2ee712018-12-07 00:42:25 +09001935func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001936 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001937 apex {
1938 name: "myapex",
1939 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001940 native_shared_libs: ["mylib"],
1941 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001942 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001943 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001944 }
1945
1946 apex_key {
1947 name: "myapex.key",
1948 public_key: "testkey.avbpubkey",
1949 private_key: "testkey.pem",
1950 }
1951
1952 prebuilt_etc {
1953 name: "myetc",
1954 src: "myprebuilt",
1955 sub_dir: "foo/bar",
1956 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001957
1958 cc_library {
1959 name: "mylib",
1960 srcs: ["mylib.cpp"],
1961 relative_install_path: "foo/bar",
1962 system_shared_libs: [],
1963 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001964 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001965 }
1966
1967 cc_binary {
1968 name: "mybin",
1969 srcs: ["mylib.cpp"],
1970 relative_install_path: "foo/bar",
1971 system_shared_libs: [],
1972 static_executable: true,
1973 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001974 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001975 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001976 `)
1977
Sundong Ahnabb64432019-10-22 13:58:29 +09001978 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001979 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1980
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001981 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001982 ensureListContains(t, dirs, "etc")
1983 ensureListContains(t, dirs, "etc/foo")
1984 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001985 ensureListContains(t, dirs, "lib64")
1986 ensureListContains(t, dirs, "lib64/foo")
1987 ensureListContains(t, dirs, "lib64/foo/bar")
1988 ensureListContains(t, dirs, "lib")
1989 ensureListContains(t, dirs, "lib/foo")
1990 ensureListContains(t, dirs, "lib/foo/bar")
1991
Jiyong Parkbd13e442019-03-15 18:10:35 +09001992 ensureListContains(t, dirs, "bin")
1993 ensureListContains(t, dirs, "bin/foo")
1994 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001995}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001996
Jooyung Han35155c42020-02-06 17:33:20 +09001997func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1998 ctx, _ := testApex(t, `
1999 apex {
2000 name: "myapex",
2001 key: "myapex.key",
2002 multilib: {
2003 both: {
2004 native_shared_libs: ["mylib"],
2005 binaries: ["mybin"],
2006 },
2007 },
2008 compile_multilib: "both",
2009 native_bridge_supported: true,
2010 }
2011
2012 apex_key {
2013 name: "myapex.key",
2014 public_key: "testkey.avbpubkey",
2015 private_key: "testkey.pem",
2016 }
2017
2018 cc_library {
2019 name: "mylib",
2020 relative_install_path: "foo/bar",
2021 system_shared_libs: [],
2022 stl: "none",
2023 apex_available: [ "myapex" ],
2024 native_bridge_supported: true,
2025 }
2026
2027 cc_binary {
2028 name: "mybin",
2029 relative_install_path: "foo/bar",
2030 system_shared_libs: [],
2031 static_executable: true,
2032 stl: "none",
2033 apex_available: [ "myapex" ],
2034 native_bridge_supported: true,
2035 compile_multilib: "both", // default is "first" for binary
2036 multilib: {
2037 lib64: {
2038 suffix: "64",
2039 },
2040 },
2041 }
2042 `, withNativeBridgeEnabled)
2043 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2044 "bin/foo/bar/mybin",
2045 "bin/foo/bar/mybin64",
2046 "bin/arm/foo/bar/mybin",
2047 "bin/arm64/foo/bar/mybin64",
2048 "lib/foo/bar/mylib.so",
2049 "lib/arm/foo/bar/mylib.so",
2050 "lib64/foo/bar/mylib.so",
2051 "lib64/arm64/foo/bar/mylib.so",
2052 })
2053}
2054
Jiyong Parkda6eb592018-12-19 17:12:36 +09002055func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002056 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002057 apex {
2058 name: "myapex",
2059 key: "myapex.key",
2060 native_shared_libs: ["mylib"],
2061 use_vendor: true,
2062 }
2063
2064 apex_key {
2065 name: "myapex.key",
2066 public_key: "testkey.avbpubkey",
2067 private_key: "testkey.pem",
2068 }
2069
2070 cc_library {
2071 name: "mylib",
2072 srcs: ["mylib.cpp"],
2073 shared_libs: ["mylib2"],
2074 system_shared_libs: [],
2075 vendor_available: true,
2076 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002077 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002078 }
2079
2080 cc_library {
2081 name: "mylib2",
2082 srcs: ["mylib.cpp"],
2083 system_shared_libs: [],
2084 vendor_available: true,
2085 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002086 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002087 }
Jooyung Handc782442019-11-01 03:14:38 +09002088 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002089 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002090 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002091
2092 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002093 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002094 for _, implicit := range i.Implicits {
2095 inputsList = append(inputsList, implicit.String())
2096 }
2097 }
2098 inputsString := strings.Join(inputsList, " ")
2099
2100 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08002101 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
2102 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002103
2104 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08002105 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
2106 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002107}
Jiyong Park16e91a02018-12-20 18:18:08 +09002108
Jooyung Han85d61762020-06-24 23:50:26 +09002109func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002110 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2111 apex {
2112 name: "myapex",
2113 key: "myapex.key",
2114 use_vendor: true,
2115 }
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002122 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002123 })
Colin Cross440e0d02020-06-11 11:32:11 -07002124 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002125 testApex(t, `
2126 apex {
2127 name: "myapex",
2128 key: "myapex.key",
2129 use_vendor: true,
2130 }
2131 apex_key {
2132 name: "myapex.key",
2133 public_key: "testkey.avbpubkey",
2134 private_key: "testkey.pem",
2135 }
2136 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002137 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002138 })
2139}
2140
Jooyung Han5c998b92019-06-27 11:30:33 +09002141func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2142 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2143 apex {
2144 name: "myapex",
2145 key: "myapex.key",
2146 native_shared_libs: ["mylib"],
2147 use_vendor: true,
2148 }
2149
2150 apex_key {
2151 name: "myapex.key",
2152 public_key: "testkey.avbpubkey",
2153 private_key: "testkey.pem",
2154 }
2155
2156 cc_library {
2157 name: "mylib",
2158 srcs: ["mylib.cpp"],
2159 system_shared_libs: [],
2160 stl: "none",
2161 }
2162 `)
2163}
2164
Jooyung Han85d61762020-06-24 23:50:26 +09002165func TestVendorApex(t *testing.T) {
2166 ctx, config := testApex(t, `
2167 apex {
2168 name: "myapex",
2169 key: "myapex.key",
2170 binaries: ["mybin"],
2171 vendor: true,
2172 }
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178 cc_binary {
2179 name: "mybin",
2180 vendor: true,
2181 shared_libs: ["libfoo"],
2182 }
2183 cc_library {
2184 name: "libfoo",
2185 proprietary: true,
2186 }
2187 `)
2188
2189 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2190 "bin/mybin",
2191 "lib64/libfoo.so",
2192 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2193 "lib64/libc++.so",
2194 })
2195
2196 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2197 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2198 name := apexBundle.BaseModuleName()
2199 prefix := "TARGET_"
2200 var builder strings.Builder
2201 data.Custom(&builder, name, prefix, "", data)
2202 androidMk := builder.String()
2203 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002204
2205 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2206 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2207 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002208}
2209
Jooyung Handf78e212020-07-22 15:54:47 +09002210func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2211 ctx, _ := testApex(t, `
2212 apex {
2213 name: "myapex",
2214 key: "myapex.key",
2215 binaries: ["mybin"],
2216 vendor: true,
2217 use_vndk_as_stable: true,
2218 }
2219 apex_key {
2220 name: "myapex.key",
2221 public_key: "testkey.avbpubkey",
2222 private_key: "testkey.pem",
2223 }
2224 cc_binary {
2225 name: "mybin",
2226 vendor: true,
2227 shared_libs: ["libvndk", "libvendor"],
2228 }
2229 cc_library {
2230 name: "libvndk",
2231 vndk: {
2232 enabled: true,
2233 },
2234 vendor_available: true,
2235 }
2236 cc_library {
2237 name: "libvendor",
2238 vendor: true,
2239 }
2240 `)
2241
2242 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2243
2244 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_myapex").Rule("ld")
2245 libs := names(ldRule.Args["libFlags"])
2246 // VNDK libs(libvndk/libc++) as they are
2247 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2248 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2249 // non-stable Vendor libs as APEX variants
2250 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_myapex/libvendor.so")
2251
2252 // VNDK libs are not included when use_vndk_as_stable: true
2253 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2254 "bin/mybin",
2255 "lib64/libvendor.so",
2256 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002257
2258 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2259 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2260 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002261}
2262
Jooyung Hanefb184e2020-06-25 17:14:25 +09002263func TestAndroidMk_UseVendorRequired(t *testing.T) {
2264 ctx, config := testApex(t, `
2265 apex {
2266 name: "myapex",
2267 key: "myapex.key",
2268 use_vendor: true,
2269 native_shared_libs: ["mylib"],
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
2277
2278 cc_library {
2279 name: "mylib",
2280 vendor_available: true,
2281 apex_available: ["myapex"],
2282 }
2283 `, func(fs map[string][]byte, config android.Config) {
2284 setUseVendorAllowListForTest(config, []string{"myapex"})
2285 })
2286
2287 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2288 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2289 name := apexBundle.BaseModuleName()
2290 prefix := "TARGET_"
2291 var builder strings.Builder
2292 data.Custom(&builder, name, prefix, "", data)
2293 androidMk := builder.String()
2294 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2295}
2296
2297func TestAndroidMk_VendorApexRequired(t *testing.T) {
2298 ctx, config := testApex(t, `
2299 apex {
2300 name: "myapex",
2301 key: "myapex.key",
2302 vendor: true,
2303 native_shared_libs: ["mylib"],
2304 }
2305
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311
2312 cc_library {
2313 name: "mylib",
2314 vendor_available: true,
2315 }
2316 `)
2317
2318 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2319 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2320 name := apexBundle.BaseModuleName()
2321 prefix := "TARGET_"
2322 var builder strings.Builder
2323 data.Custom(&builder, name, prefix, "", data)
2324 androidMk := builder.String()
2325 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2326}
2327
Jooyung Han2ed99d02020-06-24 23:26:26 +09002328func TestAndroidMkWritesCommonProperties(t *testing.T) {
2329 ctx, config := testApex(t, `
2330 apex {
2331 name: "myapex",
2332 key: "myapex.key",
2333 vintf_fragments: ["fragment.xml"],
2334 init_rc: ["init.rc"],
2335 }
2336 apex_key {
2337 name: "myapex.key",
2338 public_key: "testkey.avbpubkey",
2339 private_key: "testkey.pem",
2340 }
2341 cc_binary {
2342 name: "mybin",
2343 }
2344 `)
2345
2346 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2347 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2348 name := apexBundle.BaseModuleName()
2349 prefix := "TARGET_"
2350 var builder strings.Builder
2351 data.Custom(&builder, name, prefix, "", data)
2352 androidMk := builder.String()
2353 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2354 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2355}
2356
Jiyong Park16e91a02018-12-20 18:18:08 +09002357func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002358 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002359 apex {
2360 name: "myapex",
2361 key: "myapex.key",
2362 native_shared_libs: ["mylib"],
2363 }
2364
2365 apex_key {
2366 name: "myapex.key",
2367 public_key: "testkey.avbpubkey",
2368 private_key: "testkey.pem",
2369 }
2370
2371 cc_library {
2372 name: "mylib",
2373 srcs: ["mylib.cpp"],
2374 system_shared_libs: [],
2375 stl: "none",
2376 stubs: {
2377 versions: ["1", "2", "3"],
2378 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002379 apex_available: [
2380 "//apex_available:platform",
2381 "myapex",
2382 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002383 }
2384
2385 cc_binary {
2386 name: "not_in_apex",
2387 srcs: ["mylib.cpp"],
2388 static_libs: ["mylib"],
2389 static_executable: true,
2390 system_shared_libs: [],
2391 stl: "none",
2392 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002393 `)
2394
Colin Cross7113d202019-11-20 16:39:12 -08002395 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002396
2397 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002398 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002399}
Jiyong Park9335a262018-12-24 11:31:58 +09002400
2401func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002402 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002403 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002404 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002405 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002406 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002407 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002408 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002409 }
2410
2411 cc_library {
2412 name: "mylib",
2413 srcs: ["mylib.cpp"],
2414 system_shared_libs: [],
2415 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002416 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
2424
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002425 android_app_certificate {
2426 name: "myapex.certificate",
2427 certificate: "testkey",
2428 }
2429
2430 android_app_certificate {
2431 name: "myapex.certificate.override",
2432 certificate: "testkey.override",
2433 }
2434
Jiyong Park9335a262018-12-24 11:31:58 +09002435 `)
2436
2437 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002438 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002439
2440 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2441 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2442 "vendor/foo/devkeys/testkey.avbpubkey")
2443 }
2444 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2445 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2446 "vendor/foo/devkeys/testkey.pem")
2447 }
2448
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002449 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002450 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002451 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002452 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002453 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002454 }
2455}
Jiyong Park58e364a2019-01-19 19:24:06 +09002456
Jooyung Hanf121a652019-12-17 14:30:11 +09002457func TestCertificate(t *testing.T) {
2458 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2459 ctx, _ := testApex(t, `
2460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 }
2464 apex_key {
2465 name: "myapex.key",
2466 public_key: "testkey.avbpubkey",
2467 private_key: "testkey.pem",
2468 }`)
2469 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2470 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2471 if actual := rule.Args["certificates"]; actual != expected {
2472 t.Errorf("certificates should be %q, not %q", expected, actual)
2473 }
2474 })
2475 t.Run("override when unspecified", func(t *testing.T) {
2476 ctx, _ := testApex(t, `
2477 apex {
2478 name: "myapex_keytest",
2479 key: "myapex.key",
2480 file_contexts: ":myapex-file_contexts",
2481 }
2482 apex_key {
2483 name: "myapex.key",
2484 public_key: "testkey.avbpubkey",
2485 private_key: "testkey.pem",
2486 }
2487 android_app_certificate {
2488 name: "myapex.certificate.override",
2489 certificate: "testkey.override",
2490 }`)
2491 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2492 expected := "testkey.override.x509.pem testkey.override.pk8"
2493 if actual := rule.Args["certificates"]; actual != expected {
2494 t.Errorf("certificates should be %q, not %q", expected, actual)
2495 }
2496 })
2497 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2498 ctx, _ := testApex(t, `
2499 apex {
2500 name: "myapex",
2501 key: "myapex.key",
2502 certificate: ":myapex.certificate",
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 android_app_certificate {
2510 name: "myapex.certificate",
2511 certificate: "testkey",
2512 }`)
2513 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2514 expected := "testkey.x509.pem testkey.pk8"
2515 if actual := rule.Args["certificates"]; actual != expected {
2516 t.Errorf("certificates should be %q, not %q", expected, actual)
2517 }
2518 })
2519 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2520 ctx, _ := testApex(t, `
2521 apex {
2522 name: "myapex_keytest",
2523 key: "myapex.key",
2524 file_contexts: ":myapex-file_contexts",
2525 certificate: ":myapex.certificate",
2526 }
2527 apex_key {
2528 name: "myapex.key",
2529 public_key: "testkey.avbpubkey",
2530 private_key: "testkey.pem",
2531 }
2532 android_app_certificate {
2533 name: "myapex.certificate.override",
2534 certificate: "testkey.override",
2535 }`)
2536 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2537 expected := "testkey.override.x509.pem testkey.override.pk8"
2538 if actual := rule.Args["certificates"]; actual != expected {
2539 t.Errorf("certificates should be %q, not %q", expected, actual)
2540 }
2541 })
2542 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2543 ctx, _ := testApex(t, `
2544 apex {
2545 name: "myapex",
2546 key: "myapex.key",
2547 certificate: "testkey",
2548 }
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }`)
2554 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2555 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2556 if actual := rule.Args["certificates"]; actual != expected {
2557 t.Errorf("certificates should be %q, not %q", expected, actual)
2558 }
2559 })
2560 t.Run("override when specified as <name>", func(t *testing.T) {
2561 ctx, _ := testApex(t, `
2562 apex {
2563 name: "myapex_keytest",
2564 key: "myapex.key",
2565 file_contexts: ":myapex-file_contexts",
2566 certificate: "testkey",
2567 }
2568 apex_key {
2569 name: "myapex.key",
2570 public_key: "testkey.avbpubkey",
2571 private_key: "testkey.pem",
2572 }
2573 android_app_certificate {
2574 name: "myapex.certificate.override",
2575 certificate: "testkey.override",
2576 }`)
2577 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2578 expected := "testkey.override.x509.pem testkey.override.pk8"
2579 if actual := rule.Args["certificates"]; actual != expected {
2580 t.Errorf("certificates should be %q, not %q", expected, actual)
2581 }
2582 })
2583}
2584
Jiyong Park58e364a2019-01-19 19:24:06 +09002585func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002586 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002587 apex {
2588 name: "myapex",
2589 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002590 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002591 }
2592
2593 apex {
2594 name: "otherapex",
2595 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002596 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002597 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002598 }
2599
2600 apex_key {
2601 name: "myapex.key",
2602 public_key: "testkey.avbpubkey",
2603 private_key: "testkey.pem",
2604 }
2605
2606 cc_library {
2607 name: "mylib",
2608 srcs: ["mylib.cpp"],
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002612 "myapex",
2613 "otherapex",
2614 ],
Jooyung Han24282772020-03-21 23:20:55 +09002615 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002616 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002617 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002618 cc_library {
2619 name: "mylib2",
2620 srcs: ["mylib.cpp"],
2621 system_shared_libs: [],
2622 stl: "none",
2623 apex_available: [
2624 "myapex",
2625 "otherapex",
2626 ],
2627 use_apex_name_macro: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002628 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002629 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002630 `)
2631
Jooyung Hanc87a0592020-03-02 17:44:33 +09002632 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002633 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002634 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002635 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002636
Jooyung Hanccce2f22020-03-07 03:45:53 +09002637 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002638 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2639 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002640 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002641 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002642
Jooyung Hanccce2f22020-03-07 03:45:53 +09002643 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002644 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2645 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002646 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002647 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002648
Jooyung Hanc87a0592020-03-02 17:44:33 +09002649 // When cc_library sets use_apex_name_macro: true
2650 // apex variants define additional macro to distinguish which apex variant it is built for
2651
2652 // non-APEX variant does not have __ANDROID_APEX__ defined
2653 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2654 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2655
2656 // APEX variant has __ANDROID_APEX__ defined
2657 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002658 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002659 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2660 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002661
Jooyung Hanc87a0592020-03-02 17:44:33 +09002662 // APEX variant has __ANDROID_APEX__ defined
2663 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002664 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002665 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2666 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002667
2668 // recovery variant does not set __ANDROID_SDK_VERSION__
2669 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2670 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2671 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002672}
Jiyong Park7e636d02019-01-28 16:16:54 +09002673
2674func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002675 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 native_shared_libs: ["mylib"],
2680 }
2681
2682 apex_key {
2683 name: "myapex.key",
2684 public_key: "testkey.avbpubkey",
2685 private_key: "testkey.pem",
2686 }
2687
2688 cc_library_headers {
2689 name: "mylib_headers",
2690 export_include_dirs: ["my_include"],
2691 system_shared_libs: [],
2692 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002693 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002694 }
2695
2696 cc_library {
2697 name: "mylib",
2698 srcs: ["mylib.cpp"],
2699 system_shared_libs: [],
2700 stl: "none",
2701 header_libs: ["mylib_headers"],
2702 export_header_lib_headers: ["mylib_headers"],
2703 stubs: {
2704 versions: ["1", "2", "3"],
2705 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002706 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002707 }
2708
2709 cc_library {
2710 name: "otherlib",
2711 srcs: ["mylib.cpp"],
2712 system_shared_libs: [],
2713 stl: "none",
2714 shared_libs: ["mylib"],
2715 }
2716 `)
2717
Colin Cross7113d202019-11-20 16:39:12 -08002718 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002719
2720 // Ensure that the include path of the header lib is exported to 'otherlib'
2721 ensureContains(t, cFlags, "-Imy_include")
2722}
Alex Light9670d332019-01-29 18:07:33 -08002723
Jiyong Park7cd10e32020-01-14 09:22:18 +09002724type fileInApex struct {
2725 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002726 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002727 isLink bool
2728}
2729
Jooyung Hana57af4a2020-01-23 05:36:59 +00002730func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002731 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002732 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002733 copyCmds := apexRule.Args["copy_commands"]
2734 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002735 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002736 for _, cmd := range strings.Split(copyCmds, "&&") {
2737 cmd = strings.TrimSpace(cmd)
2738 if cmd == "" {
2739 continue
2740 }
2741 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002742 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002743 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002744 switch terms[0] {
2745 case "mkdir":
2746 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002747 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002748 t.Fatal("copyCmds contains invalid cp command", cmd)
2749 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002750 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002751 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002752 isLink = false
2753 case "ln":
2754 if len(terms) != 3 && len(terms) != 4 {
2755 // ln LINK TARGET or ln -s LINK TARGET
2756 t.Fatal("copyCmds contains invalid ln command", cmd)
2757 }
2758 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002759 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002760 isLink = true
2761 default:
2762 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2763 }
2764 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002765 index := strings.Index(dst, imageApexDir)
2766 if index == -1 {
2767 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2768 }
2769 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002770 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002771 }
2772 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002773 return ret
2774}
2775
Jooyung Hana57af4a2020-01-23 05:36:59 +00002776func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2777 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002778 var failed bool
2779 var surplus []string
2780 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002781 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002782 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002783 for _, expected := range files {
2784 if matched, _ := path.Match(expected, file.path); matched {
2785 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002786 mactchFound = true
2787 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002788 }
2789 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002790 if !mactchFound {
2791 surplus = append(surplus, file.path)
2792 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002793 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002794
Jooyung Han31c470b2019-10-18 16:26:59 +09002795 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002796 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002797 t.Log("surplus files", surplus)
2798 failed = true
2799 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002800
2801 if len(files) > len(filesMatched) {
2802 var missing []string
2803 for _, expected := range files {
2804 if !filesMatched[expected] {
2805 missing = append(missing, expected)
2806 }
2807 }
2808 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002809 t.Log("missing files", missing)
2810 failed = true
2811 }
2812 if failed {
2813 t.Fail()
2814 }
2815}
2816
Jooyung Han344d5432019-08-23 11:17:39 +09002817func TestVndkApexCurrent(t *testing.T) {
2818 ctx, _ := testApex(t, `
2819 apex_vndk {
2820 name: "myapex",
2821 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002822 }
2823
2824 apex_key {
2825 name: "myapex.key",
2826 public_key: "testkey.avbpubkey",
2827 private_key: "testkey.pem",
2828 }
2829
2830 cc_library {
2831 name: "libvndk",
2832 srcs: ["mylib.cpp"],
2833 vendor_available: true,
2834 vndk: {
2835 enabled: true,
2836 },
2837 system_shared_libs: [],
2838 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002839 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002840 }
2841
2842 cc_library {
2843 name: "libvndksp",
2844 srcs: ["mylib.cpp"],
2845 vendor_available: true,
2846 vndk: {
2847 enabled: true,
2848 support_system_process: true,
2849 },
2850 system_shared_libs: [],
2851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002852 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002853 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002854 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002855
Jooyung Hana57af4a2020-01-23 05:36:59 +00002856 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002857 "lib/libvndk.so",
2858 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002859 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002860 "lib64/libvndk.so",
2861 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002862 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002863 "etc/llndk.libraries.VER.txt",
2864 "etc/vndkcore.libraries.VER.txt",
2865 "etc/vndksp.libraries.VER.txt",
2866 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002867 })
Jooyung Han344d5432019-08-23 11:17:39 +09002868}
2869
2870func TestVndkApexWithPrebuilt(t *testing.T) {
2871 ctx, _ := testApex(t, `
2872 apex_vndk {
2873 name: "myapex",
2874 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002875 }
2876
2877 apex_key {
2878 name: "myapex.key",
2879 public_key: "testkey.avbpubkey",
2880 private_key: "testkey.pem",
2881 }
2882
2883 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002884 name: "libvndk",
2885 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002886 vendor_available: true,
2887 vndk: {
2888 enabled: true,
2889 },
2890 system_shared_libs: [],
2891 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002892 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002893 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002894
2895 cc_prebuilt_library_shared {
2896 name: "libvndk.arm",
2897 srcs: ["libvndk.arm.so"],
2898 vendor_available: true,
2899 vndk: {
2900 enabled: true,
2901 },
2902 enabled: false,
2903 arch: {
2904 arm: {
2905 enabled: true,
2906 },
2907 },
2908 system_shared_libs: [],
2909 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002910 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002911 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002912 `+vndkLibrariesTxtFiles("current"),
2913 withFiles(map[string][]byte{
2914 "libvndk.so": nil,
2915 "libvndk.arm.so": nil,
2916 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002917
Jooyung Hana57af4a2020-01-23 05:36:59 +00002918 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002919 "lib/libvndk.so",
2920 "lib/libvndk.arm.so",
2921 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002922 "lib/libc++.so",
2923 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002924 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002925 })
Jooyung Han344d5432019-08-23 11:17:39 +09002926}
2927
Jooyung Han39edb6c2019-11-06 16:53:07 +09002928func vndkLibrariesTxtFiles(vers ...string) (result string) {
2929 for _, v := range vers {
2930 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002931 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002932 result += `
2933 vndk_libraries_txt {
2934 name: "` + txt + `.libraries.txt",
2935 }
2936 `
2937 }
2938 } else {
2939 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2940 result += `
2941 prebuilt_etc {
2942 name: "` + txt + `.libraries.` + v + `.txt",
2943 src: "dummy.txt",
2944 }
2945 `
2946 }
2947 }
2948 }
2949 return
2950}
2951
Jooyung Han344d5432019-08-23 11:17:39 +09002952func TestVndkApexVersion(t *testing.T) {
2953 ctx, _ := testApex(t, `
2954 apex_vndk {
2955 name: "myapex_v27",
2956 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002957 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002958 vndk_version: "27",
2959 }
2960
2961 apex_key {
2962 name: "myapex.key",
2963 public_key: "testkey.avbpubkey",
2964 private_key: "testkey.pem",
2965 }
2966
Jooyung Han31c470b2019-10-18 16:26:59 +09002967 vndk_prebuilt_shared {
2968 name: "libvndk27",
2969 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002970 vendor_available: true,
2971 vndk: {
2972 enabled: true,
2973 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002974 target_arch: "arm64",
2975 arch: {
2976 arm: {
2977 srcs: ["libvndk27_arm.so"],
2978 },
2979 arm64: {
2980 srcs: ["libvndk27_arm64.so"],
2981 },
2982 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002983 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002984 }
2985
2986 vndk_prebuilt_shared {
2987 name: "libvndk27",
2988 version: "27",
2989 vendor_available: true,
2990 vndk: {
2991 enabled: true,
2992 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002993 target_arch: "x86_64",
2994 arch: {
2995 x86: {
2996 srcs: ["libvndk27_x86.so"],
2997 },
2998 x86_64: {
2999 srcs: ["libvndk27_x86_64.so"],
3000 },
3001 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003002 }
3003 `+vndkLibrariesTxtFiles("27"),
3004 withFiles(map[string][]byte{
3005 "libvndk27_arm.so": nil,
3006 "libvndk27_arm64.so": nil,
3007 "libvndk27_x86.so": nil,
3008 "libvndk27_x86_64.so": nil,
3009 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003010
Jooyung Hana57af4a2020-01-23 05:36:59 +00003011 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003012 "lib/libvndk27_arm.so",
3013 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003014 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003015 })
Jooyung Han344d5432019-08-23 11:17:39 +09003016}
3017
3018func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3019 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3020 apex_vndk {
3021 name: "myapex_v27",
3022 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003023 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003024 vndk_version: "27",
3025 }
3026 apex_vndk {
3027 name: "myapex_v27_other",
3028 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003029 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003030 vndk_version: "27",
3031 }
3032
3033 apex_key {
3034 name: "myapex.key",
3035 public_key: "testkey.avbpubkey",
3036 private_key: "testkey.pem",
3037 }
3038
3039 cc_library {
3040 name: "libvndk",
3041 srcs: ["mylib.cpp"],
3042 vendor_available: true,
3043 vndk: {
3044 enabled: true,
3045 },
3046 system_shared_libs: [],
3047 stl: "none",
3048 }
3049
3050 vndk_prebuilt_shared {
3051 name: "libvndk",
3052 version: "27",
3053 vendor_available: true,
3054 vndk: {
3055 enabled: true,
3056 },
3057 srcs: ["libvndk.so"],
3058 }
3059 `, withFiles(map[string][]byte{
3060 "libvndk.so": nil,
3061 }))
3062}
3063
Jooyung Han90eee022019-10-01 20:02:42 +09003064func TestVndkApexNameRule(t *testing.T) {
3065 ctx, _ := testApex(t, `
3066 apex_vndk {
3067 name: "myapex",
3068 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003069 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003070 }
3071 apex_vndk {
3072 name: "myapex_v28",
3073 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003074 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003075 vndk_version: "28",
3076 }
3077 apex_key {
3078 name: "myapex.key",
3079 public_key: "testkey.avbpubkey",
3080 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003081 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003082
3083 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003084 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003085 actual := proptools.String(bundle.properties.Apex_name)
3086 if !reflect.DeepEqual(actual, expected) {
3087 t.Errorf("Got '%v', expected '%v'", actual, expected)
3088 }
3089 }
3090
3091 assertApexName("com.android.vndk.vVER", "myapex")
3092 assertApexName("com.android.vndk.v28", "myapex_v28")
3093}
3094
Jooyung Han344d5432019-08-23 11:17:39 +09003095func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3096 ctx, _ := testApex(t, `
3097 apex_vndk {
3098 name: "myapex",
3099 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003100 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003101 }
3102
3103 apex_key {
3104 name: "myapex.key",
3105 public_key: "testkey.avbpubkey",
3106 private_key: "testkey.pem",
3107 }
3108
3109 cc_library {
3110 name: "libvndk",
3111 srcs: ["mylib.cpp"],
3112 vendor_available: true,
3113 native_bridge_supported: true,
3114 host_supported: true,
3115 vndk: {
3116 enabled: true,
3117 },
3118 system_shared_libs: [],
3119 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003120 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003121 }
Jooyung Han35155c42020-02-06 17:33:20 +09003122 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003123
Jooyung Hana57af4a2020-01-23 05:36:59 +00003124 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003125 "lib/libvndk.so",
3126 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003127 "lib/libc++.so",
3128 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003129 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003130 })
Jooyung Han344d5432019-08-23 11:17:39 +09003131}
3132
3133func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3134 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3135 apex_vndk {
3136 name: "myapex",
3137 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003138 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003139 native_bridge_supported: true,
3140 }
3141
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }
3147
3148 cc_library {
3149 name: "libvndk",
3150 srcs: ["mylib.cpp"],
3151 vendor_available: true,
3152 native_bridge_supported: true,
3153 host_supported: true,
3154 vndk: {
3155 enabled: true,
3156 },
3157 system_shared_libs: [],
3158 stl: "none",
3159 }
3160 `)
3161}
3162
Jooyung Han31c470b2019-10-18 16:26:59 +09003163func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003164 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003165 apex_vndk {
3166 name: "myapex_v27",
3167 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003168 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003169 vndk_version: "27",
3170 }
3171
3172 apex_key {
3173 name: "myapex.key",
3174 public_key: "testkey.avbpubkey",
3175 private_key: "testkey.pem",
3176 }
3177
3178 vndk_prebuilt_shared {
3179 name: "libvndk27",
3180 version: "27",
3181 target_arch: "arm",
3182 vendor_available: true,
3183 vndk: {
3184 enabled: true,
3185 },
3186 arch: {
3187 arm: {
3188 srcs: ["libvndk27.so"],
3189 }
3190 },
3191 }
3192
3193 vndk_prebuilt_shared {
3194 name: "libvndk27",
3195 version: "27",
3196 target_arch: "arm",
3197 binder32bit: true,
3198 vendor_available: true,
3199 vndk: {
3200 enabled: true,
3201 },
3202 arch: {
3203 arm: {
3204 srcs: ["libvndk27binder32.so"],
3205 }
3206 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003207 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003208 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003209 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003210 withFiles(map[string][]byte{
3211 "libvndk27.so": nil,
3212 "libvndk27binder32.so": nil,
3213 }),
3214 withBinder32bit,
3215 withTargets(map[android.OsType][]android.Target{
3216 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003217 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3218 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003219 },
3220 }),
3221 )
3222
Jooyung Hana57af4a2020-01-23 05:36:59 +00003223 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003224 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003225 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003226 })
3227}
3228
Jooyung Han45a96772020-06-15 14:59:42 +09003229func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3230 ctx, _ := testApex(t, `
3231 apex_vndk {
3232 name: "myapex",
3233 key: "myapex.key",
3234 file_contexts: ":myapex-file_contexts",
3235 }
3236
3237 apex_key {
3238 name: "myapex.key",
3239 public_key: "testkey.avbpubkey",
3240 private_key: "testkey.pem",
3241 }
3242
3243 cc_library {
3244 name: "libz",
3245 vendor_available: true,
3246 vndk: {
3247 enabled: true,
3248 },
3249 stubs: {
3250 symbol_file: "libz.map.txt",
3251 versions: ["30"],
3252 }
3253 }
3254 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3255 "libz.map.txt": nil,
3256 }))
3257
3258 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3259 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3260 ensureListEmpty(t, provideNativeLibs)
3261}
3262
Jooyung Hane1633032019-08-01 17:41:43 +09003263func TestDependenciesInApexManifest(t *testing.T) {
3264 ctx, _ := testApex(t, `
3265 apex {
3266 name: "myapex_nodep",
3267 key: "myapex.key",
3268 native_shared_libs: ["lib_nodep"],
3269 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003270 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003271 }
3272
3273 apex {
3274 name: "myapex_dep",
3275 key: "myapex.key",
3276 native_shared_libs: ["lib_dep"],
3277 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003278 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003279 }
3280
3281 apex {
3282 name: "myapex_provider",
3283 key: "myapex.key",
3284 native_shared_libs: ["libfoo"],
3285 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003286 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003287 }
3288
3289 apex {
3290 name: "myapex_selfcontained",
3291 key: "myapex.key",
3292 native_shared_libs: ["lib_dep", "libfoo"],
3293 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003294 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003295 }
3296
3297 apex_key {
3298 name: "myapex.key",
3299 public_key: "testkey.avbpubkey",
3300 private_key: "testkey.pem",
3301 }
3302
3303 cc_library {
3304 name: "lib_nodep",
3305 srcs: ["mylib.cpp"],
3306 system_shared_libs: [],
3307 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003308 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003309 }
3310
3311 cc_library {
3312 name: "lib_dep",
3313 srcs: ["mylib.cpp"],
3314 shared_libs: ["libfoo"],
3315 system_shared_libs: [],
3316 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003317 apex_available: [
3318 "myapex_dep",
3319 "myapex_provider",
3320 "myapex_selfcontained",
3321 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003322 }
3323
3324 cc_library {
3325 name: "libfoo",
3326 srcs: ["mytest.cpp"],
3327 stubs: {
3328 versions: ["1"],
3329 },
3330 system_shared_libs: [],
3331 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003332 apex_available: [
3333 "myapex_provider",
3334 "myapex_selfcontained",
3335 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003336 }
3337 `)
3338
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003339 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003340 var provideNativeLibs, requireNativeLibs []string
3341
Sundong Ahnabb64432019-10-22 13:58:29 +09003342 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003343 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3344 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003345 ensureListEmpty(t, provideNativeLibs)
3346 ensureListEmpty(t, requireNativeLibs)
3347
Sundong Ahnabb64432019-10-22 13:58:29 +09003348 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003349 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3350 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003351 ensureListEmpty(t, provideNativeLibs)
3352 ensureListContains(t, requireNativeLibs, "libfoo.so")
3353
Sundong Ahnabb64432019-10-22 13:58:29 +09003354 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003355 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3356 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003357 ensureListContains(t, provideNativeLibs, "libfoo.so")
3358 ensureListEmpty(t, requireNativeLibs)
3359
Sundong Ahnabb64432019-10-22 13:58:29 +09003360 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003361 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3362 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003363 ensureListContains(t, provideNativeLibs, "libfoo.so")
3364 ensureListEmpty(t, requireNativeLibs)
3365}
3366
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003367func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003368 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003369 apex {
3370 name: "myapex",
3371 key: "myapex.key",
3372 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003373 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003374 }
3375
3376 apex_key {
3377 name: "myapex.key",
3378 public_key: "testkey.avbpubkey",
3379 private_key: "testkey.pem",
3380 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003381
3382 cc_library {
3383 name: "mylib",
3384 srcs: ["mylib.cpp"],
3385 system_shared_libs: [],
3386 stl: "none",
3387 apex_available: [
3388 "//apex_available:platform",
3389 "myapex",
3390 ],
3391 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003392 `)
3393
Sundong Ahnabb64432019-10-22 13:58:29 +09003394 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003395 apexManifestRule := module.Rule("apexManifestRule")
3396 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3397 apexRule := module.Rule("apexRule")
3398 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003399
3400 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3401 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3402 name := apexBundle.BaseModuleName()
3403 prefix := "TARGET_"
3404 var builder strings.Builder
3405 data.Custom(&builder, name, prefix, "", data)
3406 androidMk := builder.String()
3407 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3408 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003409}
3410
Alex Light0851b882019-02-07 13:20:53 -08003411func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003412 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003413 apex {
3414 name: "myapex",
3415 key: "myapex.key",
3416 native_shared_libs: ["mylib_common"],
3417 }
3418
3419 apex_key {
3420 name: "myapex.key",
3421 public_key: "testkey.avbpubkey",
3422 private_key: "testkey.pem",
3423 }
3424
3425 cc_library {
3426 name: "mylib_common",
3427 srcs: ["mylib.cpp"],
3428 system_shared_libs: [],
3429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003430 apex_available: [
3431 "//apex_available:platform",
3432 "myapex",
3433 ],
Alex Light0851b882019-02-07 13:20:53 -08003434 }
3435 `)
3436
Sundong Ahnabb64432019-10-22 13:58:29 +09003437 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003438 apexRule := module.Rule("apexRule")
3439 copyCmds := apexRule.Args["copy_commands"]
3440
3441 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3442 t.Log("Apex was a test apex!")
3443 t.Fail()
3444 }
3445 // Ensure that main rule creates an output
3446 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3447
3448 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003449 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003450
3451 // Ensure that both direct and indirect deps are copied into apex
3452 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3453
Colin Cross7113d202019-11-20 16:39:12 -08003454 // Ensure that the platform variant ends with _shared
3455 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003456
3457 if !android.InAnyApex("mylib_common") {
3458 t.Log("Found mylib_common not in any apex!")
3459 t.Fail()
3460 }
3461}
3462
3463func TestTestApex(t *testing.T) {
3464 if android.InAnyApex("mylib_common_test") {
3465 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!")
3466 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003467 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003468 apex_test {
3469 name: "myapex",
3470 key: "myapex.key",
3471 native_shared_libs: ["mylib_common_test"],
3472 }
3473
3474 apex_key {
3475 name: "myapex.key",
3476 public_key: "testkey.avbpubkey",
3477 private_key: "testkey.pem",
3478 }
3479
3480 cc_library {
3481 name: "mylib_common_test",
3482 srcs: ["mylib.cpp"],
3483 system_shared_libs: [],
3484 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003485 // TODO: remove //apex_available:platform
3486 apex_available: [
3487 "//apex_available:platform",
3488 "myapex",
3489 ],
Alex Light0851b882019-02-07 13:20:53 -08003490 }
3491 `)
3492
Sundong Ahnabb64432019-10-22 13:58:29 +09003493 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003494 apexRule := module.Rule("apexRule")
3495 copyCmds := apexRule.Args["copy_commands"]
3496
3497 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3498 t.Log("Apex was not a test apex!")
3499 t.Fail()
3500 }
3501 // Ensure that main rule creates an output
3502 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3503
3504 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003505 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003506
3507 // Ensure that both direct and indirect deps are copied into apex
3508 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3509
Colin Cross7113d202019-11-20 16:39:12 -08003510 // Ensure that the platform variant ends with _shared
3511 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003512}
3513
Alex Light9670d332019-01-29 18:07:33 -08003514func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003515 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003516 apex {
3517 name: "myapex",
3518 key: "myapex.key",
3519 multilib: {
3520 first: {
3521 native_shared_libs: ["mylib_common"],
3522 }
3523 },
3524 target: {
3525 android: {
3526 multilib: {
3527 first: {
3528 native_shared_libs: ["mylib"],
3529 }
3530 }
3531 },
3532 host: {
3533 multilib: {
3534 first: {
3535 native_shared_libs: ["mylib2"],
3536 }
3537 }
3538 }
3539 }
3540 }
3541
3542 apex_key {
3543 name: "myapex.key",
3544 public_key: "testkey.avbpubkey",
3545 private_key: "testkey.pem",
3546 }
3547
3548 cc_library {
3549 name: "mylib",
3550 srcs: ["mylib.cpp"],
3551 system_shared_libs: [],
3552 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003553 // TODO: remove //apex_available:platform
3554 apex_available: [
3555 "//apex_available:platform",
3556 "myapex",
3557 ],
Alex Light9670d332019-01-29 18:07:33 -08003558 }
3559
3560 cc_library {
3561 name: "mylib_common",
3562 srcs: ["mylib.cpp"],
3563 system_shared_libs: [],
3564 stl: "none",
3565 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003566 // TODO: remove //apex_available:platform
3567 apex_available: [
3568 "//apex_available:platform",
3569 "myapex",
3570 ],
Alex Light9670d332019-01-29 18:07:33 -08003571 }
3572
3573 cc_library {
3574 name: "mylib2",
3575 srcs: ["mylib.cpp"],
3576 system_shared_libs: [],
3577 stl: "none",
3578 compile_multilib: "first",
3579 }
3580 `)
3581
Sundong Ahnabb64432019-10-22 13:58:29 +09003582 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003583 copyCmds := apexRule.Args["copy_commands"]
3584
3585 // Ensure that main rule creates an output
3586 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3587
3588 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003589 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3590 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3591 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003592
3593 // Ensure that both direct and indirect deps are copied into apex
3594 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3595 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3596 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3597
Colin Cross7113d202019-11-20 16:39:12 -08003598 // Ensure that the platform variant ends with _shared
3599 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3600 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3601 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003602}
Jiyong Park04480cf2019-02-06 00:16:29 +09003603
3604func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003605 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003606 apex {
3607 name: "myapex",
3608 key: "myapex.key",
3609 binaries: ["myscript"],
3610 }
3611
3612 apex_key {
3613 name: "myapex.key",
3614 public_key: "testkey.avbpubkey",
3615 private_key: "testkey.pem",
3616 }
3617
3618 sh_binary {
3619 name: "myscript",
3620 src: "mylib.cpp",
3621 filename: "myscript.sh",
3622 sub_dir: "script",
3623 }
3624 `)
3625
Sundong Ahnabb64432019-10-22 13:58:29 +09003626 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003627 copyCmds := apexRule.Args["copy_commands"]
3628
3629 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3630}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003631
Jooyung Han91df2082019-11-20 01:49:42 +09003632func TestApexInVariousPartition(t *testing.T) {
3633 testcases := []struct {
3634 propName, parition, flattenedPartition string
3635 }{
3636 {"", "system", "system_ext"},
3637 {"product_specific: true", "product", "product"},
3638 {"soc_specific: true", "vendor", "vendor"},
3639 {"proprietary: true", "vendor", "vendor"},
3640 {"vendor: true", "vendor", "vendor"},
3641 {"system_ext_specific: true", "system_ext", "system_ext"},
3642 }
3643 for _, tc := range testcases {
3644 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3645 ctx, _ := testApex(t, `
3646 apex {
3647 name: "myapex",
3648 key: "myapex.key",
3649 `+tc.propName+`
3650 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003651
Jooyung Han91df2082019-11-20 01:49:42 +09003652 apex_key {
3653 name: "myapex.key",
3654 public_key: "testkey.avbpubkey",
3655 private_key: "testkey.pem",
3656 }
3657 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003658
Jooyung Han91df2082019-11-20 01:49:42 +09003659 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3660 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3661 actual := apex.installDir.String()
3662 if actual != expected {
3663 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3664 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003665
Jooyung Han91df2082019-11-20 01:49:42 +09003666 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3667 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3668 actual = flattened.installDir.String()
3669 if actual != expected {
3670 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3671 }
3672 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003673 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003674}
Jiyong Park67882562019-03-21 01:11:21 +09003675
Jooyung Han580eb4f2020-06-24 19:33:06 +09003676func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003677 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003678 apex {
3679 name: "myapex",
3680 key: "myapex.key",
3681 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003682
Jooyung Han580eb4f2020-06-24 19:33:06 +09003683 apex_key {
3684 name: "myapex.key",
3685 public_key: "testkey.avbpubkey",
3686 private_key: "testkey.pem",
3687 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003688 `)
3689 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003690 rule := module.Output("file_contexts")
3691 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3692}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003693
Jooyung Han580eb4f2020-06-24 19:33:06 +09003694func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003695 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003696 apex {
3697 name: "myapex",
3698 key: "myapex.key",
3699 file_contexts: "my_own_file_contexts",
3700 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003701
Jooyung Han580eb4f2020-06-24 19:33:06 +09003702 apex_key {
3703 name: "myapex.key",
3704 public_key: "testkey.avbpubkey",
3705 private_key: "testkey.pem",
3706 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003707 `, withFiles(map[string][]byte{
3708 "my_own_file_contexts": nil,
3709 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003710}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003711
Jooyung Han580eb4f2020-06-24 19:33:06 +09003712func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003713 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003714 apex {
3715 name: "myapex",
3716 key: "myapex.key",
3717 product_specific: true,
3718 file_contexts: "product_specific_file_contexts",
3719 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003720
Jooyung Han580eb4f2020-06-24 19:33:06 +09003721 apex_key {
3722 name: "myapex.key",
3723 public_key: "testkey.avbpubkey",
3724 private_key: "testkey.pem",
3725 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003726 `)
3727
Jooyung Han580eb4f2020-06-24 19:33:06 +09003728 ctx, _ := testApex(t, `
3729 apex {
3730 name: "myapex",
3731 key: "myapex.key",
3732 product_specific: true,
3733 file_contexts: "product_specific_file_contexts",
3734 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003735
Jooyung Han580eb4f2020-06-24 19:33:06 +09003736 apex_key {
3737 name: "myapex.key",
3738 public_key: "testkey.avbpubkey",
3739 private_key: "testkey.pem",
3740 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003741 `, withFiles(map[string][]byte{
3742 "product_specific_file_contexts": nil,
3743 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003744 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3745 rule := module.Output("file_contexts")
3746 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3747}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003748
Jooyung Han580eb4f2020-06-24 19:33:06 +09003749func TestFileContexts_SetViaFileGroup(t *testing.T) {
3750 ctx, _ := testApex(t, `
3751 apex {
3752 name: "myapex",
3753 key: "myapex.key",
3754 product_specific: true,
3755 file_contexts: ":my-file-contexts",
3756 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003757
Jooyung Han580eb4f2020-06-24 19:33:06 +09003758 apex_key {
3759 name: "myapex.key",
3760 public_key: "testkey.avbpubkey",
3761 private_key: "testkey.pem",
3762 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003763
Jooyung Han580eb4f2020-06-24 19:33:06 +09003764 filegroup {
3765 name: "my-file-contexts",
3766 srcs: ["product_specific_file_contexts"],
3767 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003768 `, withFiles(map[string][]byte{
3769 "product_specific_file_contexts": nil,
3770 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003771 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3772 rule := module.Output("file_contexts")
3773 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774}
3775
Jiyong Park67882562019-03-21 01:11:21 +09003776func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003777 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003778 apex_key {
3779 name: "myapex.key",
3780 public_key: ":my.avbpubkey",
3781 private_key: ":my.pem",
3782 product_specific: true,
3783 }
3784
3785 filegroup {
3786 name: "my.avbpubkey",
3787 srcs: ["testkey2.avbpubkey"],
3788 }
3789
3790 filegroup {
3791 name: "my.pem",
3792 srcs: ["testkey2.pem"],
3793 }
3794 `)
3795
3796 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3797 expected_pubkey := "testkey2.avbpubkey"
3798 actual_pubkey := apex_key.public_key_file.String()
3799 if actual_pubkey != expected_pubkey {
3800 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3801 }
3802 expected_privkey := "testkey2.pem"
3803 actual_privkey := apex_key.private_key_file.String()
3804 if actual_privkey != expected_privkey {
3805 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3806 }
3807}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003808
3809func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003810 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003811 prebuilt_apex {
3812 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003813 arch: {
3814 arm64: {
3815 src: "myapex-arm64.apex",
3816 },
3817 arm: {
3818 src: "myapex-arm.apex",
3819 },
3820 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003821 }
3822 `)
3823
3824 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3825
Jiyong Parkc95714e2019-03-29 14:23:10 +09003826 expectedInput := "myapex-arm64.apex"
3827 if prebuilt.inputApex.String() != expectedInput {
3828 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3829 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003830}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003831
3832func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003833 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003834 prebuilt_apex {
3835 name: "myapex",
3836 src: "myapex-arm.apex",
3837 filename: "notmyapex.apex",
3838 }
3839 `)
3840
3841 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3842
3843 expected := "notmyapex.apex"
3844 if p.installFilename != expected {
3845 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3846 }
3847}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003848
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003849func TestPrebuiltOverrides(t *testing.T) {
3850 ctx, config := testApex(t, `
3851 prebuilt_apex {
3852 name: "myapex.prebuilt",
3853 src: "myapex-arm.apex",
3854 overrides: [
3855 "myapex",
3856 ],
3857 }
3858 `)
3859
3860 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3861
3862 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003863 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003864 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003865 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003866 }
3867}
3868
Roland Levillain630846d2019-06-26 12:48:34 +01003869func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003870 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003871 apex_test {
3872 name: "myapex",
3873 key: "myapex.key",
3874 tests: [
3875 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003876 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003877 ],
3878 }
3879
3880 apex_key {
3881 name: "myapex.key",
3882 public_key: "testkey.avbpubkey",
3883 private_key: "testkey.pem",
3884 }
3885
Liz Kammer1c14a212020-05-12 15:26:55 -07003886 filegroup {
3887 name: "fg",
3888 srcs: [
3889 "baz",
3890 "bar/baz"
3891 ],
3892 }
3893
Roland Levillain630846d2019-06-26 12:48:34 +01003894 cc_test {
3895 name: "mytest",
3896 gtest: false,
3897 srcs: ["mytest.cpp"],
3898 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003899 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003900 system_shared_libs: [],
3901 static_executable: true,
3902 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003903 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003904 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003905
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003906 cc_library {
3907 name: "mylib",
3908 srcs: ["mylib.cpp"],
3909 system_shared_libs: [],
3910 stl: "none",
3911 }
3912
Liz Kammer5bd365f2020-05-27 15:15:11 -07003913 filegroup {
3914 name: "fg2",
3915 srcs: [
3916 "testdata/baz"
3917 ],
3918 }
3919
Roland Levillain9b5fde92019-06-28 15:41:19 +01003920 cc_test {
3921 name: "mytests",
3922 gtest: false,
3923 srcs: [
3924 "mytest1.cpp",
3925 "mytest2.cpp",
3926 "mytest3.cpp",
3927 ],
3928 test_per_src: true,
3929 relative_install_path: "test",
3930 system_shared_libs: [],
3931 static_executable: true,
3932 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003933 data: [
3934 ":fg",
3935 ":fg2",
3936 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003937 }
Roland Levillain630846d2019-06-26 12:48:34 +01003938 `)
3939
Sundong Ahnabb64432019-10-22 13:58:29 +09003940 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003941 copyCmds := apexRule.Args["copy_commands"]
3942
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003943 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003944 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003945 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003946
Liz Kammer1c14a212020-05-12 15:26:55 -07003947 //Ensure that test data are copied into apex.
3948 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3949 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3950
Roland Levillain9b5fde92019-06-28 15:41:19 +01003951 // Ensure that test deps built with `test_per_src` are copied into apex.
3952 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3953 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3954 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003955
3956 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003957 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3958 data := android.AndroidMkDataForTest(t, config, "", bundle)
3959 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003960 prefix := "TARGET_"
3961 var builder strings.Builder
3962 data.Custom(&builder, name, prefix, "", data)
3963 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003964 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3965 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3966 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3967 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003968 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003969 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003970 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003971
3972 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3973 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3974 data.Custom(&builder, name, prefix, "", data)
3975 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003976 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3977 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003978}
3979
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003980func TestInstallExtraFlattenedApexes(t *testing.T) {
3981 ctx, config := testApex(t, `
3982 apex {
3983 name: "myapex",
3984 key: "myapex.key",
3985 }
3986 apex_key {
3987 name: "myapex.key",
3988 public_key: "testkey.avbpubkey",
3989 private_key: "testkey.pem",
3990 }
3991 `, func(fs map[string][]byte, config android.Config) {
3992 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3993 })
3994 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003995 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003996 mk := android.AndroidMkDataForTest(t, config, "", ab)
3997 var builder strings.Builder
3998 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3999 androidMk := builder.String()
4000 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4001}
4002
Jooyung Han5c998b92019-06-27 11:30:33 +09004003func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004004 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004005 apex {
4006 name: "myapex",
4007 key: "myapex.key",
4008 native_shared_libs: ["mylib"],
4009 uses: ["commonapex"],
4010 }
4011
4012 apex {
4013 name: "commonapex",
4014 key: "myapex.key",
4015 native_shared_libs: ["libcommon"],
4016 provide_cpp_shared_libs: true,
4017 }
4018
4019 apex_key {
4020 name: "myapex.key",
4021 public_key: "testkey.avbpubkey",
4022 private_key: "testkey.pem",
4023 }
4024
4025 cc_library {
4026 name: "mylib",
4027 srcs: ["mylib.cpp"],
4028 shared_libs: ["libcommon"],
4029 system_shared_libs: [],
4030 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004031 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004032 }
4033
4034 cc_library {
4035 name: "libcommon",
4036 srcs: ["mylib_common.cpp"],
4037 system_shared_libs: [],
4038 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004039 // TODO: remove //apex_available:platform
4040 apex_available: [
4041 "//apex_available:platform",
4042 "commonapex",
4043 "myapex",
4044 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004045 }
4046 `)
4047
Sundong Ahnabb64432019-10-22 13:58:29 +09004048 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004049 apexRule1 := module1.Rule("apexRule")
4050 copyCmds1 := apexRule1.Args["copy_commands"]
4051
Sundong Ahnabb64432019-10-22 13:58:29 +09004052 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004053 apexRule2 := module2.Rule("apexRule")
4054 copyCmds2 := apexRule2.Args["copy_commands"]
4055
Colin Cross7113d202019-11-20 16:39:12 -08004056 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
4057 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09004058 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4059 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4060 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4061}
4062
4063func TestApexUsesFailsIfNotProvided(t *testing.T) {
4064 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4065 apex {
4066 name: "myapex",
4067 key: "myapex.key",
4068 uses: ["commonapex"],
4069 }
4070
4071 apex {
4072 name: "commonapex",
4073 key: "myapex.key",
4074 }
4075
4076 apex_key {
4077 name: "myapex.key",
4078 public_key: "testkey.avbpubkey",
4079 private_key: "testkey.pem",
4080 }
4081 `)
4082 testApexError(t, `uses: "commonapex" is not a provider`, `
4083 apex {
4084 name: "myapex",
4085 key: "myapex.key",
4086 uses: ["commonapex"],
4087 }
4088
4089 cc_library {
4090 name: "commonapex",
4091 system_shared_libs: [],
4092 stl: "none",
4093 }
4094
4095 apex_key {
4096 name: "myapex.key",
4097 public_key: "testkey.avbpubkey",
4098 private_key: "testkey.pem",
4099 }
4100 `)
4101}
4102
4103func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4104 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4105 apex {
4106 name: "myapex",
4107 key: "myapex.key",
4108 use_vendor: true,
4109 uses: ["commonapex"],
4110 }
4111
4112 apex {
4113 name: "commonapex",
4114 key: "myapex.key",
4115 provide_cpp_shared_libs: true,
4116 }
4117
4118 apex_key {
4119 name: "myapex.key",
4120 public_key: "testkey.avbpubkey",
4121 private_key: "testkey.pem",
4122 }
Jooyung Handc782442019-11-01 03:14:38 +09004123 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004124 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004125 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004126}
4127
Jooyung Hand48f3c32019-08-23 11:18:57 +09004128func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4129 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4130 apex {
4131 name: "myapex",
4132 key: "myapex.key",
4133 native_shared_libs: ["libfoo"],
4134 }
4135
4136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141
4142 cc_library {
4143 name: "libfoo",
4144 stl: "none",
4145 system_shared_libs: [],
4146 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004147 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004148 }
4149 `)
4150 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4151 apex {
4152 name: "myapex",
4153 key: "myapex.key",
4154 java_libs: ["myjar"],
4155 }
4156
4157 apex_key {
4158 name: "myapex.key",
4159 public_key: "testkey.avbpubkey",
4160 private_key: "testkey.pem",
4161 }
4162
4163 java_library {
4164 name: "myjar",
4165 srcs: ["foo/bar/MyClass.java"],
4166 sdk_version: "none",
4167 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004168 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004169 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004170 }
4171 `)
4172}
4173
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004174func TestApexWithApps(t *testing.T) {
4175 ctx, _ := testApex(t, `
4176 apex {
4177 name: "myapex",
4178 key: "myapex.key",
4179 apps: [
4180 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004181 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004182 ],
4183 }
4184
4185 apex_key {
4186 name: "myapex.key",
4187 public_key: "testkey.avbpubkey",
4188 private_key: "testkey.pem",
4189 }
4190
4191 android_app {
4192 name: "AppFoo",
4193 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004194 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004195 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004196 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004197 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004198 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004199 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004200
4201 android_app {
4202 name: "AppFooPriv",
4203 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004204 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004205 system_modules: "none",
4206 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004207 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004208 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004209 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004210
4211 cc_library_shared {
4212 name: "libjni",
4213 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004214 shared_libs: ["libfoo"],
4215 stl: "none",
4216 system_shared_libs: [],
4217 apex_available: [ "myapex" ],
4218 sdk_version: "current",
4219 }
4220
4221 cc_library_shared {
4222 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004223 stl: "none",
4224 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004225 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004226 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004227 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004228 `)
4229
Sundong Ahnabb64432019-10-22 13:58:29 +09004230 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004231 apexRule := module.Rule("apexRule")
4232 copyCmds := apexRule.Args["copy_commands"]
4233
4234 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004235 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004236
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004237 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
4238 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004239 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004240 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004241 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004242 // JNI libraries including transitive deps are
4243 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00004244 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004245 // ... embedded inside APK (jnilibs.zip)
4246 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4247 // ... and not directly inside the APEX
4248 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4249 }
Dario Frenicde2a032019-10-27 00:29:22 +01004250}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004251
Dario Frenicde2a032019-10-27 00:29:22 +01004252func TestApexWithAppImports(t *testing.T) {
4253 ctx, _ := testApex(t, `
4254 apex {
4255 name: "myapex",
4256 key: "myapex.key",
4257 apps: [
4258 "AppFooPrebuilt",
4259 "AppFooPrivPrebuilt",
4260 ],
4261 }
4262
4263 apex_key {
4264 name: "myapex.key",
4265 public_key: "testkey.avbpubkey",
4266 private_key: "testkey.pem",
4267 }
4268
4269 android_app_import {
4270 name: "AppFooPrebuilt",
4271 apk: "PrebuiltAppFoo.apk",
4272 presigned: true,
4273 dex_preopt: {
4274 enabled: false,
4275 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004276 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004277 }
4278
4279 android_app_import {
4280 name: "AppFooPrivPrebuilt",
4281 apk: "PrebuiltAppFooPriv.apk",
4282 privileged: true,
4283 presigned: true,
4284 dex_preopt: {
4285 enabled: false,
4286 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004287 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004288 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004289 }
4290 `)
4291
Sundong Ahnabb64432019-10-22 13:58:29 +09004292 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004293 apexRule := module.Rule("apexRule")
4294 copyCmds := apexRule.Args["copy_commands"]
4295
4296 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004297 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4298}
4299
4300func TestApexWithAppImportsPrefer(t *testing.T) {
4301 ctx, _ := testApex(t, `
4302 apex {
4303 name: "myapex",
4304 key: "myapex.key",
4305 apps: [
4306 "AppFoo",
4307 ],
4308 }
4309
4310 apex_key {
4311 name: "myapex.key",
4312 public_key: "testkey.avbpubkey",
4313 private_key: "testkey.pem",
4314 }
4315
4316 android_app {
4317 name: "AppFoo",
4318 srcs: ["foo/bar/MyClass.java"],
4319 sdk_version: "none",
4320 system_modules: "none",
4321 apex_available: [ "myapex" ],
4322 }
4323
4324 android_app_import {
4325 name: "AppFoo",
4326 apk: "AppFooPrebuilt.apk",
4327 filename: "AppFooPrebuilt.apk",
4328 presigned: true,
4329 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004330 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004331 }
4332 `, withFiles(map[string][]byte{
4333 "AppFooPrebuilt.apk": nil,
4334 }))
4335
4336 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4337 "app/AppFoo/AppFooPrebuilt.apk",
4338 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004339}
4340
Dario Freni6f3937c2019-12-20 22:58:03 +00004341func TestApexWithTestHelperApp(t *testing.T) {
4342 ctx, _ := testApex(t, `
4343 apex {
4344 name: "myapex",
4345 key: "myapex.key",
4346 apps: [
4347 "TesterHelpAppFoo",
4348 ],
4349 }
4350
4351 apex_key {
4352 name: "myapex.key",
4353 public_key: "testkey.avbpubkey",
4354 private_key: "testkey.pem",
4355 }
4356
4357 android_test_helper_app {
4358 name: "TesterHelpAppFoo",
4359 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004360 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004361 }
4362
4363 `)
4364
4365 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4366 apexRule := module.Rule("apexRule")
4367 copyCmds := apexRule.Args["copy_commands"]
4368
4369 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4370}
4371
Jooyung Han18020ea2019-11-13 10:50:48 +09004372func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4373 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004374 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004375 apex {
4376 name: "myapex",
4377 key: "myapex.key",
4378 native_shared_libs: ["libfoo"],
4379 }
4380
4381 apex_key {
4382 name: "myapex.key",
4383 public_key: "testkey.avbpubkey",
4384 private_key: "testkey.pem",
4385 }
4386
4387 apex {
4388 name: "otherapex",
4389 key: "myapex.key",
4390 native_shared_libs: ["libfoo"],
4391 }
4392
4393 cc_defaults {
4394 name: "libfoo-defaults",
4395 apex_available: ["otherapex"],
4396 }
4397
4398 cc_library {
4399 name: "libfoo",
4400 defaults: ["libfoo-defaults"],
4401 stl: "none",
4402 system_shared_libs: [],
4403 }`)
4404}
4405
Paul Duffine52e66f2020-03-30 17:54:29 +01004406func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004407 // libfoo is not available to myapex, but only to otherapex
4408 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4409 apex {
4410 name: "myapex",
4411 key: "myapex.key",
4412 native_shared_libs: ["libfoo"],
4413 }
4414
4415 apex_key {
4416 name: "myapex.key",
4417 public_key: "testkey.avbpubkey",
4418 private_key: "testkey.pem",
4419 }
4420
4421 apex {
4422 name: "otherapex",
4423 key: "otherapex.key",
4424 native_shared_libs: ["libfoo"],
4425 }
4426
4427 apex_key {
4428 name: "otherapex.key",
4429 public_key: "testkey.avbpubkey",
4430 private_key: "testkey.pem",
4431 }
4432
4433 cc_library {
4434 name: "libfoo",
4435 stl: "none",
4436 system_shared_libs: [],
4437 apex_available: ["otherapex"],
4438 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004439}
Jiyong Park127b40b2019-09-30 16:04:35 +09004440
Paul Duffine52e66f2020-03-30 17:54:29 +01004441func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004442 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004443 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004444.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004445.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004446.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004447.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004448.*via tag cc\.DependencyTag.*"shared".*
4449.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004450 apex {
4451 name: "myapex",
4452 key: "myapex.key",
4453 native_shared_libs: ["libfoo"],
4454 }
4455
4456 apex_key {
4457 name: "myapex.key",
4458 public_key: "testkey.avbpubkey",
4459 private_key: "testkey.pem",
4460 }
4461
Jiyong Park127b40b2019-09-30 16:04:35 +09004462 cc_library {
4463 name: "libfoo",
4464 stl: "none",
4465 shared_libs: ["libbar"],
4466 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004467 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004468 }
4469
4470 cc_library {
4471 name: "libbar",
4472 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004473 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004474 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004475 apex_available: ["myapex"],
4476 }
4477
4478 cc_library {
4479 name: "libbaz",
4480 stl: "none",
4481 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004482 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004483}
Jiyong Park127b40b2019-09-30 16:04:35 +09004484
Paul Duffine52e66f2020-03-30 17:54:29 +01004485func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004486 testApexError(t, "\"otherapex\" is not a valid module name", `
4487 apex {
4488 name: "myapex",
4489 key: "myapex.key",
4490 native_shared_libs: ["libfoo"],
4491 }
4492
4493 apex_key {
4494 name: "myapex.key",
4495 public_key: "testkey.avbpubkey",
4496 private_key: "testkey.pem",
4497 }
4498
4499 cc_library {
4500 name: "libfoo",
4501 stl: "none",
4502 system_shared_libs: [],
4503 apex_available: ["otherapex"],
4504 }`)
4505
Paul Duffine52e66f2020-03-30 17:54:29 +01004506 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004507 apex {
4508 name: "myapex",
4509 key: "myapex.key",
4510 native_shared_libs: ["libfoo", "libbar"],
4511 }
4512
4513 apex_key {
4514 name: "myapex.key",
4515 public_key: "testkey.avbpubkey",
4516 private_key: "testkey.pem",
4517 }
4518
4519 cc_library {
4520 name: "libfoo",
4521 stl: "none",
4522 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004523 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004524 apex_available: ["myapex"],
4525 }
4526
4527 cc_library {
4528 name: "libbar",
4529 stl: "none",
4530 system_shared_libs: [],
4531 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004532 }
4533
4534 cc_library {
4535 name: "libbaz",
4536 stl: "none",
4537 system_shared_libs: [],
4538 stubs: {
4539 versions: ["10", "20", "30"],
4540 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004541 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004542}
Jiyong Park127b40b2019-09-30 16:04:35 +09004543
Jiyong Park89e850a2020-04-07 16:37:39 +09004544func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004545 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004546 apex {
4547 name: "myapex",
4548 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004549 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004550 }
4551
4552 apex_key {
4553 name: "myapex.key",
4554 public_key: "testkey.avbpubkey",
4555 private_key: "testkey.pem",
4556 }
4557
4558 cc_library {
4559 name: "libfoo",
4560 stl: "none",
4561 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004562 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004563 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004564 }
4565
4566 cc_library {
4567 name: "libfoo2",
4568 stl: "none",
4569 system_shared_libs: [],
4570 shared_libs: ["libbaz"],
4571 apex_available: ["//apex_available:platform"],
4572 }
4573
4574 cc_library {
4575 name: "libbar",
4576 stl: "none",
4577 system_shared_libs: [],
4578 apex_available: ["myapex"],
4579 }
4580
4581 cc_library {
4582 name: "libbaz",
4583 stl: "none",
4584 system_shared_libs: [],
4585 apex_available: ["myapex"],
4586 stubs: {
4587 versions: ["1"],
4588 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004589 }`)
4590
Jiyong Park89e850a2020-04-07 16:37:39 +09004591 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4592 // because it depends on libbar which isn't available to platform
4593 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4594 if libfoo.NotAvailableForPlatform() != true {
4595 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4596 }
4597
4598 // libfoo2 however can be available to platform because it depends on libbaz which provides
4599 // stubs
4600 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4601 if libfoo2.NotAvailableForPlatform() == true {
4602 t.Errorf("%q should be available to platform", libfoo2.String())
4603 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004604}
Jiyong Parka90ca002019-10-07 15:47:24 +09004605
Paul Duffine52e66f2020-03-30 17:54:29 +01004606func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004607 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004608 apex {
4609 name: "myapex",
4610 key: "myapex.key",
4611 native_shared_libs: ["libfoo"],
4612 }
4613
4614 apex_key {
4615 name: "myapex.key",
4616 public_key: "testkey.avbpubkey",
4617 private_key: "testkey.pem",
4618 }
4619
4620 cc_library {
4621 name: "libfoo",
4622 stl: "none",
4623 system_shared_libs: [],
4624 apex_available: ["myapex"],
4625 static: {
4626 apex_available: ["//apex_available:platform"],
4627 },
4628 }`)
4629
Jiyong Park89e850a2020-04-07 16:37:39 +09004630 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4631 if libfooShared.NotAvailableForPlatform() != true {
4632 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4633 }
4634 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4635 if libfooStatic.NotAvailableForPlatform() != false {
4636 t.Errorf("%q should be available to platform", libfooStatic.String())
4637 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004638}
4639
Jiyong Park5d790c32019-11-15 18:40:32 +09004640func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004641 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004642 apex {
4643 name: "myapex",
4644 key: "myapex.key",
4645 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004646 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004647 }
4648
4649 override_apex {
4650 name: "override_myapex",
4651 base: "myapex",
4652 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004653 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004654 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004655 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004656 }
4657
4658 apex_key {
4659 name: "myapex.key",
4660 public_key: "testkey.avbpubkey",
4661 private_key: "testkey.pem",
4662 }
4663
4664 android_app {
4665 name: "app",
4666 srcs: ["foo/bar/MyClass.java"],
4667 package_name: "foo",
4668 sdk_version: "none",
4669 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004670 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004671 }
4672
4673 override_android_app {
4674 name: "override_app",
4675 base: "app",
4676 package_name: "bar",
4677 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004678 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004679
Jiyong Park317645e2019-12-05 13:20:58 +09004680 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4681 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4682 if originalVariant.GetOverriddenBy() != "" {
4683 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4684 }
4685 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4686 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4687 }
4688
Jiyong Park5d790c32019-11-15 18:40:32 +09004689 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4690 apexRule := module.Rule("apexRule")
4691 copyCmds := apexRule.Args["copy_commands"]
4692
4693 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004694 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004695
4696 apexBundle := module.Module().(*apexBundle)
4697 name := apexBundle.Name()
4698 if name != "override_myapex" {
4699 t.Errorf("name should be \"override_myapex\", but was %q", name)
4700 }
4701
Baligh Uddin004d7172020-02-19 21:29:28 -08004702 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4703 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4704 }
4705
Jiyong Park20bacab2020-03-03 11:45:41 +09004706 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004707 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004708
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004709 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4710 var builder strings.Builder
4711 data.Custom(&builder, name, "TARGET_", "", data)
4712 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004713 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004714 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4715 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004716 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004717 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004718 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004719 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4720 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004721}
4722
Jooyung Han214bf372019-11-12 13:03:50 +09004723func TestLegacyAndroid10Support(t *testing.T) {
4724 ctx, _ := testApex(t, `
4725 apex {
4726 name: "myapex",
4727 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004728 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004729 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004730 }
4731
4732 apex_key {
4733 name: "myapex.key",
4734 public_key: "testkey.avbpubkey",
4735 private_key: "testkey.pem",
4736 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004737
4738 cc_library {
4739 name: "mylib",
4740 srcs: ["mylib.cpp"],
4741 stl: "libc++",
4742 system_shared_libs: [],
4743 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004744 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004745 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004746 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004747
4748 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4749 args := module.Rule("apexRule").Args
4750 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004751 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004752
4753 // The copies of the libraries in the apex should have one more dependency than
4754 // the ones outside the apex, namely the unwinder. Ideally we should check
4755 // the dependency names directly here but for some reason the names are blank in
4756 // this test.
4757 for _, lib := range []string{"libc++", "mylib"} {
4758 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4759 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4760 if len(apexImplicits) != len(nonApexImplicits)+1 {
4761 t.Errorf("%q missing unwinder dep", lib)
4762 }
4763 }
Jooyung Han214bf372019-11-12 13:03:50 +09004764}
4765
Paul Duffin9b879592020-05-26 13:21:35 +01004766var filesForSdkLibrary = map[string][]byte{
4767 "api/current.txt": nil,
4768 "api/removed.txt": nil,
4769 "api/system-current.txt": nil,
4770 "api/system-removed.txt": nil,
4771 "api/test-current.txt": nil,
4772 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004773
4774 // For java_sdk_library_import
4775 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004776}
4777
Jooyung Han58f26ab2019-12-18 15:34:32 +09004778func TestJavaSDKLibrary(t *testing.T) {
4779 ctx, _ := testApex(t, `
4780 apex {
4781 name: "myapex",
4782 key: "myapex.key",
4783 java_libs: ["foo"],
4784 }
4785
4786 apex_key {
4787 name: "myapex.key",
4788 public_key: "testkey.avbpubkey",
4789 private_key: "testkey.pem",
4790 }
4791
4792 java_sdk_library {
4793 name: "foo",
4794 srcs: ["a.java"],
4795 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004796 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004797 }
Paul Duffin9b879592020-05-26 13:21:35 +01004798 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004799
4800 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004801 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004802 "javalib/foo.jar",
4803 "etc/permissions/foo.xml",
4804 })
4805 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004806 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4807 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004808}
4809
Paul Duffin9b879592020-05-26 13:21:35 +01004810func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4811 ctx, _ := testApex(t, `
4812 apex {
4813 name: "myapex",
4814 key: "myapex.key",
4815 java_libs: ["foo", "bar"],
4816 }
4817
4818 apex_key {
4819 name: "myapex.key",
4820 public_key: "testkey.avbpubkey",
4821 private_key: "testkey.pem",
4822 }
4823
4824 java_sdk_library {
4825 name: "foo",
4826 srcs: ["a.java"],
4827 api_packages: ["foo"],
4828 apex_available: ["myapex"],
4829 sdk_version: "none",
4830 system_modules: "none",
4831 }
4832
4833 java_library {
4834 name: "bar",
4835 srcs: ["a.java"],
4836 libs: ["foo"],
4837 apex_available: ["myapex"],
4838 sdk_version: "none",
4839 system_modules: "none",
4840 }
4841 `, withFiles(filesForSdkLibrary))
4842
4843 // java_sdk_library installs both impl jar and permission XML
4844 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4845 "javalib/bar.jar",
4846 "javalib/foo.jar",
4847 "etc/permissions/foo.xml",
4848 })
4849
4850 // The bar library should depend on the implementation jar.
4851 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4852 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4853 t.Errorf("expected %q, found %#q", expected, actual)
4854 }
4855}
4856
4857func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4858 ctx, _ := testApex(t, `
4859 apex {
4860 name: "myapex",
4861 key: "myapex.key",
4862 java_libs: ["foo"],
4863 }
4864
4865 apex_key {
4866 name: "myapex.key",
4867 public_key: "testkey.avbpubkey",
4868 private_key: "testkey.pem",
4869 }
4870
4871 java_sdk_library {
4872 name: "foo",
4873 srcs: ["a.java"],
4874 api_packages: ["foo"],
4875 apex_available: ["myapex"],
4876 sdk_version: "none",
4877 system_modules: "none",
4878 }
4879
4880 java_library {
4881 name: "bar",
4882 srcs: ["a.java"],
4883 libs: ["foo"],
4884 sdk_version: "none",
4885 system_modules: "none",
4886 }
4887 `, withFiles(filesForSdkLibrary))
4888
4889 // java_sdk_library installs both impl jar and permission XML
4890 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4891 "javalib/foo.jar",
4892 "etc/permissions/foo.xml",
4893 })
4894
4895 // The bar library should depend on the stubs jar.
4896 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4897 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4898 t.Errorf("expected %q, found %#q", expected, actual)
4899 }
4900}
4901
Paul Duffineedc5d52020-06-12 17:46:39 +01004902func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4903 ctx, _ := testApex(t, ``,
4904 withFiles(map[string][]byte{
4905 "apex/a.java": nil,
4906 "apex/apex_manifest.json": nil,
4907 "apex/Android.bp": []byte(`
4908 package {
4909 default_visibility: ["//visibility:private"],
4910 }
4911
4912 apex {
4913 name: "myapex",
4914 key: "myapex.key",
4915 java_libs: ["foo", "bar"],
4916 }
4917
4918 apex_key {
4919 name: "myapex.key",
4920 public_key: "testkey.avbpubkey",
4921 private_key: "testkey.pem",
4922 }
4923
4924 java_library {
4925 name: "bar",
4926 srcs: ["a.java"],
4927 libs: ["foo"],
4928 apex_available: ["myapex"],
4929 sdk_version: "none",
4930 system_modules: "none",
4931 }
4932`),
4933 "source/a.java": nil,
4934 "source/api/current.txt": nil,
4935 "source/api/removed.txt": nil,
4936 "source/Android.bp": []byte(`
4937 package {
4938 default_visibility: ["//visibility:private"],
4939 }
4940
4941 java_sdk_library {
4942 name: "foo",
4943 visibility: ["//apex"],
4944 srcs: ["a.java"],
4945 api_packages: ["foo"],
4946 apex_available: ["myapex"],
4947 sdk_version: "none",
4948 system_modules: "none",
4949 public: {
4950 enabled: true,
4951 },
4952 }
4953`),
4954 "prebuilt/a.jar": nil,
4955 "prebuilt/Android.bp": []byte(`
4956 package {
4957 default_visibility: ["//visibility:private"],
4958 }
4959
4960 java_sdk_library_import {
4961 name: "foo",
4962 visibility: ["//apex", "//source"],
4963 apex_available: ["myapex"],
4964 prefer: true,
4965 public: {
4966 jars: ["a.jar"],
4967 },
4968 }
4969`),
4970 }),
4971 )
4972
4973 // java_sdk_library installs both impl jar and permission XML
4974 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4975 "javalib/bar.jar",
4976 "javalib/foo.jar",
4977 "etc/permissions/foo.xml",
4978 })
4979
4980 // The bar library should depend on the implementation jar.
4981 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4982 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4983 t.Errorf("expected %q, found %#q", expected, actual)
4984 }
4985}
4986
4987func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
4988 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
4989 apex {
4990 name: "myapex",
4991 key: "myapex.key",
4992 java_libs: ["foo"],
4993 }
4994
4995 apex_key {
4996 name: "myapex.key",
4997 public_key: "testkey.avbpubkey",
4998 private_key: "testkey.pem",
4999 }
5000
5001 java_sdk_library_import {
5002 name: "foo",
5003 apex_available: ["myapex"],
5004 prefer: true,
5005 public: {
5006 jars: ["a.jar"],
5007 },
5008 }
5009
5010 `, withFiles(filesForSdkLibrary))
5011}
5012
atrost6e126252020-01-27 17:01:16 +00005013func TestCompatConfig(t *testing.T) {
5014 ctx, _ := testApex(t, `
5015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
5018 prebuilts: ["myjar-platform-compat-config"],
5019 java_libs: ["myjar"],
5020 }
5021
5022 apex_key {
5023 name: "myapex.key",
5024 public_key: "testkey.avbpubkey",
5025 private_key: "testkey.pem",
5026 }
5027
5028 platform_compat_config {
5029 name: "myjar-platform-compat-config",
5030 src: ":myjar",
5031 }
5032
5033 java_library {
5034 name: "myjar",
5035 srcs: ["foo/bar/MyClass.java"],
5036 sdk_version: "none",
5037 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005038 apex_available: [ "myapex" ],
5039 }
5040 `)
5041 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5042 "etc/compatconfig/myjar-platform-compat-config.xml",
5043 "javalib/myjar.jar",
5044 })
5045}
5046
Jiyong Park479321d2019-12-16 11:47:12 +09005047func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5048 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5049 apex {
5050 name: "myapex",
5051 key: "myapex.key",
5052 java_libs: ["myjar"],
5053 }
5054
5055 apex_key {
5056 name: "myapex.key",
5057 public_key: "testkey.avbpubkey",
5058 private_key: "testkey.pem",
5059 }
5060
5061 java_library {
5062 name: "myjar",
5063 srcs: ["foo/bar/MyClass.java"],
5064 sdk_version: "none",
5065 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005066 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005067 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005068 }
5069 `)
5070}
5071
Jiyong Park7afd1072019-12-30 16:56:33 +09005072func TestCarryRequiredModuleNames(t *testing.T) {
5073 ctx, config := testApex(t, `
5074 apex {
5075 name: "myapex",
5076 key: "myapex.key",
5077 native_shared_libs: ["mylib"],
5078 }
5079
5080 apex_key {
5081 name: "myapex.key",
5082 public_key: "testkey.avbpubkey",
5083 private_key: "testkey.pem",
5084 }
5085
5086 cc_library {
5087 name: "mylib",
5088 srcs: ["mylib.cpp"],
5089 system_shared_libs: [],
5090 stl: "none",
5091 required: ["a", "b"],
5092 host_required: ["c", "d"],
5093 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005094 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005095 }
5096 `)
5097
5098 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5099 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5100 name := apexBundle.BaseModuleName()
5101 prefix := "TARGET_"
5102 var builder strings.Builder
5103 data.Custom(&builder, name, prefix, "", data)
5104 androidMk := builder.String()
5105 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5106 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5107 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5108}
5109
Jiyong Park7cd10e32020-01-14 09:22:18 +09005110func TestSymlinksFromApexToSystem(t *testing.T) {
5111 bp := `
5112 apex {
5113 name: "myapex",
5114 key: "myapex.key",
5115 native_shared_libs: ["mylib"],
5116 java_libs: ["myjar"],
5117 }
5118
Jiyong Park9d677202020-02-19 16:29:35 +09005119 apex {
5120 name: "myapex.updatable",
5121 key: "myapex.key",
5122 native_shared_libs: ["mylib"],
5123 java_libs: ["myjar"],
5124 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005125 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005126 }
5127
Jiyong Park7cd10e32020-01-14 09:22:18 +09005128 apex_key {
5129 name: "myapex.key",
5130 public_key: "testkey.avbpubkey",
5131 private_key: "testkey.pem",
5132 }
5133
5134 cc_library {
5135 name: "mylib",
5136 srcs: ["mylib.cpp"],
5137 shared_libs: ["myotherlib"],
5138 system_shared_libs: [],
5139 stl: "none",
5140 apex_available: [
5141 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005142 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005143 "//apex_available:platform",
5144 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005145 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005146 }
5147
5148 cc_library {
5149 name: "myotherlib",
5150 srcs: ["mylib.cpp"],
5151 system_shared_libs: [],
5152 stl: "none",
5153 apex_available: [
5154 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005155 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005156 "//apex_available:platform",
5157 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005158 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005159 }
5160
5161 java_library {
5162 name: "myjar",
5163 srcs: ["foo/bar/MyClass.java"],
5164 sdk_version: "none",
5165 system_modules: "none",
5166 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005167 apex_available: [
5168 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005169 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005170 "//apex_available:platform",
5171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005172 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005173 }
5174
5175 java_library {
5176 name: "myotherjar",
5177 srcs: ["foo/bar/MyClass.java"],
5178 sdk_version: "none",
5179 system_modules: "none",
5180 apex_available: [
5181 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005182 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005183 "//apex_available:platform",
5184 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005185 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005186 }
5187 `
5188
5189 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5190 for _, f := range files {
5191 if f.path == file {
5192 if f.isLink {
5193 t.Errorf("%q is not a real file", file)
5194 }
5195 return
5196 }
5197 }
5198 t.Errorf("%q is not found", file)
5199 }
5200
5201 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5202 for _, f := range files {
5203 if f.path == file {
5204 if !f.isLink {
5205 t.Errorf("%q is not a symlink", file)
5206 }
5207 return
5208 }
5209 }
5210 t.Errorf("%q is not found", file)
5211 }
5212
Jiyong Park9d677202020-02-19 16:29:35 +09005213 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5214 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005215 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005216 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005217 ensureRealfileExists(t, files, "javalib/myjar.jar")
5218 ensureRealfileExists(t, files, "lib64/mylib.so")
5219 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5220
Jiyong Park9d677202020-02-19 16:29:35 +09005221 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5222 ensureRealfileExists(t, files, "javalib/myjar.jar")
5223 ensureRealfileExists(t, files, "lib64/mylib.so")
5224 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5225
5226 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005227 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005228 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005229 ensureRealfileExists(t, files, "javalib/myjar.jar")
5230 ensureRealfileExists(t, files, "lib64/mylib.so")
5231 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005232
5233 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5234 ensureRealfileExists(t, files, "javalib/myjar.jar")
5235 ensureRealfileExists(t, files, "lib64/mylib.so")
5236 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005237}
5238
Yo Chiange8128052020-07-23 20:09:18 +08005239func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5240 ctx, config := testApex(t, `
5241 apex {
5242 name: "myapex",
5243 key: "myapex.key",
5244 native_shared_libs: ["mylib"],
5245 }
5246
5247 apex_key {
5248 name: "myapex.key",
5249 public_key: "testkey.avbpubkey",
5250 private_key: "testkey.pem",
5251 }
5252
5253 cc_library_shared {
5254 name: "mylib",
5255 srcs: ["mylib.cpp"],
5256 shared_libs: ["myotherlib"],
5257 system_shared_libs: [],
5258 stl: "none",
5259 apex_available: [
5260 "myapex",
5261 "//apex_available:platform",
5262 ],
5263 }
5264
5265 cc_prebuilt_library_shared {
5266 name: "myotherlib",
5267 srcs: ["prebuilt.so"],
5268 system_shared_libs: [],
5269 stl: "none",
5270 apex_available: [
5271 "myapex",
5272 "//apex_available:platform",
5273 ],
5274 }
5275 `)
5276
5277 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5278 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5279 var builder strings.Builder
5280 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5281 androidMk := builder.String()
5282 // `myotherlib` is added to `myapex` as symlink
5283 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5284 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5285 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5286 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5287 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5288}
5289
Jooyung Han643adc42020-02-27 13:50:06 +09005290func TestApexWithJniLibs(t *testing.T) {
5291 ctx, _ := testApex(t, `
5292 apex {
5293 name: "myapex",
5294 key: "myapex.key",
5295 jni_libs: ["mylib"],
5296 }
5297
5298 apex_key {
5299 name: "myapex.key",
5300 public_key: "testkey.avbpubkey",
5301 private_key: "testkey.pem",
5302 }
5303
5304 cc_library {
5305 name: "mylib",
5306 srcs: ["mylib.cpp"],
5307 shared_libs: ["mylib2"],
5308 system_shared_libs: [],
5309 stl: "none",
5310 apex_available: [ "myapex" ],
5311 }
5312
5313 cc_library {
5314 name: "mylib2",
5315 srcs: ["mylib.cpp"],
5316 system_shared_libs: [],
5317 stl: "none",
5318 apex_available: [ "myapex" ],
5319 }
5320 `)
5321
5322 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5323 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5324 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5325 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5326 "lib64/mylib.so",
5327 "lib64/mylib2.so",
5328 })
5329}
5330
Jooyung Han49f67012020-04-17 13:43:10 +09005331func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5332 ctx, _ := testApex(t, `
5333 apex {
5334 name: "myapex",
5335 key: "myapex.key",
5336 }
5337 apex_key {
5338 name: "myapex.key",
5339 public_key: "testkey.avbpubkey",
5340 private_key: "testkey.pem",
5341 }
5342 `, func(fs map[string][]byte, config android.Config) {
5343 delete(config.Targets, android.Android)
5344 config.AndroidCommonTarget = android.Target{}
5345 })
5346
5347 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5348 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5349 }
5350}
5351
Jooyung Han643adc42020-02-27 13:50:06 +09005352func TestApexWithJniLibs_Errors(t *testing.T) {
5353 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5354 apex {
5355 name: "myapex",
5356 key: "myapex.key",
5357 jni_libs: ["xxx"],
5358 }
5359
5360 apex_key {
5361 name: "myapex.key",
5362 public_key: "testkey.avbpubkey",
5363 private_key: "testkey.pem",
5364 }
5365
5366 prebuilt_etc {
5367 name: "xxx",
5368 src: "xxx",
5369 }
5370 `, withFiles(map[string][]byte{
5371 "xxx": nil,
5372 }))
5373}
5374
Jiyong Parkbd159612020-02-28 15:22:21 +09005375func TestAppBundle(t *testing.T) {
5376 ctx, _ := testApex(t, `
5377 apex {
5378 name: "myapex",
5379 key: "myapex.key",
5380 apps: ["AppFoo"],
5381 }
5382
5383 apex_key {
5384 name: "myapex.key",
5385 public_key: "testkey.avbpubkey",
5386 private_key: "testkey.pem",
5387 }
5388
5389 android_app {
5390 name: "AppFoo",
5391 srcs: ["foo/bar/MyClass.java"],
5392 sdk_version: "none",
5393 system_modules: "none",
5394 apex_available: [ "myapex" ],
5395 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005396 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005397
5398 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5399 content := bundleConfigRule.Args["content"]
5400
5401 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005402 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 +09005403}
5404
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005405func TestAppSetBundle(t *testing.T) {
5406 ctx, _ := testApex(t, `
5407 apex {
5408 name: "myapex",
5409 key: "myapex.key",
5410 apps: ["AppSet"],
5411 }
5412
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
5418
5419 android_app_set {
5420 name: "AppSet",
5421 set: "AppSet.apks",
5422 }`)
5423 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5424 bundleConfigRule := mod.Description("Bundle Config")
5425 content := bundleConfigRule.Args["content"]
5426 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5427 s := mod.Rule("apexRule").Args["copy_commands"]
5428 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5429 if len(copyCmds) != 3 {
5430 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5431 }
5432 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5433 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5434 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5435}
5436
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005437func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005438 t.Helper()
5439
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005440 bp := `
5441 java_library {
5442 name: "some-updatable-apex-lib",
5443 srcs: ["a.java"],
5444 sdk_version: "current",
5445 apex_available: [
5446 "some-updatable-apex",
5447 ],
5448 }
5449
5450 java_library {
5451 name: "some-non-updatable-apex-lib",
5452 srcs: ["a.java"],
5453 apex_available: [
5454 "some-non-updatable-apex",
5455 ],
5456 }
5457
5458 java_library {
5459 name: "some-platform-lib",
5460 srcs: ["a.java"],
5461 sdk_version: "current",
5462 installable: true,
5463 }
5464
5465 java_library {
5466 name: "some-art-lib",
5467 srcs: ["a.java"],
5468 sdk_version: "current",
5469 apex_available: [
5470 "com.android.art.something",
5471 ],
5472 hostdex: true,
5473 }
5474
5475 apex {
5476 name: "some-updatable-apex",
5477 key: "some-updatable-apex.key",
5478 java_libs: ["some-updatable-apex-lib"],
5479 updatable: true,
5480 min_sdk_version: "current",
5481 }
5482
5483 apex {
5484 name: "some-non-updatable-apex",
5485 key: "some-non-updatable-apex.key",
5486 java_libs: ["some-non-updatable-apex-lib"],
5487 }
5488
5489 apex_key {
5490 name: "some-updatable-apex.key",
5491 }
5492
5493 apex_key {
5494 name: "some-non-updatable-apex.key",
5495 }
5496
5497 apex {
5498 name: "com.android.art.something",
5499 key: "com.android.art.something.key",
5500 java_libs: ["some-art-lib"],
5501 updatable: true,
5502 min_sdk_version: "current",
5503 }
5504
5505 apex_key {
5506 name: "com.android.art.something.key",
5507 }
5508
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005509 filegroup {
5510 name: "some-updatable-apex-file_contexts",
5511 srcs: [
5512 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5513 ],
5514 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005515
5516 filegroup {
5517 name: "some-non-updatable-apex-file_contexts",
5518 srcs: [
5519 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5520 ],
5521 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005522 `
5523 bp += cc.GatherRequiredDepsForTest(android.Android)
5524 bp += java.GatherRequiredDepsForTest()
5525 bp += dexpreopt.BpToolModulesForTest()
5526
5527 fs := map[string][]byte{
5528 "a.java": nil,
5529 "a.jar": nil,
5530 "build/make/target/product/security": nil,
5531 "apex_manifest.json": nil,
5532 "AndroidManifest.xml": nil,
5533 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005534 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005535 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5536 "framework/aidl/a.aidl": nil,
5537 }
5538 cc.GatherRequiredFilesForTest(fs)
5539
5540 ctx := android.NewTestArchContext()
5541 ctx.RegisterModuleType("apex", BundleFactory)
5542 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5543 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005544 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005545 cc.RegisterRequiredBuildComponentsForTest(ctx)
5546 java.RegisterJavaBuildComponents(ctx)
5547 java.RegisterSystemModulesBuildComponents(ctx)
5548 java.RegisterAppBuildComponents(ctx)
5549 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005550 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5551 ctx.PreDepsMutators(RegisterPreDepsMutators)
5552 ctx.PostDepsMutators(RegisterPostDepsMutators)
5553
5554 config := android.TestArchConfig(buildDir, nil, bp, fs)
5555 ctx.Register(config)
5556
5557 _ = dexpreopt.GlobalSoongConfigForTests(config)
5558 dexpreopt.RegisterToolModulesForTest(ctx)
5559 pathCtx := android.PathContextForTesting(config)
5560 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5561 transformDexpreoptConfig(dexpreoptConfig)
5562 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5563
5564 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5565 android.FailIfErrored(t, errs)
5566
5567 _, errs = ctx.PrepareBuildActions(config)
5568 if errmsg == "" {
5569 android.FailIfErrored(t, errs)
5570 } else if len(errs) > 0 {
5571 android.FailIfNoMatchingErrors(t, errmsg, errs)
5572 return
5573 } else {
5574 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5575 }
5576}
5577
Jooyung Han548640b2020-04-27 12:10:30 +09005578func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5579 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5580 apex {
5581 name: "myapex",
5582 key: "myapex.key",
5583 updatable: true,
5584 }
5585
5586 apex_key {
5587 name: "myapex.key",
5588 public_key: "testkey.avbpubkey",
5589 private_key: "testkey.pem",
5590 }
5591 `)
5592}
5593
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005594func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005595
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005596 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005597 var transform func(*dexpreopt.GlobalConfig)
5598
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005599 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5600 transform = func(config *dexpreopt.GlobalConfig) {
5601 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
5602 }
5603 testNoUpdatableJarsInBootImage(t, "", transform)
5604 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005605
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005606 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005607 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 +01005608 transform = func(config *dexpreopt.GlobalConfig) {
5609 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5610 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005611 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005612 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005613
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005614 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 -07005615 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 +01005616 transform = func(config *dexpreopt.GlobalConfig) {
5617 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5618 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005619 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005620 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005621
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005622 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 -07005623 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005624 transform = func(config *dexpreopt.GlobalConfig) {
5625 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5626 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005627 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005628 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005629
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005630 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 -07005631 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 +01005632 transform = func(config *dexpreopt.GlobalConfig) {
5633 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5634 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005635 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005636 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005637
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005638 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5639 transform = func(config *dexpreopt.GlobalConfig) {
5640 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5641 }
5642 testNoUpdatableJarsInBootImage(t, "", transform)
5643 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005644
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005645 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005646 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005647 transform = func(config *dexpreopt.GlobalConfig) {
5648 config.ArtApexJars = []string{"platform:nonexistent"}
5649 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005650 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005651 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005652
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005653 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005654 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005655 transform = func(config *dexpreopt.GlobalConfig) {
5656 config.BootJars = []string{"platform:nonexistent"}
5657 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005658 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005659 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005660
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005661 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005662 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005663 transform = func(config *dexpreopt.GlobalConfig) {
5664 config.ArtApexJars = []string{"platform:some-platform-lib"}
5665 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005666 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005667 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005668
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005669 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5670 transform = func(config *dexpreopt.GlobalConfig) {
5671 config.BootJars = []string{"platform:some-platform-lib"}
5672 }
5673 testNoUpdatableJarsInBootImage(t, "", transform)
5674 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005675}
5676
Jiyong Park62304bb2020-04-13 16:19:48 +09005677func TestTestFor(t *testing.T) {
5678 ctx, _ := testApex(t, `
5679 apex {
5680 name: "myapex",
5681 key: "myapex.key",
5682 native_shared_libs: ["mylib", "myprivlib"],
5683 }
5684
5685 apex_key {
5686 name: "myapex.key",
5687 public_key: "testkey.avbpubkey",
5688 private_key: "testkey.pem",
5689 }
5690
5691 cc_library {
5692 name: "mylib",
5693 srcs: ["mylib.cpp"],
5694 system_shared_libs: [],
5695 stl: "none",
5696 stubs: {
5697 versions: ["1"],
5698 },
5699 apex_available: ["myapex"],
5700 }
5701
5702 cc_library {
5703 name: "myprivlib",
5704 srcs: ["mylib.cpp"],
5705 system_shared_libs: [],
5706 stl: "none",
5707 apex_available: ["myapex"],
5708 }
5709
5710
5711 cc_test {
5712 name: "mytest",
5713 gtest: false,
5714 srcs: ["mylib.cpp"],
5715 system_shared_libs: [],
5716 stl: "none",
5717 shared_libs: ["mylib", "myprivlib"],
5718 test_for: ["myapex"]
5719 }
5720 `)
5721
5722 // the test 'mytest' is a test for the apex, therefore is linked to the
5723 // actual implementation of mylib instead of its stub.
5724 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5725 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5726 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5727}
5728
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005729// TODO(jungjw): Move this to proptools
5730func intPtr(i int) *int {
5731 return &i
5732}
5733
5734func TestApexSet(t *testing.T) {
5735 ctx, config := testApex(t, `
5736 apex_set {
5737 name: "myapex",
5738 set: "myapex.apks",
5739 filename: "foo_v2.apex",
5740 overrides: ["foo"],
5741 }
5742 `, func(fs map[string][]byte, config android.Config) {
5743 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5744 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5745 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5746 })
5747
5748 m := ctx.ModuleForTests("myapex", "android_common")
5749
5750 // Check extract_apks tool parameters.
5751 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5752 actual := extractedApex.Args["abis"]
5753 expected := "ARMEABI_V7A,ARM64_V8A"
5754 if actual != expected {
5755 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5756 }
5757 actual = extractedApex.Args["sdk-version"]
5758 expected = "30"
5759 if actual != expected {
5760 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5761 }
5762
5763 a := m.Module().(*ApexSet)
5764 expectedOverrides := []string{"foo"}
5765 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5766 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5767 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5768 }
5769}
5770
Jiyong Park7d95a512020-05-10 15:16:24 +09005771func TestNoStaticLinkingToStubsLib(t *testing.T) {
5772 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5773 apex {
5774 name: "myapex",
5775 key: "myapex.key",
5776 native_shared_libs: ["mylib"],
5777 }
5778
5779 apex_key {
5780 name: "myapex.key",
5781 public_key: "testkey.avbpubkey",
5782 private_key: "testkey.pem",
5783 }
5784
5785 cc_library {
5786 name: "mylib",
5787 srcs: ["mylib.cpp"],
5788 static_libs: ["otherlib"],
5789 system_shared_libs: [],
5790 stl: "none",
5791 apex_available: [ "myapex" ],
5792 }
5793
5794 cc_library {
5795 name: "otherlib",
5796 srcs: ["mylib.cpp"],
5797 system_shared_libs: [],
5798 stl: "none",
5799 stubs: {
5800 versions: ["1", "2", "3"],
5801 },
5802 apex_available: [ "myapex" ],
5803 }
5804 `)
5805}
5806
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005807func TestApexKeysTxt(t *testing.T) {
5808 ctx, _ := testApex(t, `
5809 apex {
5810 name: "myapex",
5811 key: "myapex.key",
5812 }
5813
5814 apex_key {
5815 name: "myapex.key",
5816 public_key: "testkey.avbpubkey",
5817 private_key: "testkey.pem",
5818 }
5819
5820 prebuilt_apex {
5821 name: "myapex",
5822 prefer: true,
5823 arch: {
5824 arm64: {
5825 src: "myapex-arm64.apex",
5826 },
5827 arm: {
5828 src: "myapex-arm.apex",
5829 },
5830 },
5831 }
5832
5833 apex_set {
5834 name: "myapex_set",
5835 set: "myapex.apks",
5836 filename: "myapex_set.apex",
5837 overrides: ["myapex"],
5838 }
5839 `)
5840
5841 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5842 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5843 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 +09005844 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 +09005845}
5846
Jooyung Han938b5932020-06-20 12:47:47 +09005847func TestAllowedFiles(t *testing.T) {
5848 ctx, _ := testApex(t, `
5849 apex {
5850 name: "myapex",
5851 key: "myapex.key",
5852 apps: ["app"],
5853 allowed_files: "allowed.txt",
5854 }
5855
5856 apex_key {
5857 name: "myapex.key",
5858 public_key: "testkey.avbpubkey",
5859 private_key: "testkey.pem",
5860 }
5861
5862 android_app {
5863 name: "app",
5864 srcs: ["foo/bar/MyClass.java"],
5865 package_name: "foo",
5866 sdk_version: "none",
5867 system_modules: "none",
5868 apex_available: [ "myapex" ],
5869 }
5870 `, withFiles(map[string][]byte{
5871 "sub/Android.bp": []byte(`
5872 override_apex {
5873 name: "override_myapex",
5874 base: "myapex",
5875 apps: ["override_app"],
5876 allowed_files: ":allowed",
5877 }
5878 // Overridable "path" property should be referenced indirectly
5879 filegroup {
5880 name: "allowed",
5881 srcs: ["allowed.txt"],
5882 }
5883 override_android_app {
5884 name: "override_app",
5885 base: "app",
5886 package_name: "bar",
5887 }
5888 `),
5889 }))
5890
5891 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5892 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5893 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5894 }
5895
5896 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5897 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5898 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5899 }
5900}
5901
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005902func TestNonPreferredPrebuiltDependency(t *testing.T) {
5903 _, _ = testApex(t, `
5904 apex {
5905 name: "myapex",
5906 key: "myapex.key",
5907 native_shared_libs: ["mylib"],
5908 }
5909
5910 apex_key {
5911 name: "myapex.key",
5912 public_key: "testkey.avbpubkey",
5913 private_key: "testkey.pem",
5914 }
5915
5916 cc_library {
5917 name: "mylib",
5918 srcs: ["mylib.cpp"],
5919 stubs: {
5920 versions: ["10000"],
5921 },
5922 apex_available: ["myapex"],
5923 }
5924
5925 cc_prebuilt_library_shared {
5926 name: "mylib",
5927 prefer: false,
5928 srcs: ["prebuilt.so"],
5929 stubs: {
5930 versions: ["10000"],
5931 },
5932 apex_available: ["myapex"],
5933 }
5934 `)
5935}
5936
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005937func TestMain(m *testing.M) {
5938 run := func() int {
5939 setUp()
5940 defer tearDown()
5941
5942 return m.Run()
5943 }
5944
5945 os.Exit(run())
5946}