blob: befb814836b83a0a69f7dca0b0d15c12a67c0e22 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070032 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090033 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090035)
36
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070037var buildDir string
38
Jooyung Hand3639552019-08-09 12:57:43 +090039// names returns name list from white space separated string
40func names(s string) (ns []string) {
41 for _, n := range strings.Split(s, " ") {
42 if len(n) > 0 {
43 ns = append(ns, n)
44 }
45 }
46 return
47}
48
Jooyung Han344d5432019-08-23 11:17:39 +090049func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
50 t.Helper()
51 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090052 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
53 if len(errs) > 0 {
54 android.FailIfNoMatchingErrors(t, pattern, errs)
55 return
56 }
57 _, errs = ctx.PrepareBuildActions(config)
58 if len(errs) > 0 {
59 android.FailIfNoMatchingErrors(t, pattern, errs)
60 return
61 }
62
63 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
64}
65
Jooyung Han344d5432019-08-23 11:17:39 +090066func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
67 t.Helper()
68 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010069 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090070 android.FailIfErrored(t, errs)
71 _, errs = ctx.PrepareBuildActions(config)
72 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070073 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090074}
75
Jooyung Han344d5432019-08-23 11:17:39 +090076type testCustomizer func(fs map[string][]byte, config android.Config)
77
78func withFiles(files map[string][]byte) testCustomizer {
79 return func(fs map[string][]byte, config android.Config) {
80 for k, v := range files {
81 fs[k] = v
82 }
83 }
84}
85
86func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
87 return func(fs map[string][]byte, config android.Config) {
88 for k, v := range targets {
89 config.Targets[k] = v
90 }
91 }
92}
93
Jooyung Han35155c42020-02-06 17:33:20 +090094// withNativeBridgeTargets sets configuration with targets including:
95// - X86_64 (primary)
96// - X86 (secondary)
97// - Arm64 on X86_64 (native bridge)
98// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -070099func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110}
111
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900112func withManifestPackageNameOverrides(specs []string) testCustomizer {
113 return func(fs map[string][]byte, config android.Config) {
114 config.TestProductVariables.ManifestPackageNameOverrides = specs
115 }
116}
117
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700118func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900119 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900123 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900127 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128
129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Dario Frenicde2a032019-10-27 00:29:22 +0100140 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900141
Jooyung Han344d5432019-08-23 11:17:39 +0900142 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "build/make/target/product/security": nil,
147 "apex_manifest.json": nil,
148 "AndroidManifest.xml": nil,
149 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900151 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/commonapex-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800155 "mylib.cpp": nil,
156 "mylib_common.cpp": nil,
157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900191 }
192
Colin Crossf9aabd72020-02-15 11:29:50 -0800193 cc.GatherRequiredFilesForTest(fs)
194
Jooyung Han344d5432019-08-23 11:17:39 +0900195 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800196 // The fs now needs to be populated before creating the config, call handlers twice
197 // for now, once to get any fs changes, and later after the config was created to
198 // set product variables or targets.
199 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
200 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900201 }
202
Colin Cross98be1bb2019-12-13 20:41:13 -0800203 config := android.TestArchConfig(buildDir, nil, bp, fs)
204 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
205 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
206 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
207 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
208 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jooyung Han749dc692020-04-15 11:03:39 +0900209 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800210 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
211
212 for _, handler := range handlers {
213 // The fs now needs to be populated before creating the config, call handlers twice
214 // for now, earlier to get any fs changes, and now after the config was created to
215 // set product variables or targets.
216 tempFS := map[string][]byte{}
217 handler(tempFS, config)
218 }
219
220 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100221
222 // from android package
223 android.RegisterPackageBuildComponents(ctx)
224 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
225
Colin Cross98be1bb2019-12-13 20:41:13 -0800226 ctx.RegisterModuleType("apex", BundleFactory)
227 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
228 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
229 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
230 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
231 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
232 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700233 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800234
Jooyung Hana57af4a2020-01-23 05:36:59 +0000235 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
236 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
237
Paul Duffin77980a82019-12-19 16:01:36 +0000238 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100239
240 // Register this after the prebuilt mutators have been registered (in
241 // cc.RegisterRequiredBuildComponentsForTest) to match what happens at runtime.
242 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
243 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
244
Colin Cross98be1bb2019-12-13 20:41:13 -0800245 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
247 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700248 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000249 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700250 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000252 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000253 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000254 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100255 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900256 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800257
Colin Cross98be1bb2019-12-13 20:41:13 -0800258 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260
261 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264}
265
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700266func setUp() {
267 var err error
268 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700270 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272}
273
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700274func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700275 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276}
277
Jooyung Han643adc42020-02-27 13:50:06 +0900278// ensure that 'result' equals 'expected'
279func ensureEquals(t *testing.T, result string, expected string) {
280 t.Helper()
281 if result != expected {
282 t.Errorf("%q != %q", expected, result)
283 }
284}
285
Jiyong Park25fc6a92018-11-18 18:02:45 +0900286// ensure that 'result' contains 'expected'
287func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if !strings.Contains(result, expected) {
290 t.Errorf("%q is not found in %q", expected, result)
291 }
292}
293
Liz Kammer5bd365f2020-05-27 15:15:11 -0700294// ensure that 'result' contains 'expected' exactly one time
295func ensureContainsOnce(t *testing.T, result string, expected string) {
296 t.Helper()
297 count := strings.Count(result, expected)
298 if count != 1 {
299 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
300 }
301}
302
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303// ensures that 'result' does not contain 'notExpected'
304func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900305 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306 if strings.Contains(result, notExpected) {
307 t.Errorf("%q is found in %q", notExpected, result)
308 }
309}
310
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700311func ensureMatches(t *testing.T, result string, expectedRex string) {
312 ok, err := regexp.MatchString(expectedRex, result)
313 if err != nil {
314 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
315 return
316 }
317 if !ok {
318 t.Errorf("%s does not match regular expession %s", result, expectedRex)
319 }
320}
321
Jiyong Park25fc6a92018-11-18 18:02:45 +0900322func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900323 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900324 if !android.InList(expected, result) {
325 t.Errorf("%q is not found in %v", expected, result)
326 }
327}
328
329func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900330 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 if android.InList(notExpected, result) {
332 t.Errorf("%q is found in %v", notExpected, result)
333 }
334}
335
Jooyung Hane1633032019-08-01 17:41:43 +0900336func ensureListEmpty(t *testing.T, result []string) {
337 t.Helper()
338 if len(result) > 0 {
339 t.Errorf("%q is expected to be empty", result)
340 }
341}
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343// Minimal test
344func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900345 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900346 apex_defaults {
347 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900348 manifest: ":myapex.manifest",
349 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 key: "myapex.key",
351 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800352 multilib: {
353 both: {
354 binaries: ["foo",],
355 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900356 },
Jiyong Park77acec62020-06-01 21:39:15 +0900357 java_libs: [
358 "myjar",
359 "myjar_dex",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 }
362
Jiyong Park30ca9372019-02-07 16:27:23 +0900363 apex {
364 name: "myapex",
365 defaults: ["myapex-defaults"],
366 }
367
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 apex_key {
369 name: "myapex.key",
370 public_key: "testkey.avbpubkey",
371 private_key: "testkey.pem",
372 }
373
Jiyong Park809bb722019-02-13 21:33:49 +0900374 filegroup {
375 name: "myapex.manifest",
376 srcs: ["apex_manifest.json"],
377 }
378
379 filegroup {
380 name: "myapex.androidmanifest",
381 srcs: ["AndroidManifest.xml"],
382 }
383
Jiyong Park25fc6a92018-11-18 18:02:45 +0900384 cc_library {
385 name: "mylib",
386 srcs: ["mylib.cpp"],
387 shared_libs: ["mylib2"],
388 system_shared_libs: [],
389 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000390 // TODO: remove //apex_available:platform
391 apex_available: [
392 "//apex_available:platform",
393 "myapex",
394 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900395 }
396
Alex Light3d673592019-01-18 14:37:31 -0800397 cc_binary {
398 name: "foo",
399 srcs: ["mylib.cpp"],
400 compile_multilib: "both",
401 multilib: {
402 lib32: {
403 suffix: "32",
404 },
405 lib64: {
406 suffix: "64",
407 },
408 },
409 symlinks: ["foo_link_"],
410 symlink_preferred_arch: true,
411 system_shared_libs: [],
412 static_executable: true,
413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000414 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800415 }
416
Paul Duffindddd5462020-04-07 15:25:44 +0100417 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900418 name: "mylib2",
419 srcs: ["mylib.cpp"],
420 system_shared_libs: [],
421 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900422 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900423 static_libs: ["libstatic"],
424 // TODO: remove //apex_available:platform
425 apex_available: [
426 "//apex_available:platform",
427 "myapex",
428 ],
429 }
430
Paul Duffindddd5462020-04-07 15:25:44 +0100431 cc_prebuilt_library_shared {
432 name: "mylib2",
433 srcs: ["prebuilt.so"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Jiyong Park9918e1a2020-03-17 19:16:40 +0900441 cc_library_static {
442 name: "libstatic",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
446 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900452 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900453
454 java_library {
455 name: "myjar",
456 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900457 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900458 sdk_version: "none",
459 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900460 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900461 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000462 // TODO: remove //apex_available:platform
463 apex_available: [
464 "//apex_available:platform",
465 "myapex",
466 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900467 }
468
Jiyong Park77acec62020-06-01 21:39:15 +0900469 dex_import {
470 name: "myjar_dex",
471 jars: ["prebuilt.jar"],
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
476 }
477
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478 java_library {
479 name: "myotherjar",
480 srcs: ["foo/bar/MyClass.java"],
481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900483 // TODO: remove //apex_available:platform
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900489
490 java_library {
491 name: "mysharedjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900495 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900496 `)
497
Sundong Ahnabb64432019-10-22 13:58:29 +0900498 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900499
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900500 // Make sure that Android.mk is created
501 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
502 data := android.AndroidMkDataForTest(t, config, "", ab)
503 var builder strings.Builder
504 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
505
506 androidMk := builder.String()
507 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
508 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
509
Jiyong Park42cca6c2019-04-01 11:15:50 +0900510 optFlags := apexRule.Args["opt_flags"]
511 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700512 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900513 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900514
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515 copyCmds := apexRule.Args["copy_commands"]
516
517 // Ensure that main rule creates an output
518 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
519
520 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800521 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900523 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900524
525 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800526 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900527 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900528
529 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800530 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
531 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900532 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900533 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900534 // .. but not for java libs
535 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900536 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800537
Colin Cross7113d202019-11-20 16:39:12 -0800538 // Ensure that the platform variant ends with _shared or _common
539 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
542 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
544
545 // Ensure that dynamic dependency to java libs are not included
546 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800547
548 // Ensure that all symlinks are present.
549 found_foo_link_64 := false
550 found_foo := false
551 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900552 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800553 if strings.HasSuffix(cmd, "bin/foo") {
554 found_foo = true
555 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
556 found_foo_link_64 = true
557 }
558 }
559 }
560 good := found_foo && found_foo_link_64
561 if !good {
562 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
563 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900564
Sundong Ahnabb64432019-10-22 13:58:29 +0900565 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700566 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900567 if len(noticeInputs) != 3 {
568 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900569 }
570 ensureListContains(t, noticeInputs, "NOTICE")
571 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900572 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900573
Artur Satayeva8bd1132020-04-27 18:07:06 +0100574 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100575 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
576 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
577 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
578 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
579 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100580
581 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100582 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
583 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
584 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
585 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
586 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800587}
588
Jooyung Hanf21c7972019-12-16 22:32:06 +0900589func TestDefaults(t *testing.T) {
590 ctx, _ := testApex(t, `
591 apex_defaults {
592 name: "myapex-defaults",
593 key: "myapex.key",
594 prebuilts: ["myetc"],
595 native_shared_libs: ["mylib"],
596 java_libs: ["myjar"],
597 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900598 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900599 }
600
601 prebuilt_etc {
602 name: "myetc",
603 src: "myprebuilt",
604 }
605
606 apex {
607 name: "myapex",
608 defaults: ["myapex-defaults"],
609 }
610
611 apex_key {
612 name: "myapex.key",
613 public_key: "testkey.avbpubkey",
614 private_key: "testkey.pem",
615 }
616
617 cc_library {
618 name: "mylib",
619 system_shared_libs: [],
620 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000621 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 java_library {
625 name: "myjar",
626 srcs: ["foo/bar/MyClass.java"],
627 sdk_version: "none",
628 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000629 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900630 }
631
632 android_app {
633 name: "AppFoo",
634 srcs: ["foo/bar/MyClass.java"],
635 sdk_version: "none",
636 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000637 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900638 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900639
640 runtime_resource_overlay {
641 name: "rro",
642 theme: "blue",
643 }
644
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000646 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 "etc/myetc",
648 "javalib/myjar.jar",
649 "lib64/mylib.so",
650 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900651 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900652 })
653}
654
Jooyung Han01a3ee22019-11-02 02:52:25 +0900655func TestApexManifest(t *testing.T) {
656 ctx, _ := testApex(t, `
657 apex {
658 name: "myapex",
659 key: "myapex.key",
660 }
661
662 apex_key {
663 name: "myapex.key",
664 public_key: "testkey.avbpubkey",
665 private_key: "testkey.pem",
666 }
667 `)
668
669 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900670 args := module.Rule("apexRule").Args
671 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
672 t.Error("manifest should be apex_manifest.pb, but " + manifest)
673 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900674}
675
Alex Light5098a612018-11-29 17:12:15 -0800676func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700677 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800678 apex {
679 name: "myapex",
680 key: "myapex.key",
681 payload_type: "zip",
682 native_shared_libs: ["mylib"],
683 }
684
685 apex_key {
686 name: "myapex.key",
687 public_key: "testkey.avbpubkey",
688 private_key: "testkey.pem",
689 }
690
691 cc_library {
692 name: "mylib",
693 srcs: ["mylib.cpp"],
694 shared_libs: ["mylib2"],
695 system_shared_libs: [],
696 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000697 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800698 }
699
700 cc_library {
701 name: "mylib2",
702 srcs: ["mylib.cpp"],
703 system_shared_libs: [],
704 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000705 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800706 }
707 `)
708
Sundong Ahnabb64432019-10-22 13:58:29 +0900709 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800710 copyCmds := zipApexRule.Args["copy_commands"]
711
712 // Ensure that main rule creates an output
713 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
714
715 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800716 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800717
718 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800719 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800720
721 // Ensure that both direct and indirect deps are copied into apex
722 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
723 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900724}
725
726func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700727 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728 apex {
729 name: "myapex",
730 key: "myapex.key",
731 native_shared_libs: ["mylib", "mylib3"],
732 }
733
734 apex_key {
735 name: "myapex.key",
736 public_key: "testkey.avbpubkey",
737 private_key: "testkey.pem",
738 }
739
740 cc_library {
741 name: "mylib",
742 srcs: ["mylib.cpp"],
743 shared_libs: ["mylib2", "mylib3"],
744 system_shared_libs: [],
745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000746 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900747 }
748
749 cc_library {
750 name: "mylib2",
751 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900752 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900753 system_shared_libs: [],
754 stl: "none",
755 stubs: {
756 versions: ["1", "2", "3"],
757 },
758 }
759
760 cc_library {
761 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900762 srcs: ["mylib.cpp"],
763 shared_libs: ["mylib4"],
764 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900765 stl: "none",
766 stubs: {
767 versions: ["10", "11", "12"],
768 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000769 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900770 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900771
772 cc_library {
773 name: "mylib4",
774 srcs: ["mylib.cpp"],
775 system_shared_libs: [],
776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000777 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900778 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900779 `)
780
Sundong Ahnabb64432019-10-22 13:58:29 +0900781 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900782 copyCmds := apexRule.Args["copy_commands"]
783
784 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800785 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900786
787 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800788 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789
790 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800791 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900792
Colin Cross7113d202019-11-20 16:39:12 -0800793 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900794
795 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900796 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900798 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799
800 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Cross7113d202019-11-20 16:39:12 -0800801 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800803 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900804
805 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900806 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900807 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900808
809 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900810 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900811
Jooyung Hana57af4a2020-01-23 05:36:59 +0000812 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900813 "lib64/mylib.so",
814 "lib64/mylib3.so",
815 "lib64/mylib4.so",
816 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817}
818
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900819func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700820 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900821 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900822 name: "myapex2",
823 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900824 native_shared_libs: ["mylib"],
825 }
826
827 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900828 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829 public_key: "testkey.avbpubkey",
830 private_key: "testkey.pem",
831 }
832
833 cc_library {
834 name: "mylib",
835 srcs: ["mylib.cpp"],
836 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900837 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900838 system_shared_libs: [],
839 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000840 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900841 }
842
843 cc_library {
844 name: "libfoo",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["libbar"],
847 system_shared_libs: [],
848 stl: "none",
849 stubs: {
850 versions: ["10", "20", "30"],
851 },
852 }
853
854 cc_library {
855 name: "libbar",
856 srcs: ["mylib.cpp"],
857 system_shared_libs: [],
858 stl: "none",
859 }
860
Jiyong Park678c8812020-02-07 17:25:49 +0900861 cc_library_static {
862 name: "libbaz",
863 srcs: ["mylib.cpp"],
864 system_shared_libs: [],
865 stl: "none",
866 apex_available: [ "myapex2" ],
867 }
868
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900869 `)
870
Jiyong Park83dc74b2020-01-14 18:38:44 +0900871 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900872 copyCmds := apexRule.Args["copy_commands"]
873
874 // Ensure that direct non-stubs dep is always included
875 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
876
877 // Ensure that indirect stubs dep is not included
878 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
879
880 // Ensure that dependency of stubs is not included
881 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
882
Jiyong Park83dc74b2020-01-14 18:38:44 +0900883 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900884
885 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900886 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900887 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900888 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900889
Jiyong Park3ff16992019-12-27 14:11:47 +0900890 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900891
892 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
893 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900894
Artur Satayeva8bd1132020-04-27 18:07:06 +0100895 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100896 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
897 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
898 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900899
Artur Satayeva8bd1132020-04-27 18:07:06 +0100900 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100901 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
902 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
903 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900904}
905
Jooyung Hand3639552019-08-09 12:57:43 +0900906func TestApexWithRuntimeLibsDependency(t *testing.T) {
907 /*
908 myapex
909 |
910 v (runtime_libs)
911 mylib ------+------> libfoo [provides stub]
912 |
913 `------> libbar
914 */
915 ctx, _ := testApex(t, `
916 apex {
917 name: "myapex",
918 key: "myapex.key",
919 native_shared_libs: ["mylib"],
920 }
921
922 apex_key {
923 name: "myapex.key",
924 public_key: "testkey.avbpubkey",
925 private_key: "testkey.pem",
926 }
927
928 cc_library {
929 name: "mylib",
930 srcs: ["mylib.cpp"],
931 runtime_libs: ["libfoo", "libbar"],
932 system_shared_libs: [],
933 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000934 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900935 }
936
937 cc_library {
938 name: "libfoo",
939 srcs: ["mylib.cpp"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["10", "20", "30"],
944 },
945 }
946
947 cc_library {
948 name: "libbar",
949 srcs: ["mylib.cpp"],
950 system_shared_libs: [],
951 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000952 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900953 }
954
955 `)
956
Sundong Ahnabb64432019-10-22 13:58:29 +0900957 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900958 copyCmds := apexRule.Args["copy_commands"]
959
960 // Ensure that direct non-stubs dep is always included
961 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
962
963 // Ensure that indirect stubs dep is not included
964 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
965
966 // Ensure that runtime_libs dep in included
967 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
968
Sundong Ahnabb64432019-10-22 13:58:29 +0900969 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900970 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
971 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900972
973}
974
Jooyung Han8ce8db92020-05-15 19:05:05 +0900975func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
976 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
977 bp := `
978 apex {
979 name: "com.android.runtime",
980 key: "com.android.runtime.key",
981 native_shared_libs: ["libc"],
982 }
983
984 apex_key {
985 name: "com.android.runtime.key",
986 public_key: "testkey.avbpubkey",
987 private_key: "testkey.pem",
988 }
989
990 cc_library {
991 name: "libc",
992 no_libcrt: true,
993 nocrt: true,
994 stl: "none",
995 system_shared_libs: [],
996 stubs: { versions: ["1"] },
997 apex_available: ["com.android.runtime"],
998
999 sanitize: {
1000 hwaddress: true,
1001 }
1002 }
1003
1004 cc_prebuilt_library_shared {
1005 name: "libclang_rt.hwasan-aarch64-android",
1006 no_libcrt: true,
1007 nocrt: true,
1008 stl: "none",
1009 system_shared_libs: [],
1010 srcs: [""],
1011 stubs: { versions: ["1"] },
1012
1013 sanitize: {
1014 never: true,
1015 },
1016 }
1017 `
1018 // override bp to use hard-coded names: com.android.runtime and libc
1019 fs["Android.bp"] = []byte(bp)
1020 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1021 })
1022
1023 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1024 "lib64/bionic/libc.so",
1025 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1026 })
1027
1028 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1029
1030 installed := hwasan.Description("install libclang_rt.hwasan")
1031 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1032
1033 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1034 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1035 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1036}
1037
1038func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1039 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1040 bp := `
1041 apex {
1042 name: "com.android.runtime",
1043 key: "com.android.runtime.key",
1044 native_shared_libs: ["libc"],
1045 }
1046
1047 apex_key {
1048 name: "com.android.runtime.key",
1049 public_key: "testkey.avbpubkey",
1050 private_key: "testkey.pem",
1051 }
1052
1053 cc_library {
1054 name: "libc",
1055 no_libcrt: true,
1056 nocrt: true,
1057 stl: "none",
1058 system_shared_libs: [],
1059 stubs: { versions: ["1"] },
1060 apex_available: ["com.android.runtime"],
1061 }
1062
1063 cc_prebuilt_library_shared {
1064 name: "libclang_rt.hwasan-aarch64-android",
1065 no_libcrt: true,
1066 nocrt: true,
1067 stl: "none",
1068 system_shared_libs: [],
1069 srcs: [""],
1070 stubs: { versions: ["1"] },
1071
1072 sanitize: {
1073 never: true,
1074 },
1075 }
1076 `
1077 // override bp to use hard-coded names: com.android.runtime and libc
1078 fs["Android.bp"] = []byte(bp)
1079 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1080
1081 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1082 })
1083
1084 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1085 "lib64/bionic/libc.so",
1086 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1087 })
1088
1089 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1090
1091 installed := hwasan.Description("install libclang_rt.hwasan")
1092 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1093
1094 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1095 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1096 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1097}
1098
Jooyung Han61b66e92020-03-21 14:21:46 +00001099func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1100 testcases := []struct {
1101 name string
1102 minSdkVersion string
1103 shouldLink string
1104 shouldNotLink []string
1105 }{
1106 {
Jooyung Han75568392020-03-20 04:29:24 +09001107 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001108 minSdkVersion: "",
Jooyung Han61b66e92020-03-21 14:21:46 +00001109 shouldLink: "30",
1110 shouldNotLink: []string{"29"},
1111 },
1112 {
1113 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001114 minSdkVersion: "min_sdk_version: \"29\",",
Jooyung Han61b66e92020-03-21 14:21:46 +00001115 shouldLink: "29",
1116 shouldNotLink: []string{"30"},
1117 },
1118 }
1119 for _, tc := range testcases {
1120 t.Run(tc.name, func(t *testing.T) {
1121 ctx, _ := testApex(t, `
1122 apex {
1123 name: "myapex",
1124 key: "myapex.key",
1125 use_vendor: true,
1126 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001127 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001128 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001129
Jooyung Han61b66e92020-03-21 14:21:46 +00001130 apex_key {
1131 name: "myapex.key",
1132 public_key: "testkey.avbpubkey",
1133 private_key: "testkey.pem",
1134 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001135
Jooyung Han61b66e92020-03-21 14:21:46 +00001136 cc_library {
1137 name: "mylib",
1138 srcs: ["mylib.cpp"],
1139 vendor_available: true,
1140 shared_libs: ["libbar"],
1141 system_shared_libs: [],
1142 stl: "none",
1143 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001144 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001145 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001146
Jooyung Han61b66e92020-03-21 14:21:46 +00001147 cc_library {
1148 name: "libbar",
1149 srcs: ["mylib.cpp"],
1150 system_shared_libs: [],
1151 stl: "none",
1152 stubs: { versions: ["29","30"] },
1153 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001154
Jooyung Han61b66e92020-03-21 14:21:46 +00001155 llndk_library {
1156 name: "libbar",
1157 symbol_file: "",
1158 }
1159 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001160 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001161 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001162
Jooyung Han61b66e92020-03-21 14:21:46 +00001163 // Ensure that LLNDK dep is not included
1164 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1165 "lib64/mylib.so",
1166 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001167
Jooyung Han61b66e92020-03-21 14:21:46 +00001168 // Ensure that LLNDK dep is required
1169 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1170 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1171 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001172
Jooyung Han61b66e92020-03-21 14:21:46 +00001173 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1174 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1175 for _, ver := range tc.shouldNotLink {
1176 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1177 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001178
Jooyung Han61b66e92020-03-21 14:21:46 +00001179 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1180 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1181 })
1182 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001183}
1184
Jiyong Park25fc6a92018-11-18 18:02:45 +09001185func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001186 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001187 apex {
1188 name: "myapex",
1189 key: "myapex.key",
1190 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1191 }
1192
1193 apex_key {
1194 name: "myapex.key",
1195 public_key: "testkey.avbpubkey",
1196 private_key: "testkey.pem",
1197 }
1198
1199 cc_library {
1200 name: "mylib",
1201 srcs: ["mylib.cpp"],
1202 shared_libs: ["libdl#27"],
1203 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001204 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001205 }
1206
1207 cc_library_shared {
1208 name: "mylib_shared",
1209 srcs: ["mylib.cpp"],
1210 shared_libs: ["libdl#27"],
1211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001212 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001213 }
1214
1215 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001216 name: "libBootstrap",
1217 srcs: ["mylib.cpp"],
1218 stl: "none",
1219 bootstrap: true,
1220 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001221 `)
1222
Sundong Ahnabb64432019-10-22 13:58:29 +09001223 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001224 copyCmds := apexRule.Args["copy_commands"]
1225
1226 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001227 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001228 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1229 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001230
1231 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001232 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001233
Colin Cross7113d202019-11-20 16:39:12 -08001234 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1235 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1236 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001237
1238 // For dependency to libc
1239 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001240 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001241 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001242 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001243 // ... Cflags from stub is correctly exported to mylib
1244 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1245 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1246
1247 // For dependency to libm
1248 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001249 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001250 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001251 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001252 // ... and is not compiling with the stub
1253 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1254 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1255
1256 // For dependency to libdl
1257 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001258 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001259 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001260 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1261 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001262 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001263 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001264 // ... Cflags from stub is correctly exported to mylib
1265 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1266 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001267
1268 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001269 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1270 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1271 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1272 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001273}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001274
Jooyung Han749dc692020-04-15 11:03:39 +09001275func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001276 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001277 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1278 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001279 // 3) (platform) -> liba -> libz : this should be non-stub link
1280 ctx, _ := testApex(t, `
1281 apex {
1282 name: "myapex",
1283 key: "myapex.key",
1284 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001285 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001286 }
1287
1288 apex {
1289 name: "otherapex",
1290 key: "myapex.key",
1291 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001292 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001293 }
1294
1295 apex_key {
1296 name: "myapex.key",
1297 public_key: "testkey.avbpubkey",
1298 private_key: "testkey.pem",
1299 }
1300
1301 cc_library {
1302 name: "libx",
1303 shared_libs: ["liba"],
1304 system_shared_libs: [],
1305 stl: "none",
1306 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001307 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001308 }
1309
1310 cc_library {
1311 name: "liby",
1312 shared_libs: ["liba"],
1313 system_shared_libs: [],
1314 stl: "none",
1315 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001316 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001317 }
1318
1319 cc_library {
1320 name: "liba",
1321 shared_libs: ["libz"],
1322 system_shared_libs: [],
1323 stl: "none",
1324 apex_available: [
1325 "//apex_available:anyapex",
1326 "//apex_available:platform",
1327 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001328 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001329 }
1330
1331 cc_library {
1332 name: "libz",
1333 system_shared_libs: [],
1334 stl: "none",
1335 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001336 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001337 },
1338 }
Jooyung Han749dc692020-04-15 11:03:39 +09001339 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001340
1341 expectLink := func(from, from_variant, to, to_variant string) {
1342 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1343 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1344 }
1345 expectNoLink := func(from, from_variant, to, to_variant string) {
1346 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1347 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1348 }
1349 // platform liba is linked to non-stub version
1350 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001351 // liba in myapex is linked to #28
1352 expectLink("liba", "shared_myapex", "libz", "shared_28")
1353 expectNoLink("liba", "shared_myapex", "libz", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001354 expectNoLink("liba", "shared_myapex", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001355 // liba in otherapex is linked to #30
1356 expectLink("liba", "shared_otherapex", "libz", "shared_30")
1357 expectNoLink("liba", "shared_otherapex", "libz", "shared_28")
Jooyung Han03b51852020-02-26 22:45:42 +09001358 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1359}
1360
Jooyung Hanaed150d2020-04-02 01:41:41 +09001361func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1362 ctx, _ := testApex(t, `
1363 apex {
1364 name: "myapex",
1365 key: "myapex.key",
1366 native_shared_libs: ["libx"],
1367 min_sdk_version: "R",
1368 }
1369
1370 apex_key {
1371 name: "myapex.key",
1372 public_key: "testkey.avbpubkey",
1373 private_key: "testkey.pem",
1374 }
1375
1376 cc_library {
1377 name: "libx",
1378 shared_libs: ["libz"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001382 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001383 }
1384
1385 cc_library {
1386 name: "libz",
1387 system_shared_libs: [],
1388 stl: "none",
1389 stubs: {
1390 versions: ["29", "R"],
1391 },
1392 }
1393 `, func(fs map[string][]byte, config android.Config) {
1394 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1395 })
1396
1397 expectLink := func(from, from_variant, to, to_variant string) {
1398 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1399 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1400 }
1401 expectNoLink := func(from, from_variant, to, to_variant string) {
1402 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1403 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1404 }
1405 // 9000 is quite a magic number.
1406 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1407 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1408 // to distinguish them from finalized and future_api(10000)
1409 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1410 // (refer android/api_levels.go)
1411 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1412 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1413 expectNoLink("libx", "shared_myapex", "libz", "shared")
1414}
1415
Jooyung Han749dc692020-04-15 11:03:39 +09001416func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001417 ctx, _ := testApex(t, `
1418 apex {
1419 name: "myapex",
1420 key: "myapex.key",
1421 native_shared_libs: ["libx"],
1422 }
1423
1424 apex_key {
1425 name: "myapex.key",
1426 public_key: "testkey.avbpubkey",
1427 private_key: "testkey.pem",
1428 }
1429
1430 cc_library {
1431 name: "libx",
1432 shared_libs: ["libz"],
1433 system_shared_libs: [],
1434 stl: "none",
1435 apex_available: [ "myapex" ],
1436 }
1437
1438 cc_library {
1439 name: "libz",
1440 system_shared_libs: [],
1441 stl: "none",
1442 stubs: {
1443 versions: ["1", "2"],
1444 },
1445 }
1446 `)
1447
1448 expectLink := func(from, from_variant, to, to_variant string) {
1449 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1450 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1451 }
1452 expectNoLink := func(from, from_variant, to, to_variant string) {
1453 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1454 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1455 }
1456 expectLink("libx", "shared_myapex", "libz", "shared_2")
1457 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1458 expectNoLink("libx", "shared_myapex", "libz", "shared")
1459}
1460
1461func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1462 ctx, _ := testApex(t, `
1463 apex {
1464 name: "myapex",
1465 key: "myapex.key",
1466 native_shared_libs: ["libx"],
1467 }
1468
1469 apex_key {
1470 name: "myapex.key",
1471 public_key: "testkey.avbpubkey",
1472 private_key: "testkey.pem",
1473 }
1474
1475 cc_library {
1476 name: "libx",
1477 system_shared_libs: [],
1478 stl: "none",
1479 apex_available: [ "myapex" ],
1480 stubs: {
1481 versions: ["1", "2"],
1482 },
1483 }
1484
1485 cc_library {
1486 name: "libz",
1487 shared_libs: ["libx"],
1488 system_shared_libs: [],
1489 stl: "none",
1490 }
1491 `)
1492
1493 expectLink := func(from, from_variant, to, to_variant string) {
1494 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1495 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1496 }
1497 expectNoLink := func(from, from_variant, to, to_variant string) {
1498 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1499 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1500 }
1501 expectLink("libz", "shared", "libx", "shared_2")
1502 expectNoLink("libz", "shared", "libz", "shared_1")
1503 expectNoLink("libz", "shared", "libz", "shared")
1504}
1505
Jooyung Han75568392020-03-20 04:29:24 +09001506func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001507 ctx, _ := testApex(t, `
1508 apex {
1509 name: "myapex",
1510 key: "myapex.key",
1511 native_shared_libs: ["libx"],
1512 min_sdk_version: "29",
1513 }
1514
1515 apex_key {
1516 name: "myapex.key",
1517 public_key: "testkey.avbpubkey",
1518 private_key: "testkey.pem",
1519 }
1520
1521 cc_library {
1522 name: "libx",
1523 shared_libs: ["libbar"],
1524 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001525 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001526 }
1527
1528 cc_library {
1529 name: "libbar",
1530 stubs: {
1531 versions: ["29", "30"],
1532 },
1533 }
Jooyung Han75568392020-03-20 04:29:24 +09001534 `, func(fs map[string][]byte, config android.Config) {
1535 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1536 })
Jooyung Han03b51852020-02-26 22:45:42 +09001537 expectLink := func(from, from_variant, to, to_variant string) {
1538 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1539 libFlags := ld.Args["libFlags"]
1540 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1541 }
Jooyung Han75568392020-03-20 04:29:24 +09001542 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001543}
1544
Jooyung Han75568392020-03-20 04:29:24 +09001545func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001546 ctx, _ := testApex(t, `
1547 apex {
1548 name: "myapex",
1549 key: "myapex.key",
1550 native_shared_libs: ["libx"],
1551 min_sdk_version: "29",
1552 }
1553
1554 apex_key {
1555 name: "myapex.key",
1556 public_key: "testkey.avbpubkey",
1557 private_key: "testkey.pem",
1558 }
1559
1560 cc_library {
1561 name: "libx",
1562 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001563 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001564 }
Jooyung Han75568392020-03-20 04:29:24 +09001565 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001566
1567 // ensure apex variant of c++ is linked with static unwinder
1568 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1569 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1570 // note that platform variant is not.
1571 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1572 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001573}
1574
Jooyung Han749dc692020-04-15 11:03:39 +09001575func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001576 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001577 apex {
1578 name: "myapex",
1579 key: "myapex.key",
1580 native_shared_libs: ["libx"],
1581 min_sdk_version: "29",
1582 }
1583
1584 apex_key {
1585 name: "myapex.key",
1586 public_key: "testkey.avbpubkey",
1587 private_key: "testkey.pem",
1588 }
1589
1590 cc_library {
1591 name: "libx",
1592 shared_libs: ["libz"],
1593 system_shared_libs: [],
1594 stl: "none",
1595 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001596 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001597 }
1598
1599 cc_library {
1600 name: "libz",
1601 system_shared_libs: [],
1602 stl: "none",
1603 stubs: {
1604 versions: ["30"],
1605 },
1606 }
Jooyung Han75568392020-03-20 04:29:24 +09001607 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001608}
Jooyung Han03b51852020-02-26 22:45:42 +09001609
Jooyung Han749dc692020-04-15 11:03:39 +09001610func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1611 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001612 apex {
1613 name: "myapex",
1614 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001615 native_shared_libs: ["mylib"],
1616 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001617 }
1618
1619 apex_key {
1620 name: "myapex.key",
1621 public_key: "testkey.avbpubkey",
1622 private_key: "testkey.pem",
1623 }
Jooyung Han749dc692020-04-15 11:03:39 +09001624
1625 cc_library {
1626 name: "mylib",
1627 srcs: ["mylib.cpp"],
1628 system_shared_libs: [],
1629 stl: "none",
1630 apex_available: [
1631 "myapex",
1632 ],
1633 min_sdk_version: "30",
1634 }
1635 `)
1636}
1637
1638func TestApexMinSdkVersion_Okay(t *testing.T) {
1639 testApex(t, `
1640 apex {
1641 name: "myapex",
1642 key: "myapex.key",
1643 native_shared_libs: ["libfoo"],
1644 java_libs: ["libbar"],
1645 min_sdk_version: "29",
1646 }
1647
1648 apex_key {
1649 name: "myapex.key",
1650 public_key: "testkey.avbpubkey",
1651 private_key: "testkey.pem",
1652 }
1653
1654 cc_library {
1655 name: "libfoo",
1656 srcs: ["mylib.cpp"],
1657 shared_libs: ["libfoo_dep"],
1658 apex_available: ["myapex"],
1659 min_sdk_version: "29",
1660 }
1661
1662 cc_library {
1663 name: "libfoo_dep",
1664 srcs: ["mylib.cpp"],
1665 apex_available: ["myapex"],
1666 min_sdk_version: "29",
1667 }
1668
1669 java_library {
1670 name: "libbar",
1671 sdk_version: "current",
1672 srcs: ["a.java"],
1673 static_libs: ["libbar_dep"],
1674 apex_available: ["myapex"],
1675 min_sdk_version: "29",
1676 }
1677
1678 java_library {
1679 name: "libbar_dep",
1680 sdk_version: "current",
1681 srcs: ["a.java"],
1682 apex_available: ["myapex"],
1683 min_sdk_version: "29",
1684 }
Jooyung Han03b51852020-02-26 22:45:42 +09001685 `)
1686}
1687
Artur Satayev8cf899a2020-04-15 17:29:42 +01001688func TestJavaStableSdkVersion(t *testing.T) {
1689 testCases := []struct {
1690 name string
1691 expectedError string
1692 bp string
1693 }{
1694 {
1695 name: "Non-updatable apex with non-stable dep",
1696 bp: `
1697 apex {
1698 name: "myapex",
1699 java_libs: ["myjar"],
1700 key: "myapex.key",
1701 }
1702 apex_key {
1703 name: "myapex.key",
1704 public_key: "testkey.avbpubkey",
1705 private_key: "testkey.pem",
1706 }
1707 java_library {
1708 name: "myjar",
1709 srcs: ["foo/bar/MyClass.java"],
1710 sdk_version: "core_platform",
1711 apex_available: ["myapex"],
1712 }
1713 `,
1714 },
1715 {
1716 name: "Updatable apex with stable dep",
1717 bp: `
1718 apex {
1719 name: "myapex",
1720 java_libs: ["myjar"],
1721 key: "myapex.key",
1722 updatable: true,
1723 min_sdk_version: "29",
1724 }
1725 apex_key {
1726 name: "myapex.key",
1727 public_key: "testkey.avbpubkey",
1728 private_key: "testkey.pem",
1729 }
1730 java_library {
1731 name: "myjar",
1732 srcs: ["foo/bar/MyClass.java"],
1733 sdk_version: "current",
1734 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001735 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001736 }
1737 `,
1738 },
1739 {
1740 name: "Updatable apex with non-stable dep",
1741 expectedError: "cannot depend on \"myjar\"",
1742 bp: `
1743 apex {
1744 name: "myapex",
1745 java_libs: ["myjar"],
1746 key: "myapex.key",
1747 updatable: true,
1748 }
1749 apex_key {
1750 name: "myapex.key",
1751 public_key: "testkey.avbpubkey",
1752 private_key: "testkey.pem",
1753 }
1754 java_library {
1755 name: "myjar",
1756 srcs: ["foo/bar/MyClass.java"],
1757 sdk_version: "core_platform",
1758 apex_available: ["myapex"],
1759 }
1760 `,
1761 },
1762 {
1763 name: "Updatable apex with non-stable transitive dep",
1764 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1765 bp: `
1766 apex {
1767 name: "myapex",
1768 java_libs: ["myjar"],
1769 key: "myapex.key",
1770 updatable: true,
1771 }
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777 java_library {
1778 name: "myjar",
1779 srcs: ["foo/bar/MyClass.java"],
1780 sdk_version: "current",
1781 apex_available: ["myapex"],
1782 static_libs: ["transitive-jar"],
1783 }
1784 java_library {
1785 name: "transitive-jar",
1786 srcs: ["foo/bar/MyClass.java"],
1787 sdk_version: "core_platform",
1788 apex_available: ["myapex"],
1789 }
1790 `,
1791 },
1792 }
1793
1794 for _, test := range testCases {
1795 t.Run(test.name, func(t *testing.T) {
1796 if test.expectedError == "" {
1797 testApex(t, test.bp)
1798 } else {
1799 testApexError(t, test.expectedError, test.bp)
1800 }
1801 })
1802 }
1803}
1804
Jooyung Han749dc692020-04-15 11:03:39 +09001805func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1806 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1807 apex {
1808 name: "myapex",
1809 key: "myapex.key",
1810 native_shared_libs: ["mylib"],
1811 min_sdk_version: "29",
1812 }
1813
1814 apex_key {
1815 name: "myapex.key",
1816 public_key: "testkey.avbpubkey",
1817 private_key: "testkey.pem",
1818 }
1819
1820 cc_library {
1821 name: "mylib",
1822 srcs: ["mylib.cpp"],
1823 shared_libs: ["mylib2"],
1824 system_shared_libs: [],
1825 stl: "none",
1826 apex_available: [
1827 "myapex",
1828 ],
1829 min_sdk_version: "29",
1830 }
1831
1832 // indirect part of the apex
1833 cc_library {
1834 name: "mylib2",
1835 srcs: ["mylib.cpp"],
1836 system_shared_libs: [],
1837 stl: "none",
1838 apex_available: [
1839 "myapex",
1840 ],
1841 min_sdk_version: "30",
1842 }
1843 `)
1844}
1845
1846func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1847 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 apps: ["AppFoo"],
1852 min_sdk_version: "29",
1853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 android_app {
1862 name: "AppFoo",
1863 srcs: ["foo/bar/MyClass.java"],
1864 sdk_version: "current",
1865 min_sdk_version: "29",
1866 system_modules: "none",
1867 stl: "none",
1868 static_libs: ["bar"],
1869 apex_available: [ "myapex" ],
1870 }
1871
1872 java_library {
1873 name: "bar",
1874 sdk_version: "current",
1875 srcs: ["a.java"],
1876 apex_available: [ "myapex" ],
1877 }
1878 `)
1879}
1880
1881func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1882 ctx, _ := testApex(t, `
1883 apex {
1884 name: "myapex",
1885 key: "myapex.key",
1886 native_shared_libs: ["mylib"],
1887 min_sdk_version: "29",
1888 }
1889
1890 apex_key {
1891 name: "myapex.key",
1892 public_key: "testkey.avbpubkey",
1893 private_key: "testkey.pem",
1894 }
1895
1896 // mylib in myapex will link to mylib2#29
1897 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1898 cc_library {
1899 name: "mylib",
1900 srcs: ["mylib.cpp"],
1901 shared_libs: ["mylib2"],
1902 system_shared_libs: [],
1903 stl: "none",
1904 apex_available: ["myapex", "otherapex"],
1905 min_sdk_version: "29",
1906 }
1907
1908 cc_library {
1909 name: "mylib2",
1910 srcs: ["mylib.cpp"],
1911 system_shared_libs: [],
1912 stl: "none",
1913 apex_available: ["otherapex"],
1914 stubs: { versions: ["29", "30"] },
1915 min_sdk_version: "30",
1916 }
1917
1918 apex {
1919 name: "otherapex",
1920 key: "myapex.key",
1921 native_shared_libs: ["mylib", "mylib2"],
1922 min_sdk_version: "30",
1923 }
1924 `)
1925 expectLink := func(from, from_variant, to, to_variant string) {
1926 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1927 libFlags := ld.Args["libFlags"]
1928 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1929 }
1930 expectLink("mylib", "shared_myapex", "mylib2", "shared_29")
1931 expectLink("mylib", "shared_otherapex", "mylib2", "shared_otherapex")
1932}
1933
Jiyong Park7c2ee712018-12-07 00:42:25 +09001934func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001935 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001936 apex {
1937 name: "myapex",
1938 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001939 native_shared_libs: ["mylib"],
1940 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001941 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001942 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001943 }
1944
1945 apex_key {
1946 name: "myapex.key",
1947 public_key: "testkey.avbpubkey",
1948 private_key: "testkey.pem",
1949 }
1950
1951 prebuilt_etc {
1952 name: "myetc",
1953 src: "myprebuilt",
1954 sub_dir: "foo/bar",
1955 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001956
1957 cc_library {
1958 name: "mylib",
1959 srcs: ["mylib.cpp"],
1960 relative_install_path: "foo/bar",
1961 system_shared_libs: [],
1962 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001963 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001964 }
1965
1966 cc_binary {
1967 name: "mybin",
1968 srcs: ["mylib.cpp"],
1969 relative_install_path: "foo/bar",
1970 system_shared_libs: [],
1971 static_executable: true,
1972 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001973 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001974 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001975 `)
1976
Sundong Ahnabb64432019-10-22 13:58:29 +09001977 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001978 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1979
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001980 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001981 ensureListContains(t, dirs, "etc")
1982 ensureListContains(t, dirs, "etc/foo")
1983 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001984 ensureListContains(t, dirs, "lib64")
1985 ensureListContains(t, dirs, "lib64/foo")
1986 ensureListContains(t, dirs, "lib64/foo/bar")
1987 ensureListContains(t, dirs, "lib")
1988 ensureListContains(t, dirs, "lib/foo")
1989 ensureListContains(t, dirs, "lib/foo/bar")
1990
Jiyong Parkbd13e442019-03-15 18:10:35 +09001991 ensureListContains(t, dirs, "bin")
1992 ensureListContains(t, dirs, "bin/foo")
1993 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001994}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001995
Jooyung Han35155c42020-02-06 17:33:20 +09001996func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1997 ctx, _ := testApex(t, `
1998 apex {
1999 name: "myapex",
2000 key: "myapex.key",
2001 multilib: {
2002 both: {
2003 native_shared_libs: ["mylib"],
2004 binaries: ["mybin"],
2005 },
2006 },
2007 compile_multilib: "both",
2008 native_bridge_supported: true,
2009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
2017 cc_library {
2018 name: "mylib",
2019 relative_install_path: "foo/bar",
2020 system_shared_libs: [],
2021 stl: "none",
2022 apex_available: [ "myapex" ],
2023 native_bridge_supported: true,
2024 }
2025
2026 cc_binary {
2027 name: "mybin",
2028 relative_install_path: "foo/bar",
2029 system_shared_libs: [],
2030 static_executable: true,
2031 stl: "none",
2032 apex_available: [ "myapex" ],
2033 native_bridge_supported: true,
2034 compile_multilib: "both", // default is "first" for binary
2035 multilib: {
2036 lib64: {
2037 suffix: "64",
2038 },
2039 },
2040 }
2041 `, withNativeBridgeEnabled)
2042 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2043 "bin/foo/bar/mybin",
2044 "bin/foo/bar/mybin64",
2045 "bin/arm/foo/bar/mybin",
2046 "bin/arm64/foo/bar/mybin64",
2047 "lib/foo/bar/mylib.so",
2048 "lib/arm/foo/bar/mylib.so",
2049 "lib64/foo/bar/mylib.so",
2050 "lib64/arm64/foo/bar/mylib.so",
2051 })
2052}
2053
Jiyong Parkda6eb592018-12-19 17:12:36 +09002054func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002055 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002056 apex {
2057 name: "myapex",
2058 key: "myapex.key",
2059 native_shared_libs: ["mylib"],
2060 use_vendor: true,
2061 }
2062
2063 apex_key {
2064 name: "myapex.key",
2065 public_key: "testkey.avbpubkey",
2066 private_key: "testkey.pem",
2067 }
2068
2069 cc_library {
2070 name: "mylib",
2071 srcs: ["mylib.cpp"],
2072 shared_libs: ["mylib2"],
2073 system_shared_libs: [],
2074 vendor_available: true,
2075 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002076 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002077 }
2078
2079 cc_library {
2080 name: "mylib2",
2081 srcs: ["mylib.cpp"],
2082 system_shared_libs: [],
2083 vendor_available: true,
2084 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002085 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002086 }
Jooyung Handc782442019-11-01 03:14:38 +09002087 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002088 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002089 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002090
2091 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002092 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002093 for _, implicit := range i.Implicits {
2094 inputsList = append(inputsList, implicit.String())
2095 }
2096 }
2097 inputsString := strings.Join(inputsList, " ")
2098
2099 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08002100 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
2101 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002102
2103 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08002104 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
2105 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002106}
Jiyong Park16e91a02018-12-20 18:18:08 +09002107
Jooyung Han85d61762020-06-24 23:50:26 +09002108func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002109 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2110 apex {
2111 name: "myapex",
2112 key: "myapex.key",
2113 use_vendor: true,
2114 }
2115 apex_key {
2116 name: "myapex.key",
2117 public_key: "testkey.avbpubkey",
2118 private_key: "testkey.pem",
2119 }
2120 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002121 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002122 })
Colin Cross440e0d02020-06-11 11:32:11 -07002123 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002124 testApex(t, `
2125 apex {
2126 name: "myapex",
2127 key: "myapex.key",
2128 use_vendor: true,
2129 }
2130 apex_key {
2131 name: "myapex.key",
2132 public_key: "testkey.avbpubkey",
2133 private_key: "testkey.pem",
2134 }
2135 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002136 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002137 })
2138}
2139
Jooyung Han5c998b92019-06-27 11:30:33 +09002140func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2141 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2142 apex {
2143 name: "myapex",
2144 key: "myapex.key",
2145 native_shared_libs: ["mylib"],
2146 use_vendor: true,
2147 }
2148
2149 apex_key {
2150 name: "myapex.key",
2151 public_key: "testkey.avbpubkey",
2152 private_key: "testkey.pem",
2153 }
2154
2155 cc_library {
2156 name: "mylib",
2157 srcs: ["mylib.cpp"],
2158 system_shared_libs: [],
2159 stl: "none",
2160 }
2161 `)
2162}
2163
Jooyung Han85d61762020-06-24 23:50:26 +09002164func TestVendorApex(t *testing.T) {
2165 ctx, config := testApex(t, `
2166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 binaries: ["mybin"],
2170 vendor: true,
2171 }
2172 apex_key {
2173 name: "myapex.key",
2174 public_key: "testkey.avbpubkey",
2175 private_key: "testkey.pem",
2176 }
2177 cc_binary {
2178 name: "mybin",
2179 vendor: true,
2180 shared_libs: ["libfoo"],
2181 }
2182 cc_library {
2183 name: "libfoo",
2184 proprietary: true,
2185 }
2186 `)
2187
2188 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2189 "bin/mybin",
2190 "lib64/libfoo.so",
2191 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2192 "lib64/libc++.so",
2193 })
2194
2195 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2196 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2197 name := apexBundle.BaseModuleName()
2198 prefix := "TARGET_"
2199 var builder strings.Builder
2200 data.Custom(&builder, name, prefix, "", data)
2201 androidMk := builder.String()
2202 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
2203}
2204
Jooyung Hanefb184e2020-06-25 17:14:25 +09002205func TestAndroidMk_UseVendorRequired(t *testing.T) {
2206 ctx, config := testApex(t, `
2207 apex {
2208 name: "myapex",
2209 key: "myapex.key",
2210 use_vendor: true,
2211 native_shared_libs: ["mylib"],
2212 }
2213
2214 apex_key {
2215 name: "myapex.key",
2216 public_key: "testkey.avbpubkey",
2217 private_key: "testkey.pem",
2218 }
2219
2220 cc_library {
2221 name: "mylib",
2222 vendor_available: true,
2223 apex_available: ["myapex"],
2224 }
2225 `, func(fs map[string][]byte, config android.Config) {
2226 setUseVendorAllowListForTest(config, []string{"myapex"})
2227 })
2228
2229 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2230 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2231 name := apexBundle.BaseModuleName()
2232 prefix := "TARGET_"
2233 var builder strings.Builder
2234 data.Custom(&builder, name, prefix, "", data)
2235 androidMk := builder.String()
2236 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2237}
2238
2239func TestAndroidMk_VendorApexRequired(t *testing.T) {
2240 ctx, config := testApex(t, `
2241 apex {
2242 name: "myapex",
2243 key: "myapex.key",
2244 vendor: true,
2245 native_shared_libs: ["mylib"],
2246 }
2247
2248 apex_key {
2249 name: "myapex.key",
2250 public_key: "testkey.avbpubkey",
2251 private_key: "testkey.pem",
2252 }
2253
2254 cc_library {
2255 name: "mylib",
2256 vendor_available: true,
2257 }
2258 `)
2259
2260 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2261 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2262 name := apexBundle.BaseModuleName()
2263 prefix := "TARGET_"
2264 var builder strings.Builder
2265 data.Custom(&builder, name, prefix, "", data)
2266 androidMk := builder.String()
2267 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2268}
2269
Jooyung Han2ed99d02020-06-24 23:26:26 +09002270func TestAndroidMkWritesCommonProperties(t *testing.T) {
2271 ctx, config := testApex(t, `
2272 apex {
2273 name: "myapex",
2274 key: "myapex.key",
2275 vintf_fragments: ["fragment.xml"],
2276 init_rc: ["init.rc"],
2277 }
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283 cc_binary {
2284 name: "mybin",
2285 }
2286 `)
2287
2288 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2289 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2290 name := apexBundle.BaseModuleName()
2291 prefix := "TARGET_"
2292 var builder strings.Builder
2293 data.Custom(&builder, name, prefix, "", data)
2294 androidMk := builder.String()
2295 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2296 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2297}
2298
Jiyong Park16e91a02018-12-20 18:18:08 +09002299func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002300 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002301 apex {
2302 name: "myapex",
2303 key: "myapex.key",
2304 native_shared_libs: ["mylib"],
2305 }
2306
2307 apex_key {
2308 name: "myapex.key",
2309 public_key: "testkey.avbpubkey",
2310 private_key: "testkey.pem",
2311 }
2312
2313 cc_library {
2314 name: "mylib",
2315 srcs: ["mylib.cpp"],
2316 system_shared_libs: [],
2317 stl: "none",
2318 stubs: {
2319 versions: ["1", "2", "3"],
2320 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002321 apex_available: [
2322 "//apex_available:platform",
2323 "myapex",
2324 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002325 }
2326
2327 cc_binary {
2328 name: "not_in_apex",
2329 srcs: ["mylib.cpp"],
2330 static_libs: ["mylib"],
2331 static_executable: true,
2332 system_shared_libs: [],
2333 stl: "none",
2334 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002335 `)
2336
Colin Cross7113d202019-11-20 16:39:12 -08002337 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002338
2339 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002340 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002341}
Jiyong Park9335a262018-12-24 11:31:58 +09002342
2343func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002344 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002345 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002346 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002347 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002348 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002349 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002350 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002351 }
2352
2353 cc_library {
2354 name: "mylib",
2355 srcs: ["mylib.cpp"],
2356 system_shared_libs: [],
2357 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002358 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002359 }
2360
2361 apex_key {
2362 name: "myapex.key",
2363 public_key: "testkey.avbpubkey",
2364 private_key: "testkey.pem",
2365 }
2366
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002367 android_app_certificate {
2368 name: "myapex.certificate",
2369 certificate: "testkey",
2370 }
2371
2372 android_app_certificate {
2373 name: "myapex.certificate.override",
2374 certificate: "testkey.override",
2375 }
2376
Jiyong Park9335a262018-12-24 11:31:58 +09002377 `)
2378
2379 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002380 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002381
2382 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2383 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2384 "vendor/foo/devkeys/testkey.avbpubkey")
2385 }
2386 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2387 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2388 "vendor/foo/devkeys/testkey.pem")
2389 }
2390
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002391 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002392 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002393 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002394 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002395 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002396 }
2397}
Jiyong Park58e364a2019-01-19 19:24:06 +09002398
Jooyung Hanf121a652019-12-17 14:30:11 +09002399func TestCertificate(t *testing.T) {
2400 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2401 ctx, _ := testApex(t, `
2402 apex {
2403 name: "myapex",
2404 key: "myapex.key",
2405 }
2406 apex_key {
2407 name: "myapex.key",
2408 public_key: "testkey.avbpubkey",
2409 private_key: "testkey.pem",
2410 }`)
2411 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2412 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2413 if actual := rule.Args["certificates"]; actual != expected {
2414 t.Errorf("certificates should be %q, not %q", expected, actual)
2415 }
2416 })
2417 t.Run("override when unspecified", func(t *testing.T) {
2418 ctx, _ := testApex(t, `
2419 apex {
2420 name: "myapex_keytest",
2421 key: "myapex.key",
2422 file_contexts: ":myapex-file_contexts",
2423 }
2424 apex_key {
2425 name: "myapex.key",
2426 public_key: "testkey.avbpubkey",
2427 private_key: "testkey.pem",
2428 }
2429 android_app_certificate {
2430 name: "myapex.certificate.override",
2431 certificate: "testkey.override",
2432 }`)
2433 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2434 expected := "testkey.override.x509.pem testkey.override.pk8"
2435 if actual := rule.Args["certificates"]; actual != expected {
2436 t.Errorf("certificates should be %q, not %q", expected, actual)
2437 }
2438 })
2439 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2440 ctx, _ := testApex(t, `
2441 apex {
2442 name: "myapex",
2443 key: "myapex.key",
2444 certificate: ":myapex.certificate",
2445 }
2446 apex_key {
2447 name: "myapex.key",
2448 public_key: "testkey.avbpubkey",
2449 private_key: "testkey.pem",
2450 }
2451 android_app_certificate {
2452 name: "myapex.certificate",
2453 certificate: "testkey",
2454 }`)
2455 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2456 expected := "testkey.x509.pem testkey.pk8"
2457 if actual := rule.Args["certificates"]; actual != expected {
2458 t.Errorf("certificates should be %q, not %q", expected, actual)
2459 }
2460 })
2461 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2462 ctx, _ := testApex(t, `
2463 apex {
2464 name: "myapex_keytest",
2465 key: "myapex.key",
2466 file_contexts: ":myapex-file_contexts",
2467 certificate: ":myapex.certificate",
2468 }
2469 apex_key {
2470 name: "myapex.key",
2471 public_key: "testkey.avbpubkey",
2472 private_key: "testkey.pem",
2473 }
2474 android_app_certificate {
2475 name: "myapex.certificate.override",
2476 certificate: "testkey.override",
2477 }`)
2478 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2479 expected := "testkey.override.x509.pem testkey.override.pk8"
2480 if actual := rule.Args["certificates"]; actual != expected {
2481 t.Errorf("certificates should be %q, not %q", expected, actual)
2482 }
2483 })
2484 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2485 ctx, _ := testApex(t, `
2486 apex {
2487 name: "myapex",
2488 key: "myapex.key",
2489 certificate: "testkey",
2490 }
2491 apex_key {
2492 name: "myapex.key",
2493 public_key: "testkey.avbpubkey",
2494 private_key: "testkey.pem",
2495 }`)
2496 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2497 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2498 if actual := rule.Args["certificates"]; actual != expected {
2499 t.Errorf("certificates should be %q, not %q", expected, actual)
2500 }
2501 })
2502 t.Run("override when specified as <name>", func(t *testing.T) {
2503 ctx, _ := testApex(t, `
2504 apex {
2505 name: "myapex_keytest",
2506 key: "myapex.key",
2507 file_contexts: ":myapex-file_contexts",
2508 certificate: "testkey",
2509 }
2510 apex_key {
2511 name: "myapex.key",
2512 public_key: "testkey.avbpubkey",
2513 private_key: "testkey.pem",
2514 }
2515 android_app_certificate {
2516 name: "myapex.certificate.override",
2517 certificate: "testkey.override",
2518 }`)
2519 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2520 expected := "testkey.override.x509.pem testkey.override.pk8"
2521 if actual := rule.Args["certificates"]; actual != expected {
2522 t.Errorf("certificates should be %q, not %q", expected, actual)
2523 }
2524 })
2525}
2526
Jiyong Park58e364a2019-01-19 19:24:06 +09002527func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002528 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002529 apex {
2530 name: "myapex",
2531 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002532 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002533 }
2534
2535 apex {
2536 name: "otherapex",
2537 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002538 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002539 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002540 }
2541
2542 apex_key {
2543 name: "myapex.key",
2544 public_key: "testkey.avbpubkey",
2545 private_key: "testkey.pem",
2546 }
2547
2548 cc_library {
2549 name: "mylib",
2550 srcs: ["mylib.cpp"],
2551 system_shared_libs: [],
2552 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002553 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002554 "myapex",
2555 "otherapex",
2556 ],
Jooyung Han24282772020-03-21 23:20:55 +09002557 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002558 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002559 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002560 cc_library {
2561 name: "mylib2",
2562 srcs: ["mylib.cpp"],
2563 system_shared_libs: [],
2564 stl: "none",
2565 apex_available: [
2566 "myapex",
2567 "otherapex",
2568 ],
2569 use_apex_name_macro: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002570 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002571 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002572 `)
2573
Jooyung Hanc87a0592020-03-02 17:44:33 +09002574 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002575 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002576 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002577 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002578
Jooyung Hanccce2f22020-03-07 03:45:53 +09002579 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002580 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2581 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002582 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002583 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002584
Jooyung Hanccce2f22020-03-07 03:45:53 +09002585 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002586 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2587 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002588 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002589 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002590
Jooyung Hanc87a0592020-03-02 17:44:33 +09002591 // When cc_library sets use_apex_name_macro: true
2592 // apex variants define additional macro to distinguish which apex variant it is built for
2593
2594 // non-APEX variant does not have __ANDROID_APEX__ defined
2595 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2596 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2597
2598 // APEX variant has __ANDROID_APEX__ defined
2599 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002600 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002601 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2602 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002603
Jooyung Hanc87a0592020-03-02 17:44:33 +09002604 // APEX variant has __ANDROID_APEX__ defined
2605 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002606 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002607 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2608 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002609
2610 // recovery variant does not set __ANDROID_SDK_VERSION__
2611 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2612 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2613 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002614}
Jiyong Park7e636d02019-01-28 16:16:54 +09002615
2616func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002617 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002618 apex {
2619 name: "myapex",
2620 key: "myapex.key",
2621 native_shared_libs: ["mylib"],
2622 }
2623
2624 apex_key {
2625 name: "myapex.key",
2626 public_key: "testkey.avbpubkey",
2627 private_key: "testkey.pem",
2628 }
2629
2630 cc_library_headers {
2631 name: "mylib_headers",
2632 export_include_dirs: ["my_include"],
2633 system_shared_libs: [],
2634 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002635 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002636 }
2637
2638 cc_library {
2639 name: "mylib",
2640 srcs: ["mylib.cpp"],
2641 system_shared_libs: [],
2642 stl: "none",
2643 header_libs: ["mylib_headers"],
2644 export_header_lib_headers: ["mylib_headers"],
2645 stubs: {
2646 versions: ["1", "2", "3"],
2647 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002648 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002649 }
2650
2651 cc_library {
2652 name: "otherlib",
2653 srcs: ["mylib.cpp"],
2654 system_shared_libs: [],
2655 stl: "none",
2656 shared_libs: ["mylib"],
2657 }
2658 `)
2659
Colin Cross7113d202019-11-20 16:39:12 -08002660 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002661
2662 // Ensure that the include path of the header lib is exported to 'otherlib'
2663 ensureContains(t, cFlags, "-Imy_include")
2664}
Alex Light9670d332019-01-29 18:07:33 -08002665
Jiyong Park7cd10e32020-01-14 09:22:18 +09002666type fileInApex struct {
2667 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002668 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002669 isLink bool
2670}
2671
Jooyung Hana57af4a2020-01-23 05:36:59 +00002672func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002673 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002674 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002675 copyCmds := apexRule.Args["copy_commands"]
2676 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002677 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002678 for _, cmd := range strings.Split(copyCmds, "&&") {
2679 cmd = strings.TrimSpace(cmd)
2680 if cmd == "" {
2681 continue
2682 }
2683 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002684 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002685 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002686 switch terms[0] {
2687 case "mkdir":
2688 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002689 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002690 t.Fatal("copyCmds contains invalid cp command", cmd)
2691 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002692 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002693 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002694 isLink = false
2695 case "ln":
2696 if len(terms) != 3 && len(terms) != 4 {
2697 // ln LINK TARGET or ln -s LINK TARGET
2698 t.Fatal("copyCmds contains invalid ln command", cmd)
2699 }
2700 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002701 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002702 isLink = true
2703 default:
2704 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2705 }
2706 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002707 index := strings.Index(dst, imageApexDir)
2708 if index == -1 {
2709 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2710 }
2711 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002712 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002713 }
2714 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002715 return ret
2716}
2717
Jooyung Hana57af4a2020-01-23 05:36:59 +00002718func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2719 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002720 var failed bool
2721 var surplus []string
2722 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002723 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002724 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002725 for _, expected := range files {
2726 if matched, _ := path.Match(expected, file.path); matched {
2727 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002728 mactchFound = true
2729 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002730 }
2731 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002732 if !mactchFound {
2733 surplus = append(surplus, file.path)
2734 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002735 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002736
Jooyung Han31c470b2019-10-18 16:26:59 +09002737 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002738 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002739 t.Log("surplus files", surplus)
2740 failed = true
2741 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002742
2743 if len(files) > len(filesMatched) {
2744 var missing []string
2745 for _, expected := range files {
2746 if !filesMatched[expected] {
2747 missing = append(missing, expected)
2748 }
2749 }
2750 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002751 t.Log("missing files", missing)
2752 failed = true
2753 }
2754 if failed {
2755 t.Fail()
2756 }
2757}
2758
Jooyung Han344d5432019-08-23 11:17:39 +09002759func TestVndkApexCurrent(t *testing.T) {
2760 ctx, _ := testApex(t, `
2761 apex_vndk {
2762 name: "myapex",
2763 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002764 }
2765
2766 apex_key {
2767 name: "myapex.key",
2768 public_key: "testkey.avbpubkey",
2769 private_key: "testkey.pem",
2770 }
2771
2772 cc_library {
2773 name: "libvndk",
2774 srcs: ["mylib.cpp"],
2775 vendor_available: true,
2776 vndk: {
2777 enabled: true,
2778 },
2779 system_shared_libs: [],
2780 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002781 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002782 }
2783
2784 cc_library {
2785 name: "libvndksp",
2786 srcs: ["mylib.cpp"],
2787 vendor_available: true,
2788 vndk: {
2789 enabled: true,
2790 support_system_process: true,
2791 },
2792 system_shared_libs: [],
2793 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002794 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002795 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002796 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002797
Jooyung Hana57af4a2020-01-23 05:36:59 +00002798 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002799 "lib/libvndk.so",
2800 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002801 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002802 "lib64/libvndk.so",
2803 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002804 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002805 "etc/llndk.libraries.VER.txt",
2806 "etc/vndkcore.libraries.VER.txt",
2807 "etc/vndksp.libraries.VER.txt",
2808 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002809 })
Jooyung Han344d5432019-08-23 11:17:39 +09002810}
2811
2812func TestVndkApexWithPrebuilt(t *testing.T) {
2813 ctx, _ := testApex(t, `
2814 apex_vndk {
2815 name: "myapex",
2816 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002817 }
2818
2819 apex_key {
2820 name: "myapex.key",
2821 public_key: "testkey.avbpubkey",
2822 private_key: "testkey.pem",
2823 }
2824
2825 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002826 name: "libvndk",
2827 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002828 vendor_available: true,
2829 vndk: {
2830 enabled: true,
2831 },
2832 system_shared_libs: [],
2833 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002834 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002835 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002836
2837 cc_prebuilt_library_shared {
2838 name: "libvndk.arm",
2839 srcs: ["libvndk.arm.so"],
2840 vendor_available: true,
2841 vndk: {
2842 enabled: true,
2843 },
2844 enabled: false,
2845 arch: {
2846 arm: {
2847 enabled: true,
2848 },
2849 },
2850 system_shared_libs: [],
2851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002852 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002853 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002854 `+vndkLibrariesTxtFiles("current"),
2855 withFiles(map[string][]byte{
2856 "libvndk.so": nil,
2857 "libvndk.arm.so": nil,
2858 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002859
Jooyung Hana57af4a2020-01-23 05:36:59 +00002860 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002861 "lib/libvndk.so",
2862 "lib/libvndk.arm.so",
2863 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002864 "lib/libc++.so",
2865 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002866 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002867 })
Jooyung Han344d5432019-08-23 11:17:39 +09002868}
2869
Jooyung Han39edb6c2019-11-06 16:53:07 +09002870func vndkLibrariesTxtFiles(vers ...string) (result string) {
2871 for _, v := range vers {
2872 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002873 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002874 result += `
2875 vndk_libraries_txt {
2876 name: "` + txt + `.libraries.txt",
2877 }
2878 `
2879 }
2880 } else {
2881 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2882 result += `
2883 prebuilt_etc {
2884 name: "` + txt + `.libraries.` + v + `.txt",
2885 src: "dummy.txt",
2886 }
2887 `
2888 }
2889 }
2890 }
2891 return
2892}
2893
Jooyung Han344d5432019-08-23 11:17:39 +09002894func TestVndkApexVersion(t *testing.T) {
2895 ctx, _ := testApex(t, `
2896 apex_vndk {
2897 name: "myapex_v27",
2898 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002899 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002900 vndk_version: "27",
2901 }
2902
2903 apex_key {
2904 name: "myapex.key",
2905 public_key: "testkey.avbpubkey",
2906 private_key: "testkey.pem",
2907 }
2908
Jooyung Han31c470b2019-10-18 16:26:59 +09002909 vndk_prebuilt_shared {
2910 name: "libvndk27",
2911 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002912 vendor_available: true,
2913 vndk: {
2914 enabled: true,
2915 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002916 target_arch: "arm64",
2917 arch: {
2918 arm: {
2919 srcs: ["libvndk27_arm.so"],
2920 },
2921 arm64: {
2922 srcs: ["libvndk27_arm64.so"],
2923 },
2924 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002925 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002926 }
2927
2928 vndk_prebuilt_shared {
2929 name: "libvndk27",
2930 version: "27",
2931 vendor_available: true,
2932 vndk: {
2933 enabled: true,
2934 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002935 target_arch: "x86_64",
2936 arch: {
2937 x86: {
2938 srcs: ["libvndk27_x86.so"],
2939 },
2940 x86_64: {
2941 srcs: ["libvndk27_x86_64.so"],
2942 },
2943 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002944 }
2945 `+vndkLibrariesTxtFiles("27"),
2946 withFiles(map[string][]byte{
2947 "libvndk27_arm.so": nil,
2948 "libvndk27_arm64.so": nil,
2949 "libvndk27_x86.so": nil,
2950 "libvndk27_x86_64.so": nil,
2951 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002952
Jooyung Hana57af4a2020-01-23 05:36:59 +00002953 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002954 "lib/libvndk27_arm.so",
2955 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002956 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002957 })
Jooyung Han344d5432019-08-23 11:17:39 +09002958}
2959
2960func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2961 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2962 apex_vndk {
2963 name: "myapex_v27",
2964 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002965 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002966 vndk_version: "27",
2967 }
2968 apex_vndk {
2969 name: "myapex_v27_other",
2970 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002971 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002972 vndk_version: "27",
2973 }
2974
2975 apex_key {
2976 name: "myapex.key",
2977 public_key: "testkey.avbpubkey",
2978 private_key: "testkey.pem",
2979 }
2980
2981 cc_library {
2982 name: "libvndk",
2983 srcs: ["mylib.cpp"],
2984 vendor_available: true,
2985 vndk: {
2986 enabled: true,
2987 },
2988 system_shared_libs: [],
2989 stl: "none",
2990 }
2991
2992 vndk_prebuilt_shared {
2993 name: "libvndk",
2994 version: "27",
2995 vendor_available: true,
2996 vndk: {
2997 enabled: true,
2998 },
2999 srcs: ["libvndk.so"],
3000 }
3001 `, withFiles(map[string][]byte{
3002 "libvndk.so": nil,
3003 }))
3004}
3005
Jooyung Han90eee022019-10-01 20:02:42 +09003006func TestVndkApexNameRule(t *testing.T) {
3007 ctx, _ := testApex(t, `
3008 apex_vndk {
3009 name: "myapex",
3010 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003011 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003012 }
3013 apex_vndk {
3014 name: "myapex_v28",
3015 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003016 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003017 vndk_version: "28",
3018 }
3019 apex_key {
3020 name: "myapex.key",
3021 public_key: "testkey.avbpubkey",
3022 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003023 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003024
3025 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003026 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003027 actual := proptools.String(bundle.properties.Apex_name)
3028 if !reflect.DeepEqual(actual, expected) {
3029 t.Errorf("Got '%v', expected '%v'", actual, expected)
3030 }
3031 }
3032
3033 assertApexName("com.android.vndk.vVER", "myapex")
3034 assertApexName("com.android.vndk.v28", "myapex_v28")
3035}
3036
Jooyung Han344d5432019-08-23 11:17:39 +09003037func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3038 ctx, _ := testApex(t, `
3039 apex_vndk {
3040 name: "myapex",
3041 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003042 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003043 }
3044
3045 apex_key {
3046 name: "myapex.key",
3047 public_key: "testkey.avbpubkey",
3048 private_key: "testkey.pem",
3049 }
3050
3051 cc_library {
3052 name: "libvndk",
3053 srcs: ["mylib.cpp"],
3054 vendor_available: true,
3055 native_bridge_supported: true,
3056 host_supported: true,
3057 vndk: {
3058 enabled: true,
3059 },
3060 system_shared_libs: [],
3061 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003062 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003063 }
Jooyung Han35155c42020-02-06 17:33:20 +09003064 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003065
Jooyung Hana57af4a2020-01-23 05:36:59 +00003066 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003067 "lib/libvndk.so",
3068 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003069 "lib/libc++.so",
3070 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003071 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003072 })
Jooyung Han344d5432019-08-23 11:17:39 +09003073}
3074
3075func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3076 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3077 apex_vndk {
3078 name: "myapex",
3079 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003080 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003081 native_bridge_supported: true,
3082 }
3083
3084 apex_key {
3085 name: "myapex.key",
3086 public_key: "testkey.avbpubkey",
3087 private_key: "testkey.pem",
3088 }
3089
3090 cc_library {
3091 name: "libvndk",
3092 srcs: ["mylib.cpp"],
3093 vendor_available: true,
3094 native_bridge_supported: true,
3095 host_supported: true,
3096 vndk: {
3097 enabled: true,
3098 },
3099 system_shared_libs: [],
3100 stl: "none",
3101 }
3102 `)
3103}
3104
Jooyung Han31c470b2019-10-18 16:26:59 +09003105func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003106 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003107 apex_vndk {
3108 name: "myapex_v27",
3109 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003110 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003111 vndk_version: "27",
3112 }
3113
3114 apex_key {
3115 name: "myapex.key",
3116 public_key: "testkey.avbpubkey",
3117 private_key: "testkey.pem",
3118 }
3119
3120 vndk_prebuilt_shared {
3121 name: "libvndk27",
3122 version: "27",
3123 target_arch: "arm",
3124 vendor_available: true,
3125 vndk: {
3126 enabled: true,
3127 },
3128 arch: {
3129 arm: {
3130 srcs: ["libvndk27.so"],
3131 }
3132 },
3133 }
3134
3135 vndk_prebuilt_shared {
3136 name: "libvndk27",
3137 version: "27",
3138 target_arch: "arm",
3139 binder32bit: true,
3140 vendor_available: true,
3141 vndk: {
3142 enabled: true,
3143 },
3144 arch: {
3145 arm: {
3146 srcs: ["libvndk27binder32.so"],
3147 }
3148 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003149 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003150 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003151 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003152 withFiles(map[string][]byte{
3153 "libvndk27.so": nil,
3154 "libvndk27binder32.so": nil,
3155 }),
3156 withBinder32bit,
3157 withTargets(map[android.OsType][]android.Target{
3158 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003159 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3160 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003161 },
3162 }),
3163 )
3164
Jooyung Hana57af4a2020-01-23 05:36:59 +00003165 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003166 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003167 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003168 })
3169}
3170
Jooyung Han45a96772020-06-15 14:59:42 +09003171func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3172 ctx, _ := testApex(t, `
3173 apex_vndk {
3174 name: "myapex",
3175 key: "myapex.key",
3176 file_contexts: ":myapex-file_contexts",
3177 }
3178
3179 apex_key {
3180 name: "myapex.key",
3181 public_key: "testkey.avbpubkey",
3182 private_key: "testkey.pem",
3183 }
3184
3185 cc_library {
3186 name: "libz",
3187 vendor_available: true,
3188 vndk: {
3189 enabled: true,
3190 },
3191 stubs: {
3192 symbol_file: "libz.map.txt",
3193 versions: ["30"],
3194 }
3195 }
3196 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3197 "libz.map.txt": nil,
3198 }))
3199
3200 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3201 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3202 ensureListEmpty(t, provideNativeLibs)
3203}
3204
Jooyung Hane1633032019-08-01 17:41:43 +09003205func TestDependenciesInApexManifest(t *testing.T) {
3206 ctx, _ := testApex(t, `
3207 apex {
3208 name: "myapex_nodep",
3209 key: "myapex.key",
3210 native_shared_libs: ["lib_nodep"],
3211 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003212 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003213 }
3214
3215 apex {
3216 name: "myapex_dep",
3217 key: "myapex.key",
3218 native_shared_libs: ["lib_dep"],
3219 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003220 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003221 }
3222
3223 apex {
3224 name: "myapex_provider",
3225 key: "myapex.key",
3226 native_shared_libs: ["libfoo"],
3227 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003228 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003229 }
3230
3231 apex {
3232 name: "myapex_selfcontained",
3233 key: "myapex.key",
3234 native_shared_libs: ["lib_dep", "libfoo"],
3235 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003236 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003237 }
3238
3239 apex_key {
3240 name: "myapex.key",
3241 public_key: "testkey.avbpubkey",
3242 private_key: "testkey.pem",
3243 }
3244
3245 cc_library {
3246 name: "lib_nodep",
3247 srcs: ["mylib.cpp"],
3248 system_shared_libs: [],
3249 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003250 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003251 }
3252
3253 cc_library {
3254 name: "lib_dep",
3255 srcs: ["mylib.cpp"],
3256 shared_libs: ["libfoo"],
3257 system_shared_libs: [],
3258 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003259 apex_available: [
3260 "myapex_dep",
3261 "myapex_provider",
3262 "myapex_selfcontained",
3263 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003264 }
3265
3266 cc_library {
3267 name: "libfoo",
3268 srcs: ["mytest.cpp"],
3269 stubs: {
3270 versions: ["1"],
3271 },
3272 system_shared_libs: [],
3273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003274 apex_available: [
3275 "myapex_provider",
3276 "myapex_selfcontained",
3277 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003278 }
3279 `)
3280
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003281 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003282 var provideNativeLibs, requireNativeLibs []string
3283
Sundong Ahnabb64432019-10-22 13:58:29 +09003284 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003285 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3286 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003287 ensureListEmpty(t, provideNativeLibs)
3288 ensureListEmpty(t, requireNativeLibs)
3289
Sundong Ahnabb64432019-10-22 13:58:29 +09003290 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003291 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3292 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003293 ensureListEmpty(t, provideNativeLibs)
3294 ensureListContains(t, requireNativeLibs, "libfoo.so")
3295
Sundong Ahnabb64432019-10-22 13:58:29 +09003296 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003297 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3298 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003299 ensureListContains(t, provideNativeLibs, "libfoo.so")
3300 ensureListEmpty(t, requireNativeLibs)
3301
Sundong Ahnabb64432019-10-22 13:58:29 +09003302 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003303 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3304 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003305 ensureListContains(t, provideNativeLibs, "libfoo.so")
3306 ensureListEmpty(t, requireNativeLibs)
3307}
3308
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003309func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003310 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003311 apex {
3312 name: "myapex",
3313 key: "myapex.key",
3314 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003315 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003316 }
3317
3318 apex_key {
3319 name: "myapex.key",
3320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003323
3324 cc_library {
3325 name: "mylib",
3326 srcs: ["mylib.cpp"],
3327 system_shared_libs: [],
3328 stl: "none",
3329 apex_available: [
3330 "//apex_available:platform",
3331 "myapex",
3332 ],
3333 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003334 `)
3335
Sundong Ahnabb64432019-10-22 13:58:29 +09003336 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003337 apexManifestRule := module.Rule("apexManifestRule")
3338 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3339 apexRule := module.Rule("apexRule")
3340 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003341
3342 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3343 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3344 name := apexBundle.BaseModuleName()
3345 prefix := "TARGET_"
3346 var builder strings.Builder
3347 data.Custom(&builder, name, prefix, "", data)
3348 androidMk := builder.String()
3349 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3350 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003351}
3352
Alex Light0851b882019-02-07 13:20:53 -08003353func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003354 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003355 apex {
3356 name: "myapex",
3357 key: "myapex.key",
3358 native_shared_libs: ["mylib_common"],
3359 }
3360
3361 apex_key {
3362 name: "myapex.key",
3363 public_key: "testkey.avbpubkey",
3364 private_key: "testkey.pem",
3365 }
3366
3367 cc_library {
3368 name: "mylib_common",
3369 srcs: ["mylib.cpp"],
3370 system_shared_libs: [],
3371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003372 apex_available: [
3373 "//apex_available:platform",
3374 "myapex",
3375 ],
Alex Light0851b882019-02-07 13:20:53 -08003376 }
3377 `)
3378
Sundong Ahnabb64432019-10-22 13:58:29 +09003379 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003380 apexRule := module.Rule("apexRule")
3381 copyCmds := apexRule.Args["copy_commands"]
3382
3383 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3384 t.Log("Apex was a test apex!")
3385 t.Fail()
3386 }
3387 // Ensure that main rule creates an output
3388 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3389
3390 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003392
3393 // Ensure that both direct and indirect deps are copied into apex
3394 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3395
Colin Cross7113d202019-11-20 16:39:12 -08003396 // Ensure that the platform variant ends with _shared
3397 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003398
3399 if !android.InAnyApex("mylib_common") {
3400 t.Log("Found mylib_common not in any apex!")
3401 t.Fail()
3402 }
3403}
3404
3405func TestTestApex(t *testing.T) {
3406 if android.InAnyApex("mylib_common_test") {
3407 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!")
3408 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003409 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003410 apex_test {
3411 name: "myapex",
3412 key: "myapex.key",
3413 native_shared_libs: ["mylib_common_test"],
3414 }
3415
3416 apex_key {
3417 name: "myapex.key",
3418 public_key: "testkey.avbpubkey",
3419 private_key: "testkey.pem",
3420 }
3421
3422 cc_library {
3423 name: "mylib_common_test",
3424 srcs: ["mylib.cpp"],
3425 system_shared_libs: [],
3426 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003427 // TODO: remove //apex_available:platform
3428 apex_available: [
3429 "//apex_available:platform",
3430 "myapex",
3431 ],
Alex Light0851b882019-02-07 13:20:53 -08003432 }
3433 `)
3434
Sundong Ahnabb64432019-10-22 13:58:29 +09003435 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003436 apexRule := module.Rule("apexRule")
3437 copyCmds := apexRule.Args["copy_commands"]
3438
3439 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3440 t.Log("Apex was not a test apex!")
3441 t.Fail()
3442 }
3443 // Ensure that main rule creates an output
3444 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3445
3446 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003447 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003448
3449 // Ensure that both direct and indirect deps are copied into apex
3450 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3451
Colin Cross7113d202019-11-20 16:39:12 -08003452 // Ensure that the platform variant ends with _shared
3453 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003454}
3455
Alex Light9670d332019-01-29 18:07:33 -08003456func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003457 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003458 apex {
3459 name: "myapex",
3460 key: "myapex.key",
3461 multilib: {
3462 first: {
3463 native_shared_libs: ["mylib_common"],
3464 }
3465 },
3466 target: {
3467 android: {
3468 multilib: {
3469 first: {
3470 native_shared_libs: ["mylib"],
3471 }
3472 }
3473 },
3474 host: {
3475 multilib: {
3476 first: {
3477 native_shared_libs: ["mylib2"],
3478 }
3479 }
3480 }
3481 }
3482 }
3483
3484 apex_key {
3485 name: "myapex.key",
3486 public_key: "testkey.avbpubkey",
3487 private_key: "testkey.pem",
3488 }
3489
3490 cc_library {
3491 name: "mylib",
3492 srcs: ["mylib.cpp"],
3493 system_shared_libs: [],
3494 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003495 // TODO: remove //apex_available:platform
3496 apex_available: [
3497 "//apex_available:platform",
3498 "myapex",
3499 ],
Alex Light9670d332019-01-29 18:07:33 -08003500 }
3501
3502 cc_library {
3503 name: "mylib_common",
3504 srcs: ["mylib.cpp"],
3505 system_shared_libs: [],
3506 stl: "none",
3507 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003508 // TODO: remove //apex_available:platform
3509 apex_available: [
3510 "//apex_available:platform",
3511 "myapex",
3512 ],
Alex Light9670d332019-01-29 18:07:33 -08003513 }
3514
3515 cc_library {
3516 name: "mylib2",
3517 srcs: ["mylib.cpp"],
3518 system_shared_libs: [],
3519 stl: "none",
3520 compile_multilib: "first",
3521 }
3522 `)
3523
Sundong Ahnabb64432019-10-22 13:58:29 +09003524 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003525 copyCmds := apexRule.Args["copy_commands"]
3526
3527 // Ensure that main rule creates an output
3528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3529
3530 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3532 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3533 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003534
3535 // Ensure that both direct and indirect deps are copied into apex
3536 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3537 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3538 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3539
Colin Cross7113d202019-11-20 16:39:12 -08003540 // Ensure that the platform variant ends with _shared
3541 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3542 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003544}
Jiyong Park04480cf2019-02-06 00:16:29 +09003545
3546func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003547 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003548 apex {
3549 name: "myapex",
3550 key: "myapex.key",
3551 binaries: ["myscript"],
3552 }
3553
3554 apex_key {
3555 name: "myapex.key",
3556 public_key: "testkey.avbpubkey",
3557 private_key: "testkey.pem",
3558 }
3559
3560 sh_binary {
3561 name: "myscript",
3562 src: "mylib.cpp",
3563 filename: "myscript.sh",
3564 sub_dir: "script",
3565 }
3566 `)
3567
Sundong Ahnabb64432019-10-22 13:58:29 +09003568 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003569 copyCmds := apexRule.Args["copy_commands"]
3570
3571 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3572}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003573
Jooyung Han91df2082019-11-20 01:49:42 +09003574func TestApexInVariousPartition(t *testing.T) {
3575 testcases := []struct {
3576 propName, parition, flattenedPartition string
3577 }{
3578 {"", "system", "system_ext"},
3579 {"product_specific: true", "product", "product"},
3580 {"soc_specific: true", "vendor", "vendor"},
3581 {"proprietary: true", "vendor", "vendor"},
3582 {"vendor: true", "vendor", "vendor"},
3583 {"system_ext_specific: true", "system_ext", "system_ext"},
3584 }
3585 for _, tc := range testcases {
3586 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3587 ctx, _ := testApex(t, `
3588 apex {
3589 name: "myapex",
3590 key: "myapex.key",
3591 `+tc.propName+`
3592 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003593
Jooyung Han91df2082019-11-20 01:49:42 +09003594 apex_key {
3595 name: "myapex.key",
3596 public_key: "testkey.avbpubkey",
3597 private_key: "testkey.pem",
3598 }
3599 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003600
Jooyung Han91df2082019-11-20 01:49:42 +09003601 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3602 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3603 actual := apex.installDir.String()
3604 if actual != expected {
3605 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3606 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003607
Jooyung Han91df2082019-11-20 01:49:42 +09003608 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3609 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3610 actual = flattened.installDir.String()
3611 if actual != expected {
3612 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3613 }
3614 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003615 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003616}
Jiyong Park67882562019-03-21 01:11:21 +09003617
Jooyung Han580eb4f2020-06-24 19:33:06 +09003618func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003619 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003620 apex {
3621 name: "myapex",
3622 key: "myapex.key",
3623 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003624
Jooyung Han580eb4f2020-06-24 19:33:06 +09003625 apex_key {
3626 name: "myapex.key",
3627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003630 `)
3631 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003632 rule := module.Output("file_contexts")
3633 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3634}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003635
Jooyung Han580eb4f2020-06-24 19:33:06 +09003636func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003637 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003638 apex {
3639 name: "myapex",
3640 key: "myapex.key",
3641 file_contexts: "my_own_file_contexts",
3642 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003643
Jooyung Han580eb4f2020-06-24 19:33:06 +09003644 apex_key {
3645 name: "myapex.key",
3646 public_key: "testkey.avbpubkey",
3647 private_key: "testkey.pem",
3648 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003649 `, withFiles(map[string][]byte{
3650 "my_own_file_contexts": nil,
3651 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003652}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003653
Jooyung Han580eb4f2020-06-24 19:33:06 +09003654func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003655 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003656 apex {
3657 name: "myapex",
3658 key: "myapex.key",
3659 product_specific: true,
3660 file_contexts: "product_specific_file_contexts",
3661 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003662
Jooyung Han580eb4f2020-06-24 19:33:06 +09003663 apex_key {
3664 name: "myapex.key",
3665 public_key: "testkey.avbpubkey",
3666 private_key: "testkey.pem",
3667 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003668 `)
3669
Jooyung Han580eb4f2020-06-24 19:33:06 +09003670 ctx, _ := testApex(t, `
3671 apex {
3672 name: "myapex",
3673 key: "myapex.key",
3674 product_specific: true,
3675 file_contexts: "product_specific_file_contexts",
3676 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003677
Jooyung Han580eb4f2020-06-24 19:33:06 +09003678 apex_key {
3679 name: "myapex.key",
3680 public_key: "testkey.avbpubkey",
3681 private_key: "testkey.pem",
3682 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003683 `, withFiles(map[string][]byte{
3684 "product_specific_file_contexts": nil,
3685 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003686 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3687 rule := module.Output("file_contexts")
3688 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3689}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003690
Jooyung Han580eb4f2020-06-24 19:33:06 +09003691func TestFileContexts_SetViaFileGroup(t *testing.T) {
3692 ctx, _ := testApex(t, `
3693 apex {
3694 name: "myapex",
3695 key: "myapex.key",
3696 product_specific: true,
3697 file_contexts: ":my-file-contexts",
3698 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003699
Jooyung Han580eb4f2020-06-24 19:33:06 +09003700 apex_key {
3701 name: "myapex.key",
3702 public_key: "testkey.avbpubkey",
3703 private_key: "testkey.pem",
3704 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003705
Jooyung Han580eb4f2020-06-24 19:33:06 +09003706 filegroup {
3707 name: "my-file-contexts",
3708 srcs: ["product_specific_file_contexts"],
3709 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003710 `, withFiles(map[string][]byte{
3711 "product_specific_file_contexts": nil,
3712 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003713 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3714 rule := module.Output("file_contexts")
3715 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003716}
3717
Jiyong Park67882562019-03-21 01:11:21 +09003718func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003719 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003720 apex_key {
3721 name: "myapex.key",
3722 public_key: ":my.avbpubkey",
3723 private_key: ":my.pem",
3724 product_specific: true,
3725 }
3726
3727 filegroup {
3728 name: "my.avbpubkey",
3729 srcs: ["testkey2.avbpubkey"],
3730 }
3731
3732 filegroup {
3733 name: "my.pem",
3734 srcs: ["testkey2.pem"],
3735 }
3736 `)
3737
3738 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3739 expected_pubkey := "testkey2.avbpubkey"
3740 actual_pubkey := apex_key.public_key_file.String()
3741 if actual_pubkey != expected_pubkey {
3742 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3743 }
3744 expected_privkey := "testkey2.pem"
3745 actual_privkey := apex_key.private_key_file.String()
3746 if actual_privkey != expected_privkey {
3747 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3748 }
3749}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003750
3751func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003752 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003753 prebuilt_apex {
3754 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003755 arch: {
3756 arm64: {
3757 src: "myapex-arm64.apex",
3758 },
3759 arm: {
3760 src: "myapex-arm.apex",
3761 },
3762 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003763 }
3764 `)
3765
3766 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3767
Jiyong Parkc95714e2019-03-29 14:23:10 +09003768 expectedInput := "myapex-arm64.apex"
3769 if prebuilt.inputApex.String() != expectedInput {
3770 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3771 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003772}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003773
3774func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003775 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003776 prebuilt_apex {
3777 name: "myapex",
3778 src: "myapex-arm.apex",
3779 filename: "notmyapex.apex",
3780 }
3781 `)
3782
3783 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3784
3785 expected := "notmyapex.apex"
3786 if p.installFilename != expected {
3787 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3788 }
3789}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003790
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003791func TestPrebuiltOverrides(t *testing.T) {
3792 ctx, config := testApex(t, `
3793 prebuilt_apex {
3794 name: "myapex.prebuilt",
3795 src: "myapex-arm.apex",
3796 overrides: [
3797 "myapex",
3798 ],
3799 }
3800 `)
3801
3802 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3803
3804 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003805 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003806 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003807 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003808 }
3809}
3810
Roland Levillain630846d2019-06-26 12:48:34 +01003811func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003812 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003813 apex_test {
3814 name: "myapex",
3815 key: "myapex.key",
3816 tests: [
3817 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003818 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003819 ],
3820 }
3821
3822 apex_key {
3823 name: "myapex.key",
3824 public_key: "testkey.avbpubkey",
3825 private_key: "testkey.pem",
3826 }
3827
Liz Kammer1c14a212020-05-12 15:26:55 -07003828 filegroup {
3829 name: "fg",
3830 srcs: [
3831 "baz",
3832 "bar/baz"
3833 ],
3834 }
3835
Roland Levillain630846d2019-06-26 12:48:34 +01003836 cc_test {
3837 name: "mytest",
3838 gtest: false,
3839 srcs: ["mytest.cpp"],
3840 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003841 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003842 system_shared_libs: [],
3843 static_executable: true,
3844 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003845 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003846 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003847
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003848 cc_library {
3849 name: "mylib",
3850 srcs: ["mylib.cpp"],
3851 system_shared_libs: [],
3852 stl: "none",
3853 }
3854
Liz Kammer5bd365f2020-05-27 15:15:11 -07003855 filegroup {
3856 name: "fg2",
3857 srcs: [
3858 "testdata/baz"
3859 ],
3860 }
3861
Roland Levillain9b5fde92019-06-28 15:41:19 +01003862 cc_test {
3863 name: "mytests",
3864 gtest: false,
3865 srcs: [
3866 "mytest1.cpp",
3867 "mytest2.cpp",
3868 "mytest3.cpp",
3869 ],
3870 test_per_src: true,
3871 relative_install_path: "test",
3872 system_shared_libs: [],
3873 static_executable: true,
3874 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003875 data: [
3876 ":fg",
3877 ":fg2",
3878 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003879 }
Roland Levillain630846d2019-06-26 12:48:34 +01003880 `)
3881
Sundong Ahnabb64432019-10-22 13:58:29 +09003882 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003883 copyCmds := apexRule.Args["copy_commands"]
3884
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003885 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003886 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003887 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003888
Liz Kammer1c14a212020-05-12 15:26:55 -07003889 //Ensure that test data are copied into apex.
3890 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3891 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3892
Roland Levillain9b5fde92019-06-28 15:41:19 +01003893 // Ensure that test deps built with `test_per_src` are copied into apex.
3894 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3895 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3896 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003897
3898 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003899 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3900 data := android.AndroidMkDataForTest(t, config, "", bundle)
3901 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003902 prefix := "TARGET_"
3903 var builder strings.Builder
3904 data.Custom(&builder, name, prefix, "", data)
3905 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003906 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3907 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3908 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3909 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003910 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003912 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003913
3914 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3915 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3916 data.Custom(&builder, name, prefix, "", data)
3917 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003918 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3919 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003920}
3921
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003922func TestInstallExtraFlattenedApexes(t *testing.T) {
3923 ctx, config := testApex(t, `
3924 apex {
3925 name: "myapex",
3926 key: "myapex.key",
3927 }
3928 apex_key {
3929 name: "myapex.key",
3930 public_key: "testkey.avbpubkey",
3931 private_key: "testkey.pem",
3932 }
3933 `, func(fs map[string][]byte, config android.Config) {
3934 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3935 })
3936 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003937 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003938 mk := android.AndroidMkDataForTest(t, config, "", ab)
3939 var builder strings.Builder
3940 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3941 androidMk := builder.String()
3942 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3943}
3944
Jooyung Han5c998b92019-06-27 11:30:33 +09003945func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003946 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003947 apex {
3948 name: "myapex",
3949 key: "myapex.key",
3950 native_shared_libs: ["mylib"],
3951 uses: ["commonapex"],
3952 }
3953
3954 apex {
3955 name: "commonapex",
3956 key: "myapex.key",
3957 native_shared_libs: ["libcommon"],
3958 provide_cpp_shared_libs: true,
3959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
3967 cc_library {
3968 name: "mylib",
3969 srcs: ["mylib.cpp"],
3970 shared_libs: ["libcommon"],
3971 system_shared_libs: [],
3972 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003973 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003974 }
3975
3976 cc_library {
3977 name: "libcommon",
3978 srcs: ["mylib_common.cpp"],
3979 system_shared_libs: [],
3980 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003981 // TODO: remove //apex_available:platform
3982 apex_available: [
3983 "//apex_available:platform",
3984 "commonapex",
3985 "myapex",
3986 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003987 }
3988 `)
3989
Sundong Ahnabb64432019-10-22 13:58:29 +09003990 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003991 apexRule1 := module1.Rule("apexRule")
3992 copyCmds1 := apexRule1.Args["copy_commands"]
3993
Sundong Ahnabb64432019-10-22 13:58:29 +09003994 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003995 apexRule2 := module2.Rule("apexRule")
3996 copyCmds2 := apexRule2.Args["copy_commands"]
3997
Colin Cross7113d202019-11-20 16:39:12 -08003998 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3999 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09004000 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4001 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4002 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4003}
4004
4005func TestApexUsesFailsIfNotProvided(t *testing.T) {
4006 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4007 apex {
4008 name: "myapex",
4009 key: "myapex.key",
4010 uses: ["commonapex"],
4011 }
4012
4013 apex {
4014 name: "commonapex",
4015 key: "myapex.key",
4016 }
4017
4018 apex_key {
4019 name: "myapex.key",
4020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023 `)
4024 testApexError(t, `uses: "commonapex" is not a provider`, `
4025 apex {
4026 name: "myapex",
4027 key: "myapex.key",
4028 uses: ["commonapex"],
4029 }
4030
4031 cc_library {
4032 name: "commonapex",
4033 system_shared_libs: [],
4034 stl: "none",
4035 }
4036
4037 apex_key {
4038 name: "myapex.key",
4039 public_key: "testkey.avbpubkey",
4040 private_key: "testkey.pem",
4041 }
4042 `)
4043}
4044
4045func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4046 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4047 apex {
4048 name: "myapex",
4049 key: "myapex.key",
4050 use_vendor: true,
4051 uses: ["commonapex"],
4052 }
4053
4054 apex {
4055 name: "commonapex",
4056 key: "myapex.key",
4057 provide_cpp_shared_libs: true,
4058 }
4059
4060 apex_key {
4061 name: "myapex.key",
4062 public_key: "testkey.avbpubkey",
4063 private_key: "testkey.pem",
4064 }
Jooyung Handc782442019-11-01 03:14:38 +09004065 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004066 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004067 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004068}
4069
Jooyung Hand48f3c32019-08-23 11:18:57 +09004070func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4071 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4072 apex {
4073 name: "myapex",
4074 key: "myapex.key",
4075 native_shared_libs: ["libfoo"],
4076 }
4077
4078 apex_key {
4079 name: "myapex.key",
4080 public_key: "testkey.avbpubkey",
4081 private_key: "testkey.pem",
4082 }
4083
4084 cc_library {
4085 name: "libfoo",
4086 stl: "none",
4087 system_shared_libs: [],
4088 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004089 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004090 }
4091 `)
4092 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4093 apex {
4094 name: "myapex",
4095 key: "myapex.key",
4096 java_libs: ["myjar"],
4097 }
4098
4099 apex_key {
4100 name: "myapex.key",
4101 public_key: "testkey.avbpubkey",
4102 private_key: "testkey.pem",
4103 }
4104
4105 java_library {
4106 name: "myjar",
4107 srcs: ["foo/bar/MyClass.java"],
4108 sdk_version: "none",
4109 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004110 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004111 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004112 }
4113 `)
4114}
4115
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004116func TestApexWithApps(t *testing.T) {
4117 ctx, _ := testApex(t, `
4118 apex {
4119 name: "myapex",
4120 key: "myapex.key",
4121 apps: [
4122 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004123 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004124 ],
4125 }
4126
4127 apex_key {
4128 name: "myapex.key",
4129 public_key: "testkey.avbpubkey",
4130 private_key: "testkey.pem",
4131 }
4132
4133 android_app {
4134 name: "AppFoo",
4135 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004136 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004137 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004138 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004139 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004140 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004141 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004142
4143 android_app {
4144 name: "AppFooPriv",
4145 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004146 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004147 system_modules: "none",
4148 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004149 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004150 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004151 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004152
4153 cc_library_shared {
4154 name: "libjni",
4155 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004156 shared_libs: ["libfoo"],
4157 stl: "none",
4158 system_shared_libs: [],
4159 apex_available: [ "myapex" ],
4160 sdk_version: "current",
4161 }
4162
4163 cc_library_shared {
4164 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004165 stl: "none",
4166 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004167 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004168 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004169 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004170 `)
4171
Sundong Ahnabb64432019-10-22 13:58:29 +09004172 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004173 apexRule := module.Rule("apexRule")
4174 copyCmds := apexRule.Args["copy_commands"]
4175
4176 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004177 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004178
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004179 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
4180 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004181 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004182 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004183 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004184 // JNI libraries including transitive deps are
4185 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00004186 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004187 // ... embedded inside APK (jnilibs.zip)
4188 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4189 // ... and not directly inside the APEX
4190 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4191 }
Dario Frenicde2a032019-10-27 00:29:22 +01004192}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004193
Dario Frenicde2a032019-10-27 00:29:22 +01004194func TestApexWithAppImports(t *testing.T) {
4195 ctx, _ := testApex(t, `
4196 apex {
4197 name: "myapex",
4198 key: "myapex.key",
4199 apps: [
4200 "AppFooPrebuilt",
4201 "AppFooPrivPrebuilt",
4202 ],
4203 }
4204
4205 apex_key {
4206 name: "myapex.key",
4207 public_key: "testkey.avbpubkey",
4208 private_key: "testkey.pem",
4209 }
4210
4211 android_app_import {
4212 name: "AppFooPrebuilt",
4213 apk: "PrebuiltAppFoo.apk",
4214 presigned: true,
4215 dex_preopt: {
4216 enabled: false,
4217 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004218 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004219 }
4220
4221 android_app_import {
4222 name: "AppFooPrivPrebuilt",
4223 apk: "PrebuiltAppFooPriv.apk",
4224 privileged: true,
4225 presigned: true,
4226 dex_preopt: {
4227 enabled: false,
4228 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004229 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004230 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004231 }
4232 `)
4233
Sundong Ahnabb64432019-10-22 13:58:29 +09004234 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004235 apexRule := module.Rule("apexRule")
4236 copyCmds := apexRule.Args["copy_commands"]
4237
4238 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004239 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4240}
4241
4242func TestApexWithAppImportsPrefer(t *testing.T) {
4243 ctx, _ := testApex(t, `
4244 apex {
4245 name: "myapex",
4246 key: "myapex.key",
4247 apps: [
4248 "AppFoo",
4249 ],
4250 }
4251
4252 apex_key {
4253 name: "myapex.key",
4254 public_key: "testkey.avbpubkey",
4255 private_key: "testkey.pem",
4256 }
4257
4258 android_app {
4259 name: "AppFoo",
4260 srcs: ["foo/bar/MyClass.java"],
4261 sdk_version: "none",
4262 system_modules: "none",
4263 apex_available: [ "myapex" ],
4264 }
4265
4266 android_app_import {
4267 name: "AppFoo",
4268 apk: "AppFooPrebuilt.apk",
4269 filename: "AppFooPrebuilt.apk",
4270 presigned: true,
4271 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004272 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004273 }
4274 `, withFiles(map[string][]byte{
4275 "AppFooPrebuilt.apk": nil,
4276 }))
4277
4278 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4279 "app/AppFoo/AppFooPrebuilt.apk",
4280 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004281}
4282
Dario Freni6f3937c2019-12-20 22:58:03 +00004283func TestApexWithTestHelperApp(t *testing.T) {
4284 ctx, _ := testApex(t, `
4285 apex {
4286 name: "myapex",
4287 key: "myapex.key",
4288 apps: [
4289 "TesterHelpAppFoo",
4290 ],
4291 }
4292
4293 apex_key {
4294 name: "myapex.key",
4295 public_key: "testkey.avbpubkey",
4296 private_key: "testkey.pem",
4297 }
4298
4299 android_test_helper_app {
4300 name: "TesterHelpAppFoo",
4301 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004302 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004303 }
4304
4305 `)
4306
4307 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4308 apexRule := module.Rule("apexRule")
4309 copyCmds := apexRule.Args["copy_commands"]
4310
4311 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4312}
4313
Jooyung Han18020ea2019-11-13 10:50:48 +09004314func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4315 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004316 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004317 apex {
4318 name: "myapex",
4319 key: "myapex.key",
4320 native_shared_libs: ["libfoo"],
4321 }
4322
4323 apex_key {
4324 name: "myapex.key",
4325 public_key: "testkey.avbpubkey",
4326 private_key: "testkey.pem",
4327 }
4328
4329 apex {
4330 name: "otherapex",
4331 key: "myapex.key",
4332 native_shared_libs: ["libfoo"],
4333 }
4334
4335 cc_defaults {
4336 name: "libfoo-defaults",
4337 apex_available: ["otherapex"],
4338 }
4339
4340 cc_library {
4341 name: "libfoo",
4342 defaults: ["libfoo-defaults"],
4343 stl: "none",
4344 system_shared_libs: [],
4345 }`)
4346}
4347
Paul Duffine52e66f2020-03-30 17:54:29 +01004348func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004349 // libfoo is not available to myapex, but only to otherapex
4350 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4351 apex {
4352 name: "myapex",
4353 key: "myapex.key",
4354 native_shared_libs: ["libfoo"],
4355 }
4356
4357 apex_key {
4358 name: "myapex.key",
4359 public_key: "testkey.avbpubkey",
4360 private_key: "testkey.pem",
4361 }
4362
4363 apex {
4364 name: "otherapex",
4365 key: "otherapex.key",
4366 native_shared_libs: ["libfoo"],
4367 }
4368
4369 apex_key {
4370 name: "otherapex.key",
4371 public_key: "testkey.avbpubkey",
4372 private_key: "testkey.pem",
4373 }
4374
4375 cc_library {
4376 name: "libfoo",
4377 stl: "none",
4378 system_shared_libs: [],
4379 apex_available: ["otherapex"],
4380 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004381}
Jiyong Park127b40b2019-09-30 16:04:35 +09004382
Paul Duffine52e66f2020-03-30 17:54:29 +01004383func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004384 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004385 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004386.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004387.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004388.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004389.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004390.*via tag cc\.DependencyTag.*"shared".*
4391.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004392 apex {
4393 name: "myapex",
4394 key: "myapex.key",
4395 native_shared_libs: ["libfoo"],
4396 }
4397
4398 apex_key {
4399 name: "myapex.key",
4400 public_key: "testkey.avbpubkey",
4401 private_key: "testkey.pem",
4402 }
4403
Jiyong Park127b40b2019-09-30 16:04:35 +09004404 cc_library {
4405 name: "libfoo",
4406 stl: "none",
4407 shared_libs: ["libbar"],
4408 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004409 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004410 }
4411
4412 cc_library {
4413 name: "libbar",
4414 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004415 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004416 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004417 apex_available: ["myapex"],
4418 }
4419
4420 cc_library {
4421 name: "libbaz",
4422 stl: "none",
4423 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004424 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004425}
Jiyong Park127b40b2019-09-30 16:04:35 +09004426
Paul Duffine52e66f2020-03-30 17:54:29 +01004427func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004428 testApexError(t, "\"otherapex\" is not a valid module name", `
4429 apex {
4430 name: "myapex",
4431 key: "myapex.key",
4432 native_shared_libs: ["libfoo"],
4433 }
4434
4435 apex_key {
4436 name: "myapex.key",
4437 public_key: "testkey.avbpubkey",
4438 private_key: "testkey.pem",
4439 }
4440
4441 cc_library {
4442 name: "libfoo",
4443 stl: "none",
4444 system_shared_libs: [],
4445 apex_available: ["otherapex"],
4446 }`)
4447
Paul Duffine52e66f2020-03-30 17:54:29 +01004448 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004449 apex {
4450 name: "myapex",
4451 key: "myapex.key",
4452 native_shared_libs: ["libfoo", "libbar"],
4453 }
4454
4455 apex_key {
4456 name: "myapex.key",
4457 public_key: "testkey.avbpubkey",
4458 private_key: "testkey.pem",
4459 }
4460
4461 cc_library {
4462 name: "libfoo",
4463 stl: "none",
4464 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004465 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004466 apex_available: ["myapex"],
4467 }
4468
4469 cc_library {
4470 name: "libbar",
4471 stl: "none",
4472 system_shared_libs: [],
4473 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004474 }
4475
4476 cc_library {
4477 name: "libbaz",
4478 stl: "none",
4479 system_shared_libs: [],
4480 stubs: {
4481 versions: ["10", "20", "30"],
4482 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004483 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004484}
Jiyong Park127b40b2019-09-30 16:04:35 +09004485
Jiyong Park89e850a2020-04-07 16:37:39 +09004486func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004487 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004488 apex {
4489 name: "myapex",
4490 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004491 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004492 }
4493
4494 apex_key {
4495 name: "myapex.key",
4496 public_key: "testkey.avbpubkey",
4497 private_key: "testkey.pem",
4498 }
4499
4500 cc_library {
4501 name: "libfoo",
4502 stl: "none",
4503 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004504 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004505 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004506 }
4507
4508 cc_library {
4509 name: "libfoo2",
4510 stl: "none",
4511 system_shared_libs: [],
4512 shared_libs: ["libbaz"],
4513 apex_available: ["//apex_available:platform"],
4514 }
4515
4516 cc_library {
4517 name: "libbar",
4518 stl: "none",
4519 system_shared_libs: [],
4520 apex_available: ["myapex"],
4521 }
4522
4523 cc_library {
4524 name: "libbaz",
4525 stl: "none",
4526 system_shared_libs: [],
4527 apex_available: ["myapex"],
4528 stubs: {
4529 versions: ["1"],
4530 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004531 }`)
4532
Jiyong Park89e850a2020-04-07 16:37:39 +09004533 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4534 // because it depends on libbar which isn't available to platform
4535 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4536 if libfoo.NotAvailableForPlatform() != true {
4537 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4538 }
4539
4540 // libfoo2 however can be available to platform because it depends on libbaz which provides
4541 // stubs
4542 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4543 if libfoo2.NotAvailableForPlatform() == true {
4544 t.Errorf("%q should be available to platform", libfoo2.String())
4545 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004546}
Jiyong Parka90ca002019-10-07 15:47:24 +09004547
Paul Duffine52e66f2020-03-30 17:54:29 +01004548func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004549 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004550 apex {
4551 name: "myapex",
4552 key: "myapex.key",
4553 native_shared_libs: ["libfoo"],
4554 }
4555
4556 apex_key {
4557 name: "myapex.key",
4558 public_key: "testkey.avbpubkey",
4559 private_key: "testkey.pem",
4560 }
4561
4562 cc_library {
4563 name: "libfoo",
4564 stl: "none",
4565 system_shared_libs: [],
4566 apex_available: ["myapex"],
4567 static: {
4568 apex_available: ["//apex_available:platform"],
4569 },
4570 }`)
4571
Jiyong Park89e850a2020-04-07 16:37:39 +09004572 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4573 if libfooShared.NotAvailableForPlatform() != true {
4574 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4575 }
4576 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4577 if libfooStatic.NotAvailableForPlatform() != false {
4578 t.Errorf("%q should be available to platform", libfooStatic.String())
4579 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004580}
4581
Jiyong Park5d790c32019-11-15 18:40:32 +09004582func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004583 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004584 apex {
4585 name: "myapex",
4586 key: "myapex.key",
4587 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004588 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004589 }
4590
4591 override_apex {
4592 name: "override_myapex",
4593 base: "myapex",
4594 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004595 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004596 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004597 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004598 }
4599
4600 apex_key {
4601 name: "myapex.key",
4602 public_key: "testkey.avbpubkey",
4603 private_key: "testkey.pem",
4604 }
4605
4606 android_app {
4607 name: "app",
4608 srcs: ["foo/bar/MyClass.java"],
4609 package_name: "foo",
4610 sdk_version: "none",
4611 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004612 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004613 }
4614
4615 override_android_app {
4616 name: "override_app",
4617 base: "app",
4618 package_name: "bar",
4619 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004620 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004621
Jiyong Park317645e2019-12-05 13:20:58 +09004622 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4623 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4624 if originalVariant.GetOverriddenBy() != "" {
4625 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4626 }
4627 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4628 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4629 }
4630
Jiyong Park5d790c32019-11-15 18:40:32 +09004631 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4632 apexRule := module.Rule("apexRule")
4633 copyCmds := apexRule.Args["copy_commands"]
4634
4635 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004636 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004637
4638 apexBundle := module.Module().(*apexBundle)
4639 name := apexBundle.Name()
4640 if name != "override_myapex" {
4641 t.Errorf("name should be \"override_myapex\", but was %q", name)
4642 }
4643
Baligh Uddin004d7172020-02-19 21:29:28 -08004644 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4645 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4646 }
4647
Jiyong Park20bacab2020-03-03 11:45:41 +09004648 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004649 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004650
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004651 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4652 var builder strings.Builder
4653 data.Custom(&builder, name, "TARGET_", "", data)
4654 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004655 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004656 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4657 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004658 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004659 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004660 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004661 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4662 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004663}
4664
Jooyung Han214bf372019-11-12 13:03:50 +09004665func TestLegacyAndroid10Support(t *testing.T) {
4666 ctx, _ := testApex(t, `
4667 apex {
4668 name: "myapex",
4669 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004670 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004671 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004672 }
4673
4674 apex_key {
4675 name: "myapex.key",
4676 public_key: "testkey.avbpubkey",
4677 private_key: "testkey.pem",
4678 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004679
4680 cc_library {
4681 name: "mylib",
4682 srcs: ["mylib.cpp"],
4683 stl: "libc++",
4684 system_shared_libs: [],
4685 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004686 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004687 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004688 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004689
4690 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4691 args := module.Rule("apexRule").Args
4692 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004693 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004694
4695 // The copies of the libraries in the apex should have one more dependency than
4696 // the ones outside the apex, namely the unwinder. Ideally we should check
4697 // the dependency names directly here but for some reason the names are blank in
4698 // this test.
4699 for _, lib := range []string{"libc++", "mylib"} {
4700 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4701 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4702 if len(apexImplicits) != len(nonApexImplicits)+1 {
4703 t.Errorf("%q missing unwinder dep", lib)
4704 }
4705 }
Jooyung Han214bf372019-11-12 13:03:50 +09004706}
4707
Paul Duffin9b879592020-05-26 13:21:35 +01004708var filesForSdkLibrary = map[string][]byte{
4709 "api/current.txt": nil,
4710 "api/removed.txt": nil,
4711 "api/system-current.txt": nil,
4712 "api/system-removed.txt": nil,
4713 "api/test-current.txt": nil,
4714 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004715
4716 // For java_sdk_library_import
4717 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004718}
4719
Jooyung Han58f26ab2019-12-18 15:34:32 +09004720func TestJavaSDKLibrary(t *testing.T) {
4721 ctx, _ := testApex(t, `
4722 apex {
4723 name: "myapex",
4724 key: "myapex.key",
4725 java_libs: ["foo"],
4726 }
4727
4728 apex_key {
4729 name: "myapex.key",
4730 public_key: "testkey.avbpubkey",
4731 private_key: "testkey.pem",
4732 }
4733
4734 java_sdk_library {
4735 name: "foo",
4736 srcs: ["a.java"],
4737 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004738 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004739 }
Paul Duffin9b879592020-05-26 13:21:35 +01004740 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004741
4742 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004743 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004744 "javalib/foo.jar",
4745 "etc/permissions/foo.xml",
4746 })
4747 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004748 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4749 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004750}
4751
Paul Duffin9b879592020-05-26 13:21:35 +01004752func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4753 ctx, _ := testApex(t, `
4754 apex {
4755 name: "myapex",
4756 key: "myapex.key",
4757 java_libs: ["foo", "bar"],
4758 }
4759
4760 apex_key {
4761 name: "myapex.key",
4762 public_key: "testkey.avbpubkey",
4763 private_key: "testkey.pem",
4764 }
4765
4766 java_sdk_library {
4767 name: "foo",
4768 srcs: ["a.java"],
4769 api_packages: ["foo"],
4770 apex_available: ["myapex"],
4771 sdk_version: "none",
4772 system_modules: "none",
4773 }
4774
4775 java_library {
4776 name: "bar",
4777 srcs: ["a.java"],
4778 libs: ["foo"],
4779 apex_available: ["myapex"],
4780 sdk_version: "none",
4781 system_modules: "none",
4782 }
4783 `, withFiles(filesForSdkLibrary))
4784
4785 // java_sdk_library installs both impl jar and permission XML
4786 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4787 "javalib/bar.jar",
4788 "javalib/foo.jar",
4789 "etc/permissions/foo.xml",
4790 })
4791
4792 // The bar library should depend on the implementation jar.
4793 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4794 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4795 t.Errorf("expected %q, found %#q", expected, actual)
4796 }
4797}
4798
4799func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4800 ctx, _ := testApex(t, `
4801 apex {
4802 name: "myapex",
4803 key: "myapex.key",
4804 java_libs: ["foo"],
4805 }
4806
4807 apex_key {
4808 name: "myapex.key",
4809 public_key: "testkey.avbpubkey",
4810 private_key: "testkey.pem",
4811 }
4812
4813 java_sdk_library {
4814 name: "foo",
4815 srcs: ["a.java"],
4816 api_packages: ["foo"],
4817 apex_available: ["myapex"],
4818 sdk_version: "none",
4819 system_modules: "none",
4820 }
4821
4822 java_library {
4823 name: "bar",
4824 srcs: ["a.java"],
4825 libs: ["foo"],
4826 sdk_version: "none",
4827 system_modules: "none",
4828 }
4829 `, withFiles(filesForSdkLibrary))
4830
4831 // java_sdk_library installs both impl jar and permission XML
4832 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4833 "javalib/foo.jar",
4834 "etc/permissions/foo.xml",
4835 })
4836
4837 // The bar library should depend on the stubs jar.
4838 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4839 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4840 t.Errorf("expected %q, found %#q", expected, actual)
4841 }
4842}
4843
Paul Duffineedc5d52020-06-12 17:46:39 +01004844func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4845 ctx, _ := testApex(t, ``,
4846 withFiles(map[string][]byte{
4847 "apex/a.java": nil,
4848 "apex/apex_manifest.json": nil,
4849 "apex/Android.bp": []byte(`
4850 package {
4851 default_visibility: ["//visibility:private"],
4852 }
4853
4854 apex {
4855 name: "myapex",
4856 key: "myapex.key",
4857 java_libs: ["foo", "bar"],
4858 }
4859
4860 apex_key {
4861 name: "myapex.key",
4862 public_key: "testkey.avbpubkey",
4863 private_key: "testkey.pem",
4864 }
4865
4866 java_library {
4867 name: "bar",
4868 srcs: ["a.java"],
4869 libs: ["foo"],
4870 apex_available: ["myapex"],
4871 sdk_version: "none",
4872 system_modules: "none",
4873 }
4874`),
4875 "source/a.java": nil,
4876 "source/api/current.txt": nil,
4877 "source/api/removed.txt": nil,
4878 "source/Android.bp": []byte(`
4879 package {
4880 default_visibility: ["//visibility:private"],
4881 }
4882
4883 java_sdk_library {
4884 name: "foo",
4885 visibility: ["//apex"],
4886 srcs: ["a.java"],
4887 api_packages: ["foo"],
4888 apex_available: ["myapex"],
4889 sdk_version: "none",
4890 system_modules: "none",
4891 public: {
4892 enabled: true,
4893 },
4894 }
4895`),
4896 "prebuilt/a.jar": nil,
4897 "prebuilt/Android.bp": []byte(`
4898 package {
4899 default_visibility: ["//visibility:private"],
4900 }
4901
4902 java_sdk_library_import {
4903 name: "foo",
4904 visibility: ["//apex", "//source"],
4905 apex_available: ["myapex"],
4906 prefer: true,
4907 public: {
4908 jars: ["a.jar"],
4909 },
4910 }
4911`),
4912 }),
4913 )
4914
4915 // java_sdk_library installs both impl jar and permission XML
4916 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4917 "javalib/bar.jar",
4918 "javalib/foo.jar",
4919 "etc/permissions/foo.xml",
4920 })
4921
4922 // The bar library should depend on the implementation jar.
4923 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4924 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4925 t.Errorf("expected %q, found %#q", expected, actual)
4926 }
4927}
4928
4929func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
4930 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
4931 apex {
4932 name: "myapex",
4933 key: "myapex.key",
4934 java_libs: ["foo"],
4935 }
4936
4937 apex_key {
4938 name: "myapex.key",
4939 public_key: "testkey.avbpubkey",
4940 private_key: "testkey.pem",
4941 }
4942
4943 java_sdk_library_import {
4944 name: "foo",
4945 apex_available: ["myapex"],
4946 prefer: true,
4947 public: {
4948 jars: ["a.jar"],
4949 },
4950 }
4951
4952 `, withFiles(filesForSdkLibrary))
4953}
4954
atrost6e126252020-01-27 17:01:16 +00004955func TestCompatConfig(t *testing.T) {
4956 ctx, _ := testApex(t, `
4957 apex {
4958 name: "myapex",
4959 key: "myapex.key",
4960 prebuilts: ["myjar-platform-compat-config"],
4961 java_libs: ["myjar"],
4962 }
4963
4964 apex_key {
4965 name: "myapex.key",
4966 public_key: "testkey.avbpubkey",
4967 private_key: "testkey.pem",
4968 }
4969
4970 platform_compat_config {
4971 name: "myjar-platform-compat-config",
4972 src: ":myjar",
4973 }
4974
4975 java_library {
4976 name: "myjar",
4977 srcs: ["foo/bar/MyClass.java"],
4978 sdk_version: "none",
4979 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004980 apex_available: [ "myapex" ],
4981 }
4982 `)
4983 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4984 "etc/compatconfig/myjar-platform-compat-config.xml",
4985 "javalib/myjar.jar",
4986 })
4987}
4988
Jiyong Park479321d2019-12-16 11:47:12 +09004989func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4990 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4991 apex {
4992 name: "myapex",
4993 key: "myapex.key",
4994 java_libs: ["myjar"],
4995 }
4996
4997 apex_key {
4998 name: "myapex.key",
4999 public_key: "testkey.avbpubkey",
5000 private_key: "testkey.pem",
5001 }
5002
5003 java_library {
5004 name: "myjar",
5005 srcs: ["foo/bar/MyClass.java"],
5006 sdk_version: "none",
5007 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005008 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005009 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005010 }
5011 `)
5012}
5013
Jiyong Park7afd1072019-12-30 16:56:33 +09005014func TestCarryRequiredModuleNames(t *testing.T) {
5015 ctx, config := testApex(t, `
5016 apex {
5017 name: "myapex",
5018 key: "myapex.key",
5019 native_shared_libs: ["mylib"],
5020 }
5021
5022 apex_key {
5023 name: "myapex.key",
5024 public_key: "testkey.avbpubkey",
5025 private_key: "testkey.pem",
5026 }
5027
5028 cc_library {
5029 name: "mylib",
5030 srcs: ["mylib.cpp"],
5031 system_shared_libs: [],
5032 stl: "none",
5033 required: ["a", "b"],
5034 host_required: ["c", "d"],
5035 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005036 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005037 }
5038 `)
5039
5040 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5041 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5042 name := apexBundle.BaseModuleName()
5043 prefix := "TARGET_"
5044 var builder strings.Builder
5045 data.Custom(&builder, name, prefix, "", data)
5046 androidMk := builder.String()
5047 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5048 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5049 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5050}
5051
Jiyong Park7cd10e32020-01-14 09:22:18 +09005052func TestSymlinksFromApexToSystem(t *testing.T) {
5053 bp := `
5054 apex {
5055 name: "myapex",
5056 key: "myapex.key",
5057 native_shared_libs: ["mylib"],
5058 java_libs: ["myjar"],
5059 }
5060
Jiyong Park9d677202020-02-19 16:29:35 +09005061 apex {
5062 name: "myapex.updatable",
5063 key: "myapex.key",
5064 native_shared_libs: ["mylib"],
5065 java_libs: ["myjar"],
5066 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005067 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005068 }
5069
Jiyong Park7cd10e32020-01-14 09:22:18 +09005070 apex_key {
5071 name: "myapex.key",
5072 public_key: "testkey.avbpubkey",
5073 private_key: "testkey.pem",
5074 }
5075
5076 cc_library {
5077 name: "mylib",
5078 srcs: ["mylib.cpp"],
5079 shared_libs: ["myotherlib"],
5080 system_shared_libs: [],
5081 stl: "none",
5082 apex_available: [
5083 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005084 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005085 "//apex_available:platform",
5086 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005087 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005088 }
5089
5090 cc_library {
5091 name: "myotherlib",
5092 srcs: ["mylib.cpp"],
5093 system_shared_libs: [],
5094 stl: "none",
5095 apex_available: [
5096 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005097 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005098 "//apex_available:platform",
5099 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005100 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005101 }
5102
5103 java_library {
5104 name: "myjar",
5105 srcs: ["foo/bar/MyClass.java"],
5106 sdk_version: "none",
5107 system_modules: "none",
5108 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005109 apex_available: [
5110 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005111 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005112 "//apex_available:platform",
5113 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005114 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005115 }
5116
5117 java_library {
5118 name: "myotherjar",
5119 srcs: ["foo/bar/MyClass.java"],
5120 sdk_version: "none",
5121 system_modules: "none",
5122 apex_available: [
5123 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005124 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005125 "//apex_available:platform",
5126 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005127 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005128 }
5129 `
5130
5131 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5132 for _, f := range files {
5133 if f.path == file {
5134 if f.isLink {
5135 t.Errorf("%q is not a real file", file)
5136 }
5137 return
5138 }
5139 }
5140 t.Errorf("%q is not found", file)
5141 }
5142
5143 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5144 for _, f := range files {
5145 if f.path == file {
5146 if !f.isLink {
5147 t.Errorf("%q is not a symlink", file)
5148 }
5149 return
5150 }
5151 }
5152 t.Errorf("%q is not found", file)
5153 }
5154
Jiyong Park9d677202020-02-19 16:29:35 +09005155 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5156 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005157 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005158 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005159 ensureRealfileExists(t, files, "javalib/myjar.jar")
5160 ensureRealfileExists(t, files, "lib64/mylib.so")
5161 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5162
Jiyong Park9d677202020-02-19 16:29:35 +09005163 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5164 ensureRealfileExists(t, files, "javalib/myjar.jar")
5165 ensureRealfileExists(t, files, "lib64/mylib.so")
5166 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5167
5168 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005169 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005170 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005171 ensureRealfileExists(t, files, "javalib/myjar.jar")
5172 ensureRealfileExists(t, files, "lib64/mylib.so")
5173 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005174
5175 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5176 ensureRealfileExists(t, files, "javalib/myjar.jar")
5177 ensureRealfileExists(t, files, "lib64/mylib.so")
5178 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005179}
5180
Jooyung Han643adc42020-02-27 13:50:06 +09005181func TestApexWithJniLibs(t *testing.T) {
5182 ctx, _ := testApex(t, `
5183 apex {
5184 name: "myapex",
5185 key: "myapex.key",
5186 jni_libs: ["mylib"],
5187 }
5188
5189 apex_key {
5190 name: "myapex.key",
5191 public_key: "testkey.avbpubkey",
5192 private_key: "testkey.pem",
5193 }
5194
5195 cc_library {
5196 name: "mylib",
5197 srcs: ["mylib.cpp"],
5198 shared_libs: ["mylib2"],
5199 system_shared_libs: [],
5200 stl: "none",
5201 apex_available: [ "myapex" ],
5202 }
5203
5204 cc_library {
5205 name: "mylib2",
5206 srcs: ["mylib.cpp"],
5207 system_shared_libs: [],
5208 stl: "none",
5209 apex_available: [ "myapex" ],
5210 }
5211 `)
5212
5213 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5214 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5215 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5216 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5217 "lib64/mylib.so",
5218 "lib64/mylib2.so",
5219 })
5220}
5221
Jooyung Han49f67012020-04-17 13:43:10 +09005222func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5223 ctx, _ := testApex(t, `
5224 apex {
5225 name: "myapex",
5226 key: "myapex.key",
5227 }
5228 apex_key {
5229 name: "myapex.key",
5230 public_key: "testkey.avbpubkey",
5231 private_key: "testkey.pem",
5232 }
5233 `, func(fs map[string][]byte, config android.Config) {
5234 delete(config.Targets, android.Android)
5235 config.AndroidCommonTarget = android.Target{}
5236 })
5237
5238 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5239 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5240 }
5241}
5242
Jooyung Han643adc42020-02-27 13:50:06 +09005243func TestApexWithJniLibs_Errors(t *testing.T) {
5244 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5245 apex {
5246 name: "myapex",
5247 key: "myapex.key",
5248 jni_libs: ["xxx"],
5249 }
5250
5251 apex_key {
5252 name: "myapex.key",
5253 public_key: "testkey.avbpubkey",
5254 private_key: "testkey.pem",
5255 }
5256
5257 prebuilt_etc {
5258 name: "xxx",
5259 src: "xxx",
5260 }
5261 `, withFiles(map[string][]byte{
5262 "xxx": nil,
5263 }))
5264}
5265
Jiyong Parkbd159612020-02-28 15:22:21 +09005266func TestAppBundle(t *testing.T) {
5267 ctx, _ := testApex(t, `
5268 apex {
5269 name: "myapex",
5270 key: "myapex.key",
5271 apps: ["AppFoo"],
5272 }
5273
5274 apex_key {
5275 name: "myapex.key",
5276 public_key: "testkey.avbpubkey",
5277 private_key: "testkey.pem",
5278 }
5279
5280 android_app {
5281 name: "AppFoo",
5282 srcs: ["foo/bar/MyClass.java"],
5283 sdk_version: "none",
5284 system_modules: "none",
5285 apex_available: [ "myapex" ],
5286 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005287 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005288
5289 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5290 content := bundleConfigRule.Args["content"]
5291
5292 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005293 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 +09005294}
5295
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005296func TestAppSetBundle(t *testing.T) {
5297 ctx, _ := testApex(t, `
5298 apex {
5299 name: "myapex",
5300 key: "myapex.key",
5301 apps: ["AppSet"],
5302 }
5303
5304 apex_key {
5305 name: "myapex.key",
5306 public_key: "testkey.avbpubkey",
5307 private_key: "testkey.pem",
5308 }
5309
5310 android_app_set {
5311 name: "AppSet",
5312 set: "AppSet.apks",
5313 }`)
5314 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5315 bundleConfigRule := mod.Description("Bundle Config")
5316 content := bundleConfigRule.Args["content"]
5317 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5318 s := mod.Rule("apexRule").Args["copy_commands"]
5319 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5320 if len(copyCmds) != 3 {
5321 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5322 }
5323 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5324 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5325 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5326}
5327
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005328func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005329 t.Helper()
5330
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005331 bp := `
5332 java_library {
5333 name: "some-updatable-apex-lib",
5334 srcs: ["a.java"],
5335 sdk_version: "current",
5336 apex_available: [
5337 "some-updatable-apex",
5338 ],
5339 }
5340
5341 java_library {
5342 name: "some-non-updatable-apex-lib",
5343 srcs: ["a.java"],
5344 apex_available: [
5345 "some-non-updatable-apex",
5346 ],
5347 }
5348
5349 java_library {
5350 name: "some-platform-lib",
5351 srcs: ["a.java"],
5352 sdk_version: "current",
5353 installable: true,
5354 }
5355
5356 java_library {
5357 name: "some-art-lib",
5358 srcs: ["a.java"],
5359 sdk_version: "current",
5360 apex_available: [
5361 "com.android.art.something",
5362 ],
5363 hostdex: true,
5364 }
5365
5366 apex {
5367 name: "some-updatable-apex",
5368 key: "some-updatable-apex.key",
5369 java_libs: ["some-updatable-apex-lib"],
5370 updatable: true,
5371 min_sdk_version: "current",
5372 }
5373
5374 apex {
5375 name: "some-non-updatable-apex",
5376 key: "some-non-updatable-apex.key",
5377 java_libs: ["some-non-updatable-apex-lib"],
5378 }
5379
5380 apex_key {
5381 name: "some-updatable-apex.key",
5382 }
5383
5384 apex_key {
5385 name: "some-non-updatable-apex.key",
5386 }
5387
5388 apex {
5389 name: "com.android.art.something",
5390 key: "com.android.art.something.key",
5391 java_libs: ["some-art-lib"],
5392 updatable: true,
5393 min_sdk_version: "current",
5394 }
5395
5396 apex_key {
5397 name: "com.android.art.something.key",
5398 }
5399
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005400 filegroup {
5401 name: "some-updatable-apex-file_contexts",
5402 srcs: [
5403 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5404 ],
5405 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005406
5407 filegroup {
5408 name: "some-non-updatable-apex-file_contexts",
5409 srcs: [
5410 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5411 ],
5412 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005413 `
5414 bp += cc.GatherRequiredDepsForTest(android.Android)
5415 bp += java.GatherRequiredDepsForTest()
5416 bp += dexpreopt.BpToolModulesForTest()
5417
5418 fs := map[string][]byte{
5419 "a.java": nil,
5420 "a.jar": nil,
5421 "build/make/target/product/security": nil,
5422 "apex_manifest.json": nil,
5423 "AndroidManifest.xml": nil,
5424 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005425 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005426 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5427 "framework/aidl/a.aidl": nil,
5428 }
5429 cc.GatherRequiredFilesForTest(fs)
5430
5431 ctx := android.NewTestArchContext()
5432 ctx.RegisterModuleType("apex", BundleFactory)
5433 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5434 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005435 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005436 cc.RegisterRequiredBuildComponentsForTest(ctx)
5437 java.RegisterJavaBuildComponents(ctx)
5438 java.RegisterSystemModulesBuildComponents(ctx)
5439 java.RegisterAppBuildComponents(ctx)
5440 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005441 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5442 ctx.PreDepsMutators(RegisterPreDepsMutators)
5443 ctx.PostDepsMutators(RegisterPostDepsMutators)
5444
5445 config := android.TestArchConfig(buildDir, nil, bp, fs)
5446 ctx.Register(config)
5447
5448 _ = dexpreopt.GlobalSoongConfigForTests(config)
5449 dexpreopt.RegisterToolModulesForTest(ctx)
5450 pathCtx := android.PathContextForTesting(config)
5451 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5452 transformDexpreoptConfig(dexpreoptConfig)
5453 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5454
5455 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5456 android.FailIfErrored(t, errs)
5457
5458 _, errs = ctx.PrepareBuildActions(config)
5459 if errmsg == "" {
5460 android.FailIfErrored(t, errs)
5461 } else if len(errs) > 0 {
5462 android.FailIfNoMatchingErrors(t, errmsg, errs)
5463 return
5464 } else {
5465 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5466 }
5467}
5468
Jooyung Han548640b2020-04-27 12:10:30 +09005469func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5470 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5471 apex {
5472 name: "myapex",
5473 key: "myapex.key",
5474 updatable: true,
5475 }
5476
5477 apex_key {
5478 name: "myapex.key",
5479 public_key: "testkey.avbpubkey",
5480 private_key: "testkey.pem",
5481 }
5482 `)
5483}
5484
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005485func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005486
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005487 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005488 var transform func(*dexpreopt.GlobalConfig)
5489
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005490 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5491 transform = func(config *dexpreopt.GlobalConfig) {
5492 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
5493 }
5494 testNoUpdatableJarsInBootImage(t, "", transform)
5495 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005496
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005497 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005498 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 +01005499 transform = func(config *dexpreopt.GlobalConfig) {
5500 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5501 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005502 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005503 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005504
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005505 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 -07005506 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 +01005507 transform = func(config *dexpreopt.GlobalConfig) {
5508 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5509 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005510 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005511 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005512
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005513 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 -07005514 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005515 transform = func(config *dexpreopt.GlobalConfig) {
5516 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5517 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005518 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005519 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005520
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005521 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 -07005522 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 +01005523 transform = func(config *dexpreopt.GlobalConfig) {
5524 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5525 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005526 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005527 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005528
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005529 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5530 transform = func(config *dexpreopt.GlobalConfig) {
5531 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5532 }
5533 testNoUpdatableJarsInBootImage(t, "", transform)
5534 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005535
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005536 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005537 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005538 transform = func(config *dexpreopt.GlobalConfig) {
5539 config.ArtApexJars = []string{"platform:nonexistent"}
5540 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005541 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005542 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005543
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005544 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005545 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005546 transform = func(config *dexpreopt.GlobalConfig) {
5547 config.BootJars = []string{"platform:nonexistent"}
5548 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005549 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005550 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005551
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005552 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005553 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005554 transform = func(config *dexpreopt.GlobalConfig) {
5555 config.ArtApexJars = []string{"platform:some-platform-lib"}
5556 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005557 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005558 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005559
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005560 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5561 transform = func(config *dexpreopt.GlobalConfig) {
5562 config.BootJars = []string{"platform:some-platform-lib"}
5563 }
5564 testNoUpdatableJarsInBootImage(t, "", transform)
5565 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005566}
5567
Jiyong Park62304bb2020-04-13 16:19:48 +09005568func TestTestFor(t *testing.T) {
5569 ctx, _ := testApex(t, `
5570 apex {
5571 name: "myapex",
5572 key: "myapex.key",
5573 native_shared_libs: ["mylib", "myprivlib"],
5574 }
5575
5576 apex_key {
5577 name: "myapex.key",
5578 public_key: "testkey.avbpubkey",
5579 private_key: "testkey.pem",
5580 }
5581
5582 cc_library {
5583 name: "mylib",
5584 srcs: ["mylib.cpp"],
5585 system_shared_libs: [],
5586 stl: "none",
5587 stubs: {
5588 versions: ["1"],
5589 },
5590 apex_available: ["myapex"],
5591 }
5592
5593 cc_library {
5594 name: "myprivlib",
5595 srcs: ["mylib.cpp"],
5596 system_shared_libs: [],
5597 stl: "none",
5598 apex_available: ["myapex"],
5599 }
5600
5601
5602 cc_test {
5603 name: "mytest",
5604 gtest: false,
5605 srcs: ["mylib.cpp"],
5606 system_shared_libs: [],
5607 stl: "none",
5608 shared_libs: ["mylib", "myprivlib"],
5609 test_for: ["myapex"]
5610 }
5611 `)
5612
5613 // the test 'mytest' is a test for the apex, therefore is linked to the
5614 // actual implementation of mylib instead of its stub.
5615 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5616 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5617 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5618}
5619
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005620// TODO(jungjw): Move this to proptools
5621func intPtr(i int) *int {
5622 return &i
5623}
5624
5625func TestApexSet(t *testing.T) {
5626 ctx, config := testApex(t, `
5627 apex_set {
5628 name: "myapex",
5629 set: "myapex.apks",
5630 filename: "foo_v2.apex",
5631 overrides: ["foo"],
5632 }
5633 `, func(fs map[string][]byte, config android.Config) {
5634 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5635 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5636 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5637 })
5638
5639 m := ctx.ModuleForTests("myapex", "android_common")
5640
5641 // Check extract_apks tool parameters.
5642 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5643 actual := extractedApex.Args["abis"]
5644 expected := "ARMEABI_V7A,ARM64_V8A"
5645 if actual != expected {
5646 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5647 }
5648 actual = extractedApex.Args["sdk-version"]
5649 expected = "30"
5650 if actual != expected {
5651 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5652 }
5653
5654 a := m.Module().(*ApexSet)
5655 expectedOverrides := []string{"foo"}
5656 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5657 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5658 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5659 }
5660}
5661
Jiyong Park7d95a512020-05-10 15:16:24 +09005662func TestNoStaticLinkingToStubsLib(t *testing.T) {
5663 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5664 apex {
5665 name: "myapex",
5666 key: "myapex.key",
5667 native_shared_libs: ["mylib"],
5668 }
5669
5670 apex_key {
5671 name: "myapex.key",
5672 public_key: "testkey.avbpubkey",
5673 private_key: "testkey.pem",
5674 }
5675
5676 cc_library {
5677 name: "mylib",
5678 srcs: ["mylib.cpp"],
5679 static_libs: ["otherlib"],
5680 system_shared_libs: [],
5681 stl: "none",
5682 apex_available: [ "myapex" ],
5683 }
5684
5685 cc_library {
5686 name: "otherlib",
5687 srcs: ["mylib.cpp"],
5688 system_shared_libs: [],
5689 stl: "none",
5690 stubs: {
5691 versions: ["1", "2", "3"],
5692 },
5693 apex_available: [ "myapex" ],
5694 }
5695 `)
5696}
5697
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005698func TestApexKeysTxt(t *testing.T) {
5699 ctx, _ := testApex(t, `
5700 apex {
5701 name: "myapex",
5702 key: "myapex.key",
5703 }
5704
5705 apex_key {
5706 name: "myapex.key",
5707 public_key: "testkey.avbpubkey",
5708 private_key: "testkey.pem",
5709 }
5710
5711 prebuilt_apex {
5712 name: "myapex",
5713 prefer: true,
5714 arch: {
5715 arm64: {
5716 src: "myapex-arm64.apex",
5717 },
5718 arm: {
5719 src: "myapex-arm.apex",
5720 },
5721 },
5722 }
5723
5724 apex_set {
5725 name: "myapex_set",
5726 set: "myapex.apks",
5727 filename: "myapex_set.apex",
5728 overrides: ["myapex"],
5729 }
5730 `)
5731
5732 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5733 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5734 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 +09005735 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 +09005736}
5737
Jooyung Han938b5932020-06-20 12:47:47 +09005738func TestAllowedFiles(t *testing.T) {
5739 ctx, _ := testApex(t, `
5740 apex {
5741 name: "myapex",
5742 key: "myapex.key",
5743 apps: ["app"],
5744 allowed_files: "allowed.txt",
5745 }
5746
5747 apex_key {
5748 name: "myapex.key",
5749 public_key: "testkey.avbpubkey",
5750 private_key: "testkey.pem",
5751 }
5752
5753 android_app {
5754 name: "app",
5755 srcs: ["foo/bar/MyClass.java"],
5756 package_name: "foo",
5757 sdk_version: "none",
5758 system_modules: "none",
5759 apex_available: [ "myapex" ],
5760 }
5761 `, withFiles(map[string][]byte{
5762 "sub/Android.bp": []byte(`
5763 override_apex {
5764 name: "override_myapex",
5765 base: "myapex",
5766 apps: ["override_app"],
5767 allowed_files: ":allowed",
5768 }
5769 // Overridable "path" property should be referenced indirectly
5770 filegroup {
5771 name: "allowed",
5772 srcs: ["allowed.txt"],
5773 }
5774 override_android_app {
5775 name: "override_app",
5776 base: "app",
5777 package_name: "bar",
5778 }
5779 `),
5780 }))
5781
5782 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5783 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5784 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5785 }
5786
5787 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5788 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5789 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5790 }
5791}
5792
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005793func TestMain(m *testing.M) {
5794 run := func() int {
5795 setUp()
5796 defer tearDown()
5797
5798 return m.Run()
5799 }
5800
5801 os.Exit(run())
5802}