blob: 690c2f5fde42a9c5494e037f8ac9e52d6ddef37a [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",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700415 apex_available: [ "myapex", "com.android.gki.*" ],
416 }
417
418 apex {
419 name: "com.android.gki.fake",
420 binaries: ["foo"],
421 key: "myapex.key",
422 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800423 }
424
Paul Duffindddd5462020-04-07 15:25:44 +0100425 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900426 name: "mylib2",
427 srcs: ["mylib.cpp"],
428 system_shared_libs: [],
429 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900430 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900431 static_libs: ["libstatic"],
432 // TODO: remove //apex_available:platform
433 apex_available: [
434 "//apex_available:platform",
435 "myapex",
436 ],
437 }
438
Paul Duffindddd5462020-04-07 15:25:44 +0100439 cc_prebuilt_library_shared {
440 name: "mylib2",
441 srcs: ["prebuilt.so"],
442 // TODO: remove //apex_available:platform
443 apex_available: [
444 "//apex_available:platform",
445 "myapex",
446 ],
447 }
448
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 cc_library_static {
450 name: "libstatic",
451 srcs: ["mylib.cpp"],
452 system_shared_libs: [],
453 stl: "none",
454 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000455 // TODO: remove //apex_available:platform
456 apex_available: [
457 "//apex_available:platform",
458 "myapex",
459 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900460 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461
462 java_library {
463 name: "myjar",
464 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900465 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 sdk_version: "none",
467 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900469 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475 }
476
Jiyong Park77acec62020-06-01 21:39:15 +0900477 dex_import {
478 name: "myjar_dex",
479 jars: ["prebuilt.jar"],
480 apex_available: [
481 "//apex_available:platform",
482 "myapex",
483 ],
484 }
485
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 java_library {
487 name: "myotherjar",
488 srcs: ["foo/bar/MyClass.java"],
489 sdk_version: "none",
490 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900491 // TODO: remove //apex_available:platform
492 apex_available: [
493 "//apex_available:platform",
494 "myapex",
495 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900496 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900497
498 java_library {
499 name: "mysharedjar",
500 srcs: ["foo/bar/MyClass.java"],
501 sdk_version: "none",
502 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900503 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900504 `)
505
Sundong Ahnabb64432019-10-22 13:58:29 +0900506 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900507
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900508 // Make sure that Android.mk is created
509 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
510 data := android.AndroidMkDataForTest(t, config, "", ab)
511 var builder strings.Builder
512 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
513
514 androidMk := builder.String()
515 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
516 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
517
Jiyong Park42cca6c2019-04-01 11:15:50 +0900518 optFlags := apexRule.Args["opt_flags"]
519 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700520 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900521 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park25fc6a92018-11-18 18:02:45 +0900523 copyCmds := apexRule.Args["copy_commands"]
524
525 // Ensure that main rule creates an output
526 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
527
528 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800529 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900530 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900531 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900532
533 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800534 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900535 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800538 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
539 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900540 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900541 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900542 // .. but not for java libs
543 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900544 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800545
Colin Cross7113d202019-11-20 16:39:12 -0800546 // Ensure that the platform variant ends with _shared or _common
547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
548 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
550 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
552
553 // Ensure that dynamic dependency to java libs are not included
554 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800555
556 // Ensure that all symlinks are present.
557 found_foo_link_64 := false
558 found_foo := false
559 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900560 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800561 if strings.HasSuffix(cmd, "bin/foo") {
562 found_foo = true
563 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
564 found_foo_link_64 = true
565 }
566 }
567 }
568 good := found_foo && found_foo_link_64
569 if !good {
570 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
571 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900572
Sundong Ahnabb64432019-10-22 13:58:29 +0900573 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700574 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900575 if len(noticeInputs) != 3 {
576 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900577 }
578 ensureListContains(t, noticeInputs, "NOTICE")
579 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900580 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900581
Artur Satayeva8bd1132020-04-27 18:07:06 +0100582 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000583 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
584 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
585 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
586 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
587 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100588
589 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000590 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
591 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
592 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
593 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
594 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800595}
596
Jooyung Hanf21c7972019-12-16 22:32:06 +0900597func TestDefaults(t *testing.T) {
598 ctx, _ := testApex(t, `
599 apex_defaults {
600 name: "myapex-defaults",
601 key: "myapex.key",
602 prebuilts: ["myetc"],
603 native_shared_libs: ["mylib"],
604 java_libs: ["myjar"],
605 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900606 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 }
608
609 prebuilt_etc {
610 name: "myetc",
611 src: "myprebuilt",
612 }
613
614 apex {
615 name: "myapex",
616 defaults: ["myapex-defaults"],
617 }
618
619 apex_key {
620 name: "myapex.key",
621 public_key: "testkey.avbpubkey",
622 private_key: "testkey.pem",
623 }
624
625 cc_library {
626 name: "mylib",
627 system_shared_libs: [],
628 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000629 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900630 }
631
632 java_library {
633 name: "myjar",
634 srcs: ["foo/bar/MyClass.java"],
635 sdk_version: "none",
636 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000637 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900638 }
639
640 android_app {
641 name: "AppFoo",
642 srcs: ["foo/bar/MyClass.java"],
643 sdk_version: "none",
644 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900647
648 runtime_resource_overlay {
649 name: "rro",
650 theme: "blue",
651 }
652
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000654 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 "etc/myetc",
656 "javalib/myjar.jar",
657 "lib64/mylib.so",
658 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900659 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 })
661}
662
Jooyung Han01a3ee22019-11-02 02:52:25 +0900663func TestApexManifest(t *testing.T) {
664 ctx, _ := testApex(t, `
665 apex {
666 name: "myapex",
667 key: "myapex.key",
668 }
669
670 apex_key {
671 name: "myapex.key",
672 public_key: "testkey.avbpubkey",
673 private_key: "testkey.pem",
674 }
675 `)
676
677 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900678 args := module.Rule("apexRule").Args
679 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
680 t.Error("manifest should be apex_manifest.pb, but " + manifest)
681 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900682}
683
Alex Light5098a612018-11-29 17:12:15 -0800684func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700685 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800686 apex {
687 name: "myapex",
688 key: "myapex.key",
689 payload_type: "zip",
690 native_shared_libs: ["mylib"],
691 }
692
693 apex_key {
694 name: "myapex.key",
695 public_key: "testkey.avbpubkey",
696 private_key: "testkey.pem",
697 }
698
699 cc_library {
700 name: "mylib",
701 srcs: ["mylib.cpp"],
702 shared_libs: ["mylib2"],
703 system_shared_libs: [],
704 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000705 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800706 }
707
708 cc_library {
709 name: "mylib2",
710 srcs: ["mylib.cpp"],
711 system_shared_libs: [],
712 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000713 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800714 }
715 `)
716
Sundong Ahnabb64432019-10-22 13:58:29 +0900717 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800718 copyCmds := zipApexRule.Args["copy_commands"]
719
720 // Ensure that main rule creates an output
721 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
722
723 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800724 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800725
726 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800727 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800728
729 // Ensure that both direct and indirect deps are copied into apex
730 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
731 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900732}
733
734func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700735 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900736 apex {
737 name: "myapex",
738 key: "myapex.key",
739 native_shared_libs: ["mylib", "mylib3"],
740 }
741
742 apex_key {
743 name: "myapex.key",
744 public_key: "testkey.avbpubkey",
745 private_key: "testkey.pem",
746 }
747
748 cc_library {
749 name: "mylib",
750 srcs: ["mylib.cpp"],
751 shared_libs: ["mylib2", "mylib3"],
752 system_shared_libs: [],
753 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000754 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900755 }
756
757 cc_library {
758 name: "mylib2",
759 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900760 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900761 system_shared_libs: [],
762 stl: "none",
763 stubs: {
764 versions: ["1", "2", "3"],
765 },
766 }
767
768 cc_library {
769 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900770 srcs: ["mylib.cpp"],
771 shared_libs: ["mylib4"],
772 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773 stl: "none",
774 stubs: {
775 versions: ["10", "11", "12"],
776 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000777 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900778 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900779
780 cc_library {
781 name: "mylib4",
782 srcs: ["mylib.cpp"],
783 system_shared_libs: [],
784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000785 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900786 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900787 `)
788
Sundong Ahnabb64432019-10-22 13:58:29 +0900789 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 copyCmds := apexRule.Args["copy_commands"]
791
792 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800793 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900794
795 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800796 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797
798 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800799 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900800
Colin Cross7113d202019-11-20 16:39:12 -0800801 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802
803 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900804 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900805 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900806 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807
808 // 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 -0800809 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900810 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800811 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900812
813 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900814 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900815 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900816
817 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900818 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900819
Jooyung Hana57af4a2020-01-23 05:36:59 +0000820 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900821 "lib64/mylib.so",
822 "lib64/mylib3.so",
823 "lib64/mylib4.so",
824 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900825}
826
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900827func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700828 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900830 name: "myapex2",
831 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900832 native_shared_libs: ["mylib"],
833 }
834
835 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900836 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900837 public_key: "testkey.avbpubkey",
838 private_key: "testkey.pem",
839 }
840
841 cc_library {
842 name: "mylib",
843 srcs: ["mylib.cpp"],
844 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900845 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900846 system_shared_libs: [],
847 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000848 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900849 }
850
851 cc_library {
852 name: "libfoo",
853 srcs: ["mylib.cpp"],
854 shared_libs: ["libbar"],
855 system_shared_libs: [],
856 stl: "none",
857 stubs: {
858 versions: ["10", "20", "30"],
859 },
860 }
861
862 cc_library {
863 name: "libbar",
864 srcs: ["mylib.cpp"],
865 system_shared_libs: [],
866 stl: "none",
867 }
868
Jiyong Park678c8812020-02-07 17:25:49 +0900869 cc_library_static {
870 name: "libbaz",
871 srcs: ["mylib.cpp"],
872 system_shared_libs: [],
873 stl: "none",
874 apex_available: [ "myapex2" ],
875 }
876
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900877 `)
878
Jiyong Park83dc74b2020-01-14 18:38:44 +0900879 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900880 copyCmds := apexRule.Args["copy_commands"]
881
882 // Ensure that direct non-stubs dep is always included
883 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
884
885 // Ensure that indirect stubs dep is not included
886 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
887
888 // Ensure that dependency of stubs is not included
889 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
890
Jiyong Park83dc74b2020-01-14 18:38:44 +0900891 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892
893 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900894 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900895 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900896 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900897
Jiyong Park3ff16992019-12-27 14:11:47 +0900898 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900899
900 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
901 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900902
Artur Satayeva8bd1132020-04-27 18:07:06 +0100903 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000904 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
905 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
906 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900907
Artur Satayeva8bd1132020-04-27 18:07:06 +0100908 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000909 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
910 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
911 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900912}
913
Jooyung Hand3639552019-08-09 12:57:43 +0900914func TestApexWithRuntimeLibsDependency(t *testing.T) {
915 /*
916 myapex
917 |
918 v (runtime_libs)
919 mylib ------+------> libfoo [provides stub]
920 |
921 `------> libbar
922 */
923 ctx, _ := testApex(t, `
924 apex {
925 name: "myapex",
926 key: "myapex.key",
927 native_shared_libs: ["mylib"],
928 }
929
930 apex_key {
931 name: "myapex.key",
932 public_key: "testkey.avbpubkey",
933 private_key: "testkey.pem",
934 }
935
936 cc_library {
937 name: "mylib",
938 srcs: ["mylib.cpp"],
939 runtime_libs: ["libfoo", "libbar"],
940 system_shared_libs: [],
941 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000942 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900943 }
944
945 cc_library {
946 name: "libfoo",
947 srcs: ["mylib.cpp"],
948 system_shared_libs: [],
949 stl: "none",
950 stubs: {
951 versions: ["10", "20", "30"],
952 },
953 }
954
955 cc_library {
956 name: "libbar",
957 srcs: ["mylib.cpp"],
958 system_shared_libs: [],
959 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000960 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900961 }
962
963 `)
964
Sundong Ahnabb64432019-10-22 13:58:29 +0900965 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900966 copyCmds := apexRule.Args["copy_commands"]
967
968 // Ensure that direct non-stubs dep is always included
969 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
970
971 // Ensure that indirect stubs dep is not included
972 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
973
974 // Ensure that runtime_libs dep in included
975 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
976
Sundong Ahnabb64432019-10-22 13:58:29 +0900977 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900978 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
979 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900980
981}
982
Jooyung Han8ce8db92020-05-15 19:05:05 +0900983func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
984 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
985 bp := `
986 apex {
987 name: "com.android.runtime",
988 key: "com.android.runtime.key",
989 native_shared_libs: ["libc"],
990 }
991
992 apex_key {
993 name: "com.android.runtime.key",
994 public_key: "testkey.avbpubkey",
995 private_key: "testkey.pem",
996 }
997
998 cc_library {
999 name: "libc",
1000 no_libcrt: true,
1001 nocrt: true,
1002 stl: "none",
1003 system_shared_libs: [],
1004 stubs: { versions: ["1"] },
1005 apex_available: ["com.android.runtime"],
1006
1007 sanitize: {
1008 hwaddress: true,
1009 }
1010 }
1011
1012 cc_prebuilt_library_shared {
1013 name: "libclang_rt.hwasan-aarch64-android",
1014 no_libcrt: true,
1015 nocrt: true,
1016 stl: "none",
1017 system_shared_libs: [],
1018 srcs: [""],
1019 stubs: { versions: ["1"] },
1020
1021 sanitize: {
1022 never: true,
1023 },
1024 }
1025 `
1026 // override bp to use hard-coded names: com.android.runtime and libc
1027 fs["Android.bp"] = []byte(bp)
1028 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1029 })
1030
1031 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1032 "lib64/bionic/libc.so",
1033 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1034 })
1035
1036 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1037
1038 installed := hwasan.Description("install libclang_rt.hwasan")
1039 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1040
1041 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1042 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1043 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1044}
1045
1046func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1047 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1048 bp := `
1049 apex {
1050 name: "com.android.runtime",
1051 key: "com.android.runtime.key",
1052 native_shared_libs: ["libc"],
1053 }
1054
1055 apex_key {
1056 name: "com.android.runtime.key",
1057 public_key: "testkey.avbpubkey",
1058 private_key: "testkey.pem",
1059 }
1060
1061 cc_library {
1062 name: "libc",
1063 no_libcrt: true,
1064 nocrt: true,
1065 stl: "none",
1066 system_shared_libs: [],
1067 stubs: { versions: ["1"] },
1068 apex_available: ["com.android.runtime"],
1069 }
1070
1071 cc_prebuilt_library_shared {
1072 name: "libclang_rt.hwasan-aarch64-android",
1073 no_libcrt: true,
1074 nocrt: true,
1075 stl: "none",
1076 system_shared_libs: [],
1077 srcs: [""],
1078 stubs: { versions: ["1"] },
1079
1080 sanitize: {
1081 never: true,
1082 },
1083 }
1084 `
1085 // override bp to use hard-coded names: com.android.runtime and libc
1086 fs["Android.bp"] = []byte(bp)
1087 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1088
1089 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1090 })
1091
1092 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1093 "lib64/bionic/libc.so",
1094 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1095 })
1096
1097 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1098
1099 installed := hwasan.Description("install libclang_rt.hwasan")
1100 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1101
1102 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1103 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1104 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1105}
1106
Jooyung Han61b66e92020-03-21 14:21:46 +00001107func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1108 testcases := []struct {
1109 name string
1110 minSdkVersion string
1111 shouldLink string
1112 shouldNotLink []string
1113 }{
1114 {
Jooyung Han75568392020-03-20 04:29:24 +09001115 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001116 minSdkVersion: "",
Jooyung Han61b66e92020-03-21 14:21:46 +00001117 shouldLink: "30",
1118 shouldNotLink: []string{"29"},
1119 },
1120 {
1121 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001122 minSdkVersion: "min_sdk_version: \"29\",",
Jooyung Han61b66e92020-03-21 14:21:46 +00001123 shouldLink: "29",
1124 shouldNotLink: []string{"30"},
1125 },
1126 }
1127 for _, tc := range testcases {
1128 t.Run(tc.name, func(t *testing.T) {
1129 ctx, _ := testApex(t, `
1130 apex {
1131 name: "myapex",
1132 key: "myapex.key",
1133 use_vendor: true,
1134 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001135 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001136 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001137
Jooyung Han61b66e92020-03-21 14:21:46 +00001138 apex_key {
1139 name: "myapex.key",
1140 public_key: "testkey.avbpubkey",
1141 private_key: "testkey.pem",
1142 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001143
Jooyung Han61b66e92020-03-21 14:21:46 +00001144 cc_library {
1145 name: "mylib",
1146 srcs: ["mylib.cpp"],
1147 vendor_available: true,
1148 shared_libs: ["libbar"],
1149 system_shared_libs: [],
1150 stl: "none",
1151 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001152 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001153 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001154
Jooyung Han61b66e92020-03-21 14:21:46 +00001155 cc_library {
1156 name: "libbar",
1157 srcs: ["mylib.cpp"],
1158 system_shared_libs: [],
1159 stl: "none",
1160 stubs: { versions: ["29","30"] },
1161 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001162
Jooyung Han61b66e92020-03-21 14:21:46 +00001163 llndk_library {
1164 name: "libbar",
1165 symbol_file: "",
1166 }
1167 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001168 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001169 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001170
Jooyung Han61b66e92020-03-21 14:21:46 +00001171 // Ensure that LLNDK dep is not included
1172 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1173 "lib64/mylib.so",
1174 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001175
Jooyung Han61b66e92020-03-21 14:21:46 +00001176 // Ensure that LLNDK dep is required
1177 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1178 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1179 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001180
Jooyung Han61b66e92020-03-21 14:21:46 +00001181 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1182 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1183 for _, ver := range tc.shouldNotLink {
1184 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1185 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001186
Jooyung Han61b66e92020-03-21 14:21:46 +00001187 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1188 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1189 })
1190 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001191}
1192
Jiyong Park25fc6a92018-11-18 18:02:45 +09001193func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001194 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001195 apex {
1196 name: "myapex",
1197 key: "myapex.key",
1198 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1199 }
1200
1201 apex_key {
1202 name: "myapex.key",
1203 public_key: "testkey.avbpubkey",
1204 private_key: "testkey.pem",
1205 }
1206
1207 cc_library {
1208 name: "mylib",
1209 srcs: ["mylib.cpp"],
1210 shared_libs: ["libdl#27"],
1211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001212 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001213 }
1214
1215 cc_library_shared {
1216 name: "mylib_shared",
1217 srcs: ["mylib.cpp"],
1218 shared_libs: ["libdl#27"],
1219 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001220 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001221 }
1222
1223 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001224 name: "libBootstrap",
1225 srcs: ["mylib.cpp"],
1226 stl: "none",
1227 bootstrap: true,
1228 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001229 `)
1230
Sundong Ahnabb64432019-10-22 13:58:29 +09001231 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001232 copyCmds := apexRule.Args["copy_commands"]
1233
1234 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001235 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001236 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1237 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001238
1239 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001240 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001241
Colin Cross7113d202019-11-20 16:39:12 -08001242 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1243 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1244 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001245
1246 // For dependency to libc
1247 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001248 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001249 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001250 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001251 // ... Cflags from stub is correctly exported to mylib
1252 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1253 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1254
1255 // For dependency to libm
1256 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001257 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001258 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001259 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260 // ... and is not compiling with the stub
1261 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1262 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1263
1264 // For dependency to libdl
1265 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001266 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001267 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001268 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1269 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001270 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001271 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001272 // ... Cflags from stub is correctly exported to mylib
1273 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1274 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001275
1276 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001277 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1278 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1279 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1280 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001281}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001282
Jooyung Han749dc692020-04-15 11:03:39 +09001283func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001284 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001285 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1286 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001287 // 3) (platform) -> liba -> libz : this should be non-stub link
1288 ctx, _ := testApex(t, `
1289 apex {
1290 name: "myapex",
1291 key: "myapex.key",
1292 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001293 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001294 }
1295
1296 apex {
1297 name: "otherapex",
1298 key: "myapex.key",
1299 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001300 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001301 }
1302
1303 apex_key {
1304 name: "myapex.key",
1305 public_key: "testkey.avbpubkey",
1306 private_key: "testkey.pem",
1307 }
1308
1309 cc_library {
1310 name: "libx",
1311 shared_libs: ["liba"],
1312 system_shared_libs: [],
1313 stl: "none",
1314 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001315 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001316 }
1317
1318 cc_library {
1319 name: "liby",
1320 shared_libs: ["liba"],
1321 system_shared_libs: [],
1322 stl: "none",
1323 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001324 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001325 }
1326
1327 cc_library {
1328 name: "liba",
1329 shared_libs: ["libz"],
1330 system_shared_libs: [],
1331 stl: "none",
1332 apex_available: [
1333 "//apex_available:anyapex",
1334 "//apex_available:platform",
1335 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001336 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001337 }
1338
1339 cc_library {
1340 name: "libz",
1341 system_shared_libs: [],
1342 stl: "none",
1343 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001344 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001345 },
1346 }
Jooyung Han749dc692020-04-15 11:03:39 +09001347 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001348
1349 expectLink := func(from, from_variant, to, to_variant string) {
1350 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1351 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1352 }
1353 expectNoLink := func(from, from_variant, to, to_variant string) {
1354 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1355 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1356 }
1357 // platform liba is linked to non-stub version
1358 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001359 // liba in myapex is linked to #28
1360 expectLink("liba", "shared_myapex", "libz", "shared_28")
1361 expectNoLink("liba", "shared_myapex", "libz", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001362 expectNoLink("liba", "shared_myapex", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001363 // liba in otherapex is linked to #30
1364 expectLink("liba", "shared_otherapex", "libz", "shared_30")
1365 expectNoLink("liba", "shared_otherapex", "libz", "shared_28")
Jooyung Han03b51852020-02-26 22:45:42 +09001366 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1367}
1368
Jooyung Hanaed150d2020-04-02 01:41:41 +09001369func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1370 ctx, _ := testApex(t, `
1371 apex {
1372 name: "myapex",
1373 key: "myapex.key",
1374 native_shared_libs: ["libx"],
1375 min_sdk_version: "R",
1376 }
1377
1378 apex_key {
1379 name: "myapex.key",
1380 public_key: "testkey.avbpubkey",
1381 private_key: "testkey.pem",
1382 }
1383
1384 cc_library {
1385 name: "libx",
1386 shared_libs: ["libz"],
1387 system_shared_libs: [],
1388 stl: "none",
1389 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001390 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001391 }
1392
1393 cc_library {
1394 name: "libz",
1395 system_shared_libs: [],
1396 stl: "none",
1397 stubs: {
1398 versions: ["29", "R"],
1399 },
1400 }
1401 `, func(fs map[string][]byte, config android.Config) {
1402 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1403 })
1404
1405 expectLink := func(from, from_variant, to, to_variant string) {
1406 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1407 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1408 }
1409 expectNoLink := func(from, from_variant, to, to_variant string) {
1410 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1411 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1412 }
1413 // 9000 is quite a magic number.
1414 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1415 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1416 // to distinguish them from finalized and future_api(10000)
1417 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1418 // (refer android/api_levels.go)
1419 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1420 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1421 expectNoLink("libx", "shared_myapex", "libz", "shared")
1422}
1423
Jooyung Han749dc692020-04-15 11:03:39 +09001424func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001425 ctx, _ := testApex(t, `
1426 apex {
1427 name: "myapex",
1428 key: "myapex.key",
1429 native_shared_libs: ["libx"],
1430 }
1431
1432 apex_key {
1433 name: "myapex.key",
1434 public_key: "testkey.avbpubkey",
1435 private_key: "testkey.pem",
1436 }
1437
1438 cc_library {
1439 name: "libx",
1440 shared_libs: ["libz"],
1441 system_shared_libs: [],
1442 stl: "none",
1443 apex_available: [ "myapex" ],
1444 }
1445
1446 cc_library {
1447 name: "libz",
1448 system_shared_libs: [],
1449 stl: "none",
1450 stubs: {
1451 versions: ["1", "2"],
1452 },
1453 }
1454 `)
1455
1456 expectLink := func(from, from_variant, to, to_variant string) {
1457 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1458 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1459 }
1460 expectNoLink := func(from, from_variant, to, to_variant string) {
1461 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1462 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1463 }
1464 expectLink("libx", "shared_myapex", "libz", "shared_2")
1465 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1466 expectNoLink("libx", "shared_myapex", "libz", "shared")
1467}
1468
1469func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1470 ctx, _ := testApex(t, `
1471 apex {
1472 name: "myapex",
1473 key: "myapex.key",
1474 native_shared_libs: ["libx"],
1475 }
1476
1477 apex_key {
1478 name: "myapex.key",
1479 public_key: "testkey.avbpubkey",
1480 private_key: "testkey.pem",
1481 }
1482
1483 cc_library {
1484 name: "libx",
1485 system_shared_libs: [],
1486 stl: "none",
1487 apex_available: [ "myapex" ],
1488 stubs: {
1489 versions: ["1", "2"],
1490 },
1491 }
1492
1493 cc_library {
1494 name: "libz",
1495 shared_libs: ["libx"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 }
1499 `)
1500
1501 expectLink := func(from, from_variant, to, to_variant string) {
1502 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1503 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1504 }
1505 expectNoLink := func(from, from_variant, to, to_variant string) {
1506 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1507 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1508 }
1509 expectLink("libz", "shared", "libx", "shared_2")
1510 expectNoLink("libz", "shared", "libz", "shared_1")
1511 expectNoLink("libz", "shared", "libz", "shared")
1512}
1513
Jooyung Han75568392020-03-20 04:29:24 +09001514func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001515 ctx, _ := testApex(t, `
1516 apex {
1517 name: "myapex",
1518 key: "myapex.key",
1519 native_shared_libs: ["libx"],
1520 min_sdk_version: "29",
1521 }
1522
1523 apex_key {
1524 name: "myapex.key",
1525 public_key: "testkey.avbpubkey",
1526 private_key: "testkey.pem",
1527 }
1528
1529 cc_library {
1530 name: "libx",
1531 shared_libs: ["libbar"],
1532 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001533 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001534 }
1535
1536 cc_library {
1537 name: "libbar",
1538 stubs: {
1539 versions: ["29", "30"],
1540 },
1541 }
Jooyung Han75568392020-03-20 04:29:24 +09001542 `, func(fs map[string][]byte, config android.Config) {
1543 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1544 })
Jooyung Han03b51852020-02-26 22:45:42 +09001545 expectLink := func(from, from_variant, to, to_variant string) {
1546 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1547 libFlags := ld.Args["libFlags"]
1548 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1549 }
Jooyung Han75568392020-03-20 04:29:24 +09001550 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001551}
1552
Jooyung Han75568392020-03-20 04:29:24 +09001553func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001554 ctx, _ := testApex(t, `
1555 apex {
1556 name: "myapex",
1557 key: "myapex.key",
1558 native_shared_libs: ["libx"],
1559 min_sdk_version: "29",
1560 }
1561
1562 apex_key {
1563 name: "myapex.key",
1564 public_key: "testkey.avbpubkey",
1565 private_key: "testkey.pem",
1566 }
1567
1568 cc_library {
1569 name: "libx",
1570 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001571 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001572 }
Jooyung Han75568392020-03-20 04:29:24 +09001573 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001574
1575 // ensure apex variant of c++ is linked with static unwinder
1576 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1577 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1578 // note that platform variant is not.
1579 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1580 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001581}
1582
Jooyung Han749dc692020-04-15 11:03:39 +09001583func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001584 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001585 apex {
1586 name: "myapex",
1587 key: "myapex.key",
1588 native_shared_libs: ["libx"],
1589 min_sdk_version: "29",
1590 }
1591
1592 apex_key {
1593 name: "myapex.key",
1594 public_key: "testkey.avbpubkey",
1595 private_key: "testkey.pem",
1596 }
1597
1598 cc_library {
1599 name: "libx",
1600 shared_libs: ["libz"],
1601 system_shared_libs: [],
1602 stl: "none",
1603 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001604 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001605 }
1606
1607 cc_library {
1608 name: "libz",
1609 system_shared_libs: [],
1610 stl: "none",
1611 stubs: {
1612 versions: ["30"],
1613 },
1614 }
Jooyung Han75568392020-03-20 04:29:24 +09001615 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001616}
Jooyung Han03b51852020-02-26 22:45:42 +09001617
Jooyung Han749dc692020-04-15 11:03:39 +09001618func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1619 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001620 apex {
1621 name: "myapex",
1622 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001623 native_shared_libs: ["mylib"],
1624 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001625 }
1626
1627 apex_key {
1628 name: "myapex.key",
1629 public_key: "testkey.avbpubkey",
1630 private_key: "testkey.pem",
1631 }
Jooyung Han749dc692020-04-15 11:03:39 +09001632
1633 cc_library {
1634 name: "mylib",
1635 srcs: ["mylib.cpp"],
1636 system_shared_libs: [],
1637 stl: "none",
1638 apex_available: [
1639 "myapex",
1640 ],
1641 min_sdk_version: "30",
1642 }
1643 `)
1644}
1645
1646func TestApexMinSdkVersion_Okay(t *testing.T) {
1647 testApex(t, `
1648 apex {
1649 name: "myapex",
1650 key: "myapex.key",
1651 native_shared_libs: ["libfoo"],
1652 java_libs: ["libbar"],
1653 min_sdk_version: "29",
1654 }
1655
1656 apex_key {
1657 name: "myapex.key",
1658 public_key: "testkey.avbpubkey",
1659 private_key: "testkey.pem",
1660 }
1661
1662 cc_library {
1663 name: "libfoo",
1664 srcs: ["mylib.cpp"],
1665 shared_libs: ["libfoo_dep"],
1666 apex_available: ["myapex"],
1667 min_sdk_version: "29",
1668 }
1669
1670 cc_library {
1671 name: "libfoo_dep",
1672 srcs: ["mylib.cpp"],
1673 apex_available: ["myapex"],
1674 min_sdk_version: "29",
1675 }
1676
1677 java_library {
1678 name: "libbar",
1679 sdk_version: "current",
1680 srcs: ["a.java"],
1681 static_libs: ["libbar_dep"],
1682 apex_available: ["myapex"],
1683 min_sdk_version: "29",
1684 }
1685
1686 java_library {
1687 name: "libbar_dep",
1688 sdk_version: "current",
1689 srcs: ["a.java"],
1690 apex_available: ["myapex"],
1691 min_sdk_version: "29",
1692 }
Jooyung Han03b51852020-02-26 22:45:42 +09001693 `)
1694}
1695
Artur Satayev8cf899a2020-04-15 17:29:42 +01001696func TestJavaStableSdkVersion(t *testing.T) {
1697 testCases := []struct {
1698 name string
1699 expectedError string
1700 bp string
1701 }{
1702 {
1703 name: "Non-updatable apex with non-stable dep",
1704 bp: `
1705 apex {
1706 name: "myapex",
1707 java_libs: ["myjar"],
1708 key: "myapex.key",
1709 }
1710 apex_key {
1711 name: "myapex.key",
1712 public_key: "testkey.avbpubkey",
1713 private_key: "testkey.pem",
1714 }
1715 java_library {
1716 name: "myjar",
1717 srcs: ["foo/bar/MyClass.java"],
1718 sdk_version: "core_platform",
1719 apex_available: ["myapex"],
1720 }
1721 `,
1722 },
1723 {
1724 name: "Updatable apex with stable dep",
1725 bp: `
1726 apex {
1727 name: "myapex",
1728 java_libs: ["myjar"],
1729 key: "myapex.key",
1730 updatable: true,
1731 min_sdk_version: "29",
1732 }
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738 java_library {
1739 name: "myjar",
1740 srcs: ["foo/bar/MyClass.java"],
1741 sdk_version: "current",
1742 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001743 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001744 }
1745 `,
1746 },
1747 {
1748 name: "Updatable apex with non-stable dep",
1749 expectedError: "cannot depend on \"myjar\"",
1750 bp: `
1751 apex {
1752 name: "myapex",
1753 java_libs: ["myjar"],
1754 key: "myapex.key",
1755 updatable: true,
1756 }
1757 apex_key {
1758 name: "myapex.key",
1759 public_key: "testkey.avbpubkey",
1760 private_key: "testkey.pem",
1761 }
1762 java_library {
1763 name: "myjar",
1764 srcs: ["foo/bar/MyClass.java"],
1765 sdk_version: "core_platform",
1766 apex_available: ["myapex"],
1767 }
1768 `,
1769 },
1770 {
1771 name: "Updatable apex with non-stable transitive dep",
1772 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1773 bp: `
1774 apex {
1775 name: "myapex",
1776 java_libs: ["myjar"],
1777 key: "myapex.key",
1778 updatable: true,
1779 }
1780 apex_key {
1781 name: "myapex.key",
1782 public_key: "testkey.avbpubkey",
1783 private_key: "testkey.pem",
1784 }
1785 java_library {
1786 name: "myjar",
1787 srcs: ["foo/bar/MyClass.java"],
1788 sdk_version: "current",
1789 apex_available: ["myapex"],
1790 static_libs: ["transitive-jar"],
1791 }
1792 java_library {
1793 name: "transitive-jar",
1794 srcs: ["foo/bar/MyClass.java"],
1795 sdk_version: "core_platform",
1796 apex_available: ["myapex"],
1797 }
1798 `,
1799 },
1800 }
1801
1802 for _, test := range testCases {
1803 t.Run(test.name, func(t *testing.T) {
1804 if test.expectedError == "" {
1805 testApex(t, test.bp)
1806 } else {
1807 testApexError(t, test.expectedError, test.bp)
1808 }
1809 })
1810 }
1811}
1812
Jooyung Han749dc692020-04-15 11:03:39 +09001813func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1814 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1815 apex {
1816 name: "myapex",
1817 key: "myapex.key",
1818 native_shared_libs: ["mylib"],
1819 min_sdk_version: "29",
1820 }
1821
1822 apex_key {
1823 name: "myapex.key",
1824 public_key: "testkey.avbpubkey",
1825 private_key: "testkey.pem",
1826 }
1827
1828 cc_library {
1829 name: "mylib",
1830 srcs: ["mylib.cpp"],
1831 shared_libs: ["mylib2"],
1832 system_shared_libs: [],
1833 stl: "none",
1834 apex_available: [
1835 "myapex",
1836 ],
1837 min_sdk_version: "29",
1838 }
1839
1840 // indirect part of the apex
1841 cc_library {
1842 name: "mylib2",
1843 srcs: ["mylib.cpp"],
1844 system_shared_libs: [],
1845 stl: "none",
1846 apex_available: [
1847 "myapex",
1848 ],
1849 min_sdk_version: "30",
1850 }
1851 `)
1852}
1853
1854func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1855 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1856 apex {
1857 name: "myapex",
1858 key: "myapex.key",
1859 apps: ["AppFoo"],
1860 min_sdk_version: "29",
1861 }
1862
1863 apex_key {
1864 name: "myapex.key",
1865 public_key: "testkey.avbpubkey",
1866 private_key: "testkey.pem",
1867 }
1868
1869 android_app {
1870 name: "AppFoo",
1871 srcs: ["foo/bar/MyClass.java"],
1872 sdk_version: "current",
1873 min_sdk_version: "29",
1874 system_modules: "none",
1875 stl: "none",
1876 static_libs: ["bar"],
1877 apex_available: [ "myapex" ],
1878 }
1879
1880 java_library {
1881 name: "bar",
1882 sdk_version: "current",
1883 srcs: ["a.java"],
1884 apex_available: [ "myapex" ],
1885 }
1886 `)
1887}
1888
1889func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1890 ctx, _ := testApex(t, `
1891 apex {
1892 name: "myapex",
1893 key: "myapex.key",
1894 native_shared_libs: ["mylib"],
1895 min_sdk_version: "29",
1896 }
1897
1898 apex_key {
1899 name: "myapex.key",
1900 public_key: "testkey.avbpubkey",
1901 private_key: "testkey.pem",
1902 }
1903
1904 // mylib in myapex will link to mylib2#29
1905 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1906 cc_library {
1907 name: "mylib",
1908 srcs: ["mylib.cpp"],
1909 shared_libs: ["mylib2"],
1910 system_shared_libs: [],
1911 stl: "none",
1912 apex_available: ["myapex", "otherapex"],
1913 min_sdk_version: "29",
1914 }
1915
1916 cc_library {
1917 name: "mylib2",
1918 srcs: ["mylib.cpp"],
1919 system_shared_libs: [],
1920 stl: "none",
1921 apex_available: ["otherapex"],
1922 stubs: { versions: ["29", "30"] },
1923 min_sdk_version: "30",
1924 }
1925
1926 apex {
1927 name: "otherapex",
1928 key: "myapex.key",
1929 native_shared_libs: ["mylib", "mylib2"],
1930 min_sdk_version: "30",
1931 }
1932 `)
1933 expectLink := func(from, from_variant, to, to_variant string) {
1934 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1935 libFlags := ld.Args["libFlags"]
1936 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1937 }
1938 expectLink("mylib", "shared_myapex", "mylib2", "shared_29")
1939 expectLink("mylib", "shared_otherapex", "mylib2", "shared_otherapex")
1940}
1941
Jiyong Park7c2ee712018-12-07 00:42:25 +09001942func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001943 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001944 apex {
1945 name: "myapex",
1946 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001947 native_shared_libs: ["mylib"],
1948 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001949 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001950 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001951 }
1952
1953 apex_key {
1954 name: "myapex.key",
1955 public_key: "testkey.avbpubkey",
1956 private_key: "testkey.pem",
1957 }
1958
1959 prebuilt_etc {
1960 name: "myetc",
1961 src: "myprebuilt",
1962 sub_dir: "foo/bar",
1963 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001964
1965 cc_library {
1966 name: "mylib",
1967 srcs: ["mylib.cpp"],
1968 relative_install_path: "foo/bar",
1969 system_shared_libs: [],
1970 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001971 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001972 }
1973
1974 cc_binary {
1975 name: "mybin",
1976 srcs: ["mylib.cpp"],
1977 relative_install_path: "foo/bar",
1978 system_shared_libs: [],
1979 static_executable: true,
1980 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001981 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001982 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001983 `)
1984
Sundong Ahnabb64432019-10-22 13:58:29 +09001985 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001986 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1987
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001988 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001989 ensureListContains(t, dirs, "etc")
1990 ensureListContains(t, dirs, "etc/foo")
1991 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001992 ensureListContains(t, dirs, "lib64")
1993 ensureListContains(t, dirs, "lib64/foo")
1994 ensureListContains(t, dirs, "lib64/foo/bar")
1995 ensureListContains(t, dirs, "lib")
1996 ensureListContains(t, dirs, "lib/foo")
1997 ensureListContains(t, dirs, "lib/foo/bar")
1998
Jiyong Parkbd13e442019-03-15 18:10:35 +09001999 ensureListContains(t, dirs, "bin")
2000 ensureListContains(t, dirs, "bin/foo")
2001 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002002}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002003
Jooyung Han35155c42020-02-06 17:33:20 +09002004func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2005 ctx, _ := testApex(t, `
2006 apex {
2007 name: "myapex",
2008 key: "myapex.key",
2009 multilib: {
2010 both: {
2011 native_shared_libs: ["mylib"],
2012 binaries: ["mybin"],
2013 },
2014 },
2015 compile_multilib: "both",
2016 native_bridge_supported: true,
2017 }
2018
2019 apex_key {
2020 name: "myapex.key",
2021 public_key: "testkey.avbpubkey",
2022 private_key: "testkey.pem",
2023 }
2024
2025 cc_library {
2026 name: "mylib",
2027 relative_install_path: "foo/bar",
2028 system_shared_libs: [],
2029 stl: "none",
2030 apex_available: [ "myapex" ],
2031 native_bridge_supported: true,
2032 }
2033
2034 cc_binary {
2035 name: "mybin",
2036 relative_install_path: "foo/bar",
2037 system_shared_libs: [],
2038 static_executable: true,
2039 stl: "none",
2040 apex_available: [ "myapex" ],
2041 native_bridge_supported: true,
2042 compile_multilib: "both", // default is "first" for binary
2043 multilib: {
2044 lib64: {
2045 suffix: "64",
2046 },
2047 },
2048 }
2049 `, withNativeBridgeEnabled)
2050 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2051 "bin/foo/bar/mybin",
2052 "bin/foo/bar/mybin64",
2053 "bin/arm/foo/bar/mybin",
2054 "bin/arm64/foo/bar/mybin64",
2055 "lib/foo/bar/mylib.so",
2056 "lib/arm/foo/bar/mylib.so",
2057 "lib64/foo/bar/mylib.so",
2058 "lib64/arm64/foo/bar/mylib.so",
2059 })
2060}
2061
Jiyong Parkda6eb592018-12-19 17:12:36 +09002062func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002063 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002064 apex {
2065 name: "myapex",
2066 key: "myapex.key",
2067 native_shared_libs: ["mylib"],
2068 use_vendor: true,
2069 }
2070
2071 apex_key {
2072 name: "myapex.key",
2073 public_key: "testkey.avbpubkey",
2074 private_key: "testkey.pem",
2075 }
2076
2077 cc_library {
2078 name: "mylib",
2079 srcs: ["mylib.cpp"],
2080 shared_libs: ["mylib2"],
2081 system_shared_libs: [],
2082 vendor_available: true,
2083 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002084 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002085 }
2086
2087 cc_library {
2088 name: "mylib2",
2089 srcs: ["mylib.cpp"],
2090 system_shared_libs: [],
2091 vendor_available: true,
2092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002093 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002094 }
Jooyung Handc782442019-11-01 03:14:38 +09002095 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002096 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002097 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002098
2099 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002100 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002101 for _, implicit := range i.Implicits {
2102 inputsList = append(inputsList, implicit.String())
2103 }
2104 }
2105 inputsString := strings.Join(inputsList, " ")
2106
2107 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08002108 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
2109 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002110
2111 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08002112 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
2113 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002114}
Jiyong Park16e91a02018-12-20 18:18:08 +09002115
Jooyung Han85d61762020-06-24 23:50:26 +09002116func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002117 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2118 apex {
2119 name: "myapex",
2120 key: "myapex.key",
2121 use_vendor: true,
2122 }
2123 apex_key {
2124 name: "myapex.key",
2125 public_key: "testkey.avbpubkey",
2126 private_key: "testkey.pem",
2127 }
2128 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002129 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002130 })
Colin Cross440e0d02020-06-11 11:32:11 -07002131 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002132 testApex(t, `
2133 apex {
2134 name: "myapex",
2135 key: "myapex.key",
2136 use_vendor: true,
2137 }
2138 apex_key {
2139 name: "myapex.key",
2140 public_key: "testkey.avbpubkey",
2141 private_key: "testkey.pem",
2142 }
2143 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002144 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002145 })
2146}
2147
Jooyung Han5c998b92019-06-27 11:30:33 +09002148func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2149 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2150 apex {
2151 name: "myapex",
2152 key: "myapex.key",
2153 native_shared_libs: ["mylib"],
2154 use_vendor: true,
2155 }
2156
2157 apex_key {
2158 name: "myapex.key",
2159 public_key: "testkey.avbpubkey",
2160 private_key: "testkey.pem",
2161 }
2162
2163 cc_library {
2164 name: "mylib",
2165 srcs: ["mylib.cpp"],
2166 system_shared_libs: [],
2167 stl: "none",
2168 }
2169 `)
2170}
2171
Jooyung Han85d61762020-06-24 23:50:26 +09002172func TestVendorApex(t *testing.T) {
2173 ctx, config := testApex(t, `
2174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 binaries: ["mybin"],
2178 vendor: true,
2179 }
2180 apex_key {
2181 name: "myapex.key",
2182 public_key: "testkey.avbpubkey",
2183 private_key: "testkey.pem",
2184 }
2185 cc_binary {
2186 name: "mybin",
2187 vendor: true,
2188 shared_libs: ["libfoo"],
2189 }
2190 cc_library {
2191 name: "libfoo",
2192 proprietary: true,
2193 }
2194 `)
2195
2196 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2197 "bin/mybin",
2198 "lib64/libfoo.so",
2199 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2200 "lib64/libc++.so",
2201 })
2202
2203 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2204 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2205 name := apexBundle.BaseModuleName()
2206 prefix := "TARGET_"
2207 var builder strings.Builder
2208 data.Custom(&builder, name, prefix, "", data)
2209 androidMk := builder.String()
2210 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
2211}
2212
Jooyung Handf78e212020-07-22 15:54:47 +09002213func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2214 ctx, _ := testApex(t, `
2215 apex {
2216 name: "myapex",
2217 key: "myapex.key",
2218 binaries: ["mybin"],
2219 vendor: true,
2220 use_vndk_as_stable: true,
2221 }
2222 apex_key {
2223 name: "myapex.key",
2224 public_key: "testkey.avbpubkey",
2225 private_key: "testkey.pem",
2226 }
2227 cc_binary {
2228 name: "mybin",
2229 vendor: true,
2230 shared_libs: ["libvndk", "libvendor"],
2231 }
2232 cc_library {
2233 name: "libvndk",
2234 vndk: {
2235 enabled: true,
2236 },
2237 vendor_available: true,
2238 }
2239 cc_library {
2240 name: "libvendor",
2241 vendor: true,
2242 }
2243 `)
2244
2245 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2246
2247 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_myapex").Rule("ld")
2248 libs := names(ldRule.Args["libFlags"])
2249 // VNDK libs(libvndk/libc++) as they are
2250 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2251 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2252 // non-stable Vendor libs as APEX variants
2253 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_myapex/libvendor.so")
2254
2255 // VNDK libs are not included when use_vndk_as_stable: true
2256 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2257 "bin/mybin",
2258 "lib64/libvendor.so",
2259 })
2260}
2261
Jooyung Hanefb184e2020-06-25 17:14:25 +09002262func TestAndroidMk_UseVendorRequired(t *testing.T) {
2263 ctx, config := testApex(t, `
2264 apex {
2265 name: "myapex",
2266 key: "myapex.key",
2267 use_vendor: true,
2268 native_shared_libs: ["mylib"],
2269 }
2270
2271 apex_key {
2272 name: "myapex.key",
2273 public_key: "testkey.avbpubkey",
2274 private_key: "testkey.pem",
2275 }
2276
2277 cc_library {
2278 name: "mylib",
2279 vendor_available: true,
2280 apex_available: ["myapex"],
2281 }
2282 `, func(fs map[string][]byte, config android.Config) {
2283 setUseVendorAllowListForTest(config, []string{"myapex"})
2284 })
2285
2286 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2287 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2288 name := apexBundle.BaseModuleName()
2289 prefix := "TARGET_"
2290 var builder strings.Builder
2291 data.Custom(&builder, name, prefix, "", data)
2292 androidMk := builder.String()
2293 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2294}
2295
2296func TestAndroidMk_VendorApexRequired(t *testing.T) {
2297 ctx, config := testApex(t, `
2298 apex {
2299 name: "myapex",
2300 key: "myapex.key",
2301 vendor: true,
2302 native_shared_libs: ["mylib"],
2303 }
2304
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
2310
2311 cc_library {
2312 name: "mylib",
2313 vendor_available: true,
2314 }
2315 `)
2316
2317 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2318 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2319 name := apexBundle.BaseModuleName()
2320 prefix := "TARGET_"
2321 var builder strings.Builder
2322 data.Custom(&builder, name, prefix, "", data)
2323 androidMk := builder.String()
2324 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2325}
2326
Jooyung Han2ed99d02020-06-24 23:26:26 +09002327func TestAndroidMkWritesCommonProperties(t *testing.T) {
2328 ctx, config := testApex(t, `
2329 apex {
2330 name: "myapex",
2331 key: "myapex.key",
2332 vintf_fragments: ["fragment.xml"],
2333 init_rc: ["init.rc"],
2334 }
2335 apex_key {
2336 name: "myapex.key",
2337 public_key: "testkey.avbpubkey",
2338 private_key: "testkey.pem",
2339 }
2340 cc_binary {
2341 name: "mybin",
2342 }
2343 `)
2344
2345 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2346 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2347 name := apexBundle.BaseModuleName()
2348 prefix := "TARGET_"
2349 var builder strings.Builder
2350 data.Custom(&builder, name, prefix, "", data)
2351 androidMk := builder.String()
2352 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2353 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2354}
2355
Jiyong Park16e91a02018-12-20 18:18:08 +09002356func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002357 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002358 apex {
2359 name: "myapex",
2360 key: "myapex.key",
2361 native_shared_libs: ["mylib"],
2362 }
2363
2364 apex_key {
2365 name: "myapex.key",
2366 public_key: "testkey.avbpubkey",
2367 private_key: "testkey.pem",
2368 }
2369
2370 cc_library {
2371 name: "mylib",
2372 srcs: ["mylib.cpp"],
2373 system_shared_libs: [],
2374 stl: "none",
2375 stubs: {
2376 versions: ["1", "2", "3"],
2377 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002378 apex_available: [
2379 "//apex_available:platform",
2380 "myapex",
2381 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002382 }
2383
2384 cc_binary {
2385 name: "not_in_apex",
2386 srcs: ["mylib.cpp"],
2387 static_libs: ["mylib"],
2388 static_executable: true,
2389 system_shared_libs: [],
2390 stl: "none",
2391 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002392 `)
2393
Colin Cross7113d202019-11-20 16:39:12 -08002394 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002395
2396 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002397 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002398}
Jiyong Park9335a262018-12-24 11:31:58 +09002399
2400func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002401 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002402 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002403 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002404 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002405 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002406 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002407 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002408 }
2409
2410 cc_library {
2411 name: "mylib",
2412 srcs: ["mylib.cpp"],
2413 system_shared_libs: [],
2414 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002415 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002416 }
2417
2418 apex_key {
2419 name: "myapex.key",
2420 public_key: "testkey.avbpubkey",
2421 private_key: "testkey.pem",
2422 }
2423
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002424 android_app_certificate {
2425 name: "myapex.certificate",
2426 certificate: "testkey",
2427 }
2428
2429 android_app_certificate {
2430 name: "myapex.certificate.override",
2431 certificate: "testkey.override",
2432 }
2433
Jiyong Park9335a262018-12-24 11:31:58 +09002434 `)
2435
2436 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002437 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002438
2439 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2440 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2441 "vendor/foo/devkeys/testkey.avbpubkey")
2442 }
2443 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2444 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2445 "vendor/foo/devkeys/testkey.pem")
2446 }
2447
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002448 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002449 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002450 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002451 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002452 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002453 }
2454}
Jiyong Park58e364a2019-01-19 19:24:06 +09002455
Jooyung Hanf121a652019-12-17 14:30:11 +09002456func TestCertificate(t *testing.T) {
2457 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2458 ctx, _ := testApex(t, `
2459 apex {
2460 name: "myapex",
2461 key: "myapex.key",
2462 }
2463 apex_key {
2464 name: "myapex.key",
2465 public_key: "testkey.avbpubkey",
2466 private_key: "testkey.pem",
2467 }`)
2468 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2469 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2470 if actual := rule.Args["certificates"]; actual != expected {
2471 t.Errorf("certificates should be %q, not %q", expected, actual)
2472 }
2473 })
2474 t.Run("override when unspecified", func(t *testing.T) {
2475 ctx, _ := testApex(t, `
2476 apex {
2477 name: "myapex_keytest",
2478 key: "myapex.key",
2479 file_contexts: ":myapex-file_contexts",
2480 }
2481 apex_key {
2482 name: "myapex.key",
2483 public_key: "testkey.avbpubkey",
2484 private_key: "testkey.pem",
2485 }
2486 android_app_certificate {
2487 name: "myapex.certificate.override",
2488 certificate: "testkey.override",
2489 }`)
2490 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2491 expected := "testkey.override.x509.pem testkey.override.pk8"
2492 if actual := rule.Args["certificates"]; actual != expected {
2493 t.Errorf("certificates should be %q, not %q", expected, actual)
2494 }
2495 })
2496 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2497 ctx, _ := testApex(t, `
2498 apex {
2499 name: "myapex",
2500 key: "myapex.key",
2501 certificate: ":myapex.certificate",
2502 }
2503 apex_key {
2504 name: "myapex.key",
2505 public_key: "testkey.avbpubkey",
2506 private_key: "testkey.pem",
2507 }
2508 android_app_certificate {
2509 name: "myapex.certificate",
2510 certificate: "testkey",
2511 }`)
2512 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2513 expected := "testkey.x509.pem testkey.pk8"
2514 if actual := rule.Args["certificates"]; actual != expected {
2515 t.Errorf("certificates should be %q, not %q", expected, actual)
2516 }
2517 })
2518 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2519 ctx, _ := testApex(t, `
2520 apex {
2521 name: "myapex_keytest",
2522 key: "myapex.key",
2523 file_contexts: ":myapex-file_contexts",
2524 certificate: ":myapex.certificate",
2525 }
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
2531 android_app_certificate {
2532 name: "myapex.certificate.override",
2533 certificate: "testkey.override",
2534 }`)
2535 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2536 expected := "testkey.override.x509.pem testkey.override.pk8"
2537 if actual := rule.Args["certificates"]; actual != expected {
2538 t.Errorf("certificates should be %q, not %q", expected, actual)
2539 }
2540 })
2541 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2542 ctx, _ := testApex(t, `
2543 apex {
2544 name: "myapex",
2545 key: "myapex.key",
2546 certificate: "testkey",
2547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }`)
2553 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2554 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2555 if actual := rule.Args["certificates"]; actual != expected {
2556 t.Errorf("certificates should be %q, not %q", expected, actual)
2557 }
2558 })
2559 t.Run("override when specified as <name>", func(t *testing.T) {
2560 ctx, _ := testApex(t, `
2561 apex {
2562 name: "myapex_keytest",
2563 key: "myapex.key",
2564 file_contexts: ":myapex-file_contexts",
2565 certificate: "testkey",
2566 }
2567 apex_key {
2568 name: "myapex.key",
2569 public_key: "testkey.avbpubkey",
2570 private_key: "testkey.pem",
2571 }
2572 android_app_certificate {
2573 name: "myapex.certificate.override",
2574 certificate: "testkey.override",
2575 }`)
2576 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2577 expected := "testkey.override.x509.pem testkey.override.pk8"
2578 if actual := rule.Args["certificates"]; actual != expected {
2579 t.Errorf("certificates should be %q, not %q", expected, actual)
2580 }
2581 })
2582}
2583
Jiyong Park58e364a2019-01-19 19:24:06 +09002584func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002585 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002586 apex {
2587 name: "myapex",
2588 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002589 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002590 }
2591
2592 apex {
2593 name: "otherapex",
2594 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002595 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002596 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002597 }
2598
2599 apex_key {
2600 name: "myapex.key",
2601 public_key: "testkey.avbpubkey",
2602 private_key: "testkey.pem",
2603 }
2604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 system_shared_libs: [],
2609 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002610 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 "myapex",
2612 "otherapex",
2613 ],
Jooyung Han24282772020-03-21 23:20:55 +09002614 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002615 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002616 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002617 cc_library {
2618 name: "mylib2",
2619 srcs: ["mylib.cpp"],
2620 system_shared_libs: [],
2621 stl: "none",
2622 apex_available: [
2623 "myapex",
2624 "otherapex",
2625 ],
2626 use_apex_name_macro: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002627 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002628 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002629 `)
2630
Jooyung Hanc87a0592020-03-02 17:44:33 +09002631 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002632 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002633 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002634 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002635
Jooyung Hanccce2f22020-03-07 03:45:53 +09002636 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002637 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2638 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002639 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002640 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002641
Jooyung Hanccce2f22020-03-07 03:45:53 +09002642 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002643 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2644 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002645 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002646 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002647
Jooyung Hanc87a0592020-03-02 17:44:33 +09002648 // When cc_library sets use_apex_name_macro: true
2649 // apex variants define additional macro to distinguish which apex variant it is built for
2650
2651 // non-APEX variant does not have __ANDROID_APEX__ defined
2652 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2653 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2654
2655 // APEX variant has __ANDROID_APEX__ defined
2656 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002657 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002658 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2659 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002660
Jooyung Hanc87a0592020-03-02 17:44:33 +09002661 // APEX variant has __ANDROID_APEX__ defined
2662 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002663 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002664 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2665 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002666
2667 // recovery variant does not set __ANDROID_SDK_VERSION__
2668 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2669 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2670 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002671}
Jiyong Park7e636d02019-01-28 16:16:54 +09002672
2673func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002674 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002675 apex {
2676 name: "myapex",
2677 key: "myapex.key",
2678 native_shared_libs: ["mylib"],
2679 }
2680
2681 apex_key {
2682 name: "myapex.key",
2683 public_key: "testkey.avbpubkey",
2684 private_key: "testkey.pem",
2685 }
2686
2687 cc_library_headers {
2688 name: "mylib_headers",
2689 export_include_dirs: ["my_include"],
2690 system_shared_libs: [],
2691 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002692 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002693 }
2694
2695 cc_library {
2696 name: "mylib",
2697 srcs: ["mylib.cpp"],
2698 system_shared_libs: [],
2699 stl: "none",
2700 header_libs: ["mylib_headers"],
2701 export_header_lib_headers: ["mylib_headers"],
2702 stubs: {
2703 versions: ["1", "2", "3"],
2704 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002705 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002706 }
2707
2708 cc_library {
2709 name: "otherlib",
2710 srcs: ["mylib.cpp"],
2711 system_shared_libs: [],
2712 stl: "none",
2713 shared_libs: ["mylib"],
2714 }
2715 `)
2716
Colin Cross7113d202019-11-20 16:39:12 -08002717 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002718
2719 // Ensure that the include path of the header lib is exported to 'otherlib'
2720 ensureContains(t, cFlags, "-Imy_include")
2721}
Alex Light9670d332019-01-29 18:07:33 -08002722
Jiyong Park7cd10e32020-01-14 09:22:18 +09002723type fileInApex struct {
2724 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002725 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002726 isLink bool
2727}
2728
Jooyung Hana57af4a2020-01-23 05:36:59 +00002729func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002730 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002731 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002732 copyCmds := apexRule.Args["copy_commands"]
2733 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002734 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002735 for _, cmd := range strings.Split(copyCmds, "&&") {
2736 cmd = strings.TrimSpace(cmd)
2737 if cmd == "" {
2738 continue
2739 }
2740 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002741 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002742 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002743 switch terms[0] {
2744 case "mkdir":
2745 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002746 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002747 t.Fatal("copyCmds contains invalid cp command", cmd)
2748 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002749 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002750 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002751 isLink = false
2752 case "ln":
2753 if len(terms) != 3 && len(terms) != 4 {
2754 // ln LINK TARGET or ln -s LINK TARGET
2755 t.Fatal("copyCmds contains invalid ln command", cmd)
2756 }
2757 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002758 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002759 isLink = true
2760 default:
2761 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2762 }
2763 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002764 index := strings.Index(dst, imageApexDir)
2765 if index == -1 {
2766 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2767 }
2768 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002769 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002770 }
2771 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002772 return ret
2773}
2774
Jooyung Hana57af4a2020-01-23 05:36:59 +00002775func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2776 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002777 var failed bool
2778 var surplus []string
2779 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002780 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002781 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002782 for _, expected := range files {
2783 if matched, _ := path.Match(expected, file.path); matched {
2784 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002785 mactchFound = true
2786 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002787 }
2788 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002789 if !mactchFound {
2790 surplus = append(surplus, file.path)
2791 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002792 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002793
Jooyung Han31c470b2019-10-18 16:26:59 +09002794 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002795 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002796 t.Log("surplus files", surplus)
2797 failed = true
2798 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002799
2800 if len(files) > len(filesMatched) {
2801 var missing []string
2802 for _, expected := range files {
2803 if !filesMatched[expected] {
2804 missing = append(missing, expected)
2805 }
2806 }
2807 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002808 t.Log("missing files", missing)
2809 failed = true
2810 }
2811 if failed {
2812 t.Fail()
2813 }
2814}
2815
Jooyung Han344d5432019-08-23 11:17:39 +09002816func TestVndkApexCurrent(t *testing.T) {
2817 ctx, _ := testApex(t, `
2818 apex_vndk {
2819 name: "myapex",
2820 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002821 }
2822
2823 apex_key {
2824 name: "myapex.key",
2825 public_key: "testkey.avbpubkey",
2826 private_key: "testkey.pem",
2827 }
2828
2829 cc_library {
2830 name: "libvndk",
2831 srcs: ["mylib.cpp"],
2832 vendor_available: true,
2833 vndk: {
2834 enabled: true,
2835 },
2836 system_shared_libs: [],
2837 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002838 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002839 }
2840
2841 cc_library {
2842 name: "libvndksp",
2843 srcs: ["mylib.cpp"],
2844 vendor_available: true,
2845 vndk: {
2846 enabled: true,
2847 support_system_process: true,
2848 },
2849 system_shared_libs: [],
2850 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002851 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002852 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002853 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002854
Jooyung Hana57af4a2020-01-23 05:36:59 +00002855 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002856 "lib/libvndk.so",
2857 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002858 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002859 "lib64/libvndk.so",
2860 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002861 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002862 "etc/llndk.libraries.VER.txt",
2863 "etc/vndkcore.libraries.VER.txt",
2864 "etc/vndksp.libraries.VER.txt",
2865 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002866 })
Jooyung Han344d5432019-08-23 11:17:39 +09002867}
2868
2869func TestVndkApexWithPrebuilt(t *testing.T) {
2870 ctx, _ := testApex(t, `
2871 apex_vndk {
2872 name: "myapex",
2873 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002874 }
2875
2876 apex_key {
2877 name: "myapex.key",
2878 public_key: "testkey.avbpubkey",
2879 private_key: "testkey.pem",
2880 }
2881
2882 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002883 name: "libvndk",
2884 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002885 vendor_available: true,
2886 vndk: {
2887 enabled: true,
2888 },
2889 system_shared_libs: [],
2890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002891 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002892 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002893
2894 cc_prebuilt_library_shared {
2895 name: "libvndk.arm",
2896 srcs: ["libvndk.arm.so"],
2897 vendor_available: true,
2898 vndk: {
2899 enabled: true,
2900 },
2901 enabled: false,
2902 arch: {
2903 arm: {
2904 enabled: true,
2905 },
2906 },
2907 system_shared_libs: [],
2908 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002909 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002910 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002911 `+vndkLibrariesTxtFiles("current"),
2912 withFiles(map[string][]byte{
2913 "libvndk.so": nil,
2914 "libvndk.arm.so": nil,
2915 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002916
Jooyung Hana57af4a2020-01-23 05:36:59 +00002917 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002918 "lib/libvndk.so",
2919 "lib/libvndk.arm.so",
2920 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002921 "lib/libc++.so",
2922 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002923 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002924 })
Jooyung Han344d5432019-08-23 11:17:39 +09002925}
2926
Jooyung Han39edb6c2019-11-06 16:53:07 +09002927func vndkLibrariesTxtFiles(vers ...string) (result string) {
2928 for _, v := range vers {
2929 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002930 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002931 result += `
2932 vndk_libraries_txt {
2933 name: "` + txt + `.libraries.txt",
2934 }
2935 `
2936 }
2937 } else {
2938 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2939 result += `
2940 prebuilt_etc {
2941 name: "` + txt + `.libraries.` + v + `.txt",
2942 src: "dummy.txt",
2943 }
2944 `
2945 }
2946 }
2947 }
2948 return
2949}
2950
Jooyung Han344d5432019-08-23 11:17:39 +09002951func TestVndkApexVersion(t *testing.T) {
2952 ctx, _ := testApex(t, `
2953 apex_vndk {
2954 name: "myapex_v27",
2955 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002956 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002957 vndk_version: "27",
2958 }
2959
2960 apex_key {
2961 name: "myapex.key",
2962 public_key: "testkey.avbpubkey",
2963 private_key: "testkey.pem",
2964 }
2965
Jooyung Han31c470b2019-10-18 16:26:59 +09002966 vndk_prebuilt_shared {
2967 name: "libvndk27",
2968 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002969 vendor_available: true,
2970 vndk: {
2971 enabled: true,
2972 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002973 target_arch: "arm64",
2974 arch: {
2975 arm: {
2976 srcs: ["libvndk27_arm.so"],
2977 },
2978 arm64: {
2979 srcs: ["libvndk27_arm64.so"],
2980 },
2981 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002982 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002983 }
2984
2985 vndk_prebuilt_shared {
2986 name: "libvndk27",
2987 version: "27",
2988 vendor_available: true,
2989 vndk: {
2990 enabled: true,
2991 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002992 target_arch: "x86_64",
2993 arch: {
2994 x86: {
2995 srcs: ["libvndk27_x86.so"],
2996 },
2997 x86_64: {
2998 srcs: ["libvndk27_x86_64.so"],
2999 },
3000 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003001 }
3002 `+vndkLibrariesTxtFiles("27"),
3003 withFiles(map[string][]byte{
3004 "libvndk27_arm.so": nil,
3005 "libvndk27_arm64.so": nil,
3006 "libvndk27_x86.so": nil,
3007 "libvndk27_x86_64.so": nil,
3008 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003009
Jooyung Hana57af4a2020-01-23 05:36:59 +00003010 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003011 "lib/libvndk27_arm.so",
3012 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003013 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003014 })
Jooyung Han344d5432019-08-23 11:17:39 +09003015}
3016
3017func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3018 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3019 apex_vndk {
3020 name: "myapex_v27",
3021 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003022 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003023 vndk_version: "27",
3024 }
3025 apex_vndk {
3026 name: "myapex_v27_other",
3027 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003028 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003029 vndk_version: "27",
3030 }
3031
3032 apex_key {
3033 name: "myapex.key",
3034 public_key: "testkey.avbpubkey",
3035 private_key: "testkey.pem",
3036 }
3037
3038 cc_library {
3039 name: "libvndk",
3040 srcs: ["mylib.cpp"],
3041 vendor_available: true,
3042 vndk: {
3043 enabled: true,
3044 },
3045 system_shared_libs: [],
3046 stl: "none",
3047 }
3048
3049 vndk_prebuilt_shared {
3050 name: "libvndk",
3051 version: "27",
3052 vendor_available: true,
3053 vndk: {
3054 enabled: true,
3055 },
3056 srcs: ["libvndk.so"],
3057 }
3058 `, withFiles(map[string][]byte{
3059 "libvndk.so": nil,
3060 }))
3061}
3062
Jooyung Han90eee022019-10-01 20:02:42 +09003063func TestVndkApexNameRule(t *testing.T) {
3064 ctx, _ := testApex(t, `
3065 apex_vndk {
3066 name: "myapex",
3067 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003068 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003069 }
3070 apex_vndk {
3071 name: "myapex_v28",
3072 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003073 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003074 vndk_version: "28",
3075 }
3076 apex_key {
3077 name: "myapex.key",
3078 public_key: "testkey.avbpubkey",
3079 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003080 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003081
3082 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003083 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003084 actual := proptools.String(bundle.properties.Apex_name)
3085 if !reflect.DeepEqual(actual, expected) {
3086 t.Errorf("Got '%v', expected '%v'", actual, expected)
3087 }
3088 }
3089
3090 assertApexName("com.android.vndk.vVER", "myapex")
3091 assertApexName("com.android.vndk.v28", "myapex_v28")
3092}
3093
Jooyung Han344d5432019-08-23 11:17:39 +09003094func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3095 ctx, _ := testApex(t, `
3096 apex_vndk {
3097 name: "myapex",
3098 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003099 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003100 }
3101
3102 apex_key {
3103 name: "myapex.key",
3104 public_key: "testkey.avbpubkey",
3105 private_key: "testkey.pem",
3106 }
3107
3108 cc_library {
3109 name: "libvndk",
3110 srcs: ["mylib.cpp"],
3111 vendor_available: true,
3112 native_bridge_supported: true,
3113 host_supported: true,
3114 vndk: {
3115 enabled: true,
3116 },
3117 system_shared_libs: [],
3118 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003119 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003120 }
Jooyung Han35155c42020-02-06 17:33:20 +09003121 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003122
Jooyung Hana57af4a2020-01-23 05:36:59 +00003123 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003124 "lib/libvndk.so",
3125 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003126 "lib/libc++.so",
3127 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003128 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003129 })
Jooyung Han344d5432019-08-23 11:17:39 +09003130}
3131
3132func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3133 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3134 apex_vndk {
3135 name: "myapex",
3136 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003137 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003138 native_bridge_supported: true,
3139 }
3140
3141 apex_key {
3142 name: "myapex.key",
3143 public_key: "testkey.avbpubkey",
3144 private_key: "testkey.pem",
3145 }
3146
3147 cc_library {
3148 name: "libvndk",
3149 srcs: ["mylib.cpp"],
3150 vendor_available: true,
3151 native_bridge_supported: true,
3152 host_supported: true,
3153 vndk: {
3154 enabled: true,
3155 },
3156 system_shared_libs: [],
3157 stl: "none",
3158 }
3159 `)
3160}
3161
Jooyung Han31c470b2019-10-18 16:26:59 +09003162func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003163 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003164 apex_vndk {
3165 name: "myapex_v27",
3166 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003167 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003168 vndk_version: "27",
3169 }
3170
3171 apex_key {
3172 name: "myapex.key",
3173 public_key: "testkey.avbpubkey",
3174 private_key: "testkey.pem",
3175 }
3176
3177 vndk_prebuilt_shared {
3178 name: "libvndk27",
3179 version: "27",
3180 target_arch: "arm",
3181 vendor_available: true,
3182 vndk: {
3183 enabled: true,
3184 },
3185 arch: {
3186 arm: {
3187 srcs: ["libvndk27.so"],
3188 }
3189 },
3190 }
3191
3192 vndk_prebuilt_shared {
3193 name: "libvndk27",
3194 version: "27",
3195 target_arch: "arm",
3196 binder32bit: true,
3197 vendor_available: true,
3198 vndk: {
3199 enabled: true,
3200 },
3201 arch: {
3202 arm: {
3203 srcs: ["libvndk27binder32.so"],
3204 }
3205 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003206 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003207 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003208 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003209 withFiles(map[string][]byte{
3210 "libvndk27.so": nil,
3211 "libvndk27binder32.so": nil,
3212 }),
3213 withBinder32bit,
3214 withTargets(map[android.OsType][]android.Target{
3215 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003216 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3217 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003218 },
3219 }),
3220 )
3221
Jooyung Hana57af4a2020-01-23 05:36:59 +00003222 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003223 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003224 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003225 })
3226}
3227
Jooyung Han45a96772020-06-15 14:59:42 +09003228func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3229 ctx, _ := testApex(t, `
3230 apex_vndk {
3231 name: "myapex",
3232 key: "myapex.key",
3233 file_contexts: ":myapex-file_contexts",
3234 }
3235
3236 apex_key {
3237 name: "myapex.key",
3238 public_key: "testkey.avbpubkey",
3239 private_key: "testkey.pem",
3240 }
3241
3242 cc_library {
3243 name: "libz",
3244 vendor_available: true,
3245 vndk: {
3246 enabled: true,
3247 },
3248 stubs: {
3249 symbol_file: "libz.map.txt",
3250 versions: ["30"],
3251 }
3252 }
3253 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3254 "libz.map.txt": nil,
3255 }))
3256
3257 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3258 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3259 ensureListEmpty(t, provideNativeLibs)
3260}
3261
Jooyung Hane1633032019-08-01 17:41:43 +09003262func TestDependenciesInApexManifest(t *testing.T) {
3263 ctx, _ := testApex(t, `
3264 apex {
3265 name: "myapex_nodep",
3266 key: "myapex.key",
3267 native_shared_libs: ["lib_nodep"],
3268 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003269 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003270 }
3271
3272 apex {
3273 name: "myapex_dep",
3274 key: "myapex.key",
3275 native_shared_libs: ["lib_dep"],
3276 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003277 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003278 }
3279
3280 apex {
3281 name: "myapex_provider",
3282 key: "myapex.key",
3283 native_shared_libs: ["libfoo"],
3284 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003285 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003286 }
3287
3288 apex {
3289 name: "myapex_selfcontained",
3290 key: "myapex.key",
3291 native_shared_libs: ["lib_dep", "libfoo"],
3292 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003293 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003294 }
3295
3296 apex_key {
3297 name: "myapex.key",
3298 public_key: "testkey.avbpubkey",
3299 private_key: "testkey.pem",
3300 }
3301
3302 cc_library {
3303 name: "lib_nodep",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003307 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003308 }
3309
3310 cc_library {
3311 name: "lib_dep",
3312 srcs: ["mylib.cpp"],
3313 shared_libs: ["libfoo"],
3314 system_shared_libs: [],
3315 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003316 apex_available: [
3317 "myapex_dep",
3318 "myapex_provider",
3319 "myapex_selfcontained",
3320 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003321 }
3322
3323 cc_library {
3324 name: "libfoo",
3325 srcs: ["mytest.cpp"],
3326 stubs: {
3327 versions: ["1"],
3328 },
3329 system_shared_libs: [],
3330 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003331 apex_available: [
3332 "myapex_provider",
3333 "myapex_selfcontained",
3334 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003335 }
3336 `)
3337
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003338 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003339 var provideNativeLibs, requireNativeLibs []string
3340
Sundong Ahnabb64432019-10-22 13:58:29 +09003341 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003342 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3343 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003344 ensureListEmpty(t, provideNativeLibs)
3345 ensureListEmpty(t, requireNativeLibs)
3346
Sundong Ahnabb64432019-10-22 13:58:29 +09003347 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003348 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3349 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003350 ensureListEmpty(t, provideNativeLibs)
3351 ensureListContains(t, requireNativeLibs, "libfoo.so")
3352
Sundong Ahnabb64432019-10-22 13:58:29 +09003353 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003354 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3355 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003356 ensureListContains(t, provideNativeLibs, "libfoo.so")
3357 ensureListEmpty(t, requireNativeLibs)
3358
Sundong Ahnabb64432019-10-22 13:58:29 +09003359 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003360 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3361 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003362 ensureListContains(t, provideNativeLibs, "libfoo.so")
3363 ensureListEmpty(t, requireNativeLibs)
3364}
3365
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003366func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003367 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003372 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003373 }
3374
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003380
3381 cc_library {
3382 name: "mylib",
3383 srcs: ["mylib.cpp"],
3384 system_shared_libs: [],
3385 stl: "none",
3386 apex_available: [
3387 "//apex_available:platform",
3388 "myapex",
3389 ],
3390 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003391 `)
3392
Sundong Ahnabb64432019-10-22 13:58:29 +09003393 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003394 apexManifestRule := module.Rule("apexManifestRule")
3395 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3396 apexRule := module.Rule("apexRule")
3397 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003398
3399 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3400 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3401 name := apexBundle.BaseModuleName()
3402 prefix := "TARGET_"
3403 var builder strings.Builder
3404 data.Custom(&builder, name, prefix, "", data)
3405 androidMk := builder.String()
3406 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3407 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003408}
3409
Alex Light0851b882019-02-07 13:20:53 -08003410func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003411 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003412 apex {
3413 name: "myapex",
3414 key: "myapex.key",
3415 native_shared_libs: ["mylib_common"],
3416 }
3417
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423
3424 cc_library {
3425 name: "mylib_common",
3426 srcs: ["mylib.cpp"],
3427 system_shared_libs: [],
3428 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003429 apex_available: [
3430 "//apex_available:platform",
3431 "myapex",
3432 ],
Alex Light0851b882019-02-07 13:20:53 -08003433 }
3434 `)
3435
Sundong Ahnabb64432019-10-22 13:58:29 +09003436 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003437 apexRule := module.Rule("apexRule")
3438 copyCmds := apexRule.Args["copy_commands"]
3439
3440 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3441 t.Log("Apex was a test apex!")
3442 t.Fail()
3443 }
3444 // Ensure that main rule creates an output
3445 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3446
3447 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003448 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003449
3450 // Ensure that both direct and indirect deps are copied into apex
3451 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3452
Colin Cross7113d202019-11-20 16:39:12 -08003453 // Ensure that the platform variant ends with _shared
3454 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003455
3456 if !android.InAnyApex("mylib_common") {
3457 t.Log("Found mylib_common not in any apex!")
3458 t.Fail()
3459 }
3460}
3461
3462func TestTestApex(t *testing.T) {
3463 if android.InAnyApex("mylib_common_test") {
3464 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!")
3465 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003466 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003467 apex_test {
3468 name: "myapex",
3469 key: "myapex.key",
3470 native_shared_libs: ["mylib_common_test"],
3471 }
3472
3473 apex_key {
3474 name: "myapex.key",
3475 public_key: "testkey.avbpubkey",
3476 private_key: "testkey.pem",
3477 }
3478
3479 cc_library {
3480 name: "mylib_common_test",
3481 srcs: ["mylib.cpp"],
3482 system_shared_libs: [],
3483 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003484 // TODO: remove //apex_available:platform
3485 apex_available: [
3486 "//apex_available:platform",
3487 "myapex",
3488 ],
Alex Light0851b882019-02-07 13:20:53 -08003489 }
3490 `)
3491
Sundong Ahnabb64432019-10-22 13:58:29 +09003492 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003493 apexRule := module.Rule("apexRule")
3494 copyCmds := apexRule.Args["copy_commands"]
3495
3496 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3497 t.Log("Apex was not a test apex!")
3498 t.Fail()
3499 }
3500 // Ensure that main rule creates an output
3501 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3502
3503 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003504 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003505
3506 // Ensure that both direct and indirect deps are copied into apex
3507 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3508
Colin Cross7113d202019-11-20 16:39:12 -08003509 // Ensure that the platform variant ends with _shared
3510 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003511}
3512
Alex Light9670d332019-01-29 18:07:33 -08003513func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003514 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003515 apex {
3516 name: "myapex",
3517 key: "myapex.key",
3518 multilib: {
3519 first: {
3520 native_shared_libs: ["mylib_common"],
3521 }
3522 },
3523 target: {
3524 android: {
3525 multilib: {
3526 first: {
3527 native_shared_libs: ["mylib"],
3528 }
3529 }
3530 },
3531 host: {
3532 multilib: {
3533 first: {
3534 native_shared_libs: ["mylib2"],
3535 }
3536 }
3537 }
3538 }
3539 }
3540
3541 apex_key {
3542 name: "myapex.key",
3543 public_key: "testkey.avbpubkey",
3544 private_key: "testkey.pem",
3545 }
3546
3547 cc_library {
3548 name: "mylib",
3549 srcs: ["mylib.cpp"],
3550 system_shared_libs: [],
3551 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003552 // TODO: remove //apex_available:platform
3553 apex_available: [
3554 "//apex_available:platform",
3555 "myapex",
3556 ],
Alex Light9670d332019-01-29 18:07:33 -08003557 }
3558
3559 cc_library {
3560 name: "mylib_common",
3561 srcs: ["mylib.cpp"],
3562 system_shared_libs: [],
3563 stl: "none",
3564 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003565 // TODO: remove //apex_available:platform
3566 apex_available: [
3567 "//apex_available:platform",
3568 "myapex",
3569 ],
Alex Light9670d332019-01-29 18:07:33 -08003570 }
3571
3572 cc_library {
3573 name: "mylib2",
3574 srcs: ["mylib.cpp"],
3575 system_shared_libs: [],
3576 stl: "none",
3577 compile_multilib: "first",
3578 }
3579 `)
3580
Sundong Ahnabb64432019-10-22 13:58:29 +09003581 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003582 copyCmds := apexRule.Args["copy_commands"]
3583
3584 // Ensure that main rule creates an output
3585 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3586
3587 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003588 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3589 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3590 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003591
3592 // Ensure that both direct and indirect deps are copied into apex
3593 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3594 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3595 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3596
Colin Cross7113d202019-11-20 16:39:12 -08003597 // Ensure that the platform variant ends with _shared
3598 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3599 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3600 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003601}
Jiyong Park04480cf2019-02-06 00:16:29 +09003602
3603func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003604 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003605 apex {
3606 name: "myapex",
3607 key: "myapex.key",
3608 binaries: ["myscript"],
3609 }
3610
3611 apex_key {
3612 name: "myapex.key",
3613 public_key: "testkey.avbpubkey",
3614 private_key: "testkey.pem",
3615 }
3616
3617 sh_binary {
3618 name: "myscript",
3619 src: "mylib.cpp",
3620 filename: "myscript.sh",
3621 sub_dir: "script",
3622 }
3623 `)
3624
Sundong Ahnabb64432019-10-22 13:58:29 +09003625 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003626 copyCmds := apexRule.Args["copy_commands"]
3627
3628 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3629}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003630
Jooyung Han91df2082019-11-20 01:49:42 +09003631func TestApexInVariousPartition(t *testing.T) {
3632 testcases := []struct {
3633 propName, parition, flattenedPartition string
3634 }{
3635 {"", "system", "system_ext"},
3636 {"product_specific: true", "product", "product"},
3637 {"soc_specific: true", "vendor", "vendor"},
3638 {"proprietary: true", "vendor", "vendor"},
3639 {"vendor: true", "vendor", "vendor"},
3640 {"system_ext_specific: true", "system_ext", "system_ext"},
3641 }
3642 for _, tc := range testcases {
3643 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3644 ctx, _ := testApex(t, `
3645 apex {
3646 name: "myapex",
3647 key: "myapex.key",
3648 `+tc.propName+`
3649 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003650
Jooyung Han91df2082019-11-20 01:49:42 +09003651 apex_key {
3652 name: "myapex.key",
3653 public_key: "testkey.avbpubkey",
3654 private_key: "testkey.pem",
3655 }
3656 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003657
Jooyung Han91df2082019-11-20 01:49:42 +09003658 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3659 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3660 actual := apex.installDir.String()
3661 if actual != expected {
3662 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3663 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003664
Jooyung Han91df2082019-11-20 01:49:42 +09003665 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3666 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3667 actual = flattened.installDir.String()
3668 if actual != expected {
3669 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3670 }
3671 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003672 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003673}
Jiyong Park67882562019-03-21 01:11:21 +09003674
Jooyung Han580eb4f2020-06-24 19:33:06 +09003675func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003676 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003677 apex {
3678 name: "myapex",
3679 key: "myapex.key",
3680 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003681
Jooyung Han580eb4f2020-06-24 19:33:06 +09003682 apex_key {
3683 name: "myapex.key",
3684 public_key: "testkey.avbpubkey",
3685 private_key: "testkey.pem",
3686 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003687 `)
3688 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003689 rule := module.Output("file_contexts")
3690 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3691}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003692
Jooyung Han580eb4f2020-06-24 19:33:06 +09003693func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003694 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003695 apex {
3696 name: "myapex",
3697 key: "myapex.key",
3698 file_contexts: "my_own_file_contexts",
3699 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003700
Jooyung Han580eb4f2020-06-24 19:33:06 +09003701 apex_key {
3702 name: "myapex.key",
3703 public_key: "testkey.avbpubkey",
3704 private_key: "testkey.pem",
3705 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003706 `, withFiles(map[string][]byte{
3707 "my_own_file_contexts": nil,
3708 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003709}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003710
Jooyung Han580eb4f2020-06-24 19:33:06 +09003711func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003712 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003713 apex {
3714 name: "myapex",
3715 key: "myapex.key",
3716 product_specific: true,
3717 file_contexts: "product_specific_file_contexts",
3718 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003719
Jooyung Han580eb4f2020-06-24 19:33:06 +09003720 apex_key {
3721 name: "myapex.key",
3722 public_key: "testkey.avbpubkey",
3723 private_key: "testkey.pem",
3724 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003725 `)
3726
Jooyung Han580eb4f2020-06-24 19:33:06 +09003727 ctx, _ := testApex(t, `
3728 apex {
3729 name: "myapex",
3730 key: "myapex.key",
3731 product_specific: true,
3732 file_contexts: "product_specific_file_contexts",
3733 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003734
Jooyung Han580eb4f2020-06-24 19:33:06 +09003735 apex_key {
3736 name: "myapex.key",
3737 public_key: "testkey.avbpubkey",
3738 private_key: "testkey.pem",
3739 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003740 `, withFiles(map[string][]byte{
3741 "product_specific_file_contexts": nil,
3742 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003743 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3744 rule := module.Output("file_contexts")
3745 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3746}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003747
Jooyung Han580eb4f2020-06-24 19:33:06 +09003748func TestFileContexts_SetViaFileGroup(t *testing.T) {
3749 ctx, _ := testApex(t, `
3750 apex {
3751 name: "myapex",
3752 key: "myapex.key",
3753 product_specific: true,
3754 file_contexts: ":my-file-contexts",
3755 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003756
Jooyung Han580eb4f2020-06-24 19:33:06 +09003757 apex_key {
3758 name: "myapex.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003762
Jooyung Han580eb4f2020-06-24 19:33:06 +09003763 filegroup {
3764 name: "my-file-contexts",
3765 srcs: ["product_specific_file_contexts"],
3766 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003767 `, withFiles(map[string][]byte{
3768 "product_specific_file_contexts": nil,
3769 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003770 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3771 rule := module.Output("file_contexts")
3772 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003773}
3774
Jiyong Park67882562019-03-21 01:11:21 +09003775func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003776 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003777 apex_key {
3778 name: "myapex.key",
3779 public_key: ":my.avbpubkey",
3780 private_key: ":my.pem",
3781 product_specific: true,
3782 }
3783
3784 filegroup {
3785 name: "my.avbpubkey",
3786 srcs: ["testkey2.avbpubkey"],
3787 }
3788
3789 filegroup {
3790 name: "my.pem",
3791 srcs: ["testkey2.pem"],
3792 }
3793 `)
3794
3795 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3796 expected_pubkey := "testkey2.avbpubkey"
3797 actual_pubkey := apex_key.public_key_file.String()
3798 if actual_pubkey != expected_pubkey {
3799 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3800 }
3801 expected_privkey := "testkey2.pem"
3802 actual_privkey := apex_key.private_key_file.String()
3803 if actual_privkey != expected_privkey {
3804 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3805 }
3806}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003807
3808func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003809 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003810 prebuilt_apex {
3811 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003812 arch: {
3813 arm64: {
3814 src: "myapex-arm64.apex",
3815 },
3816 arm: {
3817 src: "myapex-arm.apex",
3818 },
3819 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003820 }
3821 `)
3822
3823 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3824
Jiyong Parkc95714e2019-03-29 14:23:10 +09003825 expectedInput := "myapex-arm64.apex"
3826 if prebuilt.inputApex.String() != expectedInput {
3827 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3828 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003829}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003830
3831func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003832 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003833 prebuilt_apex {
3834 name: "myapex",
3835 src: "myapex-arm.apex",
3836 filename: "notmyapex.apex",
3837 }
3838 `)
3839
3840 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3841
3842 expected := "notmyapex.apex"
3843 if p.installFilename != expected {
3844 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3845 }
3846}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003847
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003848func TestPrebuiltOverrides(t *testing.T) {
3849 ctx, config := testApex(t, `
3850 prebuilt_apex {
3851 name: "myapex.prebuilt",
3852 src: "myapex-arm.apex",
3853 overrides: [
3854 "myapex",
3855 ],
3856 }
3857 `)
3858
3859 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3860
3861 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003862 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003863 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003864 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003865 }
3866}
3867
Roland Levillain630846d2019-06-26 12:48:34 +01003868func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003869 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003870 apex_test {
3871 name: "myapex",
3872 key: "myapex.key",
3873 tests: [
3874 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003875 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003876 ],
3877 }
3878
3879 apex_key {
3880 name: "myapex.key",
3881 public_key: "testkey.avbpubkey",
3882 private_key: "testkey.pem",
3883 }
3884
Liz Kammer1c14a212020-05-12 15:26:55 -07003885 filegroup {
3886 name: "fg",
3887 srcs: [
3888 "baz",
3889 "bar/baz"
3890 ],
3891 }
3892
Roland Levillain630846d2019-06-26 12:48:34 +01003893 cc_test {
3894 name: "mytest",
3895 gtest: false,
3896 srcs: ["mytest.cpp"],
3897 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003898 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003899 system_shared_libs: [],
3900 static_executable: true,
3901 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003902 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003903 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003904
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003905 cc_library {
3906 name: "mylib",
3907 srcs: ["mylib.cpp"],
3908 system_shared_libs: [],
3909 stl: "none",
3910 }
3911
Liz Kammer5bd365f2020-05-27 15:15:11 -07003912 filegroup {
3913 name: "fg2",
3914 srcs: [
3915 "testdata/baz"
3916 ],
3917 }
3918
Roland Levillain9b5fde92019-06-28 15:41:19 +01003919 cc_test {
3920 name: "mytests",
3921 gtest: false,
3922 srcs: [
3923 "mytest1.cpp",
3924 "mytest2.cpp",
3925 "mytest3.cpp",
3926 ],
3927 test_per_src: true,
3928 relative_install_path: "test",
3929 system_shared_libs: [],
3930 static_executable: true,
3931 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003932 data: [
3933 ":fg",
3934 ":fg2",
3935 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003936 }
Roland Levillain630846d2019-06-26 12:48:34 +01003937 `)
3938
Sundong Ahnabb64432019-10-22 13:58:29 +09003939 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003940 copyCmds := apexRule.Args["copy_commands"]
3941
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003942 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003943 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003944 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003945
Liz Kammer1c14a212020-05-12 15:26:55 -07003946 //Ensure that test data are copied into apex.
3947 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3948 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3949
Roland Levillain9b5fde92019-06-28 15:41:19 +01003950 // Ensure that test deps built with `test_per_src` are copied into apex.
3951 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3952 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3953 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003954
3955 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003956 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3957 data := android.AndroidMkDataForTest(t, config, "", bundle)
3958 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003959 prefix := "TARGET_"
3960 var builder strings.Builder
3961 data.Custom(&builder, name, prefix, "", data)
3962 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003963 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3964 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3965 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3966 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003967 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003968 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003969 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003970
3971 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3972 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3973 data.Custom(&builder, name, prefix, "", data)
3974 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003975 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3976 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003977}
3978
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003979func TestInstallExtraFlattenedApexes(t *testing.T) {
3980 ctx, config := testApex(t, `
3981 apex {
3982 name: "myapex",
3983 key: "myapex.key",
3984 }
3985 apex_key {
3986 name: "myapex.key",
3987 public_key: "testkey.avbpubkey",
3988 private_key: "testkey.pem",
3989 }
3990 `, func(fs map[string][]byte, config android.Config) {
3991 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3992 })
3993 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003994 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003995 mk := android.AndroidMkDataForTest(t, config, "", ab)
3996 var builder strings.Builder
3997 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3998 androidMk := builder.String()
3999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4000}
4001
Jooyung Han5c998b92019-06-27 11:30:33 +09004002func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004003 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004004 apex {
4005 name: "myapex",
4006 key: "myapex.key",
4007 native_shared_libs: ["mylib"],
4008 uses: ["commonapex"],
4009 }
4010
4011 apex {
4012 name: "commonapex",
4013 key: "myapex.key",
4014 native_shared_libs: ["libcommon"],
4015 provide_cpp_shared_libs: true,
4016 }
4017
4018 apex_key {
4019 name: "myapex.key",
4020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023
4024 cc_library {
4025 name: "mylib",
4026 srcs: ["mylib.cpp"],
4027 shared_libs: ["libcommon"],
4028 system_shared_libs: [],
4029 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004030 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004031 }
4032
4033 cc_library {
4034 name: "libcommon",
4035 srcs: ["mylib_common.cpp"],
4036 system_shared_libs: [],
4037 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004038 // TODO: remove //apex_available:platform
4039 apex_available: [
4040 "//apex_available:platform",
4041 "commonapex",
4042 "myapex",
4043 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004044 }
4045 `)
4046
Sundong Ahnabb64432019-10-22 13:58:29 +09004047 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004048 apexRule1 := module1.Rule("apexRule")
4049 copyCmds1 := apexRule1.Args["copy_commands"]
4050
Sundong Ahnabb64432019-10-22 13:58:29 +09004051 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004052 apexRule2 := module2.Rule("apexRule")
4053 copyCmds2 := apexRule2.Args["copy_commands"]
4054
Colin Cross7113d202019-11-20 16:39:12 -08004055 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
4056 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09004057 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4058 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4059 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4060}
4061
4062func TestApexUsesFailsIfNotProvided(t *testing.T) {
4063 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4064 apex {
4065 name: "myapex",
4066 key: "myapex.key",
4067 uses: ["commonapex"],
4068 }
4069
4070 apex {
4071 name: "commonapex",
4072 key: "myapex.key",
4073 }
4074
4075 apex_key {
4076 name: "myapex.key",
4077 public_key: "testkey.avbpubkey",
4078 private_key: "testkey.pem",
4079 }
4080 `)
4081 testApexError(t, `uses: "commonapex" is not a provider`, `
4082 apex {
4083 name: "myapex",
4084 key: "myapex.key",
4085 uses: ["commonapex"],
4086 }
4087
4088 cc_library {
4089 name: "commonapex",
4090 system_shared_libs: [],
4091 stl: "none",
4092 }
4093
4094 apex_key {
4095 name: "myapex.key",
4096 public_key: "testkey.avbpubkey",
4097 private_key: "testkey.pem",
4098 }
4099 `)
4100}
4101
4102func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4103 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4104 apex {
4105 name: "myapex",
4106 key: "myapex.key",
4107 use_vendor: true,
4108 uses: ["commonapex"],
4109 }
4110
4111 apex {
4112 name: "commonapex",
4113 key: "myapex.key",
4114 provide_cpp_shared_libs: true,
4115 }
4116
4117 apex_key {
4118 name: "myapex.key",
4119 public_key: "testkey.avbpubkey",
4120 private_key: "testkey.pem",
4121 }
Jooyung Handc782442019-11-01 03:14:38 +09004122 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004123 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004124 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004125}
4126
Jooyung Hand48f3c32019-08-23 11:18:57 +09004127func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4128 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4129 apex {
4130 name: "myapex",
4131 key: "myapex.key",
4132 native_shared_libs: ["libfoo"],
4133 }
4134
4135 apex_key {
4136 name: "myapex.key",
4137 public_key: "testkey.avbpubkey",
4138 private_key: "testkey.pem",
4139 }
4140
4141 cc_library {
4142 name: "libfoo",
4143 stl: "none",
4144 system_shared_libs: [],
4145 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004146 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004147 }
4148 `)
4149 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4150 apex {
4151 name: "myapex",
4152 key: "myapex.key",
4153 java_libs: ["myjar"],
4154 }
4155
4156 apex_key {
4157 name: "myapex.key",
4158 public_key: "testkey.avbpubkey",
4159 private_key: "testkey.pem",
4160 }
4161
4162 java_library {
4163 name: "myjar",
4164 srcs: ["foo/bar/MyClass.java"],
4165 sdk_version: "none",
4166 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004167 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004168 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004169 }
4170 `)
4171}
4172
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004173func TestApexWithApps(t *testing.T) {
4174 ctx, _ := testApex(t, `
4175 apex {
4176 name: "myapex",
4177 key: "myapex.key",
4178 apps: [
4179 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004180 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004181 ],
4182 }
4183
4184 apex_key {
4185 name: "myapex.key",
4186 public_key: "testkey.avbpubkey",
4187 private_key: "testkey.pem",
4188 }
4189
4190 android_app {
4191 name: "AppFoo",
4192 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004193 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004194 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004195 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004196 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004197 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004198 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004199
4200 android_app {
4201 name: "AppFooPriv",
4202 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004203 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004204 system_modules: "none",
4205 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004206 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004207 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004208 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004209
4210 cc_library_shared {
4211 name: "libjni",
4212 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004213 shared_libs: ["libfoo"],
4214 stl: "none",
4215 system_shared_libs: [],
4216 apex_available: [ "myapex" ],
4217 sdk_version: "current",
4218 }
4219
4220 cc_library_shared {
4221 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004222 stl: "none",
4223 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004224 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004225 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004226 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004227 `)
4228
Sundong Ahnabb64432019-10-22 13:58:29 +09004229 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004230 apexRule := module.Rule("apexRule")
4231 copyCmds := apexRule.Args["copy_commands"]
4232
4233 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004234 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004235
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004236 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
4237 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004238 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004239 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004240 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004241 // JNI libraries including transitive deps are
4242 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00004243 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004244 // ... embedded inside APK (jnilibs.zip)
4245 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4246 // ... and not directly inside the APEX
4247 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4248 }
Dario Frenicde2a032019-10-27 00:29:22 +01004249}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004250
Dario Frenicde2a032019-10-27 00:29:22 +01004251func TestApexWithAppImports(t *testing.T) {
4252 ctx, _ := testApex(t, `
4253 apex {
4254 name: "myapex",
4255 key: "myapex.key",
4256 apps: [
4257 "AppFooPrebuilt",
4258 "AppFooPrivPrebuilt",
4259 ],
4260 }
4261
4262 apex_key {
4263 name: "myapex.key",
4264 public_key: "testkey.avbpubkey",
4265 private_key: "testkey.pem",
4266 }
4267
4268 android_app_import {
4269 name: "AppFooPrebuilt",
4270 apk: "PrebuiltAppFoo.apk",
4271 presigned: true,
4272 dex_preopt: {
4273 enabled: false,
4274 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004275 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004276 }
4277
4278 android_app_import {
4279 name: "AppFooPrivPrebuilt",
4280 apk: "PrebuiltAppFooPriv.apk",
4281 privileged: true,
4282 presigned: true,
4283 dex_preopt: {
4284 enabled: false,
4285 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004286 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004287 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004288 }
4289 `)
4290
Sundong Ahnabb64432019-10-22 13:58:29 +09004291 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004292 apexRule := module.Rule("apexRule")
4293 copyCmds := apexRule.Args["copy_commands"]
4294
4295 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004296 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4297}
4298
4299func TestApexWithAppImportsPrefer(t *testing.T) {
4300 ctx, _ := testApex(t, `
4301 apex {
4302 name: "myapex",
4303 key: "myapex.key",
4304 apps: [
4305 "AppFoo",
4306 ],
4307 }
4308
4309 apex_key {
4310 name: "myapex.key",
4311 public_key: "testkey.avbpubkey",
4312 private_key: "testkey.pem",
4313 }
4314
4315 android_app {
4316 name: "AppFoo",
4317 srcs: ["foo/bar/MyClass.java"],
4318 sdk_version: "none",
4319 system_modules: "none",
4320 apex_available: [ "myapex" ],
4321 }
4322
4323 android_app_import {
4324 name: "AppFoo",
4325 apk: "AppFooPrebuilt.apk",
4326 filename: "AppFooPrebuilt.apk",
4327 presigned: true,
4328 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004329 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004330 }
4331 `, withFiles(map[string][]byte{
4332 "AppFooPrebuilt.apk": nil,
4333 }))
4334
4335 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4336 "app/AppFoo/AppFooPrebuilt.apk",
4337 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004338}
4339
Dario Freni6f3937c2019-12-20 22:58:03 +00004340func TestApexWithTestHelperApp(t *testing.T) {
4341 ctx, _ := testApex(t, `
4342 apex {
4343 name: "myapex",
4344 key: "myapex.key",
4345 apps: [
4346 "TesterHelpAppFoo",
4347 ],
4348 }
4349
4350 apex_key {
4351 name: "myapex.key",
4352 public_key: "testkey.avbpubkey",
4353 private_key: "testkey.pem",
4354 }
4355
4356 android_test_helper_app {
4357 name: "TesterHelpAppFoo",
4358 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004359 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004360 }
4361
4362 `)
4363
4364 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4365 apexRule := module.Rule("apexRule")
4366 copyCmds := apexRule.Args["copy_commands"]
4367
4368 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4369}
4370
Jooyung Han18020ea2019-11-13 10:50:48 +09004371func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4372 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004373 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004374 apex {
4375 name: "myapex",
4376 key: "myapex.key",
4377 native_shared_libs: ["libfoo"],
4378 }
4379
4380 apex_key {
4381 name: "myapex.key",
4382 public_key: "testkey.avbpubkey",
4383 private_key: "testkey.pem",
4384 }
4385
4386 apex {
4387 name: "otherapex",
4388 key: "myapex.key",
4389 native_shared_libs: ["libfoo"],
4390 }
4391
4392 cc_defaults {
4393 name: "libfoo-defaults",
4394 apex_available: ["otherapex"],
4395 }
4396
4397 cc_library {
4398 name: "libfoo",
4399 defaults: ["libfoo-defaults"],
4400 stl: "none",
4401 system_shared_libs: [],
4402 }`)
4403}
4404
Paul Duffine52e66f2020-03-30 17:54:29 +01004405func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004406 // libfoo is not available to myapex, but only to otherapex
4407 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4408 apex {
4409 name: "myapex",
4410 key: "myapex.key",
4411 native_shared_libs: ["libfoo"],
4412 }
4413
4414 apex_key {
4415 name: "myapex.key",
4416 public_key: "testkey.avbpubkey",
4417 private_key: "testkey.pem",
4418 }
4419
4420 apex {
4421 name: "otherapex",
4422 key: "otherapex.key",
4423 native_shared_libs: ["libfoo"],
4424 }
4425
4426 apex_key {
4427 name: "otherapex.key",
4428 public_key: "testkey.avbpubkey",
4429 private_key: "testkey.pem",
4430 }
4431
4432 cc_library {
4433 name: "libfoo",
4434 stl: "none",
4435 system_shared_libs: [],
4436 apex_available: ["otherapex"],
4437 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004438}
Jiyong Park127b40b2019-09-30 16:04:35 +09004439
Paul Duffine52e66f2020-03-30 17:54:29 +01004440func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004441 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004442 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004443.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004444.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004445.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004446.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004447.*via tag cc\.DependencyTag.*"shared".*
4448.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004449 apex {
4450 name: "myapex",
4451 key: "myapex.key",
4452 native_shared_libs: ["libfoo"],
4453 }
4454
4455 apex_key {
4456 name: "myapex.key",
4457 public_key: "testkey.avbpubkey",
4458 private_key: "testkey.pem",
4459 }
4460
Jiyong Park127b40b2019-09-30 16:04:35 +09004461 cc_library {
4462 name: "libfoo",
4463 stl: "none",
4464 shared_libs: ["libbar"],
4465 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004466 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004467 }
4468
4469 cc_library {
4470 name: "libbar",
4471 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004472 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004473 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004474 apex_available: ["myapex"],
4475 }
4476
4477 cc_library {
4478 name: "libbaz",
4479 stl: "none",
4480 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004481 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004482}
Jiyong Park127b40b2019-09-30 16:04:35 +09004483
Paul Duffine52e66f2020-03-30 17:54:29 +01004484func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004485 testApexError(t, "\"otherapex\" is not a valid module name", `
4486 apex {
4487 name: "myapex",
4488 key: "myapex.key",
4489 native_shared_libs: ["libfoo"],
4490 }
4491
4492 apex_key {
4493 name: "myapex.key",
4494 public_key: "testkey.avbpubkey",
4495 private_key: "testkey.pem",
4496 }
4497
4498 cc_library {
4499 name: "libfoo",
4500 stl: "none",
4501 system_shared_libs: [],
4502 apex_available: ["otherapex"],
4503 }`)
4504
Paul Duffine52e66f2020-03-30 17:54:29 +01004505 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004506 apex {
4507 name: "myapex",
4508 key: "myapex.key",
4509 native_shared_libs: ["libfoo", "libbar"],
4510 }
4511
4512 apex_key {
4513 name: "myapex.key",
4514 public_key: "testkey.avbpubkey",
4515 private_key: "testkey.pem",
4516 }
4517
4518 cc_library {
4519 name: "libfoo",
4520 stl: "none",
4521 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004522 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004523 apex_available: ["myapex"],
4524 }
4525
4526 cc_library {
4527 name: "libbar",
4528 stl: "none",
4529 system_shared_libs: [],
4530 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004531 }
4532
4533 cc_library {
4534 name: "libbaz",
4535 stl: "none",
4536 system_shared_libs: [],
4537 stubs: {
4538 versions: ["10", "20", "30"],
4539 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004540 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004541}
Jiyong Park127b40b2019-09-30 16:04:35 +09004542
Jiyong Park89e850a2020-04-07 16:37:39 +09004543func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004544 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004545 apex {
4546 name: "myapex",
4547 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004548 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004549 }
4550
4551 apex_key {
4552 name: "myapex.key",
4553 public_key: "testkey.avbpubkey",
4554 private_key: "testkey.pem",
4555 }
4556
4557 cc_library {
4558 name: "libfoo",
4559 stl: "none",
4560 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004561 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004562 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004563 }
4564
4565 cc_library {
4566 name: "libfoo2",
4567 stl: "none",
4568 system_shared_libs: [],
4569 shared_libs: ["libbaz"],
4570 apex_available: ["//apex_available:platform"],
4571 }
4572
4573 cc_library {
4574 name: "libbar",
4575 stl: "none",
4576 system_shared_libs: [],
4577 apex_available: ["myapex"],
4578 }
4579
4580 cc_library {
4581 name: "libbaz",
4582 stl: "none",
4583 system_shared_libs: [],
4584 apex_available: ["myapex"],
4585 stubs: {
4586 versions: ["1"],
4587 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004588 }`)
4589
Jiyong Park89e850a2020-04-07 16:37:39 +09004590 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4591 // because it depends on libbar which isn't available to platform
4592 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4593 if libfoo.NotAvailableForPlatform() != true {
4594 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4595 }
4596
4597 // libfoo2 however can be available to platform because it depends on libbaz which provides
4598 // stubs
4599 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4600 if libfoo2.NotAvailableForPlatform() == true {
4601 t.Errorf("%q should be available to platform", libfoo2.String())
4602 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004603}
Jiyong Parka90ca002019-10-07 15:47:24 +09004604
Paul Duffine52e66f2020-03-30 17:54:29 +01004605func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004606 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004607 apex {
4608 name: "myapex",
4609 key: "myapex.key",
4610 native_shared_libs: ["libfoo"],
4611 }
4612
4613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
4618
4619 cc_library {
4620 name: "libfoo",
4621 stl: "none",
4622 system_shared_libs: [],
4623 apex_available: ["myapex"],
4624 static: {
4625 apex_available: ["//apex_available:platform"],
4626 },
4627 }`)
4628
Jiyong Park89e850a2020-04-07 16:37:39 +09004629 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4630 if libfooShared.NotAvailableForPlatform() != true {
4631 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4632 }
4633 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4634 if libfooStatic.NotAvailableForPlatform() != false {
4635 t.Errorf("%q should be available to platform", libfooStatic.String())
4636 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004637}
4638
Jiyong Park5d790c32019-11-15 18:40:32 +09004639func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004640 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004641 apex {
4642 name: "myapex",
4643 key: "myapex.key",
4644 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004645 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004646 }
4647
4648 override_apex {
4649 name: "override_myapex",
4650 base: "myapex",
4651 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004652 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004653 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004654 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004655 }
4656
4657 apex_key {
4658 name: "myapex.key",
4659 public_key: "testkey.avbpubkey",
4660 private_key: "testkey.pem",
4661 }
4662
4663 android_app {
4664 name: "app",
4665 srcs: ["foo/bar/MyClass.java"],
4666 package_name: "foo",
4667 sdk_version: "none",
4668 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004669 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004670 }
4671
4672 override_android_app {
4673 name: "override_app",
4674 base: "app",
4675 package_name: "bar",
4676 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004677 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004678
Jiyong Park317645e2019-12-05 13:20:58 +09004679 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4680 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4681 if originalVariant.GetOverriddenBy() != "" {
4682 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4683 }
4684 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4685 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4686 }
4687
Jiyong Park5d790c32019-11-15 18:40:32 +09004688 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4689 apexRule := module.Rule("apexRule")
4690 copyCmds := apexRule.Args["copy_commands"]
4691
4692 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004693 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004694
4695 apexBundle := module.Module().(*apexBundle)
4696 name := apexBundle.Name()
4697 if name != "override_myapex" {
4698 t.Errorf("name should be \"override_myapex\", but was %q", name)
4699 }
4700
Baligh Uddin004d7172020-02-19 21:29:28 -08004701 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4702 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4703 }
4704
Jiyong Park20bacab2020-03-03 11:45:41 +09004705 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004706 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004707
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004708 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4709 var builder strings.Builder
4710 data.Custom(&builder, name, "TARGET_", "", data)
4711 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004712 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004713 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4714 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004715 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004716 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004717 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004718 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4719 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004720}
4721
Jooyung Han214bf372019-11-12 13:03:50 +09004722func TestLegacyAndroid10Support(t *testing.T) {
4723 ctx, _ := testApex(t, `
4724 apex {
4725 name: "myapex",
4726 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004727 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004728 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004729 }
4730
4731 apex_key {
4732 name: "myapex.key",
4733 public_key: "testkey.avbpubkey",
4734 private_key: "testkey.pem",
4735 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004736
4737 cc_library {
4738 name: "mylib",
4739 srcs: ["mylib.cpp"],
4740 stl: "libc++",
4741 system_shared_libs: [],
4742 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004743 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004744 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004745 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004746
4747 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4748 args := module.Rule("apexRule").Args
4749 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004750 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004751
4752 // The copies of the libraries in the apex should have one more dependency than
4753 // the ones outside the apex, namely the unwinder. Ideally we should check
4754 // the dependency names directly here but for some reason the names are blank in
4755 // this test.
4756 for _, lib := range []string{"libc++", "mylib"} {
4757 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4758 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4759 if len(apexImplicits) != len(nonApexImplicits)+1 {
4760 t.Errorf("%q missing unwinder dep", lib)
4761 }
4762 }
Jooyung Han214bf372019-11-12 13:03:50 +09004763}
4764
Paul Duffin9b879592020-05-26 13:21:35 +01004765var filesForSdkLibrary = map[string][]byte{
4766 "api/current.txt": nil,
4767 "api/removed.txt": nil,
4768 "api/system-current.txt": nil,
4769 "api/system-removed.txt": nil,
4770 "api/test-current.txt": nil,
4771 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004772
4773 // For java_sdk_library_import
4774 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004775}
4776
Jooyung Han58f26ab2019-12-18 15:34:32 +09004777func TestJavaSDKLibrary(t *testing.T) {
4778 ctx, _ := testApex(t, `
4779 apex {
4780 name: "myapex",
4781 key: "myapex.key",
4782 java_libs: ["foo"],
4783 }
4784
4785 apex_key {
4786 name: "myapex.key",
4787 public_key: "testkey.avbpubkey",
4788 private_key: "testkey.pem",
4789 }
4790
4791 java_sdk_library {
4792 name: "foo",
4793 srcs: ["a.java"],
4794 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004795 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004796 }
Paul Duffin9b879592020-05-26 13:21:35 +01004797 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004798
4799 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004800 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004801 "javalib/foo.jar",
4802 "etc/permissions/foo.xml",
4803 })
4804 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004805 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4806 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004807}
4808
Paul Duffin9b879592020-05-26 13:21:35 +01004809func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4810 ctx, _ := testApex(t, `
4811 apex {
4812 name: "myapex",
4813 key: "myapex.key",
4814 java_libs: ["foo", "bar"],
4815 }
4816
4817 apex_key {
4818 name: "myapex.key",
4819 public_key: "testkey.avbpubkey",
4820 private_key: "testkey.pem",
4821 }
4822
4823 java_sdk_library {
4824 name: "foo",
4825 srcs: ["a.java"],
4826 api_packages: ["foo"],
4827 apex_available: ["myapex"],
4828 sdk_version: "none",
4829 system_modules: "none",
4830 }
4831
4832 java_library {
4833 name: "bar",
4834 srcs: ["a.java"],
4835 libs: ["foo"],
4836 apex_available: ["myapex"],
4837 sdk_version: "none",
4838 system_modules: "none",
4839 }
4840 `, withFiles(filesForSdkLibrary))
4841
4842 // java_sdk_library installs both impl jar and permission XML
4843 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4844 "javalib/bar.jar",
4845 "javalib/foo.jar",
4846 "etc/permissions/foo.xml",
4847 })
4848
4849 // The bar library should depend on the implementation jar.
4850 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4851 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4852 t.Errorf("expected %q, found %#q", expected, actual)
4853 }
4854}
4855
4856func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4857 ctx, _ := testApex(t, `
4858 apex {
4859 name: "myapex",
4860 key: "myapex.key",
4861 java_libs: ["foo"],
4862 }
4863
4864 apex_key {
4865 name: "myapex.key",
4866 public_key: "testkey.avbpubkey",
4867 private_key: "testkey.pem",
4868 }
4869
4870 java_sdk_library {
4871 name: "foo",
4872 srcs: ["a.java"],
4873 api_packages: ["foo"],
4874 apex_available: ["myapex"],
4875 sdk_version: "none",
4876 system_modules: "none",
4877 }
4878
4879 java_library {
4880 name: "bar",
4881 srcs: ["a.java"],
4882 libs: ["foo"],
4883 sdk_version: "none",
4884 system_modules: "none",
4885 }
4886 `, withFiles(filesForSdkLibrary))
4887
4888 // java_sdk_library installs both impl jar and permission XML
4889 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4890 "javalib/foo.jar",
4891 "etc/permissions/foo.xml",
4892 })
4893
4894 // The bar library should depend on the stubs jar.
4895 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4896 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4897 t.Errorf("expected %q, found %#q", expected, actual)
4898 }
4899}
4900
Paul Duffineedc5d52020-06-12 17:46:39 +01004901func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4902 ctx, _ := testApex(t, ``,
4903 withFiles(map[string][]byte{
4904 "apex/a.java": nil,
4905 "apex/apex_manifest.json": nil,
4906 "apex/Android.bp": []byte(`
4907 package {
4908 default_visibility: ["//visibility:private"],
4909 }
4910
4911 apex {
4912 name: "myapex",
4913 key: "myapex.key",
4914 java_libs: ["foo", "bar"],
4915 }
4916
4917 apex_key {
4918 name: "myapex.key",
4919 public_key: "testkey.avbpubkey",
4920 private_key: "testkey.pem",
4921 }
4922
4923 java_library {
4924 name: "bar",
4925 srcs: ["a.java"],
4926 libs: ["foo"],
4927 apex_available: ["myapex"],
4928 sdk_version: "none",
4929 system_modules: "none",
4930 }
4931`),
4932 "source/a.java": nil,
4933 "source/api/current.txt": nil,
4934 "source/api/removed.txt": nil,
4935 "source/Android.bp": []byte(`
4936 package {
4937 default_visibility: ["//visibility:private"],
4938 }
4939
4940 java_sdk_library {
4941 name: "foo",
4942 visibility: ["//apex"],
4943 srcs: ["a.java"],
4944 api_packages: ["foo"],
4945 apex_available: ["myapex"],
4946 sdk_version: "none",
4947 system_modules: "none",
4948 public: {
4949 enabled: true,
4950 },
4951 }
4952`),
4953 "prebuilt/a.jar": nil,
4954 "prebuilt/Android.bp": []byte(`
4955 package {
4956 default_visibility: ["//visibility:private"],
4957 }
4958
4959 java_sdk_library_import {
4960 name: "foo",
4961 visibility: ["//apex", "//source"],
4962 apex_available: ["myapex"],
4963 prefer: true,
4964 public: {
4965 jars: ["a.jar"],
4966 },
4967 }
4968`),
4969 }),
4970 )
4971
4972 // java_sdk_library installs both impl jar and permission XML
4973 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4974 "javalib/bar.jar",
4975 "javalib/foo.jar",
4976 "etc/permissions/foo.xml",
4977 })
4978
4979 // The bar library should depend on the implementation jar.
4980 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4981 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4982 t.Errorf("expected %q, found %#q", expected, actual)
4983 }
4984}
4985
4986func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
4987 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
4988 apex {
4989 name: "myapex",
4990 key: "myapex.key",
4991 java_libs: ["foo"],
4992 }
4993
4994 apex_key {
4995 name: "myapex.key",
4996 public_key: "testkey.avbpubkey",
4997 private_key: "testkey.pem",
4998 }
4999
5000 java_sdk_library_import {
5001 name: "foo",
5002 apex_available: ["myapex"],
5003 prefer: true,
5004 public: {
5005 jars: ["a.jar"],
5006 },
5007 }
5008
5009 `, withFiles(filesForSdkLibrary))
5010}
5011
atrost6e126252020-01-27 17:01:16 +00005012func TestCompatConfig(t *testing.T) {
5013 ctx, _ := testApex(t, `
5014 apex {
5015 name: "myapex",
5016 key: "myapex.key",
5017 prebuilts: ["myjar-platform-compat-config"],
5018 java_libs: ["myjar"],
5019 }
5020
5021 apex_key {
5022 name: "myapex.key",
5023 public_key: "testkey.avbpubkey",
5024 private_key: "testkey.pem",
5025 }
5026
5027 platform_compat_config {
5028 name: "myjar-platform-compat-config",
5029 src: ":myjar",
5030 }
5031
5032 java_library {
5033 name: "myjar",
5034 srcs: ["foo/bar/MyClass.java"],
5035 sdk_version: "none",
5036 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005037 apex_available: [ "myapex" ],
5038 }
5039 `)
5040 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5041 "etc/compatconfig/myjar-platform-compat-config.xml",
5042 "javalib/myjar.jar",
5043 })
5044}
5045
Jiyong Park479321d2019-12-16 11:47:12 +09005046func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5047 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5048 apex {
5049 name: "myapex",
5050 key: "myapex.key",
5051 java_libs: ["myjar"],
5052 }
5053
5054 apex_key {
5055 name: "myapex.key",
5056 public_key: "testkey.avbpubkey",
5057 private_key: "testkey.pem",
5058 }
5059
5060 java_library {
5061 name: "myjar",
5062 srcs: ["foo/bar/MyClass.java"],
5063 sdk_version: "none",
5064 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005065 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005066 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005067 }
5068 `)
5069}
5070
Jiyong Park7afd1072019-12-30 16:56:33 +09005071func TestCarryRequiredModuleNames(t *testing.T) {
5072 ctx, config := testApex(t, `
5073 apex {
5074 name: "myapex",
5075 key: "myapex.key",
5076 native_shared_libs: ["mylib"],
5077 }
5078
5079 apex_key {
5080 name: "myapex.key",
5081 public_key: "testkey.avbpubkey",
5082 private_key: "testkey.pem",
5083 }
5084
5085 cc_library {
5086 name: "mylib",
5087 srcs: ["mylib.cpp"],
5088 system_shared_libs: [],
5089 stl: "none",
5090 required: ["a", "b"],
5091 host_required: ["c", "d"],
5092 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005093 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005094 }
5095 `)
5096
5097 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5098 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5099 name := apexBundle.BaseModuleName()
5100 prefix := "TARGET_"
5101 var builder strings.Builder
5102 data.Custom(&builder, name, prefix, "", data)
5103 androidMk := builder.String()
5104 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5105 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5106 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5107}
5108
Jiyong Park7cd10e32020-01-14 09:22:18 +09005109func TestSymlinksFromApexToSystem(t *testing.T) {
5110 bp := `
5111 apex {
5112 name: "myapex",
5113 key: "myapex.key",
5114 native_shared_libs: ["mylib"],
5115 java_libs: ["myjar"],
5116 }
5117
Jiyong Park9d677202020-02-19 16:29:35 +09005118 apex {
5119 name: "myapex.updatable",
5120 key: "myapex.key",
5121 native_shared_libs: ["mylib"],
5122 java_libs: ["myjar"],
5123 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005124 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005125 }
5126
Jiyong Park7cd10e32020-01-14 09:22:18 +09005127 apex_key {
5128 name: "myapex.key",
5129 public_key: "testkey.avbpubkey",
5130 private_key: "testkey.pem",
5131 }
5132
5133 cc_library {
5134 name: "mylib",
5135 srcs: ["mylib.cpp"],
5136 shared_libs: ["myotherlib"],
5137 system_shared_libs: [],
5138 stl: "none",
5139 apex_available: [
5140 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005141 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005142 "//apex_available:platform",
5143 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005144 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005145 }
5146
5147 cc_library {
5148 name: "myotherlib",
5149 srcs: ["mylib.cpp"],
5150 system_shared_libs: [],
5151 stl: "none",
5152 apex_available: [
5153 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005154 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005155 "//apex_available:platform",
5156 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005157 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005158 }
5159
5160 java_library {
5161 name: "myjar",
5162 srcs: ["foo/bar/MyClass.java"],
5163 sdk_version: "none",
5164 system_modules: "none",
5165 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005166 apex_available: [
5167 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005168 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005169 "//apex_available:platform",
5170 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005171 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005172 }
5173
5174 java_library {
5175 name: "myotherjar",
5176 srcs: ["foo/bar/MyClass.java"],
5177 sdk_version: "none",
5178 system_modules: "none",
5179 apex_available: [
5180 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005181 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005182 "//apex_available:platform",
5183 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005184 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005185 }
5186 `
5187
5188 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5189 for _, f := range files {
5190 if f.path == file {
5191 if f.isLink {
5192 t.Errorf("%q is not a real file", file)
5193 }
5194 return
5195 }
5196 }
5197 t.Errorf("%q is not found", file)
5198 }
5199
5200 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5201 for _, f := range files {
5202 if f.path == file {
5203 if !f.isLink {
5204 t.Errorf("%q is not a symlink", file)
5205 }
5206 return
5207 }
5208 }
5209 t.Errorf("%q is not found", file)
5210 }
5211
Jiyong Park9d677202020-02-19 16:29:35 +09005212 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5213 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005214 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005215 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005216 ensureRealfileExists(t, files, "javalib/myjar.jar")
5217 ensureRealfileExists(t, files, "lib64/mylib.so")
5218 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5219
Jiyong Park9d677202020-02-19 16:29:35 +09005220 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5221 ensureRealfileExists(t, files, "javalib/myjar.jar")
5222 ensureRealfileExists(t, files, "lib64/mylib.so")
5223 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5224
5225 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005226 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005227 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005228 ensureRealfileExists(t, files, "javalib/myjar.jar")
5229 ensureRealfileExists(t, files, "lib64/mylib.so")
5230 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005231
5232 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5233 ensureRealfileExists(t, files, "javalib/myjar.jar")
5234 ensureRealfileExists(t, files, "lib64/mylib.so")
5235 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005236}
5237
Yo Chiange8128052020-07-23 20:09:18 +08005238func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5239 ctx, config := testApex(t, `
5240 apex {
5241 name: "myapex",
5242 key: "myapex.key",
5243 native_shared_libs: ["mylib"],
5244 }
5245
5246 apex_key {
5247 name: "myapex.key",
5248 public_key: "testkey.avbpubkey",
5249 private_key: "testkey.pem",
5250 }
5251
5252 cc_library_shared {
5253 name: "mylib",
5254 srcs: ["mylib.cpp"],
5255 shared_libs: ["myotherlib"],
5256 system_shared_libs: [],
5257 stl: "none",
5258 apex_available: [
5259 "myapex",
5260 "//apex_available:platform",
5261 ],
5262 }
5263
5264 cc_prebuilt_library_shared {
5265 name: "myotherlib",
5266 srcs: ["prebuilt.so"],
5267 system_shared_libs: [],
5268 stl: "none",
5269 apex_available: [
5270 "myapex",
5271 "//apex_available:platform",
5272 ],
5273 }
5274 `)
5275
5276 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5277 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5278 var builder strings.Builder
5279 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5280 androidMk := builder.String()
5281 // `myotherlib` is added to `myapex` as symlink
5282 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5283 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5284 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5285 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5286 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5287}
5288
Jooyung Han643adc42020-02-27 13:50:06 +09005289func TestApexWithJniLibs(t *testing.T) {
5290 ctx, _ := testApex(t, `
5291 apex {
5292 name: "myapex",
5293 key: "myapex.key",
5294 jni_libs: ["mylib"],
5295 }
5296
5297 apex_key {
5298 name: "myapex.key",
5299 public_key: "testkey.avbpubkey",
5300 private_key: "testkey.pem",
5301 }
5302
5303 cc_library {
5304 name: "mylib",
5305 srcs: ["mylib.cpp"],
5306 shared_libs: ["mylib2"],
5307 system_shared_libs: [],
5308 stl: "none",
5309 apex_available: [ "myapex" ],
5310 }
5311
5312 cc_library {
5313 name: "mylib2",
5314 srcs: ["mylib.cpp"],
5315 system_shared_libs: [],
5316 stl: "none",
5317 apex_available: [ "myapex" ],
5318 }
5319 `)
5320
5321 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5322 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5323 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5324 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5325 "lib64/mylib.so",
5326 "lib64/mylib2.so",
5327 })
5328}
5329
Jooyung Han49f67012020-04-17 13:43:10 +09005330func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5331 ctx, _ := testApex(t, `
5332 apex {
5333 name: "myapex",
5334 key: "myapex.key",
5335 }
5336 apex_key {
5337 name: "myapex.key",
5338 public_key: "testkey.avbpubkey",
5339 private_key: "testkey.pem",
5340 }
5341 `, func(fs map[string][]byte, config android.Config) {
5342 delete(config.Targets, android.Android)
5343 config.AndroidCommonTarget = android.Target{}
5344 })
5345
5346 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5347 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5348 }
5349}
5350
Jooyung Han643adc42020-02-27 13:50:06 +09005351func TestApexWithJniLibs_Errors(t *testing.T) {
5352 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5353 apex {
5354 name: "myapex",
5355 key: "myapex.key",
5356 jni_libs: ["xxx"],
5357 }
5358
5359 apex_key {
5360 name: "myapex.key",
5361 public_key: "testkey.avbpubkey",
5362 private_key: "testkey.pem",
5363 }
5364
5365 prebuilt_etc {
5366 name: "xxx",
5367 src: "xxx",
5368 }
5369 `, withFiles(map[string][]byte{
5370 "xxx": nil,
5371 }))
5372}
5373
Jiyong Parkbd159612020-02-28 15:22:21 +09005374func TestAppBundle(t *testing.T) {
5375 ctx, _ := testApex(t, `
5376 apex {
5377 name: "myapex",
5378 key: "myapex.key",
5379 apps: ["AppFoo"],
5380 }
5381
5382 apex_key {
5383 name: "myapex.key",
5384 public_key: "testkey.avbpubkey",
5385 private_key: "testkey.pem",
5386 }
5387
5388 android_app {
5389 name: "AppFoo",
5390 srcs: ["foo/bar/MyClass.java"],
5391 sdk_version: "none",
5392 system_modules: "none",
5393 apex_available: [ "myapex" ],
5394 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005395 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005396
5397 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5398 content := bundleConfigRule.Args["content"]
5399
5400 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005401 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 +09005402}
5403
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005404func TestAppSetBundle(t *testing.T) {
5405 ctx, _ := testApex(t, `
5406 apex {
5407 name: "myapex",
5408 key: "myapex.key",
5409 apps: ["AppSet"],
5410 }
5411
5412 apex_key {
5413 name: "myapex.key",
5414 public_key: "testkey.avbpubkey",
5415 private_key: "testkey.pem",
5416 }
5417
5418 android_app_set {
5419 name: "AppSet",
5420 set: "AppSet.apks",
5421 }`)
5422 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5423 bundleConfigRule := mod.Description("Bundle Config")
5424 content := bundleConfigRule.Args["content"]
5425 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5426 s := mod.Rule("apexRule").Args["copy_commands"]
5427 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5428 if len(copyCmds) != 3 {
5429 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5430 }
5431 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5432 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5433 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5434}
5435
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005436func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005437 t.Helper()
5438
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005439 bp := `
5440 java_library {
5441 name: "some-updatable-apex-lib",
5442 srcs: ["a.java"],
5443 sdk_version: "current",
5444 apex_available: [
5445 "some-updatable-apex",
5446 ],
5447 }
5448
5449 java_library {
5450 name: "some-non-updatable-apex-lib",
5451 srcs: ["a.java"],
5452 apex_available: [
5453 "some-non-updatable-apex",
5454 ],
5455 }
5456
5457 java_library {
5458 name: "some-platform-lib",
5459 srcs: ["a.java"],
5460 sdk_version: "current",
5461 installable: true,
5462 }
5463
5464 java_library {
5465 name: "some-art-lib",
5466 srcs: ["a.java"],
5467 sdk_version: "current",
5468 apex_available: [
5469 "com.android.art.something",
5470 ],
5471 hostdex: true,
5472 }
5473
5474 apex {
5475 name: "some-updatable-apex",
5476 key: "some-updatable-apex.key",
5477 java_libs: ["some-updatable-apex-lib"],
5478 updatable: true,
5479 min_sdk_version: "current",
5480 }
5481
5482 apex {
5483 name: "some-non-updatable-apex",
5484 key: "some-non-updatable-apex.key",
5485 java_libs: ["some-non-updatable-apex-lib"],
5486 }
5487
5488 apex_key {
5489 name: "some-updatable-apex.key",
5490 }
5491
5492 apex_key {
5493 name: "some-non-updatable-apex.key",
5494 }
5495
5496 apex {
5497 name: "com.android.art.something",
5498 key: "com.android.art.something.key",
5499 java_libs: ["some-art-lib"],
5500 updatable: true,
5501 min_sdk_version: "current",
5502 }
5503
5504 apex_key {
5505 name: "com.android.art.something.key",
5506 }
5507
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005508 filegroup {
5509 name: "some-updatable-apex-file_contexts",
5510 srcs: [
5511 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5512 ],
5513 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005514
5515 filegroup {
5516 name: "some-non-updatable-apex-file_contexts",
5517 srcs: [
5518 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5519 ],
5520 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005521 `
5522 bp += cc.GatherRequiredDepsForTest(android.Android)
5523 bp += java.GatherRequiredDepsForTest()
5524 bp += dexpreopt.BpToolModulesForTest()
5525
5526 fs := map[string][]byte{
5527 "a.java": nil,
5528 "a.jar": nil,
5529 "build/make/target/product/security": nil,
5530 "apex_manifest.json": nil,
5531 "AndroidManifest.xml": nil,
5532 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005533 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005534 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5535 "framework/aidl/a.aidl": nil,
5536 }
5537 cc.GatherRequiredFilesForTest(fs)
5538
5539 ctx := android.NewTestArchContext()
5540 ctx.RegisterModuleType("apex", BundleFactory)
5541 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5542 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005543 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005544 cc.RegisterRequiredBuildComponentsForTest(ctx)
5545 java.RegisterJavaBuildComponents(ctx)
5546 java.RegisterSystemModulesBuildComponents(ctx)
5547 java.RegisterAppBuildComponents(ctx)
5548 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005549 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5550 ctx.PreDepsMutators(RegisterPreDepsMutators)
5551 ctx.PostDepsMutators(RegisterPostDepsMutators)
5552
5553 config := android.TestArchConfig(buildDir, nil, bp, fs)
5554 ctx.Register(config)
5555
5556 _ = dexpreopt.GlobalSoongConfigForTests(config)
5557 dexpreopt.RegisterToolModulesForTest(ctx)
5558 pathCtx := android.PathContextForTesting(config)
5559 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5560 transformDexpreoptConfig(dexpreoptConfig)
5561 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5562
5563 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5564 android.FailIfErrored(t, errs)
5565
5566 _, errs = ctx.PrepareBuildActions(config)
5567 if errmsg == "" {
5568 android.FailIfErrored(t, errs)
5569 } else if len(errs) > 0 {
5570 android.FailIfNoMatchingErrors(t, errmsg, errs)
5571 return
5572 } else {
5573 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5574 }
5575}
5576
Jooyung Han548640b2020-04-27 12:10:30 +09005577func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5578 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5579 apex {
5580 name: "myapex",
5581 key: "myapex.key",
5582 updatable: true,
5583 }
5584
5585 apex_key {
5586 name: "myapex.key",
5587 public_key: "testkey.avbpubkey",
5588 private_key: "testkey.pem",
5589 }
5590 `)
5591}
5592
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005593func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005594
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005595 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005596 var transform func(*dexpreopt.GlobalConfig)
5597
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005598 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5599 transform = func(config *dexpreopt.GlobalConfig) {
5600 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
5601 }
5602 testNoUpdatableJarsInBootImage(t, "", transform)
5603 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005604
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005605 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005606 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 +01005607 transform = func(config *dexpreopt.GlobalConfig) {
5608 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5609 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005610 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005611 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005612
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005613 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 -07005614 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 +01005615 transform = func(config *dexpreopt.GlobalConfig) {
5616 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5617 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005618 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005619 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005620
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005621 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 -07005622 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005623 transform = func(config *dexpreopt.GlobalConfig) {
5624 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5625 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005626 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005627 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005628
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005629 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 -07005630 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 +01005631 transform = func(config *dexpreopt.GlobalConfig) {
5632 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5633 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005634 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005635 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005636
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005637 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5638 transform = func(config *dexpreopt.GlobalConfig) {
5639 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5640 }
5641 testNoUpdatableJarsInBootImage(t, "", transform)
5642 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005643
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005644 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005645 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005646 transform = func(config *dexpreopt.GlobalConfig) {
5647 config.ArtApexJars = []string{"platform:nonexistent"}
5648 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005649 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005650 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005651
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005652 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005653 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005654 transform = func(config *dexpreopt.GlobalConfig) {
5655 config.BootJars = []string{"platform:nonexistent"}
5656 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005657 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005658 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005659
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005660 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005661 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005662 transform = func(config *dexpreopt.GlobalConfig) {
5663 config.ArtApexJars = []string{"platform:some-platform-lib"}
5664 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005665 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005666 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005667
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005668 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5669 transform = func(config *dexpreopt.GlobalConfig) {
5670 config.BootJars = []string{"platform:some-platform-lib"}
5671 }
5672 testNoUpdatableJarsInBootImage(t, "", transform)
5673 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005674}
5675
Jiyong Park62304bb2020-04-13 16:19:48 +09005676func TestTestFor(t *testing.T) {
5677 ctx, _ := testApex(t, `
5678 apex {
5679 name: "myapex",
5680 key: "myapex.key",
5681 native_shared_libs: ["mylib", "myprivlib"],
5682 }
5683
5684 apex_key {
5685 name: "myapex.key",
5686 public_key: "testkey.avbpubkey",
5687 private_key: "testkey.pem",
5688 }
5689
5690 cc_library {
5691 name: "mylib",
5692 srcs: ["mylib.cpp"],
5693 system_shared_libs: [],
5694 stl: "none",
5695 stubs: {
5696 versions: ["1"],
5697 },
5698 apex_available: ["myapex"],
5699 }
5700
5701 cc_library {
5702 name: "myprivlib",
5703 srcs: ["mylib.cpp"],
5704 system_shared_libs: [],
5705 stl: "none",
5706 apex_available: ["myapex"],
5707 }
5708
5709
5710 cc_test {
5711 name: "mytest",
5712 gtest: false,
5713 srcs: ["mylib.cpp"],
5714 system_shared_libs: [],
5715 stl: "none",
5716 shared_libs: ["mylib", "myprivlib"],
5717 test_for: ["myapex"]
5718 }
5719 `)
5720
5721 // the test 'mytest' is a test for the apex, therefore is linked to the
5722 // actual implementation of mylib instead of its stub.
5723 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5724 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5725 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5726}
5727
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005728// TODO(jungjw): Move this to proptools
5729func intPtr(i int) *int {
5730 return &i
5731}
5732
5733func TestApexSet(t *testing.T) {
5734 ctx, config := testApex(t, `
5735 apex_set {
5736 name: "myapex",
5737 set: "myapex.apks",
5738 filename: "foo_v2.apex",
5739 overrides: ["foo"],
5740 }
5741 `, func(fs map[string][]byte, config android.Config) {
5742 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5743 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5744 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5745 })
5746
5747 m := ctx.ModuleForTests("myapex", "android_common")
5748
5749 // Check extract_apks tool parameters.
5750 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5751 actual := extractedApex.Args["abis"]
5752 expected := "ARMEABI_V7A,ARM64_V8A"
5753 if actual != expected {
5754 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5755 }
5756 actual = extractedApex.Args["sdk-version"]
5757 expected = "30"
5758 if actual != expected {
5759 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5760 }
5761
5762 a := m.Module().(*ApexSet)
5763 expectedOverrides := []string{"foo"}
5764 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5765 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5766 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5767 }
5768}
5769
Jiyong Park7d95a512020-05-10 15:16:24 +09005770func TestNoStaticLinkingToStubsLib(t *testing.T) {
5771 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5772 apex {
5773 name: "myapex",
5774 key: "myapex.key",
5775 native_shared_libs: ["mylib"],
5776 }
5777
5778 apex_key {
5779 name: "myapex.key",
5780 public_key: "testkey.avbpubkey",
5781 private_key: "testkey.pem",
5782 }
5783
5784 cc_library {
5785 name: "mylib",
5786 srcs: ["mylib.cpp"],
5787 static_libs: ["otherlib"],
5788 system_shared_libs: [],
5789 stl: "none",
5790 apex_available: [ "myapex" ],
5791 }
5792
5793 cc_library {
5794 name: "otherlib",
5795 srcs: ["mylib.cpp"],
5796 system_shared_libs: [],
5797 stl: "none",
5798 stubs: {
5799 versions: ["1", "2", "3"],
5800 },
5801 apex_available: [ "myapex" ],
5802 }
5803 `)
5804}
5805
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005806func TestApexKeysTxt(t *testing.T) {
5807 ctx, _ := testApex(t, `
5808 apex {
5809 name: "myapex",
5810 key: "myapex.key",
5811 }
5812
5813 apex_key {
5814 name: "myapex.key",
5815 public_key: "testkey.avbpubkey",
5816 private_key: "testkey.pem",
5817 }
5818
5819 prebuilt_apex {
5820 name: "myapex",
5821 prefer: true,
5822 arch: {
5823 arm64: {
5824 src: "myapex-arm64.apex",
5825 },
5826 arm: {
5827 src: "myapex-arm.apex",
5828 },
5829 },
5830 }
5831
5832 apex_set {
5833 name: "myapex_set",
5834 set: "myapex.apks",
5835 filename: "myapex_set.apex",
5836 overrides: ["myapex"],
5837 }
5838 `)
5839
5840 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5841 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5842 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 +09005843 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 +09005844}
5845
Jooyung Han938b5932020-06-20 12:47:47 +09005846func TestAllowedFiles(t *testing.T) {
5847 ctx, _ := testApex(t, `
5848 apex {
5849 name: "myapex",
5850 key: "myapex.key",
5851 apps: ["app"],
5852 allowed_files: "allowed.txt",
5853 }
5854
5855 apex_key {
5856 name: "myapex.key",
5857 public_key: "testkey.avbpubkey",
5858 private_key: "testkey.pem",
5859 }
5860
5861 android_app {
5862 name: "app",
5863 srcs: ["foo/bar/MyClass.java"],
5864 package_name: "foo",
5865 sdk_version: "none",
5866 system_modules: "none",
5867 apex_available: [ "myapex" ],
5868 }
5869 `, withFiles(map[string][]byte{
5870 "sub/Android.bp": []byte(`
5871 override_apex {
5872 name: "override_myapex",
5873 base: "myapex",
5874 apps: ["override_app"],
5875 allowed_files: ":allowed",
5876 }
5877 // Overridable "path" property should be referenced indirectly
5878 filegroup {
5879 name: "allowed",
5880 srcs: ["allowed.txt"],
5881 }
5882 override_android_app {
5883 name: "override_app",
5884 base: "app",
5885 package_name: "bar",
5886 }
5887 `),
5888 }))
5889
5890 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5891 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5892 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5893 }
5894
5895 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5896 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5897 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5898 }
5899}
5900
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005901func TestNonPreferredPrebuiltDependency(t *testing.T) {
5902 _, _ = testApex(t, `
5903 apex {
5904 name: "myapex",
5905 key: "myapex.key",
5906 native_shared_libs: ["mylib"],
5907 }
5908
5909 apex_key {
5910 name: "myapex.key",
5911 public_key: "testkey.avbpubkey",
5912 private_key: "testkey.pem",
5913 }
5914
5915 cc_library {
5916 name: "mylib",
5917 srcs: ["mylib.cpp"],
5918 stubs: {
5919 versions: ["10000"],
5920 },
5921 apex_available: ["myapex"],
5922 }
5923
5924 cc_prebuilt_library_shared {
5925 name: "mylib",
5926 prefer: false,
5927 srcs: ["prebuilt.so"],
5928 stubs: {
5929 versions: ["10000"],
5930 },
5931 apex_available: ["myapex"],
5932 }
5933 `)
5934}
5935
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005936func TestMain(m *testing.M) {
5937 run := func() int {
5938 setUp()
5939 defer tearDown()
5940
5941 return m.Run()
5942 }
5943
5944 os.Exit(run())
5945}