blob: 610f6675089deac1ed44d84dcb846e8b417dc992 [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"
markchien2f59ec92020-09-02 16:23:38 +080030 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000032 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070033 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090034 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090036)
37
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070038var buildDir string
39
Jooyung Hand3639552019-08-09 12:57:43 +090040// names returns name list from white space separated string
41func names(s string) (ns []string) {
42 for _, n := range strings.Split(s, " ") {
43 if len(n) > 0 {
44 ns = append(ns, n)
45 }
46 }
47 return
48}
49
Jooyung Han344d5432019-08-23 11:17:39 +090050func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
51 t.Helper()
52 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090053 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
54 if len(errs) > 0 {
55 android.FailIfNoMatchingErrors(t, pattern, errs)
56 return
57 }
58 _, errs = ctx.PrepareBuildActions(config)
59 if len(errs) > 0 {
60 android.FailIfNoMatchingErrors(t, pattern, errs)
61 return
62 }
63
64 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
65}
66
Jooyung Han344d5432019-08-23 11:17:39 +090067func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
68 t.Helper()
69 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010070 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090071 android.FailIfErrored(t, errs)
72 _, errs = ctx.PrepareBuildActions(config)
73 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070074 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090075}
76
Jooyung Han344d5432019-08-23 11:17:39 +090077type testCustomizer func(fs map[string][]byte, config android.Config)
78
79func withFiles(files map[string][]byte) testCustomizer {
80 return func(fs map[string][]byte, config android.Config) {
81 for k, v := range files {
82 fs[k] = v
83 }
84 }
85}
86
87func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
88 return func(fs map[string][]byte, config android.Config) {
89 for k, v := range targets {
90 config.Targets[k] = v
91 }
92 }
93}
94
Jooyung Han35155c42020-02-06 17:33:20 +090095// withNativeBridgeTargets sets configuration with targets including:
96// - X86_64 (primary)
97// - X86 (secondary)
98// - Arm64 on X86_64 (native bridge)
99// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700100func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900101 config.Targets[android.Android] = []android.Target{
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
110 }
111}
112
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900113func withManifestPackageNameOverrides(specs []string) testCustomizer {
114 return func(fs map[string][]byte, config android.Config) {
115 config.TestProductVariables.ManifestPackageNameOverrides = specs
116 }
117}
118
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700119func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900120 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
121}
122
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700123func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900124 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
125}
126
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700127func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900128 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900129
130 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900131 filegroup {
132 name: "myapex-file_contexts",
133 srcs: [
134 "system/sepolicy/apex/myapex-file_contexts",
135 ],
136 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900137 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800138
Colin Crossf9aabd72020-02-15 11:29:50 -0800139 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
140
Dario Frenicde2a032019-10-27 00:29:22 +0100141 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900142
Jooyung Han344d5432019-08-23 11:17:39 +0900143 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900144 "a.java": nil,
145 "PrebuiltAppFoo.apk": nil,
146 "PrebuiltAppFooPriv.apk": nil,
147 "build/make/target/product/security": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
150 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900151 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900152 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900153 "system/sepolicy/apex/otherapex-file_contexts": nil,
154 "system/sepolicy/apex/commonapex-file_contexts": nil,
155 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800156 "mylib.cpp": nil,
157 "mylib_common.cpp": nil,
158 "mytest.cpp": nil,
159 "mytest1.cpp": nil,
160 "mytest2.cpp": nil,
161 "mytest3.cpp": nil,
162 "myprebuilt": nil,
163 "my_include": nil,
164 "foo/bar/MyClass.java": nil,
165 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100166 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800167 "vendor/foo/devkeys/test.x509.pem": nil,
168 "vendor/foo/devkeys/test.pk8": nil,
169 "testkey.x509.pem": nil,
170 "testkey.pk8": nil,
171 "testkey.override.x509.pem": nil,
172 "testkey.override.pk8": nil,
173 "vendor/foo/devkeys/testkey.avbpubkey": nil,
174 "vendor/foo/devkeys/testkey.pem": nil,
175 "NOTICE": nil,
176 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900177 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800178 "testkey2.avbpubkey": nil,
179 "testkey2.pem": nil,
180 "myapex-arm64.apex": nil,
181 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700182 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800183 "frameworks/base/api/current.txt": nil,
184 "framework/aidl/a.aidl": nil,
185 "build/make/core/proguard.flags": nil,
186 "build/make/core/proguard_basic_keeps.flags": nil,
187 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700188 "baz": nil,
189 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700190 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700191 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900192 }
193
Colin Crossf9aabd72020-02-15 11:29:50 -0800194 cc.GatherRequiredFilesForTest(fs)
195
Jooyung Han344d5432019-08-23 11:17:39 +0900196 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800197 // The fs now needs to be populated before creating the config, call handlers twice
198 // for now, once to get any fs changes, and later after the config was created to
199 // set product variables or targets.
200 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
201 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900202 }
203
Colin Cross98be1bb2019-12-13 20:41:13 -0800204 config := android.TestArchConfig(buildDir, nil, bp, fs)
205 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
206 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
207 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
208 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
209 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jooyung Han749dc692020-04-15 11:03:39 +0900210 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800211 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
212
213 for _, handler := range handlers {
214 // The fs now needs to be populated before creating the config, call handlers twice
215 // for now, earlier to get any fs changes, and now after the config was created to
216 // set product variables or targets.
217 tempFS := map[string][]byte{}
218 handler(tempFS, config)
219 }
220
221 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100222
223 // from android package
224 android.RegisterPackageBuildComponents(ctx)
225 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
226
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("apex", BundleFactory)
228 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
229 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
230 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
231 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
232 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
233 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700234 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100237 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000238 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100241
Paul Duffin021f4e52020-07-30 16:04:17 +0100242 // Register these after the prebuilt mutators have been registered to match what
243 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100244 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
245 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
246
Paul Duffin021f4e52020-07-30 16:04:17 +0100247 cc.RegisterRequiredBuildComponentsForTest(ctx)
248
Colin Cross98be1bb2019-12-13 20:41:13 -0800249 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800250 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
251 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900252 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000253 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700254 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800255 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000256 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000257 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000258 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100259 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900260 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800261 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262
Colin Cross98be1bb2019-12-13 20:41:13 -0800263 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265
266 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269}
270
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271func setUp() {
272 var err error
273 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700279func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700280 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281}
282
Jooyung Han643adc42020-02-27 13:50:06 +0900283// ensure that 'result' equals 'expected'
284func ensureEquals(t *testing.T, result string, expected string) {
285 t.Helper()
286 if result != expected {
287 t.Errorf("%q != %q", expected, result)
288 }
289}
290
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291// ensure that 'result' contains 'expected'
292func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if !strings.Contains(result, expected) {
295 t.Errorf("%q is not found in %q", expected, result)
296 }
297}
298
Liz Kammer5bd365f2020-05-27 15:15:11 -0700299// ensure that 'result' contains 'expected' exactly one time
300func ensureContainsOnce(t *testing.T, result string, expected string) {
301 t.Helper()
302 count := strings.Count(result, expected)
303 if count != 1 {
304 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// ensures that 'result' does not contain 'notExpected'
309func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900310 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311 if strings.Contains(result, notExpected) {
312 t.Errorf("%q is found in %q", notExpected, result)
313 }
314}
315
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700316func ensureMatches(t *testing.T, result string, expectedRex string) {
317 ok, err := regexp.MatchString(expectedRex, result)
318 if err != nil {
319 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
320 return
321 }
322 if !ok {
323 t.Errorf("%s does not match regular expession %s", result, expectedRex)
324 }
325}
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900328 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900329 if !android.InList(expected, result) {
330 t.Errorf("%q is not found in %v", expected, result)
331 }
332}
333
334func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900335 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900336 if android.InList(notExpected, result) {
337 t.Errorf("%q is found in %v", notExpected, result)
338 }
339}
340
Jooyung Hane1633032019-08-01 17:41:43 +0900341func ensureListEmpty(t *testing.T, result []string) {
342 t.Helper()
343 if len(result) > 0 {
344 t.Errorf("%q is expected to be empty", result)
345 }
346}
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348// Minimal test
349func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900350 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900351 apex_defaults {
352 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900353 manifest: ":myapex.manifest",
354 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 key: "myapex.key",
356 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800357 multilib: {
358 both: {
359 binaries: ["foo",],
360 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900361 },
Jiyong Park77acec62020-06-01 21:39:15 +0900362 java_libs: [
363 "myjar",
364 "myjar_dex",
365 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900366 }
367
Jiyong Park30ca9372019-02-07 16:27:23 +0900368 apex {
369 name: "myapex",
370 defaults: ["myapex-defaults"],
371 }
372
Jiyong Park25fc6a92018-11-18 18:02:45 +0900373 apex_key {
374 name: "myapex.key",
375 public_key: "testkey.avbpubkey",
376 private_key: "testkey.pem",
377 }
378
Jiyong Park809bb722019-02-13 21:33:49 +0900379 filegroup {
380 name: "myapex.manifest",
381 srcs: ["apex_manifest.json"],
382 }
383
384 filegroup {
385 name: "myapex.androidmanifest",
386 srcs: ["AndroidManifest.xml"],
387 }
388
Jiyong Park25fc6a92018-11-18 18:02:45 +0900389 cc_library {
390 name: "mylib",
391 srcs: ["mylib.cpp"],
392 shared_libs: ["mylib2"],
393 system_shared_libs: [],
394 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000395 // TODO: remove //apex_available:platform
396 apex_available: [
397 "//apex_available:platform",
398 "myapex",
399 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900400 }
401
Alex Light3d673592019-01-18 14:37:31 -0800402 cc_binary {
403 name: "foo",
404 srcs: ["mylib.cpp"],
405 compile_multilib: "both",
406 multilib: {
407 lib32: {
408 suffix: "32",
409 },
410 lib64: {
411 suffix: "64",
412 },
413 },
414 symlinks: ["foo_link_"],
415 symlink_preferred_arch: true,
416 system_shared_libs: [],
417 static_executable: true,
418 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700419 apex_available: [ "myapex", "com.android.gki.*" ],
420 }
421
422 apex {
423 name: "com.android.gki.fake",
424 binaries: ["foo"],
425 key: "myapex.key",
426 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800427 }
428
Paul Duffindddd5462020-04-07 15:25:44 +0100429 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900430 name: "mylib2",
431 srcs: ["mylib.cpp"],
432 system_shared_libs: [],
433 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900434 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
451 }
452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
458 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000459 // TODO: remove //apex_available:platform
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900464 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900465
466 java_library {
467 name: "myjar",
468 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900469 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 sdk_version: "none",
471 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900473 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000474 // TODO: remove //apex_available:platform
475 apex_available: [
476 "//apex_available:platform",
477 "myapex",
478 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Sundong Ahnabb64432019-10-22 13:58:29 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
513 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
514 data := android.AndroidMkDataForTest(t, config, "", ab)
515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900525 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700538 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540
541 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800542 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
543 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900544 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900545 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900546 // .. but not for java libs
547 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900548 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800549
Colin Cross7113d202019-11-20 16:39:12 -0800550 // Ensure that the platform variant ends with _shared or _common
551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
556
557 // Ensure that dynamic dependency to java libs are not included
558 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800559
560 // Ensure that all symlinks are present.
561 found_foo_link_64 := false
562 found_foo := false
563 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900564 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800565 if strings.HasSuffix(cmd, "bin/foo") {
566 found_foo = true
567 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
568 found_foo_link_64 = true
569 }
570 }
571 }
572 good := found_foo && found_foo_link_64
573 if !good {
574 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
575 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900576
Sundong Ahnabb64432019-10-22 13:58:29 +0900577 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700578 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900579 if len(noticeInputs) != 3 {
580 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900581 }
582 ensureListContains(t, noticeInputs, "NOTICE")
583 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900584 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900585
Artur Satayeva8bd1132020-04-27 18:07:06 +0100586 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000587 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
588 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
589 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
590 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
591 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100592
593 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000594 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
597 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
598 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800599}
600
Jooyung Hanf21c7972019-12-16 22:32:06 +0900601func TestDefaults(t *testing.T) {
602 ctx, _ := testApex(t, `
603 apex_defaults {
604 name: "myapex-defaults",
605 key: "myapex.key",
606 prebuilts: ["myetc"],
607 native_shared_libs: ["mylib"],
608 java_libs: ["myjar"],
609 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900610 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800611 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 }
613
614 prebuilt_etc {
615 name: "myetc",
616 src: "myprebuilt",
617 }
618
619 apex {
620 name: "myapex",
621 defaults: ["myapex-defaults"],
622 }
623
624 apex_key {
625 name: "myapex.key",
626 public_key: "testkey.avbpubkey",
627 private_key: "testkey.pem",
628 }
629
630 cc_library {
631 name: "mylib",
632 system_shared_libs: [],
633 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000634 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900635 }
636
637 java_library {
638 name: "myjar",
639 srcs: ["foo/bar/MyClass.java"],
640 sdk_version: "none",
641 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000642 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900643 }
644
645 android_app {
646 name: "AppFoo",
647 srcs: ["foo/bar/MyClass.java"],
648 sdk_version: "none",
649 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900652
653 runtime_resource_overlay {
654 name: "rro",
655 theme: "blue",
656 }
657
markchien2f59ec92020-09-02 16:23:38 +0800658 bpf {
659 name: "bpf",
660 srcs: ["bpf.c", "bpf2.c"],
661 }
662
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000664 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 "etc/myetc",
666 "javalib/myjar.jar",
667 "lib64/mylib.so",
668 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900669 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800670 "etc/bpf/bpf.o",
671 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900672 })
673}
674
Jooyung Han01a3ee22019-11-02 02:52:25 +0900675func TestApexManifest(t *testing.T) {
676 ctx, _ := testApex(t, `
677 apex {
678 name: "myapex",
679 key: "myapex.key",
680 }
681
682 apex_key {
683 name: "myapex.key",
684 public_key: "testkey.avbpubkey",
685 private_key: "testkey.pem",
686 }
687 `)
688
689 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900690 args := module.Rule("apexRule").Args
691 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
692 t.Error("manifest should be apex_manifest.pb, but " + manifest)
693 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694}
695
Alex Light5098a612018-11-29 17:12:15 -0800696func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700697 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800698 apex {
699 name: "myapex",
700 key: "myapex.key",
701 payload_type: "zip",
702 native_shared_libs: ["mylib"],
703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710
711 cc_library {
712 name: "mylib",
713 srcs: ["mylib.cpp"],
714 shared_libs: ["mylib2"],
715 system_shared_libs: [],
716 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000717 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800718 }
719
720 cc_library {
721 name: "mylib2",
722 srcs: ["mylib.cpp"],
723 system_shared_libs: [],
724 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000725 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800726 }
727 `)
728
Sundong Ahnabb64432019-10-22 13:58:29 +0900729 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800730 copyCmds := zipApexRule.Args["copy_commands"]
731
732 // Ensure that main rule creates an output
733 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
734
735 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700736 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800737
738 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700739 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800740
741 // Ensure that both direct and indirect deps are copied into apex
742 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
743 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900744}
745
746func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700747 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748 apex {
749 name: "myapex",
750 key: "myapex.key",
751 native_shared_libs: ["mylib", "mylib3"],
752 }
753
754 apex_key {
755 name: "myapex.key",
756 public_key: "testkey.avbpubkey",
757 private_key: "testkey.pem",
758 }
759
760 cc_library {
761 name: "mylib",
762 srcs: ["mylib.cpp"],
763 shared_libs: ["mylib2", "mylib3"],
764 system_shared_libs: [],
765 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000766 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900767 }
768
769 cc_library {
770 name: "mylib2",
771 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900772 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773 system_shared_libs: [],
774 stl: "none",
775 stubs: {
776 versions: ["1", "2", "3"],
777 },
778 }
779
780 cc_library {
781 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900782 srcs: ["mylib.cpp"],
783 shared_libs: ["mylib4"],
784 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785 stl: "none",
786 stubs: {
787 versions: ["10", "11", "12"],
788 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000789 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900791
792 cc_library {
793 name: "mylib4",
794 srcs: ["mylib.cpp"],
795 system_shared_libs: [],
796 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000797 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900798 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799 `)
800
Sundong Ahnabb64432019-10-22 13:58:29 +0900801 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 copyCmds := apexRule.Args["copy_commands"]
803
804 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800805 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900806
807 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800808 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809
810 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800811 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812
Colin Crossaede88c2020-08-11 12:17:01 -0700813 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900814
815 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900816 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900818 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900819
820 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700821 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900822 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700823 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900824
825 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900826 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900827 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900828
829 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900830 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900831
Jooyung Hana57af4a2020-01-23 05:36:59 +0000832 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900833 "lib64/mylib.so",
834 "lib64/mylib3.so",
835 "lib64/mylib4.so",
836 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700840 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900841 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900842 name: "myapex2",
843 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900844 native_shared_libs: ["mylib"],
845 }
846
847 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900848 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900849 public_key: "testkey.avbpubkey",
850 private_key: "testkey.pem",
851 }
852
853 cc_library {
854 name: "mylib",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900857 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900861 }
862
863 cc_library {
864 name: "libfoo",
865 srcs: ["mylib.cpp"],
866 shared_libs: ["libbar"],
867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["10", "20", "30"],
871 },
872 }
873
874 cc_library {
875 name: "libbar",
876 srcs: ["mylib.cpp"],
877 system_shared_libs: [],
878 stl: "none",
879 }
880
Jiyong Park678c8812020-02-07 17:25:49 +0900881 cc_library_static {
882 name: "libbaz",
883 srcs: ["mylib.cpp"],
884 system_shared_libs: [],
885 stl: "none",
886 apex_available: [ "myapex2" ],
887 }
888
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900889 `)
890
Jiyong Park83dc74b2020-01-14 18:38:44 +0900891 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892 copyCmds := apexRule.Args["copy_commands"]
893
894 // Ensure that direct non-stubs dep is always included
895 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
896
897 // Ensure that indirect stubs dep is not included
898 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
899
900 // Ensure that dependency of stubs is not included
901 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
902
Colin Crossaede88c2020-08-11 12:17:01 -0700903 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900904
905 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900906 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900907 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900908 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900909
Jiyong Park3ff16992019-12-27 14:11:47 +0900910 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900911
912 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
913 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900914
Artur Satayeva8bd1132020-04-27 18:07:06 +0100915 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000916 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
917 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
918 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900919
Artur Satayeva8bd1132020-04-27 18:07:06 +0100920 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000921 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
922 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
923 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900924}
925
Jooyung Hand3639552019-08-09 12:57:43 +0900926func TestApexWithRuntimeLibsDependency(t *testing.T) {
927 /*
928 myapex
929 |
930 v (runtime_libs)
931 mylib ------+------> libfoo [provides stub]
932 |
933 `------> libbar
934 */
935 ctx, _ := testApex(t, `
936 apex {
937 name: "myapex",
938 key: "myapex.key",
939 native_shared_libs: ["mylib"],
940 }
941
942 apex_key {
943 name: "myapex.key",
944 public_key: "testkey.avbpubkey",
945 private_key: "testkey.pem",
946 }
947
948 cc_library {
949 name: "mylib",
950 srcs: ["mylib.cpp"],
951 runtime_libs: ["libfoo", "libbar"],
952 system_shared_libs: [],
953 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000954 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900955 }
956
957 cc_library {
958 name: "libfoo",
959 srcs: ["mylib.cpp"],
960 system_shared_libs: [],
961 stl: "none",
962 stubs: {
963 versions: ["10", "20", "30"],
964 },
965 }
966
967 cc_library {
968 name: "libbar",
969 srcs: ["mylib.cpp"],
970 system_shared_libs: [],
971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000972 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900973 }
974
975 `)
976
Sundong Ahnabb64432019-10-22 13:58:29 +0900977 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900978 copyCmds := apexRule.Args["copy_commands"]
979
980 // Ensure that direct non-stubs dep is always included
981 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
982
983 // Ensure that indirect stubs dep is not included
984 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
985
986 // Ensure that runtime_libs dep in included
987 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
988
Sundong Ahnabb64432019-10-22 13:58:29 +0900989 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900990 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
991 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900992
993}
994
Jooyung Han8ce8db92020-05-15 19:05:05 +0900995func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
996 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
997 bp := `
998 apex {
999 name: "com.android.runtime",
1000 key: "com.android.runtime.key",
1001 native_shared_libs: ["libc"],
1002 }
1003
1004 apex_key {
1005 name: "com.android.runtime.key",
1006 public_key: "testkey.avbpubkey",
1007 private_key: "testkey.pem",
1008 }
1009
1010 cc_library {
1011 name: "libc",
1012 no_libcrt: true,
1013 nocrt: true,
1014 stl: "none",
1015 system_shared_libs: [],
1016 stubs: { versions: ["1"] },
1017 apex_available: ["com.android.runtime"],
1018
1019 sanitize: {
1020 hwaddress: true,
1021 }
1022 }
1023
1024 cc_prebuilt_library_shared {
1025 name: "libclang_rt.hwasan-aarch64-android",
1026 no_libcrt: true,
1027 nocrt: true,
1028 stl: "none",
1029 system_shared_libs: [],
1030 srcs: [""],
1031 stubs: { versions: ["1"] },
1032
1033 sanitize: {
1034 never: true,
1035 },
1036 }
1037 `
1038 // override bp to use hard-coded names: com.android.runtime and libc
1039 fs["Android.bp"] = []byte(bp)
1040 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1041 })
1042
1043 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1044 "lib64/bionic/libc.so",
1045 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1046 })
1047
1048 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1049
1050 installed := hwasan.Description("install libclang_rt.hwasan")
1051 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1052
1053 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1054 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1055 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1056}
1057
1058func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1059 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1060 bp := `
1061 apex {
1062 name: "com.android.runtime",
1063 key: "com.android.runtime.key",
1064 native_shared_libs: ["libc"],
1065 }
1066
1067 apex_key {
1068 name: "com.android.runtime.key",
1069 public_key: "testkey.avbpubkey",
1070 private_key: "testkey.pem",
1071 }
1072
1073 cc_library {
1074 name: "libc",
1075 no_libcrt: true,
1076 nocrt: true,
1077 stl: "none",
1078 system_shared_libs: [],
1079 stubs: { versions: ["1"] },
1080 apex_available: ["com.android.runtime"],
1081 }
1082
1083 cc_prebuilt_library_shared {
1084 name: "libclang_rt.hwasan-aarch64-android",
1085 no_libcrt: true,
1086 nocrt: true,
1087 stl: "none",
1088 system_shared_libs: [],
1089 srcs: [""],
1090 stubs: { versions: ["1"] },
1091
1092 sanitize: {
1093 never: true,
1094 },
1095 }
1096 `
1097 // override bp to use hard-coded names: com.android.runtime and libc
1098 fs["Android.bp"] = []byte(bp)
1099 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1100
1101 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1102 })
1103
1104 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1105 "lib64/bionic/libc.so",
1106 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1107 })
1108
1109 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1110
1111 installed := hwasan.Description("install libclang_rt.hwasan")
1112 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1113
1114 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1115 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1116 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1117}
1118
Jooyung Han61b66e92020-03-21 14:21:46 +00001119func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1120 testcases := []struct {
1121 name string
1122 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001123 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001124 shouldLink string
1125 shouldNotLink []string
1126 }{
1127 {
Jooyung Han75568392020-03-20 04:29:24 +09001128 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001129 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001130 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001131 shouldLink: "30",
1132 shouldNotLink: []string{"29"},
1133 },
1134 {
1135 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001136 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001137 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001138 shouldLink: "29",
1139 shouldNotLink: []string{"30"},
1140 },
1141 }
1142 for _, tc := range testcases {
1143 t.Run(tc.name, func(t *testing.T) {
1144 ctx, _ := testApex(t, `
1145 apex {
1146 name: "myapex",
1147 key: "myapex.key",
1148 use_vendor: true,
1149 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001150 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001151 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001152
Jooyung Han61b66e92020-03-21 14:21:46 +00001153 apex_key {
1154 name: "myapex.key",
1155 public_key: "testkey.avbpubkey",
1156 private_key: "testkey.pem",
1157 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001158
Jooyung Han61b66e92020-03-21 14:21:46 +00001159 cc_library {
1160 name: "mylib",
1161 srcs: ["mylib.cpp"],
1162 vendor_available: true,
1163 shared_libs: ["libbar"],
1164 system_shared_libs: [],
1165 stl: "none",
1166 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001167 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001168 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001169
Jooyung Han61b66e92020-03-21 14:21:46 +00001170 cc_library {
1171 name: "libbar",
1172 srcs: ["mylib.cpp"],
1173 system_shared_libs: [],
1174 stl: "none",
1175 stubs: { versions: ["29","30"] },
1176 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001177
Jooyung Han61b66e92020-03-21 14:21:46 +00001178 llndk_library {
1179 name: "libbar",
1180 symbol_file: "",
1181 }
1182 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001183 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001184 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001185
Jooyung Han61b66e92020-03-21 14:21:46 +00001186 // Ensure that LLNDK dep is not included
1187 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1188 "lib64/mylib.so",
1189 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001190
Jooyung Han61b66e92020-03-21 14:21:46 +00001191 // Ensure that LLNDK dep is required
1192 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1193 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1194 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001195
Colin Crossaede88c2020-08-11 12:17:01 -07001196 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001197 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1198 for _, ver := range tc.shouldNotLink {
1199 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1200 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001201
Colin Crossaede88c2020-08-11 12:17:01 -07001202 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001203 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1204 })
1205 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001206}
1207
Jiyong Park25fc6a92018-11-18 18:02:45 +09001208func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001209 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001210 apex {
1211 name: "myapex",
1212 key: "myapex.key",
1213 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1214 }
1215
1216 apex_key {
1217 name: "myapex.key",
1218 public_key: "testkey.avbpubkey",
1219 private_key: "testkey.pem",
1220 }
1221
1222 cc_library {
1223 name: "mylib",
1224 srcs: ["mylib.cpp"],
1225 shared_libs: ["libdl#27"],
1226 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001227 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001228 }
1229
1230 cc_library_shared {
1231 name: "mylib_shared",
1232 srcs: ["mylib.cpp"],
1233 shared_libs: ["libdl#27"],
1234 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001235 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001236 }
1237
1238 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001239 name: "libBootstrap",
1240 srcs: ["mylib.cpp"],
1241 stl: "none",
1242 bootstrap: true,
1243 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001244 `)
1245
Sundong Ahnabb64432019-10-22 13:58:29 +09001246 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001247 copyCmds := apexRule.Args["copy_commands"]
1248
1249 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001250 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001251 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1252 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001253
1254 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001255 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001256
Colin Crossaede88c2020-08-11 12:17:01 -07001257 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1258 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1259 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260
1261 // For dependency to libc
1262 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001263 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001264 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001265 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001266 // ... Cflags from stub is correctly exported to mylib
1267 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1268 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1269
1270 // For dependency to libm
1271 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001272 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001273 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001274 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001275 // ... and is not compiling with the stub
1276 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1277 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1278
1279 // For dependency to libdl
1280 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001282 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001283 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1284 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001285 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001286 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001287 // ... Cflags from stub is correctly exported to mylib
1288 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1289 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001290
1291 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001292 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1293 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1294 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1295 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001296}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001297
Jooyung Han749dc692020-04-15 11:03:39 +09001298func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001299 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001300 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1301 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001302 // 3) (platform) -> liba -> libz : this should be non-stub link
1303 ctx, _ := testApex(t, `
1304 apex {
1305 name: "myapex",
1306 key: "myapex.key",
1307 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001308 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001309 }
1310
1311 apex {
1312 name: "otherapex",
1313 key: "myapex.key",
1314 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001315 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001316 }
1317
1318 apex_key {
1319 name: "myapex.key",
1320 public_key: "testkey.avbpubkey",
1321 private_key: "testkey.pem",
1322 }
1323
1324 cc_library {
1325 name: "libx",
1326 shared_libs: ["liba"],
1327 system_shared_libs: [],
1328 stl: "none",
1329 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001330 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001331 }
1332
1333 cc_library {
1334 name: "liby",
1335 shared_libs: ["liba"],
1336 system_shared_libs: [],
1337 stl: "none",
1338 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001339 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001340 }
1341
1342 cc_library {
1343 name: "liba",
1344 shared_libs: ["libz"],
1345 system_shared_libs: [],
1346 stl: "none",
1347 apex_available: [
1348 "//apex_available:anyapex",
1349 "//apex_available:platform",
1350 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001351 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001352 }
1353
1354 cc_library {
1355 name: "libz",
1356 system_shared_libs: [],
1357 stl: "none",
1358 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001359 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001360 },
1361 }
Jooyung Han749dc692020-04-15 11:03:39 +09001362 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001363
1364 expectLink := func(from, from_variant, to, to_variant string) {
1365 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1366 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1367 }
1368 expectNoLink := func(from, from_variant, to, to_variant string) {
1369 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1370 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1371 }
1372 // platform liba is linked to non-stub version
1373 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001374 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001375 expectLink("liba", "shared_apex29", "libz", "shared_28")
1376 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1377 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001378 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001379 expectLink("liba", "shared_apex30", "libz", "shared_30")
1380 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1381 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001382}
1383
Jooyung Hanaed150d2020-04-02 01:41:41 +09001384func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1385 ctx, _ := testApex(t, `
1386 apex {
1387 name: "myapex",
1388 key: "myapex.key",
1389 native_shared_libs: ["libx"],
1390 min_sdk_version: "R",
1391 }
1392
1393 apex_key {
1394 name: "myapex.key",
1395 public_key: "testkey.avbpubkey",
1396 private_key: "testkey.pem",
1397 }
1398
1399 cc_library {
1400 name: "libx",
1401 shared_libs: ["libz"],
1402 system_shared_libs: [],
1403 stl: "none",
1404 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001405 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001406 }
1407
1408 cc_library {
1409 name: "libz",
1410 system_shared_libs: [],
1411 stl: "none",
1412 stubs: {
1413 versions: ["29", "R"],
1414 },
1415 }
1416 `, func(fs map[string][]byte, config android.Config) {
1417 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1418 })
1419
1420 expectLink := func(from, from_variant, to, to_variant string) {
1421 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1422 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1423 }
1424 expectNoLink := func(from, from_variant, to, to_variant string) {
1425 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1426 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1427 }
1428 // 9000 is quite a magic number.
1429 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1430 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1431 // to distinguish them from finalized and future_api(10000)
1432 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1433 // (refer android/api_levels.go)
Colin Crossaede88c2020-08-11 12:17:01 -07001434 expectLink("libx", "shared_apex10000", "libz", "shared_9000")
1435 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1436 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001437}
1438
Jooyung Han749dc692020-04-15 11:03:39 +09001439func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001440 ctx, _ := testApex(t, `
1441 apex {
1442 name: "myapex",
1443 key: "myapex.key",
1444 native_shared_libs: ["libx"],
1445 }
1446
1447 apex_key {
1448 name: "myapex.key",
1449 public_key: "testkey.avbpubkey",
1450 private_key: "testkey.pem",
1451 }
1452
1453 cc_library {
1454 name: "libx",
1455 shared_libs: ["libz"],
1456 system_shared_libs: [],
1457 stl: "none",
1458 apex_available: [ "myapex" ],
1459 }
1460
1461 cc_library {
1462 name: "libz",
1463 system_shared_libs: [],
1464 stl: "none",
1465 stubs: {
1466 versions: ["1", "2"],
1467 },
1468 }
1469 `)
1470
1471 expectLink := func(from, from_variant, to, to_variant string) {
1472 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1473 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1474 }
1475 expectNoLink := func(from, from_variant, to, to_variant string) {
1476 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1477 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1478 }
Colin Crossaede88c2020-08-11 12:17:01 -07001479 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1480 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1481 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001482}
1483
1484func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1485 ctx, _ := testApex(t, `
1486 apex {
1487 name: "myapex",
1488 key: "myapex.key",
1489 native_shared_libs: ["libx"],
1490 }
1491
1492 apex_key {
1493 name: "myapex.key",
1494 public_key: "testkey.avbpubkey",
1495 private_key: "testkey.pem",
1496 }
1497
1498 cc_library {
1499 name: "libx",
1500 system_shared_libs: [],
1501 stl: "none",
1502 apex_available: [ "myapex" ],
1503 stubs: {
1504 versions: ["1", "2"],
1505 },
1506 }
1507
1508 cc_library {
1509 name: "libz",
1510 shared_libs: ["libx"],
1511 system_shared_libs: [],
1512 stl: "none",
1513 }
1514 `)
1515
1516 expectLink := func(from, from_variant, to, to_variant string) {
1517 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1518 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1519 }
1520 expectNoLink := func(from, from_variant, to, to_variant string) {
1521 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1522 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1523 }
1524 expectLink("libz", "shared", "libx", "shared_2")
1525 expectNoLink("libz", "shared", "libz", "shared_1")
1526 expectNoLink("libz", "shared", "libz", "shared")
1527}
1528
Jooyung Han75568392020-03-20 04:29:24 +09001529func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001530 ctx, _ := testApex(t, `
1531 apex {
1532 name: "myapex",
1533 key: "myapex.key",
1534 native_shared_libs: ["libx"],
1535 min_sdk_version: "29",
1536 }
1537
1538 apex_key {
1539 name: "myapex.key",
1540 public_key: "testkey.avbpubkey",
1541 private_key: "testkey.pem",
1542 }
1543
1544 cc_library {
1545 name: "libx",
1546 shared_libs: ["libbar"],
1547 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001548 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001549 }
1550
1551 cc_library {
1552 name: "libbar",
1553 stubs: {
1554 versions: ["29", "30"],
1555 },
1556 }
Jooyung Han75568392020-03-20 04:29:24 +09001557 `, func(fs map[string][]byte, config android.Config) {
1558 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1559 })
Jooyung Han03b51852020-02-26 22:45:42 +09001560 expectLink := func(from, from_variant, to, to_variant string) {
1561 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1562 libFlags := ld.Args["libFlags"]
1563 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1564 }
Colin Crossaede88c2020-08-11 12:17:01 -07001565 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001566}
1567
Jooyung Han75568392020-03-20 04:29:24 +09001568func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001569 ctx, _ := testApex(t, `
1570 apex {
1571 name: "myapex",
1572 key: "myapex.key",
1573 native_shared_libs: ["libx"],
1574 min_sdk_version: "29",
1575 }
1576
1577 apex_key {
1578 name: "myapex.key",
1579 public_key: "testkey.avbpubkey",
1580 private_key: "testkey.pem",
1581 }
1582
1583 cc_library {
1584 name: "libx",
1585 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001586 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001587 }
Jooyung Han75568392020-03-20 04:29:24 +09001588 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001589
1590 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001591 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001592 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1593 // note that platform variant is not.
1594 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1595 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001596}
1597
Jooyung Han749dc692020-04-15 11:03:39 +09001598func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001599 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001600 apex {
1601 name: "myapex",
1602 key: "myapex.key",
1603 native_shared_libs: ["libx"],
1604 min_sdk_version: "29",
1605 }
1606
1607 apex_key {
1608 name: "myapex.key",
1609 public_key: "testkey.avbpubkey",
1610 private_key: "testkey.pem",
1611 }
1612
1613 cc_library {
1614 name: "libx",
1615 shared_libs: ["libz"],
1616 system_shared_libs: [],
1617 stl: "none",
1618 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001619 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001620 }
1621
1622 cc_library {
1623 name: "libz",
1624 system_shared_libs: [],
1625 stl: "none",
1626 stubs: {
1627 versions: ["30"],
1628 },
1629 }
Jooyung Han75568392020-03-20 04:29:24 +09001630 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001631}
Jooyung Han03b51852020-02-26 22:45:42 +09001632
Jooyung Han749dc692020-04-15 11:03:39 +09001633func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1634 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001635 apex {
1636 name: "myapex",
1637 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001638 native_shared_libs: ["mylib"],
1639 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001640 }
1641
1642 apex_key {
1643 name: "myapex.key",
1644 public_key: "testkey.avbpubkey",
1645 private_key: "testkey.pem",
1646 }
Jooyung Han749dc692020-04-15 11:03:39 +09001647
1648 cc_library {
1649 name: "mylib",
1650 srcs: ["mylib.cpp"],
1651 system_shared_libs: [],
1652 stl: "none",
1653 apex_available: [
1654 "myapex",
1655 ],
1656 min_sdk_version: "30",
1657 }
1658 `)
1659}
1660
1661func TestApexMinSdkVersion_Okay(t *testing.T) {
1662 testApex(t, `
1663 apex {
1664 name: "myapex",
1665 key: "myapex.key",
1666 native_shared_libs: ["libfoo"],
1667 java_libs: ["libbar"],
1668 min_sdk_version: "29",
1669 }
1670
1671 apex_key {
1672 name: "myapex.key",
1673 public_key: "testkey.avbpubkey",
1674 private_key: "testkey.pem",
1675 }
1676
1677 cc_library {
1678 name: "libfoo",
1679 srcs: ["mylib.cpp"],
1680 shared_libs: ["libfoo_dep"],
1681 apex_available: ["myapex"],
1682 min_sdk_version: "29",
1683 }
1684
1685 cc_library {
1686 name: "libfoo_dep",
1687 srcs: ["mylib.cpp"],
1688 apex_available: ["myapex"],
1689 min_sdk_version: "29",
1690 }
1691
1692 java_library {
1693 name: "libbar",
1694 sdk_version: "current",
1695 srcs: ["a.java"],
1696 static_libs: ["libbar_dep"],
1697 apex_available: ["myapex"],
1698 min_sdk_version: "29",
1699 }
1700
1701 java_library {
1702 name: "libbar_dep",
1703 sdk_version: "current",
1704 srcs: ["a.java"],
1705 apex_available: ["myapex"],
1706 min_sdk_version: "29",
1707 }
Jooyung Han03b51852020-02-26 22:45:42 +09001708 `)
1709}
1710
Artur Satayev8cf899a2020-04-15 17:29:42 +01001711func TestJavaStableSdkVersion(t *testing.T) {
1712 testCases := []struct {
1713 name string
1714 expectedError string
1715 bp string
1716 }{
1717 {
1718 name: "Non-updatable apex with non-stable dep",
1719 bp: `
1720 apex {
1721 name: "myapex",
1722 java_libs: ["myjar"],
1723 key: "myapex.key",
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: "core_platform",
1734 apex_available: ["myapex"],
1735 }
1736 `,
1737 },
1738 {
1739 name: "Updatable apex with stable dep",
1740 bp: `
1741 apex {
1742 name: "myapex",
1743 java_libs: ["myjar"],
1744 key: "myapex.key",
1745 updatable: true,
1746 min_sdk_version: "29",
1747 }
1748 apex_key {
1749 name: "myapex.key",
1750 public_key: "testkey.avbpubkey",
1751 private_key: "testkey.pem",
1752 }
1753 java_library {
1754 name: "myjar",
1755 srcs: ["foo/bar/MyClass.java"],
1756 sdk_version: "current",
1757 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001758 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001759 }
1760 `,
1761 },
1762 {
1763 name: "Updatable apex with non-stable dep",
1764 expectedError: "cannot depend on \"myjar\"",
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: "core_platform",
1781 apex_available: ["myapex"],
1782 }
1783 `,
1784 },
1785 {
1786 name: "Updatable apex with non-stable transitive dep",
1787 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1788 bp: `
1789 apex {
1790 name: "myapex",
1791 java_libs: ["myjar"],
1792 key: "myapex.key",
1793 updatable: true,
1794 }
1795 apex_key {
1796 name: "myapex.key",
1797 public_key: "testkey.avbpubkey",
1798 private_key: "testkey.pem",
1799 }
1800 java_library {
1801 name: "myjar",
1802 srcs: ["foo/bar/MyClass.java"],
1803 sdk_version: "current",
1804 apex_available: ["myapex"],
1805 static_libs: ["transitive-jar"],
1806 }
1807 java_library {
1808 name: "transitive-jar",
1809 srcs: ["foo/bar/MyClass.java"],
1810 sdk_version: "core_platform",
1811 apex_available: ["myapex"],
1812 }
1813 `,
1814 },
1815 }
1816
1817 for _, test := range testCases {
1818 t.Run(test.name, func(t *testing.T) {
1819 if test.expectedError == "" {
1820 testApex(t, test.bp)
1821 } else {
1822 testApexError(t, test.expectedError, test.bp)
1823 }
1824 })
1825 }
1826}
1827
Jooyung Han749dc692020-04-15 11:03:39 +09001828func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1829 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1830 apex {
1831 name: "myapex",
1832 key: "myapex.key",
1833 native_shared_libs: ["mylib"],
1834 min_sdk_version: "29",
1835 }
1836
1837 apex_key {
1838 name: "myapex.key",
1839 public_key: "testkey.avbpubkey",
1840 private_key: "testkey.pem",
1841 }
1842
1843 cc_library {
1844 name: "mylib",
1845 srcs: ["mylib.cpp"],
1846 shared_libs: ["mylib2"],
1847 system_shared_libs: [],
1848 stl: "none",
1849 apex_available: [
1850 "myapex",
1851 ],
1852 min_sdk_version: "29",
1853 }
1854
1855 // indirect part of the apex
1856 cc_library {
1857 name: "mylib2",
1858 srcs: ["mylib.cpp"],
1859 system_shared_libs: [],
1860 stl: "none",
1861 apex_available: [
1862 "myapex",
1863 ],
1864 min_sdk_version: "30",
1865 }
1866 `)
1867}
1868
1869func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1870 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1871 apex {
1872 name: "myapex",
1873 key: "myapex.key",
1874 apps: ["AppFoo"],
1875 min_sdk_version: "29",
1876 }
1877
1878 apex_key {
1879 name: "myapex.key",
1880 public_key: "testkey.avbpubkey",
1881 private_key: "testkey.pem",
1882 }
1883
1884 android_app {
1885 name: "AppFoo",
1886 srcs: ["foo/bar/MyClass.java"],
1887 sdk_version: "current",
1888 min_sdk_version: "29",
1889 system_modules: "none",
1890 stl: "none",
1891 static_libs: ["bar"],
1892 apex_available: [ "myapex" ],
1893 }
1894
1895 java_library {
1896 name: "bar",
1897 sdk_version: "current",
1898 srcs: ["a.java"],
1899 apex_available: [ "myapex" ],
1900 }
1901 `)
1902}
1903
1904func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1905 ctx, _ := testApex(t, `
1906 apex {
1907 name: "myapex",
1908 key: "myapex.key",
1909 native_shared_libs: ["mylib"],
1910 min_sdk_version: "29",
1911 }
1912
1913 apex_key {
1914 name: "myapex.key",
1915 public_key: "testkey.avbpubkey",
1916 private_key: "testkey.pem",
1917 }
1918
1919 // mylib in myapex will link to mylib2#29
1920 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1921 cc_library {
1922 name: "mylib",
1923 srcs: ["mylib.cpp"],
1924 shared_libs: ["mylib2"],
1925 system_shared_libs: [],
1926 stl: "none",
1927 apex_available: ["myapex", "otherapex"],
1928 min_sdk_version: "29",
1929 }
1930
1931 cc_library {
1932 name: "mylib2",
1933 srcs: ["mylib.cpp"],
1934 system_shared_libs: [],
1935 stl: "none",
1936 apex_available: ["otherapex"],
1937 stubs: { versions: ["29", "30"] },
1938 min_sdk_version: "30",
1939 }
1940
1941 apex {
1942 name: "otherapex",
1943 key: "myapex.key",
1944 native_shared_libs: ["mylib", "mylib2"],
1945 min_sdk_version: "30",
1946 }
1947 `)
1948 expectLink := func(from, from_variant, to, to_variant string) {
1949 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1950 libFlags := ld.Args["libFlags"]
1951 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1952 }
Colin Crossaede88c2020-08-11 12:17:01 -07001953 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
1954 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09001955}
1956
Jiyong Park7c2ee712018-12-07 00:42:25 +09001957func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001958 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001959 apex {
1960 name: "myapex",
1961 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001962 native_shared_libs: ["mylib"],
1963 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001964 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001965 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001966 }
1967
1968 apex_key {
1969 name: "myapex.key",
1970 public_key: "testkey.avbpubkey",
1971 private_key: "testkey.pem",
1972 }
1973
1974 prebuilt_etc {
1975 name: "myetc",
1976 src: "myprebuilt",
1977 sub_dir: "foo/bar",
1978 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001979
1980 cc_library {
1981 name: "mylib",
1982 srcs: ["mylib.cpp"],
1983 relative_install_path: "foo/bar",
1984 system_shared_libs: [],
1985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001986 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001987 }
1988
1989 cc_binary {
1990 name: "mybin",
1991 srcs: ["mylib.cpp"],
1992 relative_install_path: "foo/bar",
1993 system_shared_libs: [],
1994 static_executable: true,
1995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001996 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001997 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001998 `)
1999
Sundong Ahnabb64432019-10-22 13:58:29 +09002000 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002001 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2002
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002003 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002004 ensureListContains(t, dirs, "etc")
2005 ensureListContains(t, dirs, "etc/foo")
2006 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002007 ensureListContains(t, dirs, "lib64")
2008 ensureListContains(t, dirs, "lib64/foo")
2009 ensureListContains(t, dirs, "lib64/foo/bar")
2010 ensureListContains(t, dirs, "lib")
2011 ensureListContains(t, dirs, "lib/foo")
2012 ensureListContains(t, dirs, "lib/foo/bar")
2013
Jiyong Parkbd13e442019-03-15 18:10:35 +09002014 ensureListContains(t, dirs, "bin")
2015 ensureListContains(t, dirs, "bin/foo")
2016 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002017}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002018
Jooyung Han35155c42020-02-06 17:33:20 +09002019func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2020 ctx, _ := testApex(t, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 multilib: {
2025 both: {
2026 native_shared_libs: ["mylib"],
2027 binaries: ["mybin"],
2028 },
2029 },
2030 compile_multilib: "both",
2031 native_bridge_supported: true,
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "mylib",
2042 relative_install_path: "foo/bar",
2043 system_shared_libs: [],
2044 stl: "none",
2045 apex_available: [ "myapex" ],
2046 native_bridge_supported: true,
2047 }
2048
2049 cc_binary {
2050 name: "mybin",
2051 relative_install_path: "foo/bar",
2052 system_shared_libs: [],
2053 static_executable: true,
2054 stl: "none",
2055 apex_available: [ "myapex" ],
2056 native_bridge_supported: true,
2057 compile_multilib: "both", // default is "first" for binary
2058 multilib: {
2059 lib64: {
2060 suffix: "64",
2061 },
2062 },
2063 }
2064 `, withNativeBridgeEnabled)
2065 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2066 "bin/foo/bar/mybin",
2067 "bin/foo/bar/mybin64",
2068 "bin/arm/foo/bar/mybin",
2069 "bin/arm64/foo/bar/mybin64",
2070 "lib/foo/bar/mylib.so",
2071 "lib/arm/foo/bar/mylib.so",
2072 "lib64/foo/bar/mylib.so",
2073 "lib64/arm64/foo/bar/mylib.so",
2074 })
2075}
2076
Jiyong Parkda6eb592018-12-19 17:12:36 +09002077func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002078 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002079 apex {
2080 name: "myapex",
2081 key: "myapex.key",
2082 native_shared_libs: ["mylib"],
2083 use_vendor: true,
2084 }
2085
2086 apex_key {
2087 name: "myapex.key",
2088 public_key: "testkey.avbpubkey",
2089 private_key: "testkey.pem",
2090 }
2091
2092 cc_library {
2093 name: "mylib",
2094 srcs: ["mylib.cpp"],
2095 shared_libs: ["mylib2"],
2096 system_shared_libs: [],
2097 vendor_available: true,
2098 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002099 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002100 }
2101
2102 cc_library {
2103 name: "mylib2",
2104 srcs: ["mylib.cpp"],
2105 system_shared_libs: [],
2106 vendor_available: true,
2107 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002108 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002109 }
Jooyung Handc782442019-11-01 03:14:38 +09002110 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002111 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002112 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002113
2114 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002115 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002116 for _, implicit := range i.Implicits {
2117 inputsList = append(inputsList, implicit.String())
2118 }
2119 }
2120 inputsString := strings.Join(inputsList, " ")
2121
2122 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002123 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2124 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002125
2126 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002127 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2128 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002129}
Jiyong Park16e91a02018-12-20 18:18:08 +09002130
Jooyung Han85d61762020-06-24 23:50:26 +09002131func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002132 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2133 apex {
2134 name: "myapex",
2135 key: "myapex.key",
2136 use_vendor: true,
2137 }
2138 apex_key {
2139 name: "myapex.key",
2140 public_key: "testkey.avbpubkey",
2141 private_key: "testkey.pem",
2142 }
2143 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002144 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002145 })
Colin Cross440e0d02020-06-11 11:32:11 -07002146 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002147 testApex(t, `
2148 apex {
2149 name: "myapex",
2150 key: "myapex.key",
2151 use_vendor: true,
2152 }
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002159 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002160 })
2161}
2162
Jooyung Han5c998b92019-06-27 11:30:33 +09002163func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2164 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2165 apex {
2166 name: "myapex",
2167 key: "myapex.key",
2168 native_shared_libs: ["mylib"],
2169 use_vendor: true,
2170 }
2171
2172 apex_key {
2173 name: "myapex.key",
2174 public_key: "testkey.avbpubkey",
2175 private_key: "testkey.pem",
2176 }
2177
2178 cc_library {
2179 name: "mylib",
2180 srcs: ["mylib.cpp"],
2181 system_shared_libs: [],
2182 stl: "none",
2183 }
2184 `)
2185}
2186
Jooyung Han85d61762020-06-24 23:50:26 +09002187func TestVendorApex(t *testing.T) {
2188 ctx, config := testApex(t, `
2189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
2192 binaries: ["mybin"],
2193 vendor: true,
2194 }
2195 apex_key {
2196 name: "myapex.key",
2197 public_key: "testkey.avbpubkey",
2198 private_key: "testkey.pem",
2199 }
2200 cc_binary {
2201 name: "mybin",
2202 vendor: true,
2203 shared_libs: ["libfoo"],
2204 }
2205 cc_library {
2206 name: "libfoo",
2207 proprietary: true,
2208 }
2209 `)
2210
2211 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2212 "bin/mybin",
2213 "lib64/libfoo.so",
2214 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2215 "lib64/libc++.so",
2216 })
2217
2218 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2219 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2220 name := apexBundle.BaseModuleName()
2221 prefix := "TARGET_"
2222 var builder strings.Builder
2223 data.Custom(&builder, name, prefix, "", data)
2224 androidMk := builder.String()
2225 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002226
2227 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2228 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2229 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002230}
2231
Jooyung Handf78e212020-07-22 15:54:47 +09002232func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2233 ctx, _ := testApex(t, `
2234 apex {
2235 name: "myapex",
2236 key: "myapex.key",
2237 binaries: ["mybin"],
2238 vendor: true,
2239 use_vndk_as_stable: true,
2240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 cc_binary {
2247 name: "mybin",
2248 vendor: true,
2249 shared_libs: ["libvndk", "libvendor"],
2250 }
2251 cc_library {
2252 name: "libvndk",
2253 vndk: {
2254 enabled: true,
2255 },
2256 vendor_available: true,
2257 }
2258 cc_library {
2259 name: "libvendor",
2260 vendor: true,
2261 }
2262 `)
2263
2264 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2265
Colin Crossaede88c2020-08-11 12:17:01 -07002266 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002267 libs := names(ldRule.Args["libFlags"])
2268 // VNDK libs(libvndk/libc++) as they are
2269 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2270 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2271 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002272 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002273
2274 // VNDK libs are not included when use_vndk_as_stable: true
2275 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2276 "bin/mybin",
2277 "lib64/libvendor.so",
2278 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002279
2280 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2281 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2282 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002283}
2284
Jooyung Han0703fd82020-08-26 22:11:53 +09002285func TestVendorApex_withPrebuiltFirmware(t *testing.T) {
2286 ctx, _ := testApex(t, `
2287 apex {
2288 name: "myapex",
2289 key: "myapex.key",
2290 prebuilts: ["myfirmware"],
2291 vendor: true,
2292 }
2293 apex_key {
2294 name: "myapex.key",
2295 public_key: "testkey.avbpubkey",
2296 private_key: "testkey.pem",
2297 }
2298 prebuilt_firmware {
2299 name: "myfirmware",
2300 src: "myfirmware.bin",
2301 filename_from_src: true,
2302 vendor: true,
2303 }
2304 `)
2305
2306 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2307 "firmware/myfirmware.bin",
2308 })
2309}
2310
Jooyung Hanefb184e2020-06-25 17:14:25 +09002311func TestAndroidMk_UseVendorRequired(t *testing.T) {
2312 ctx, config := testApex(t, `
2313 apex {
2314 name: "myapex",
2315 key: "myapex.key",
2316 use_vendor: true,
2317 native_shared_libs: ["mylib"],
2318 }
2319
2320 apex_key {
2321 name: "myapex.key",
2322 public_key: "testkey.avbpubkey",
2323 private_key: "testkey.pem",
2324 }
2325
2326 cc_library {
2327 name: "mylib",
2328 vendor_available: true,
2329 apex_available: ["myapex"],
2330 }
2331 `, func(fs map[string][]byte, config android.Config) {
2332 setUseVendorAllowListForTest(config, []string{"myapex"})
2333 })
2334
2335 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2336 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2337 name := apexBundle.BaseModuleName()
2338 prefix := "TARGET_"
2339 var builder strings.Builder
2340 data.Custom(&builder, name, prefix, "", data)
2341 androidMk := builder.String()
2342 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2343}
2344
2345func TestAndroidMk_VendorApexRequired(t *testing.T) {
2346 ctx, config := testApex(t, `
2347 apex {
2348 name: "myapex",
2349 key: "myapex.key",
2350 vendor: true,
2351 native_shared_libs: ["mylib"],
2352 }
2353
2354 apex_key {
2355 name: "myapex.key",
2356 public_key: "testkey.avbpubkey",
2357 private_key: "testkey.pem",
2358 }
2359
2360 cc_library {
2361 name: "mylib",
2362 vendor_available: true,
2363 }
2364 `)
2365
2366 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2367 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2368 name := apexBundle.BaseModuleName()
2369 prefix := "TARGET_"
2370 var builder strings.Builder
2371 data.Custom(&builder, name, prefix, "", data)
2372 androidMk := builder.String()
2373 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2374}
2375
Jooyung Han2ed99d02020-06-24 23:26:26 +09002376func TestAndroidMkWritesCommonProperties(t *testing.T) {
2377 ctx, config := testApex(t, `
2378 apex {
2379 name: "myapex",
2380 key: "myapex.key",
2381 vintf_fragments: ["fragment.xml"],
2382 init_rc: ["init.rc"],
2383 }
2384 apex_key {
2385 name: "myapex.key",
2386 public_key: "testkey.avbpubkey",
2387 private_key: "testkey.pem",
2388 }
2389 cc_binary {
2390 name: "mybin",
2391 }
2392 `)
2393
2394 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2395 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2396 name := apexBundle.BaseModuleName()
2397 prefix := "TARGET_"
2398 var builder strings.Builder
2399 data.Custom(&builder, name, prefix, "", data)
2400 androidMk := builder.String()
2401 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2402 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2403}
2404
Jiyong Park16e91a02018-12-20 18:18:08 +09002405func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002406 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002407 apex {
2408 name: "myapex",
2409 key: "myapex.key",
2410 native_shared_libs: ["mylib"],
2411 }
2412
2413 apex_key {
2414 name: "myapex.key",
2415 public_key: "testkey.avbpubkey",
2416 private_key: "testkey.pem",
2417 }
2418
2419 cc_library {
2420 name: "mylib",
2421 srcs: ["mylib.cpp"],
2422 system_shared_libs: [],
2423 stl: "none",
2424 stubs: {
2425 versions: ["1", "2", "3"],
2426 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002427 apex_available: [
2428 "//apex_available:platform",
2429 "myapex",
2430 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002431 }
2432
2433 cc_binary {
2434 name: "not_in_apex",
2435 srcs: ["mylib.cpp"],
2436 static_libs: ["mylib"],
2437 static_executable: true,
2438 system_shared_libs: [],
2439 stl: "none",
2440 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002441 `)
2442
Colin Cross7113d202019-11-20 16:39:12 -08002443 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002444
2445 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002446 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002447}
Jiyong Park9335a262018-12-24 11:31:58 +09002448
2449func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002450 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002451 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002452 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002453 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002454 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002455 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002456 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002457 }
2458
2459 cc_library {
2460 name: "mylib",
2461 srcs: ["mylib.cpp"],
2462 system_shared_libs: [],
2463 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002464 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002473 android_app_certificate {
2474 name: "myapex.certificate",
2475 certificate: "testkey",
2476 }
2477
2478 android_app_certificate {
2479 name: "myapex.certificate.override",
2480 certificate: "testkey.override",
2481 }
2482
Jiyong Park9335a262018-12-24 11:31:58 +09002483 `)
2484
2485 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002486 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002487
2488 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2489 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2490 "vendor/foo/devkeys/testkey.avbpubkey")
2491 }
2492 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2493 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2494 "vendor/foo/devkeys/testkey.pem")
2495 }
2496
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002497 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002498 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002499 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002500 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002501 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002502 }
2503}
Jiyong Park58e364a2019-01-19 19:24:06 +09002504
Jooyung Hanf121a652019-12-17 14:30:11 +09002505func TestCertificate(t *testing.T) {
2506 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2507 ctx, _ := testApex(t, `
2508 apex {
2509 name: "myapex",
2510 key: "myapex.key",
2511 }
2512 apex_key {
2513 name: "myapex.key",
2514 public_key: "testkey.avbpubkey",
2515 private_key: "testkey.pem",
2516 }`)
2517 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2518 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2519 if actual := rule.Args["certificates"]; actual != expected {
2520 t.Errorf("certificates should be %q, not %q", expected, actual)
2521 }
2522 })
2523 t.Run("override when unspecified", func(t *testing.T) {
2524 ctx, _ := testApex(t, `
2525 apex {
2526 name: "myapex_keytest",
2527 key: "myapex.key",
2528 file_contexts: ":myapex-file_contexts",
2529 }
2530 apex_key {
2531 name: "myapex.key",
2532 public_key: "testkey.avbpubkey",
2533 private_key: "testkey.pem",
2534 }
2535 android_app_certificate {
2536 name: "myapex.certificate.override",
2537 certificate: "testkey.override",
2538 }`)
2539 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2540 expected := "testkey.override.x509.pem testkey.override.pk8"
2541 if actual := rule.Args["certificates"]; actual != expected {
2542 t.Errorf("certificates should be %q, not %q", expected, actual)
2543 }
2544 })
2545 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2546 ctx, _ := testApex(t, `
2547 apex {
2548 name: "myapex",
2549 key: "myapex.key",
2550 certificate: ":myapex.certificate",
2551 }
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557 android_app_certificate {
2558 name: "myapex.certificate",
2559 certificate: "testkey",
2560 }`)
2561 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2562 expected := "testkey.x509.pem testkey.pk8"
2563 if actual := rule.Args["certificates"]; actual != expected {
2564 t.Errorf("certificates should be %q, not %q", expected, actual)
2565 }
2566 })
2567 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2568 ctx, _ := testApex(t, `
2569 apex {
2570 name: "myapex_keytest",
2571 key: "myapex.key",
2572 file_contexts: ":myapex-file_contexts",
2573 certificate: ":myapex.certificate",
2574 }
2575 apex_key {
2576 name: "myapex.key",
2577 public_key: "testkey.avbpubkey",
2578 private_key: "testkey.pem",
2579 }
2580 android_app_certificate {
2581 name: "myapex.certificate.override",
2582 certificate: "testkey.override",
2583 }`)
2584 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2585 expected := "testkey.override.x509.pem testkey.override.pk8"
2586 if actual := rule.Args["certificates"]; actual != expected {
2587 t.Errorf("certificates should be %q, not %q", expected, actual)
2588 }
2589 })
2590 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2591 ctx, _ := testApex(t, `
2592 apex {
2593 name: "myapex",
2594 key: "myapex.key",
2595 certificate: "testkey",
2596 }
2597 apex_key {
2598 name: "myapex.key",
2599 public_key: "testkey.avbpubkey",
2600 private_key: "testkey.pem",
2601 }`)
2602 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2603 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2604 if actual := rule.Args["certificates"]; actual != expected {
2605 t.Errorf("certificates should be %q, not %q", expected, actual)
2606 }
2607 })
2608 t.Run("override when specified as <name>", func(t *testing.T) {
2609 ctx, _ := testApex(t, `
2610 apex {
2611 name: "myapex_keytest",
2612 key: "myapex.key",
2613 file_contexts: ":myapex-file_contexts",
2614 certificate: "testkey",
2615 }
2616 apex_key {
2617 name: "myapex.key",
2618 public_key: "testkey.avbpubkey",
2619 private_key: "testkey.pem",
2620 }
2621 android_app_certificate {
2622 name: "myapex.certificate.override",
2623 certificate: "testkey.override",
2624 }`)
2625 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2626 expected := "testkey.override.x509.pem testkey.override.pk8"
2627 if actual := rule.Args["certificates"]; actual != expected {
2628 t.Errorf("certificates should be %q, not %q", expected, actual)
2629 }
2630 })
2631}
2632
Jiyong Park58e364a2019-01-19 19:24:06 +09002633func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002634 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002635 apex {
2636 name: "myapex",
2637 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002638 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002639 }
2640
2641 apex {
2642 name: "otherapex",
2643 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002644 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002645 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002646 }
2647
2648 apex_key {
2649 name: "myapex.key",
2650 public_key: "testkey.avbpubkey",
2651 private_key: "testkey.pem",
2652 }
2653
2654 cc_library {
2655 name: "mylib",
2656 srcs: ["mylib.cpp"],
2657 system_shared_libs: [],
2658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002659 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002660 "myapex",
2661 "otherapex",
2662 ],
Jooyung Han24282772020-03-21 23:20:55 +09002663 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002664 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002665 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002666 cc_library {
2667 name: "mylib2",
2668 srcs: ["mylib.cpp"],
2669 system_shared_libs: [],
2670 stl: "none",
2671 apex_available: [
2672 "myapex",
2673 "otherapex",
2674 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002675 static_libs: ["mylib3"],
2676 recovery_available: true,
2677 min_sdk_version: "29",
2678 }
2679 cc_library {
2680 name: "mylib3",
2681 srcs: ["mylib.cpp"],
2682 system_shared_libs: [],
2683 stl: "none",
2684 apex_available: [
2685 "myapex",
2686 "otherapex",
2687 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002688 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002689 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002690 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002691 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002692 `)
2693
Jooyung Hanc87a0592020-03-02 17:44:33 +09002694 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002695 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002696 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002697 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002698
Jooyung Hanccce2f22020-03-07 03:45:53 +09002699 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002700 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002701 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002702 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002703 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002704
Jooyung Hanccce2f22020-03-07 03:45:53 +09002705 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002706 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002707 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002708 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002710
Colin Crossaede88c2020-08-11 12:17:01 -07002711 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2712 // each variant defines additional macros to distinguish which apex variant it is built for
2713
2714 // non-APEX variant does not have __ANDROID_APEX__ defined
2715 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2716 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2717
2718 // APEX variant has __ANDROID_APEX__ defined
2719 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2720 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2721 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2722 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2723
2724 // APEX variant has __ANDROID_APEX__ defined
2725 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2726 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2727 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2728 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2729
2730 // recovery variant does not set __ANDROID_SDK_VERSION__
2731 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2732 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2733 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2734
2735 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2736 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002737
2738 // non-APEX variant does not have __ANDROID_APEX__ defined
2739 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2740 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2741
2742 // APEX variant has __ANDROID_APEX__ defined
2743 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002744 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002745 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002746 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002747
Jooyung Hanc87a0592020-03-02 17:44:33 +09002748 // APEX variant has __ANDROID_APEX__ defined
2749 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002750 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002751 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002752 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002753
2754 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002755 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002756 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2757 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002758}
Jiyong Park7e636d02019-01-28 16:16:54 +09002759
2760func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002761 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002762 apex {
2763 name: "myapex",
2764 key: "myapex.key",
2765 native_shared_libs: ["mylib"],
2766 }
2767
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773
2774 cc_library_headers {
2775 name: "mylib_headers",
2776 export_include_dirs: ["my_include"],
2777 system_shared_libs: [],
2778 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002779 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002780 }
2781
2782 cc_library {
2783 name: "mylib",
2784 srcs: ["mylib.cpp"],
2785 system_shared_libs: [],
2786 stl: "none",
2787 header_libs: ["mylib_headers"],
2788 export_header_lib_headers: ["mylib_headers"],
2789 stubs: {
2790 versions: ["1", "2", "3"],
2791 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002792 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002793 }
2794
2795 cc_library {
2796 name: "otherlib",
2797 srcs: ["mylib.cpp"],
2798 system_shared_libs: [],
2799 stl: "none",
2800 shared_libs: ["mylib"],
2801 }
2802 `)
2803
Colin Cross7113d202019-11-20 16:39:12 -08002804 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002805
2806 // Ensure that the include path of the header lib is exported to 'otherlib'
2807 ensureContains(t, cFlags, "-Imy_include")
2808}
Alex Light9670d332019-01-29 18:07:33 -08002809
Jiyong Park7cd10e32020-01-14 09:22:18 +09002810type fileInApex struct {
2811 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002812 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002813 isLink bool
2814}
2815
Jooyung Hana57af4a2020-01-23 05:36:59 +00002816func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002817 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002818 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002819 copyCmds := apexRule.Args["copy_commands"]
2820 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002821 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002822 for _, cmd := range strings.Split(copyCmds, "&&") {
2823 cmd = strings.TrimSpace(cmd)
2824 if cmd == "" {
2825 continue
2826 }
2827 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002828 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002829 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002830 switch terms[0] {
2831 case "mkdir":
2832 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002833 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002834 t.Fatal("copyCmds contains invalid cp command", cmd)
2835 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002836 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002837 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002838 isLink = false
2839 case "ln":
2840 if len(terms) != 3 && len(terms) != 4 {
2841 // ln LINK TARGET or ln -s LINK TARGET
2842 t.Fatal("copyCmds contains invalid ln command", cmd)
2843 }
2844 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002845 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002846 isLink = true
2847 default:
2848 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2849 }
2850 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002851 index := strings.Index(dst, imageApexDir)
2852 if index == -1 {
2853 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2854 }
2855 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002856 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002857 }
2858 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002859 return ret
2860}
2861
Jooyung Hana57af4a2020-01-23 05:36:59 +00002862func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2863 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002864 var failed bool
2865 var surplus []string
2866 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002867 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002868 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002869 for _, expected := range files {
2870 if matched, _ := path.Match(expected, file.path); matched {
2871 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002872 mactchFound = true
2873 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002874 }
2875 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002876 if !mactchFound {
2877 surplus = append(surplus, file.path)
2878 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002879 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002880
Jooyung Han31c470b2019-10-18 16:26:59 +09002881 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002882 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002883 t.Log("surplus files", surplus)
2884 failed = true
2885 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002886
2887 if len(files) > len(filesMatched) {
2888 var missing []string
2889 for _, expected := range files {
2890 if !filesMatched[expected] {
2891 missing = append(missing, expected)
2892 }
2893 }
2894 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002895 t.Log("missing files", missing)
2896 failed = true
2897 }
2898 if failed {
2899 t.Fail()
2900 }
2901}
2902
Jooyung Han344d5432019-08-23 11:17:39 +09002903func TestVndkApexCurrent(t *testing.T) {
2904 ctx, _ := testApex(t, `
2905 apex_vndk {
2906 name: "myapex",
2907 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002908 }
2909
2910 apex_key {
2911 name: "myapex.key",
2912 public_key: "testkey.avbpubkey",
2913 private_key: "testkey.pem",
2914 }
2915
2916 cc_library {
2917 name: "libvndk",
2918 srcs: ["mylib.cpp"],
2919 vendor_available: true,
2920 vndk: {
2921 enabled: true,
2922 },
2923 system_shared_libs: [],
2924 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002925 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002926 }
2927
2928 cc_library {
2929 name: "libvndksp",
2930 srcs: ["mylib.cpp"],
2931 vendor_available: true,
2932 vndk: {
2933 enabled: true,
2934 support_system_process: true,
2935 },
2936 system_shared_libs: [],
2937 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002938 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002939 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002940 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002941
Jooyung Hana57af4a2020-01-23 05:36:59 +00002942 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002943 "lib/libvndk.so",
2944 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002945 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002946 "lib64/libvndk.so",
2947 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002948 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002949 "etc/llndk.libraries.VER.txt",
2950 "etc/vndkcore.libraries.VER.txt",
2951 "etc/vndksp.libraries.VER.txt",
2952 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002953 })
Jooyung Han344d5432019-08-23 11:17:39 +09002954}
2955
2956func TestVndkApexWithPrebuilt(t *testing.T) {
2957 ctx, _ := testApex(t, `
2958 apex_vndk {
2959 name: "myapex",
2960 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002961 }
2962
2963 apex_key {
2964 name: "myapex.key",
2965 public_key: "testkey.avbpubkey",
2966 private_key: "testkey.pem",
2967 }
2968
2969 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002970 name: "libvndk",
2971 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002972 vendor_available: true,
2973 vndk: {
2974 enabled: true,
2975 },
2976 system_shared_libs: [],
2977 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002978 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002979 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002980
2981 cc_prebuilt_library_shared {
2982 name: "libvndk.arm",
2983 srcs: ["libvndk.arm.so"],
2984 vendor_available: true,
2985 vndk: {
2986 enabled: true,
2987 },
2988 enabled: false,
2989 arch: {
2990 arm: {
2991 enabled: true,
2992 },
2993 },
2994 system_shared_libs: [],
2995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002996 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002997 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002998 `+vndkLibrariesTxtFiles("current"),
2999 withFiles(map[string][]byte{
3000 "libvndk.so": nil,
3001 "libvndk.arm.so": nil,
3002 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003003
Jooyung Hana57af4a2020-01-23 05:36:59 +00003004 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003005 "lib/libvndk.so",
3006 "lib/libvndk.arm.so",
3007 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003008 "lib/libc++.so",
3009 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003010 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003011 })
Jooyung Han344d5432019-08-23 11:17:39 +09003012}
3013
Jooyung Han39edb6c2019-11-06 16:53:07 +09003014func vndkLibrariesTxtFiles(vers ...string) (result string) {
3015 for _, v := range vers {
3016 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003017 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003018 result += `
3019 vndk_libraries_txt {
3020 name: "` + txt + `.libraries.txt",
3021 }
3022 `
3023 }
3024 } else {
3025 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3026 result += `
3027 prebuilt_etc {
3028 name: "` + txt + `.libraries.` + v + `.txt",
3029 src: "dummy.txt",
3030 }
3031 `
3032 }
3033 }
3034 }
3035 return
3036}
3037
Jooyung Han344d5432019-08-23 11:17:39 +09003038func TestVndkApexVersion(t *testing.T) {
3039 ctx, _ := testApex(t, `
3040 apex_vndk {
3041 name: "myapex_v27",
3042 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003043 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003044 vndk_version: "27",
3045 }
3046
3047 apex_key {
3048 name: "myapex.key",
3049 public_key: "testkey.avbpubkey",
3050 private_key: "testkey.pem",
3051 }
3052
Jooyung Han31c470b2019-10-18 16:26:59 +09003053 vndk_prebuilt_shared {
3054 name: "libvndk27",
3055 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003056 vendor_available: true,
3057 vndk: {
3058 enabled: true,
3059 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003060 target_arch: "arm64",
3061 arch: {
3062 arm: {
3063 srcs: ["libvndk27_arm.so"],
3064 },
3065 arm64: {
3066 srcs: ["libvndk27_arm64.so"],
3067 },
3068 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003069 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003070 }
3071
3072 vndk_prebuilt_shared {
3073 name: "libvndk27",
3074 version: "27",
3075 vendor_available: true,
3076 vndk: {
3077 enabled: true,
3078 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003079 target_arch: "x86_64",
3080 arch: {
3081 x86: {
3082 srcs: ["libvndk27_x86.so"],
3083 },
3084 x86_64: {
3085 srcs: ["libvndk27_x86_64.so"],
3086 },
3087 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003088 }
3089 `+vndkLibrariesTxtFiles("27"),
3090 withFiles(map[string][]byte{
3091 "libvndk27_arm.so": nil,
3092 "libvndk27_arm64.so": nil,
3093 "libvndk27_x86.so": nil,
3094 "libvndk27_x86_64.so": nil,
3095 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003096
Jooyung Hana57af4a2020-01-23 05:36:59 +00003097 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003098 "lib/libvndk27_arm.so",
3099 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003100 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003101 })
Jooyung Han344d5432019-08-23 11:17:39 +09003102}
3103
3104func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3105 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3106 apex_vndk {
3107 name: "myapex_v27",
3108 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003109 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003110 vndk_version: "27",
3111 }
3112 apex_vndk {
3113 name: "myapex_v27_other",
3114 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003115 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003116 vndk_version: "27",
3117 }
3118
3119 apex_key {
3120 name: "myapex.key",
3121 public_key: "testkey.avbpubkey",
3122 private_key: "testkey.pem",
3123 }
3124
3125 cc_library {
3126 name: "libvndk",
3127 srcs: ["mylib.cpp"],
3128 vendor_available: true,
3129 vndk: {
3130 enabled: true,
3131 },
3132 system_shared_libs: [],
3133 stl: "none",
3134 }
3135
3136 vndk_prebuilt_shared {
3137 name: "libvndk",
3138 version: "27",
3139 vendor_available: true,
3140 vndk: {
3141 enabled: true,
3142 },
3143 srcs: ["libvndk.so"],
3144 }
3145 `, withFiles(map[string][]byte{
3146 "libvndk.so": nil,
3147 }))
3148}
3149
Jooyung Han90eee022019-10-01 20:02:42 +09003150func TestVndkApexNameRule(t *testing.T) {
3151 ctx, _ := testApex(t, `
3152 apex_vndk {
3153 name: "myapex",
3154 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003155 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003156 }
3157 apex_vndk {
3158 name: "myapex_v28",
3159 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003160 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003161 vndk_version: "28",
3162 }
3163 apex_key {
3164 name: "myapex.key",
3165 public_key: "testkey.avbpubkey",
3166 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003167 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003168
3169 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003170 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003171 actual := proptools.String(bundle.properties.Apex_name)
3172 if !reflect.DeepEqual(actual, expected) {
3173 t.Errorf("Got '%v', expected '%v'", actual, expected)
3174 }
3175 }
3176
3177 assertApexName("com.android.vndk.vVER", "myapex")
3178 assertApexName("com.android.vndk.v28", "myapex_v28")
3179}
3180
Jooyung Han344d5432019-08-23 11:17:39 +09003181func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3182 ctx, _ := testApex(t, `
3183 apex_vndk {
3184 name: "myapex",
3185 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003186 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003187 }
3188
3189 apex_key {
3190 name: "myapex.key",
3191 public_key: "testkey.avbpubkey",
3192 private_key: "testkey.pem",
3193 }
3194
3195 cc_library {
3196 name: "libvndk",
3197 srcs: ["mylib.cpp"],
3198 vendor_available: true,
3199 native_bridge_supported: true,
3200 host_supported: true,
3201 vndk: {
3202 enabled: true,
3203 },
3204 system_shared_libs: [],
3205 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003206 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003207 }
Jooyung Han35155c42020-02-06 17:33:20 +09003208 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003209
Jooyung Hana57af4a2020-01-23 05:36:59 +00003210 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003211 "lib/libvndk.so",
3212 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003213 "lib/libc++.so",
3214 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003215 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003216 })
Jooyung Han344d5432019-08-23 11:17:39 +09003217}
3218
3219func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3220 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3221 apex_vndk {
3222 name: "myapex",
3223 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003224 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003225 native_bridge_supported: true,
3226 }
3227
3228 apex_key {
3229 name: "myapex.key",
3230 public_key: "testkey.avbpubkey",
3231 private_key: "testkey.pem",
3232 }
3233
3234 cc_library {
3235 name: "libvndk",
3236 srcs: ["mylib.cpp"],
3237 vendor_available: true,
3238 native_bridge_supported: true,
3239 host_supported: true,
3240 vndk: {
3241 enabled: true,
3242 },
3243 system_shared_libs: [],
3244 stl: "none",
3245 }
3246 `)
3247}
3248
Jooyung Han31c470b2019-10-18 16:26:59 +09003249func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003250 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003251 apex_vndk {
3252 name: "myapex_v27",
3253 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003254 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003255 vndk_version: "27",
3256 }
3257
3258 apex_key {
3259 name: "myapex.key",
3260 public_key: "testkey.avbpubkey",
3261 private_key: "testkey.pem",
3262 }
3263
3264 vndk_prebuilt_shared {
3265 name: "libvndk27",
3266 version: "27",
3267 target_arch: "arm",
3268 vendor_available: true,
3269 vndk: {
3270 enabled: true,
3271 },
3272 arch: {
3273 arm: {
3274 srcs: ["libvndk27.so"],
3275 }
3276 },
3277 }
3278
3279 vndk_prebuilt_shared {
3280 name: "libvndk27",
3281 version: "27",
3282 target_arch: "arm",
3283 binder32bit: true,
3284 vendor_available: true,
3285 vndk: {
3286 enabled: true,
3287 },
3288 arch: {
3289 arm: {
3290 srcs: ["libvndk27binder32.so"],
3291 }
3292 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003293 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003294 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003295 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003296 withFiles(map[string][]byte{
3297 "libvndk27.so": nil,
3298 "libvndk27binder32.so": nil,
3299 }),
3300 withBinder32bit,
3301 withTargets(map[android.OsType][]android.Target{
3302 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003303 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3304 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003305 },
3306 }),
3307 )
3308
Jooyung Hana57af4a2020-01-23 05:36:59 +00003309 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003310 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003311 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003312 })
3313}
3314
Jooyung Han45a96772020-06-15 14:59:42 +09003315func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3316 ctx, _ := testApex(t, `
3317 apex_vndk {
3318 name: "myapex",
3319 key: "myapex.key",
3320 file_contexts: ":myapex-file_contexts",
3321 }
3322
3323 apex_key {
3324 name: "myapex.key",
3325 public_key: "testkey.avbpubkey",
3326 private_key: "testkey.pem",
3327 }
3328
3329 cc_library {
3330 name: "libz",
3331 vendor_available: true,
3332 vndk: {
3333 enabled: true,
3334 },
3335 stubs: {
3336 symbol_file: "libz.map.txt",
3337 versions: ["30"],
3338 }
3339 }
3340 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3341 "libz.map.txt": nil,
3342 }))
3343
3344 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3345 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3346 ensureListEmpty(t, provideNativeLibs)
3347}
3348
Jooyung Hane1633032019-08-01 17:41:43 +09003349func TestDependenciesInApexManifest(t *testing.T) {
3350 ctx, _ := testApex(t, `
3351 apex {
3352 name: "myapex_nodep",
3353 key: "myapex.key",
3354 native_shared_libs: ["lib_nodep"],
3355 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003356 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003357 }
3358
3359 apex {
3360 name: "myapex_dep",
3361 key: "myapex.key",
3362 native_shared_libs: ["lib_dep"],
3363 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003364 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003365 }
3366
3367 apex {
3368 name: "myapex_provider",
3369 key: "myapex.key",
3370 native_shared_libs: ["libfoo"],
3371 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003372 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003373 }
3374
3375 apex {
3376 name: "myapex_selfcontained",
3377 key: "myapex.key",
3378 native_shared_libs: ["lib_dep", "libfoo"],
3379 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003380 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003381 }
3382
3383 apex_key {
3384 name: "myapex.key",
3385 public_key: "testkey.avbpubkey",
3386 private_key: "testkey.pem",
3387 }
3388
3389 cc_library {
3390 name: "lib_nodep",
3391 srcs: ["mylib.cpp"],
3392 system_shared_libs: [],
3393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003394 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003395 }
3396
3397 cc_library {
3398 name: "lib_dep",
3399 srcs: ["mylib.cpp"],
3400 shared_libs: ["libfoo"],
3401 system_shared_libs: [],
3402 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003403 apex_available: [
3404 "myapex_dep",
3405 "myapex_provider",
3406 "myapex_selfcontained",
3407 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003408 }
3409
3410 cc_library {
3411 name: "libfoo",
3412 srcs: ["mytest.cpp"],
3413 stubs: {
3414 versions: ["1"],
3415 },
3416 system_shared_libs: [],
3417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003418 apex_available: [
3419 "myapex_provider",
3420 "myapex_selfcontained",
3421 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003422 }
3423 `)
3424
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003425 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003426 var provideNativeLibs, requireNativeLibs []string
3427
Sundong Ahnabb64432019-10-22 13:58:29 +09003428 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003429 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3430 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003431 ensureListEmpty(t, provideNativeLibs)
3432 ensureListEmpty(t, requireNativeLibs)
3433
Sundong Ahnabb64432019-10-22 13:58:29 +09003434 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003435 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3436 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003437 ensureListEmpty(t, provideNativeLibs)
3438 ensureListContains(t, requireNativeLibs, "libfoo.so")
3439
Sundong Ahnabb64432019-10-22 13:58:29 +09003440 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003441 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3442 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003443 ensureListContains(t, provideNativeLibs, "libfoo.so")
3444 ensureListEmpty(t, requireNativeLibs)
3445
Sundong Ahnabb64432019-10-22 13:58:29 +09003446 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003447 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3448 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003449 ensureListContains(t, provideNativeLibs, "libfoo.so")
3450 ensureListEmpty(t, requireNativeLibs)
3451}
3452
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003453func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003454 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003455 apex {
3456 name: "myapex",
3457 key: "myapex.key",
3458 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003459 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003460 }
3461
3462 apex_key {
3463 name: "myapex.key",
3464 public_key: "testkey.avbpubkey",
3465 private_key: "testkey.pem",
3466 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003467
3468 cc_library {
3469 name: "mylib",
3470 srcs: ["mylib.cpp"],
3471 system_shared_libs: [],
3472 stl: "none",
3473 apex_available: [
3474 "//apex_available:platform",
3475 "myapex",
3476 ],
3477 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003478 `)
3479
Sundong Ahnabb64432019-10-22 13:58:29 +09003480 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003481 apexManifestRule := module.Rule("apexManifestRule")
3482 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3483 apexRule := module.Rule("apexRule")
3484 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003485
3486 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3487 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3488 name := apexBundle.BaseModuleName()
3489 prefix := "TARGET_"
3490 var builder strings.Builder
3491 data.Custom(&builder, name, prefix, "", data)
3492 androidMk := builder.String()
3493 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3494 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003495}
3496
Alex Light0851b882019-02-07 13:20:53 -08003497func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003498 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003499 apex {
3500 name: "myapex",
3501 key: "myapex.key",
3502 native_shared_libs: ["mylib_common"],
3503 }
3504
3505 apex_key {
3506 name: "myapex.key",
3507 public_key: "testkey.avbpubkey",
3508 private_key: "testkey.pem",
3509 }
3510
3511 cc_library {
3512 name: "mylib_common",
3513 srcs: ["mylib.cpp"],
3514 system_shared_libs: [],
3515 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003516 apex_available: [
3517 "//apex_available:platform",
3518 "myapex",
3519 ],
Alex Light0851b882019-02-07 13:20:53 -08003520 }
3521 `)
3522
Sundong Ahnabb64432019-10-22 13:58:29 +09003523 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003524 apexRule := module.Rule("apexRule")
3525 copyCmds := apexRule.Args["copy_commands"]
3526
3527 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3528 t.Log("Apex was a test apex!")
3529 t.Fail()
3530 }
3531 // Ensure that main rule creates an output
3532 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3533
3534 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003535 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003536
3537 // Ensure that both direct and indirect deps are copied into apex
3538 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3539
Colin Cross7113d202019-11-20 16:39:12 -08003540 // Ensure that the platform variant ends with _shared
3541 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003542
3543 if !android.InAnyApex("mylib_common") {
3544 t.Log("Found mylib_common not in any apex!")
3545 t.Fail()
3546 }
3547}
3548
3549func TestTestApex(t *testing.T) {
3550 if android.InAnyApex("mylib_common_test") {
3551 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!")
3552 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003553 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003554 apex_test {
3555 name: "myapex",
3556 key: "myapex.key",
3557 native_shared_libs: ["mylib_common_test"],
3558 }
3559
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565
3566 cc_library {
3567 name: "mylib_common_test",
3568 srcs: ["mylib.cpp"],
3569 system_shared_libs: [],
3570 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003571 // TODO: remove //apex_available:platform
3572 apex_available: [
3573 "//apex_available:platform",
3574 "myapex",
3575 ],
Alex Light0851b882019-02-07 13:20:53 -08003576 }
3577 `)
3578
Sundong Ahnabb64432019-10-22 13:58:29 +09003579 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003580 apexRule := module.Rule("apexRule")
3581 copyCmds := apexRule.Args["copy_commands"]
3582
3583 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3584 t.Log("Apex was not a test apex!")
3585 t.Fail()
3586 }
3587 // Ensure that main rule creates an output
3588 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3589
3590 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003591 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003592
3593 // Ensure that both direct and indirect deps are copied into apex
3594 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3595
Colin Cross7113d202019-11-20 16:39:12 -08003596 // Ensure that the platform variant ends with _shared
3597 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003598}
3599
Alex Light9670d332019-01-29 18:07:33 -08003600func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003601 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003602 apex {
3603 name: "myapex",
3604 key: "myapex.key",
3605 multilib: {
3606 first: {
3607 native_shared_libs: ["mylib_common"],
3608 }
3609 },
3610 target: {
3611 android: {
3612 multilib: {
3613 first: {
3614 native_shared_libs: ["mylib"],
3615 }
3616 }
3617 },
3618 host: {
3619 multilib: {
3620 first: {
3621 native_shared_libs: ["mylib2"],
3622 }
3623 }
3624 }
3625 }
3626 }
3627
3628 apex_key {
3629 name: "myapex.key",
3630 public_key: "testkey.avbpubkey",
3631 private_key: "testkey.pem",
3632 }
3633
3634 cc_library {
3635 name: "mylib",
3636 srcs: ["mylib.cpp"],
3637 system_shared_libs: [],
3638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003639 // TODO: remove //apex_available:platform
3640 apex_available: [
3641 "//apex_available:platform",
3642 "myapex",
3643 ],
Alex Light9670d332019-01-29 18:07:33 -08003644 }
3645
3646 cc_library {
3647 name: "mylib_common",
3648 srcs: ["mylib.cpp"],
3649 system_shared_libs: [],
3650 stl: "none",
3651 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003652 // TODO: remove //apex_available:platform
3653 apex_available: [
3654 "//apex_available:platform",
3655 "myapex",
3656 ],
Alex Light9670d332019-01-29 18:07:33 -08003657 }
3658
3659 cc_library {
3660 name: "mylib2",
3661 srcs: ["mylib.cpp"],
3662 system_shared_libs: [],
3663 stl: "none",
3664 compile_multilib: "first",
3665 }
3666 `)
3667
Sundong Ahnabb64432019-10-22 13:58:29 +09003668 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003669 copyCmds := apexRule.Args["copy_commands"]
3670
3671 // Ensure that main rule creates an output
3672 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3673
3674 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003675 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3676 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3677 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003678
3679 // Ensure that both direct and indirect deps are copied into apex
3680 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3681 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3682 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3683
Colin Cross7113d202019-11-20 16:39:12 -08003684 // Ensure that the platform variant ends with _shared
3685 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3687 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003688}
Jiyong Park04480cf2019-02-06 00:16:29 +09003689
3690func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003691 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003692 apex {
3693 name: "myapex",
3694 key: "myapex.key",
3695 binaries: ["myscript"],
3696 }
3697
3698 apex_key {
3699 name: "myapex.key",
3700 public_key: "testkey.avbpubkey",
3701 private_key: "testkey.pem",
3702 }
3703
3704 sh_binary {
3705 name: "myscript",
3706 src: "mylib.cpp",
3707 filename: "myscript.sh",
3708 sub_dir: "script",
3709 }
3710 `)
3711
Sundong Ahnabb64432019-10-22 13:58:29 +09003712 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003713 copyCmds := apexRule.Args["copy_commands"]
3714
3715 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3716}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003717
Jooyung Han91df2082019-11-20 01:49:42 +09003718func TestApexInVariousPartition(t *testing.T) {
3719 testcases := []struct {
3720 propName, parition, flattenedPartition string
3721 }{
3722 {"", "system", "system_ext"},
3723 {"product_specific: true", "product", "product"},
3724 {"soc_specific: true", "vendor", "vendor"},
3725 {"proprietary: true", "vendor", "vendor"},
3726 {"vendor: true", "vendor", "vendor"},
3727 {"system_ext_specific: true", "system_ext", "system_ext"},
3728 }
3729 for _, tc := range testcases {
3730 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3731 ctx, _ := testApex(t, `
3732 apex {
3733 name: "myapex",
3734 key: "myapex.key",
3735 `+tc.propName+`
3736 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003737
Jooyung Han91df2082019-11-20 01:49:42 +09003738 apex_key {
3739 name: "myapex.key",
3740 public_key: "testkey.avbpubkey",
3741 private_key: "testkey.pem",
3742 }
3743 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003744
Jooyung Han91df2082019-11-20 01:49:42 +09003745 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3746 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3747 actual := apex.installDir.String()
3748 if actual != expected {
3749 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3750 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003751
Jooyung Han91df2082019-11-20 01:49:42 +09003752 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3753 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3754 actual = flattened.installDir.String()
3755 if actual != expected {
3756 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3757 }
3758 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003759 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003760}
Jiyong Park67882562019-03-21 01:11:21 +09003761
Jooyung Han580eb4f2020-06-24 19:33:06 +09003762func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003763 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003764 apex {
3765 name: "myapex",
3766 key: "myapex.key",
3767 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003768
Jooyung Han580eb4f2020-06-24 19:33:06 +09003769 apex_key {
3770 name: "myapex.key",
3771 public_key: "testkey.avbpubkey",
3772 private_key: "testkey.pem",
3773 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 `)
3775 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003776 rule := module.Output("file_contexts")
3777 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3778}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003779
Jooyung Han580eb4f2020-06-24 19:33:06 +09003780func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003781 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003782 apex {
3783 name: "myapex",
3784 key: "myapex.key",
3785 file_contexts: "my_own_file_contexts",
3786 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003787
Jooyung Han580eb4f2020-06-24 19:33:06 +09003788 apex_key {
3789 name: "myapex.key",
3790 public_key: "testkey.avbpubkey",
3791 private_key: "testkey.pem",
3792 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003793 `, withFiles(map[string][]byte{
3794 "my_own_file_contexts": nil,
3795 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003796}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003797
Jooyung Han580eb4f2020-06-24 19:33:06 +09003798func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003799 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003800 apex {
3801 name: "myapex",
3802 key: "myapex.key",
3803 product_specific: true,
3804 file_contexts: "product_specific_file_contexts",
3805 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003806
Jooyung Han580eb4f2020-06-24 19:33:06 +09003807 apex_key {
3808 name: "myapex.key",
3809 public_key: "testkey.avbpubkey",
3810 private_key: "testkey.pem",
3811 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003812 `)
3813
Jooyung Han580eb4f2020-06-24 19:33:06 +09003814 ctx, _ := testApex(t, `
3815 apex {
3816 name: "myapex",
3817 key: "myapex.key",
3818 product_specific: true,
3819 file_contexts: "product_specific_file_contexts",
3820 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003821
Jooyung Han580eb4f2020-06-24 19:33:06 +09003822 apex_key {
3823 name: "myapex.key",
3824 public_key: "testkey.avbpubkey",
3825 private_key: "testkey.pem",
3826 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003827 `, withFiles(map[string][]byte{
3828 "product_specific_file_contexts": nil,
3829 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003830 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3831 rule := module.Output("file_contexts")
3832 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3833}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003834
Jooyung Han580eb4f2020-06-24 19:33:06 +09003835func TestFileContexts_SetViaFileGroup(t *testing.T) {
3836 ctx, _ := testApex(t, `
3837 apex {
3838 name: "myapex",
3839 key: "myapex.key",
3840 product_specific: true,
3841 file_contexts: ":my-file-contexts",
3842 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003843
Jooyung Han580eb4f2020-06-24 19:33:06 +09003844 apex_key {
3845 name: "myapex.key",
3846 public_key: "testkey.avbpubkey",
3847 private_key: "testkey.pem",
3848 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003849
Jooyung Han580eb4f2020-06-24 19:33:06 +09003850 filegroup {
3851 name: "my-file-contexts",
3852 srcs: ["product_specific_file_contexts"],
3853 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003854 `, withFiles(map[string][]byte{
3855 "product_specific_file_contexts": nil,
3856 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003857 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3858 rule := module.Output("file_contexts")
3859 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003860}
3861
Jiyong Park67882562019-03-21 01:11:21 +09003862func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003863 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003864 apex_key {
3865 name: "myapex.key",
3866 public_key: ":my.avbpubkey",
3867 private_key: ":my.pem",
3868 product_specific: true,
3869 }
3870
3871 filegroup {
3872 name: "my.avbpubkey",
3873 srcs: ["testkey2.avbpubkey"],
3874 }
3875
3876 filegroup {
3877 name: "my.pem",
3878 srcs: ["testkey2.pem"],
3879 }
3880 `)
3881
3882 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3883 expected_pubkey := "testkey2.avbpubkey"
3884 actual_pubkey := apex_key.public_key_file.String()
3885 if actual_pubkey != expected_pubkey {
3886 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3887 }
3888 expected_privkey := "testkey2.pem"
3889 actual_privkey := apex_key.private_key_file.String()
3890 if actual_privkey != expected_privkey {
3891 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3892 }
3893}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003894
3895func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003896 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003897 prebuilt_apex {
3898 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003899 arch: {
3900 arm64: {
3901 src: "myapex-arm64.apex",
3902 },
3903 arm: {
3904 src: "myapex-arm.apex",
3905 },
3906 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003907 }
3908 `)
3909
3910 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3911
Jiyong Parkc95714e2019-03-29 14:23:10 +09003912 expectedInput := "myapex-arm64.apex"
3913 if prebuilt.inputApex.String() != expectedInput {
3914 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3915 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003916}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003917
3918func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003919 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003920 prebuilt_apex {
3921 name: "myapex",
3922 src: "myapex-arm.apex",
3923 filename: "notmyapex.apex",
3924 }
3925 `)
3926
3927 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3928
3929 expected := "notmyapex.apex"
3930 if p.installFilename != expected {
3931 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3932 }
3933}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003934
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003935func TestPrebuiltOverrides(t *testing.T) {
3936 ctx, config := testApex(t, `
3937 prebuilt_apex {
3938 name: "myapex.prebuilt",
3939 src: "myapex-arm.apex",
3940 overrides: [
3941 "myapex",
3942 ],
3943 }
3944 `)
3945
3946 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3947
3948 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003949 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003950 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003951 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003952 }
3953}
3954
Roland Levillain630846d2019-06-26 12:48:34 +01003955func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003956 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003957 apex_test {
3958 name: "myapex",
3959 key: "myapex.key",
3960 tests: [
3961 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003962 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003963 ],
3964 }
3965
3966 apex_key {
3967 name: "myapex.key",
3968 public_key: "testkey.avbpubkey",
3969 private_key: "testkey.pem",
3970 }
3971
Liz Kammer1c14a212020-05-12 15:26:55 -07003972 filegroup {
3973 name: "fg",
3974 srcs: [
3975 "baz",
3976 "bar/baz"
3977 ],
3978 }
3979
Roland Levillain630846d2019-06-26 12:48:34 +01003980 cc_test {
3981 name: "mytest",
3982 gtest: false,
3983 srcs: ["mytest.cpp"],
3984 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003985 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003986 system_shared_libs: [],
3987 static_executable: true,
3988 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003989 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003990 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003991
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003992 cc_library {
3993 name: "mylib",
3994 srcs: ["mylib.cpp"],
3995 system_shared_libs: [],
3996 stl: "none",
3997 }
3998
Liz Kammer5bd365f2020-05-27 15:15:11 -07003999 filegroup {
4000 name: "fg2",
4001 srcs: [
4002 "testdata/baz"
4003 ],
4004 }
4005
Roland Levillain9b5fde92019-06-28 15:41:19 +01004006 cc_test {
4007 name: "mytests",
4008 gtest: false,
4009 srcs: [
4010 "mytest1.cpp",
4011 "mytest2.cpp",
4012 "mytest3.cpp",
4013 ],
4014 test_per_src: true,
4015 relative_install_path: "test",
4016 system_shared_libs: [],
4017 static_executable: true,
4018 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004019 data: [
4020 ":fg",
4021 ":fg2",
4022 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004023 }
Roland Levillain630846d2019-06-26 12:48:34 +01004024 `)
4025
Sundong Ahnabb64432019-10-22 13:58:29 +09004026 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004027 copyCmds := apexRule.Args["copy_commands"]
4028
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004029 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004030 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004031 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004032
Liz Kammer1c14a212020-05-12 15:26:55 -07004033 //Ensure that test data are copied into apex.
4034 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4035 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4036
Roland Levillain9b5fde92019-06-28 15:41:19 +01004037 // Ensure that test deps built with `test_per_src` are copied into apex.
4038 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4039 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4040 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004041
4042 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004043 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4044 data := android.AndroidMkDataForTest(t, config, "", bundle)
4045 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004046 prefix := "TARGET_"
4047 var builder strings.Builder
4048 data.Custom(&builder, name, prefix, "", data)
4049 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4051 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4052 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4053 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004054 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004055 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004056 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004057
4058 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4059 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4060 data.Custom(&builder, name, prefix, "", data)
4061 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004062 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4063 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004064}
4065
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004066func TestInstallExtraFlattenedApexes(t *testing.T) {
4067 ctx, config := testApex(t, `
4068 apex {
4069 name: "myapex",
4070 key: "myapex.key",
4071 }
4072 apex_key {
4073 name: "myapex.key",
4074 public_key: "testkey.avbpubkey",
4075 private_key: "testkey.pem",
4076 }
4077 `, func(fs map[string][]byte, config android.Config) {
4078 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4079 })
4080 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004081 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004082 mk := android.AndroidMkDataForTest(t, config, "", ab)
4083 var builder strings.Builder
4084 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4085 androidMk := builder.String()
4086 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4087}
4088
Jooyung Han5c998b92019-06-27 11:30:33 +09004089func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004090 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004091 apex {
4092 name: "myapex",
4093 key: "myapex.key",
4094 native_shared_libs: ["mylib"],
4095 uses: ["commonapex"],
4096 }
4097
4098 apex {
4099 name: "commonapex",
4100 key: "myapex.key",
4101 native_shared_libs: ["libcommon"],
4102 provide_cpp_shared_libs: true,
4103 }
4104
4105 apex_key {
4106 name: "myapex.key",
4107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
4109 }
4110
4111 cc_library {
4112 name: "mylib",
4113 srcs: ["mylib.cpp"],
4114 shared_libs: ["libcommon"],
4115 system_shared_libs: [],
4116 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004117 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004118 }
4119
4120 cc_library {
4121 name: "libcommon",
4122 srcs: ["mylib_common.cpp"],
4123 system_shared_libs: [],
4124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004125 // TODO: remove //apex_available:platform
4126 apex_available: [
4127 "//apex_available:platform",
4128 "commonapex",
4129 "myapex",
4130 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004131 }
4132 `)
4133
Sundong Ahnabb64432019-10-22 13:58:29 +09004134 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004135 apexRule1 := module1.Rule("apexRule")
4136 copyCmds1 := apexRule1.Args["copy_commands"]
4137
Sundong Ahnabb64432019-10-22 13:58:29 +09004138 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004139 apexRule2 := module2.Rule("apexRule")
4140 copyCmds2 := apexRule2.Args["copy_commands"]
4141
Colin Crossaede88c2020-08-11 12:17:01 -07004142 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4143 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004144 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4145 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4146 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4147}
4148
4149func TestApexUsesFailsIfNotProvided(t *testing.T) {
4150 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4151 apex {
4152 name: "myapex",
4153 key: "myapex.key",
4154 uses: ["commonapex"],
4155 }
4156
4157 apex {
4158 name: "commonapex",
4159 key: "myapex.key",
4160 }
4161
4162 apex_key {
4163 name: "myapex.key",
4164 public_key: "testkey.avbpubkey",
4165 private_key: "testkey.pem",
4166 }
4167 `)
4168 testApexError(t, `uses: "commonapex" is not a provider`, `
4169 apex {
4170 name: "myapex",
4171 key: "myapex.key",
4172 uses: ["commonapex"],
4173 }
4174
4175 cc_library {
4176 name: "commonapex",
4177 system_shared_libs: [],
4178 stl: "none",
4179 }
4180
4181 apex_key {
4182 name: "myapex.key",
4183 public_key: "testkey.avbpubkey",
4184 private_key: "testkey.pem",
4185 }
4186 `)
4187}
4188
4189func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4190 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4191 apex {
4192 name: "myapex",
4193 key: "myapex.key",
4194 use_vendor: true,
4195 uses: ["commonapex"],
4196 }
4197
4198 apex {
4199 name: "commonapex",
4200 key: "myapex.key",
4201 provide_cpp_shared_libs: true,
4202 }
4203
4204 apex_key {
4205 name: "myapex.key",
4206 public_key: "testkey.avbpubkey",
4207 private_key: "testkey.pem",
4208 }
Jooyung Handc782442019-11-01 03:14:38 +09004209 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004210 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004211 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004212}
4213
Jooyung Hand48f3c32019-08-23 11:18:57 +09004214func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4215 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4216 apex {
4217 name: "myapex",
4218 key: "myapex.key",
4219 native_shared_libs: ["libfoo"],
4220 }
4221
4222 apex_key {
4223 name: "myapex.key",
4224 public_key: "testkey.avbpubkey",
4225 private_key: "testkey.pem",
4226 }
4227
4228 cc_library {
4229 name: "libfoo",
4230 stl: "none",
4231 system_shared_libs: [],
4232 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004233 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004234 }
4235 `)
4236 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4237 apex {
4238 name: "myapex",
4239 key: "myapex.key",
4240 java_libs: ["myjar"],
4241 }
4242
4243 apex_key {
4244 name: "myapex.key",
4245 public_key: "testkey.avbpubkey",
4246 private_key: "testkey.pem",
4247 }
4248
4249 java_library {
4250 name: "myjar",
4251 srcs: ["foo/bar/MyClass.java"],
4252 sdk_version: "none",
4253 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004254 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004255 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004256 }
4257 `)
4258}
4259
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004260func TestApexWithApps(t *testing.T) {
4261 ctx, _ := testApex(t, `
4262 apex {
4263 name: "myapex",
4264 key: "myapex.key",
4265 apps: [
4266 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004267 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004268 ],
4269 }
4270
4271 apex_key {
4272 name: "myapex.key",
4273 public_key: "testkey.avbpubkey",
4274 private_key: "testkey.pem",
4275 }
4276
4277 android_app {
4278 name: "AppFoo",
4279 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004280 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004281 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004282 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004283 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004284 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004285 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004286
4287 android_app {
4288 name: "AppFooPriv",
4289 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004290 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004291 system_modules: "none",
4292 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004293 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004294 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004295 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004296
4297 cc_library_shared {
4298 name: "libjni",
4299 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004300 shared_libs: ["libfoo"],
4301 stl: "none",
4302 system_shared_libs: [],
4303 apex_available: [ "myapex" ],
4304 sdk_version: "current",
4305 }
4306
4307 cc_library_shared {
4308 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004309 stl: "none",
4310 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004311 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004312 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004313 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004314 `)
4315
Sundong Ahnabb64432019-10-22 13:58:29 +09004316 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004317 apexRule := module.Rule("apexRule")
4318 copyCmds := apexRule.Args["copy_commands"]
4319
4320 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004321 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004322
Colin Crossaede88c2020-08-11 12:17:01 -07004323 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004324 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004325 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004326 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004327 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004328 // JNI libraries including transitive deps are
4329 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004330 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004331 // ... embedded inside APK (jnilibs.zip)
4332 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4333 // ... and not directly inside the APEX
4334 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4335 }
Dario Frenicde2a032019-10-27 00:29:22 +01004336}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004337
Dario Frenicde2a032019-10-27 00:29:22 +01004338func TestApexWithAppImports(t *testing.T) {
4339 ctx, _ := testApex(t, `
4340 apex {
4341 name: "myapex",
4342 key: "myapex.key",
4343 apps: [
4344 "AppFooPrebuilt",
4345 "AppFooPrivPrebuilt",
4346 ],
4347 }
4348
4349 apex_key {
4350 name: "myapex.key",
4351 public_key: "testkey.avbpubkey",
4352 private_key: "testkey.pem",
4353 }
4354
4355 android_app_import {
4356 name: "AppFooPrebuilt",
4357 apk: "PrebuiltAppFoo.apk",
4358 presigned: true,
4359 dex_preopt: {
4360 enabled: false,
4361 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004362 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004363 }
4364
4365 android_app_import {
4366 name: "AppFooPrivPrebuilt",
4367 apk: "PrebuiltAppFooPriv.apk",
4368 privileged: true,
4369 presigned: true,
4370 dex_preopt: {
4371 enabled: false,
4372 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004373 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004374 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004375 }
4376 `)
4377
Sundong Ahnabb64432019-10-22 13:58:29 +09004378 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004379 apexRule := module.Rule("apexRule")
4380 copyCmds := apexRule.Args["copy_commands"]
4381
4382 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004383 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4384}
4385
4386func TestApexWithAppImportsPrefer(t *testing.T) {
4387 ctx, _ := testApex(t, `
4388 apex {
4389 name: "myapex",
4390 key: "myapex.key",
4391 apps: [
4392 "AppFoo",
4393 ],
4394 }
4395
4396 apex_key {
4397 name: "myapex.key",
4398 public_key: "testkey.avbpubkey",
4399 private_key: "testkey.pem",
4400 }
4401
4402 android_app {
4403 name: "AppFoo",
4404 srcs: ["foo/bar/MyClass.java"],
4405 sdk_version: "none",
4406 system_modules: "none",
4407 apex_available: [ "myapex" ],
4408 }
4409
4410 android_app_import {
4411 name: "AppFoo",
4412 apk: "AppFooPrebuilt.apk",
4413 filename: "AppFooPrebuilt.apk",
4414 presigned: true,
4415 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004416 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004417 }
4418 `, withFiles(map[string][]byte{
4419 "AppFooPrebuilt.apk": nil,
4420 }))
4421
4422 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4423 "app/AppFoo/AppFooPrebuilt.apk",
4424 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004425}
4426
Dario Freni6f3937c2019-12-20 22:58:03 +00004427func TestApexWithTestHelperApp(t *testing.T) {
4428 ctx, _ := testApex(t, `
4429 apex {
4430 name: "myapex",
4431 key: "myapex.key",
4432 apps: [
4433 "TesterHelpAppFoo",
4434 ],
4435 }
4436
4437 apex_key {
4438 name: "myapex.key",
4439 public_key: "testkey.avbpubkey",
4440 private_key: "testkey.pem",
4441 }
4442
4443 android_test_helper_app {
4444 name: "TesterHelpAppFoo",
4445 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004446 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004447 }
4448
4449 `)
4450
4451 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4452 apexRule := module.Rule("apexRule")
4453 copyCmds := apexRule.Args["copy_commands"]
4454
4455 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4456}
4457
Jooyung Han18020ea2019-11-13 10:50:48 +09004458func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4459 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004460 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004461 apex {
4462 name: "myapex",
4463 key: "myapex.key",
4464 native_shared_libs: ["libfoo"],
4465 }
4466
4467 apex_key {
4468 name: "myapex.key",
4469 public_key: "testkey.avbpubkey",
4470 private_key: "testkey.pem",
4471 }
4472
4473 apex {
4474 name: "otherapex",
4475 key: "myapex.key",
4476 native_shared_libs: ["libfoo"],
4477 }
4478
4479 cc_defaults {
4480 name: "libfoo-defaults",
4481 apex_available: ["otherapex"],
4482 }
4483
4484 cc_library {
4485 name: "libfoo",
4486 defaults: ["libfoo-defaults"],
4487 stl: "none",
4488 system_shared_libs: [],
4489 }`)
4490}
4491
Paul Duffine52e66f2020-03-30 17:54:29 +01004492func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004493 // libfoo is not available to myapex, but only to otherapex
4494 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4495 apex {
4496 name: "myapex",
4497 key: "myapex.key",
4498 native_shared_libs: ["libfoo"],
4499 }
4500
4501 apex_key {
4502 name: "myapex.key",
4503 public_key: "testkey.avbpubkey",
4504 private_key: "testkey.pem",
4505 }
4506
4507 apex {
4508 name: "otherapex",
4509 key: "otherapex.key",
4510 native_shared_libs: ["libfoo"],
4511 }
4512
4513 apex_key {
4514 name: "otherapex.key",
4515 public_key: "testkey.avbpubkey",
4516 private_key: "testkey.pem",
4517 }
4518
4519 cc_library {
4520 name: "libfoo",
4521 stl: "none",
4522 system_shared_libs: [],
4523 apex_available: ["otherapex"],
4524 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004525}
Jiyong Park127b40b2019-09-30 16:04:35 +09004526
Paul Duffine52e66f2020-03-30 17:54:29 +01004527func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004528 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004529 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004530.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004531.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004532.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004533.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004534.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004535.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004536 apex {
4537 name: "myapex",
4538 key: "myapex.key",
4539 native_shared_libs: ["libfoo"],
4540 }
4541
4542 apex_key {
4543 name: "myapex.key",
4544 public_key: "testkey.avbpubkey",
4545 private_key: "testkey.pem",
4546 }
4547
Jiyong Park127b40b2019-09-30 16:04:35 +09004548 cc_library {
4549 name: "libfoo",
4550 stl: "none",
4551 shared_libs: ["libbar"],
4552 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004553 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004554 }
4555
4556 cc_library {
4557 name: "libbar",
4558 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004559 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004560 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004561 apex_available: ["myapex"],
4562 }
4563
4564 cc_library {
4565 name: "libbaz",
4566 stl: "none",
4567 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004568 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004569}
Jiyong Park127b40b2019-09-30 16:04:35 +09004570
Paul Duffine52e66f2020-03-30 17:54:29 +01004571func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004572 testApexError(t, "\"otherapex\" is not a valid module name", `
4573 apex {
4574 name: "myapex",
4575 key: "myapex.key",
4576 native_shared_libs: ["libfoo"],
4577 }
4578
4579 apex_key {
4580 name: "myapex.key",
4581 public_key: "testkey.avbpubkey",
4582 private_key: "testkey.pem",
4583 }
4584
4585 cc_library {
4586 name: "libfoo",
4587 stl: "none",
4588 system_shared_libs: [],
4589 apex_available: ["otherapex"],
4590 }`)
4591
Paul Duffine52e66f2020-03-30 17:54:29 +01004592 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004593 apex {
4594 name: "myapex",
4595 key: "myapex.key",
4596 native_shared_libs: ["libfoo", "libbar"],
4597 }
4598
4599 apex_key {
4600 name: "myapex.key",
4601 public_key: "testkey.avbpubkey",
4602 private_key: "testkey.pem",
4603 }
4604
4605 cc_library {
4606 name: "libfoo",
4607 stl: "none",
4608 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004609 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004610 apex_available: ["myapex"],
4611 }
4612
4613 cc_library {
4614 name: "libbar",
4615 stl: "none",
4616 system_shared_libs: [],
4617 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004618 }
4619
4620 cc_library {
4621 name: "libbaz",
4622 stl: "none",
4623 system_shared_libs: [],
4624 stubs: {
4625 versions: ["10", "20", "30"],
4626 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004627 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004628}
Jiyong Park127b40b2019-09-30 16:04:35 +09004629
Jiyong Park89e850a2020-04-07 16:37:39 +09004630func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004631 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004632 apex {
4633 name: "myapex",
4634 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004635 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004636 }
4637
4638 apex_key {
4639 name: "myapex.key",
4640 public_key: "testkey.avbpubkey",
4641 private_key: "testkey.pem",
4642 }
4643
4644 cc_library {
4645 name: "libfoo",
4646 stl: "none",
4647 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004648 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004649 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004650 }
4651
4652 cc_library {
4653 name: "libfoo2",
4654 stl: "none",
4655 system_shared_libs: [],
4656 shared_libs: ["libbaz"],
4657 apex_available: ["//apex_available:platform"],
4658 }
4659
4660 cc_library {
4661 name: "libbar",
4662 stl: "none",
4663 system_shared_libs: [],
4664 apex_available: ["myapex"],
4665 }
4666
4667 cc_library {
4668 name: "libbaz",
4669 stl: "none",
4670 system_shared_libs: [],
4671 apex_available: ["myapex"],
4672 stubs: {
4673 versions: ["1"],
4674 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004675 }`)
4676
Jiyong Park89e850a2020-04-07 16:37:39 +09004677 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4678 // because it depends on libbar which isn't available to platform
4679 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4680 if libfoo.NotAvailableForPlatform() != true {
4681 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4682 }
4683
4684 // libfoo2 however can be available to platform because it depends on libbaz which provides
4685 // stubs
4686 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4687 if libfoo2.NotAvailableForPlatform() == true {
4688 t.Errorf("%q should be available to platform", libfoo2.String())
4689 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004690}
Jiyong Parka90ca002019-10-07 15:47:24 +09004691
Paul Duffine52e66f2020-03-30 17:54:29 +01004692func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004693 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004694 apex {
4695 name: "myapex",
4696 key: "myapex.key",
4697 native_shared_libs: ["libfoo"],
4698 }
4699
4700 apex_key {
4701 name: "myapex.key",
4702 public_key: "testkey.avbpubkey",
4703 private_key: "testkey.pem",
4704 }
4705
4706 cc_library {
4707 name: "libfoo",
4708 stl: "none",
4709 system_shared_libs: [],
4710 apex_available: ["myapex"],
4711 static: {
4712 apex_available: ["//apex_available:platform"],
4713 },
4714 }`)
4715
Jiyong Park89e850a2020-04-07 16:37:39 +09004716 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4717 if libfooShared.NotAvailableForPlatform() != true {
4718 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4719 }
4720 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4721 if libfooStatic.NotAvailableForPlatform() != false {
4722 t.Errorf("%q should be available to platform", libfooStatic.String())
4723 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004724}
4725
Jiyong Park5d790c32019-11-15 18:40:32 +09004726func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004727 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004728 apex {
4729 name: "myapex",
4730 key: "myapex.key",
4731 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004732 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004733 }
4734
4735 override_apex {
4736 name: "override_myapex",
4737 base: "myapex",
4738 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004739 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004740 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004741 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004742 }
4743
4744 apex_key {
4745 name: "myapex.key",
4746 public_key: "testkey.avbpubkey",
4747 private_key: "testkey.pem",
4748 }
4749
4750 android_app {
4751 name: "app",
4752 srcs: ["foo/bar/MyClass.java"],
4753 package_name: "foo",
4754 sdk_version: "none",
4755 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004756 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004757 }
4758
4759 override_android_app {
4760 name: "override_app",
4761 base: "app",
4762 package_name: "bar",
4763 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004764 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004765
Jiyong Park317645e2019-12-05 13:20:58 +09004766 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4767 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4768 if originalVariant.GetOverriddenBy() != "" {
4769 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4770 }
4771 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4772 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4773 }
4774
Jiyong Park5d790c32019-11-15 18:40:32 +09004775 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4776 apexRule := module.Rule("apexRule")
4777 copyCmds := apexRule.Args["copy_commands"]
4778
4779 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004780 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004781
4782 apexBundle := module.Module().(*apexBundle)
4783 name := apexBundle.Name()
4784 if name != "override_myapex" {
4785 t.Errorf("name should be \"override_myapex\", but was %q", name)
4786 }
4787
Baligh Uddin004d7172020-02-19 21:29:28 -08004788 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4789 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4790 }
4791
Jiyong Park20bacab2020-03-03 11:45:41 +09004792 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004793 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004794
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004795 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4796 var builder strings.Builder
4797 data.Custom(&builder, name, "TARGET_", "", data)
4798 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004799 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004800 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4801 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004802 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004803 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004804 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004805 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4806 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004807}
4808
Jooyung Han214bf372019-11-12 13:03:50 +09004809func TestLegacyAndroid10Support(t *testing.T) {
4810 ctx, _ := testApex(t, `
4811 apex {
4812 name: "myapex",
4813 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004814 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004815 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004816 }
4817
4818 apex_key {
4819 name: "myapex.key",
4820 public_key: "testkey.avbpubkey",
4821 private_key: "testkey.pem",
4822 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004823
4824 cc_library {
4825 name: "mylib",
4826 srcs: ["mylib.cpp"],
4827 stl: "libc++",
4828 system_shared_libs: [],
4829 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004830 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004831 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004832 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004833
4834 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4835 args := module.Rule("apexRule").Args
4836 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004837 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004838
4839 // The copies of the libraries in the apex should have one more dependency than
4840 // the ones outside the apex, namely the unwinder. Ideally we should check
4841 // the dependency names directly here but for some reason the names are blank in
4842 // this test.
4843 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004844 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004845 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4846 if len(apexImplicits) != len(nonApexImplicits)+1 {
4847 t.Errorf("%q missing unwinder dep", lib)
4848 }
4849 }
Jooyung Han214bf372019-11-12 13:03:50 +09004850}
4851
Paul Duffin9b879592020-05-26 13:21:35 +01004852var filesForSdkLibrary = map[string][]byte{
4853 "api/current.txt": nil,
4854 "api/removed.txt": nil,
4855 "api/system-current.txt": nil,
4856 "api/system-removed.txt": nil,
4857 "api/test-current.txt": nil,
4858 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004859
4860 // For java_sdk_library_import
4861 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004862}
4863
Jooyung Han58f26ab2019-12-18 15:34:32 +09004864func TestJavaSDKLibrary(t *testing.T) {
4865 ctx, _ := testApex(t, `
4866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 java_libs: ["foo"],
4870 }
4871
4872 apex_key {
4873 name: "myapex.key",
4874 public_key: "testkey.avbpubkey",
4875 private_key: "testkey.pem",
4876 }
4877
4878 java_sdk_library {
4879 name: "foo",
4880 srcs: ["a.java"],
4881 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004882 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004883 }
Paul Duffin9b879592020-05-26 13:21:35 +01004884 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004885
4886 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004887 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004888 "javalib/foo.jar",
4889 "etc/permissions/foo.xml",
4890 })
4891 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004892 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4893 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004894}
4895
Paul Duffin9b879592020-05-26 13:21:35 +01004896func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4897 ctx, _ := testApex(t, `
4898 apex {
4899 name: "myapex",
4900 key: "myapex.key",
4901 java_libs: ["foo", "bar"],
4902 }
4903
4904 apex_key {
4905 name: "myapex.key",
4906 public_key: "testkey.avbpubkey",
4907 private_key: "testkey.pem",
4908 }
4909
4910 java_sdk_library {
4911 name: "foo",
4912 srcs: ["a.java"],
4913 api_packages: ["foo"],
4914 apex_available: ["myapex"],
4915 sdk_version: "none",
4916 system_modules: "none",
4917 }
4918
4919 java_library {
4920 name: "bar",
4921 srcs: ["a.java"],
4922 libs: ["foo"],
4923 apex_available: ["myapex"],
4924 sdk_version: "none",
4925 system_modules: "none",
4926 }
4927 `, withFiles(filesForSdkLibrary))
4928
4929 // java_sdk_library installs both impl jar and permission XML
4930 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4931 "javalib/bar.jar",
4932 "javalib/foo.jar",
4933 "etc/permissions/foo.xml",
4934 })
4935
4936 // The bar library should depend on the implementation jar.
4937 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4938 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4939 t.Errorf("expected %q, found %#q", expected, actual)
4940 }
4941}
4942
4943func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4944 ctx, _ := testApex(t, `
4945 apex {
4946 name: "myapex",
4947 key: "myapex.key",
4948 java_libs: ["foo"],
4949 }
4950
4951 apex_key {
4952 name: "myapex.key",
4953 public_key: "testkey.avbpubkey",
4954 private_key: "testkey.pem",
4955 }
4956
4957 java_sdk_library {
4958 name: "foo",
4959 srcs: ["a.java"],
4960 api_packages: ["foo"],
4961 apex_available: ["myapex"],
4962 sdk_version: "none",
4963 system_modules: "none",
4964 }
4965
4966 java_library {
4967 name: "bar",
4968 srcs: ["a.java"],
4969 libs: ["foo"],
4970 sdk_version: "none",
4971 system_modules: "none",
4972 }
4973 `, withFiles(filesForSdkLibrary))
4974
4975 // java_sdk_library installs both impl jar and permission XML
4976 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4977 "javalib/foo.jar",
4978 "etc/permissions/foo.xml",
4979 })
4980
4981 // The bar library should depend on the stubs jar.
4982 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4983 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4984 t.Errorf("expected %q, found %#q", expected, actual)
4985 }
4986}
4987
Paul Duffineedc5d52020-06-12 17:46:39 +01004988func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4989 ctx, _ := testApex(t, ``,
4990 withFiles(map[string][]byte{
4991 "apex/a.java": nil,
4992 "apex/apex_manifest.json": nil,
4993 "apex/Android.bp": []byte(`
4994 package {
4995 default_visibility: ["//visibility:private"],
4996 }
4997
4998 apex {
4999 name: "myapex",
5000 key: "myapex.key",
5001 java_libs: ["foo", "bar"],
5002 }
5003
5004 apex_key {
5005 name: "myapex.key",
5006 public_key: "testkey.avbpubkey",
5007 private_key: "testkey.pem",
5008 }
5009
5010 java_library {
5011 name: "bar",
5012 srcs: ["a.java"],
5013 libs: ["foo"],
5014 apex_available: ["myapex"],
5015 sdk_version: "none",
5016 system_modules: "none",
5017 }
5018`),
5019 "source/a.java": nil,
5020 "source/api/current.txt": nil,
5021 "source/api/removed.txt": nil,
5022 "source/Android.bp": []byte(`
5023 package {
5024 default_visibility: ["//visibility:private"],
5025 }
5026
5027 java_sdk_library {
5028 name: "foo",
5029 visibility: ["//apex"],
5030 srcs: ["a.java"],
5031 api_packages: ["foo"],
5032 apex_available: ["myapex"],
5033 sdk_version: "none",
5034 system_modules: "none",
5035 public: {
5036 enabled: true,
5037 },
5038 }
5039`),
5040 "prebuilt/a.jar": nil,
5041 "prebuilt/Android.bp": []byte(`
5042 package {
5043 default_visibility: ["//visibility:private"],
5044 }
5045
5046 java_sdk_library_import {
5047 name: "foo",
5048 visibility: ["//apex", "//source"],
5049 apex_available: ["myapex"],
5050 prefer: true,
5051 public: {
5052 jars: ["a.jar"],
5053 },
5054 }
5055`),
5056 }),
5057 )
5058
5059 // java_sdk_library installs both impl jar and permission XML
5060 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5061 "javalib/bar.jar",
5062 "javalib/foo.jar",
5063 "etc/permissions/foo.xml",
5064 })
5065
5066 // The bar library should depend on the implementation jar.
5067 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5068 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5069 t.Errorf("expected %q, found %#q", expected, actual)
5070 }
5071}
5072
5073func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5074 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5075 apex {
5076 name: "myapex",
5077 key: "myapex.key",
5078 java_libs: ["foo"],
5079 }
5080
5081 apex_key {
5082 name: "myapex.key",
5083 public_key: "testkey.avbpubkey",
5084 private_key: "testkey.pem",
5085 }
5086
5087 java_sdk_library_import {
5088 name: "foo",
5089 apex_available: ["myapex"],
5090 prefer: true,
5091 public: {
5092 jars: ["a.jar"],
5093 },
5094 }
5095
5096 `, withFiles(filesForSdkLibrary))
5097}
5098
atrost6e126252020-01-27 17:01:16 +00005099func TestCompatConfig(t *testing.T) {
5100 ctx, _ := testApex(t, `
5101 apex {
5102 name: "myapex",
5103 key: "myapex.key",
5104 prebuilts: ["myjar-platform-compat-config"],
5105 java_libs: ["myjar"],
5106 }
5107
5108 apex_key {
5109 name: "myapex.key",
5110 public_key: "testkey.avbpubkey",
5111 private_key: "testkey.pem",
5112 }
5113
5114 platform_compat_config {
5115 name: "myjar-platform-compat-config",
5116 src: ":myjar",
5117 }
5118
5119 java_library {
5120 name: "myjar",
5121 srcs: ["foo/bar/MyClass.java"],
5122 sdk_version: "none",
5123 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005124 apex_available: [ "myapex" ],
5125 }
5126 `)
5127 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5128 "etc/compatconfig/myjar-platform-compat-config.xml",
5129 "javalib/myjar.jar",
5130 })
5131}
5132
Jiyong Park479321d2019-12-16 11:47:12 +09005133func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5134 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5135 apex {
5136 name: "myapex",
5137 key: "myapex.key",
5138 java_libs: ["myjar"],
5139 }
5140
5141 apex_key {
5142 name: "myapex.key",
5143 public_key: "testkey.avbpubkey",
5144 private_key: "testkey.pem",
5145 }
5146
5147 java_library {
5148 name: "myjar",
5149 srcs: ["foo/bar/MyClass.java"],
5150 sdk_version: "none",
5151 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005152 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005153 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005154 }
5155 `)
5156}
5157
Jiyong Park7afd1072019-12-30 16:56:33 +09005158func TestCarryRequiredModuleNames(t *testing.T) {
5159 ctx, config := testApex(t, `
5160 apex {
5161 name: "myapex",
5162 key: "myapex.key",
5163 native_shared_libs: ["mylib"],
5164 }
5165
5166 apex_key {
5167 name: "myapex.key",
5168 public_key: "testkey.avbpubkey",
5169 private_key: "testkey.pem",
5170 }
5171
5172 cc_library {
5173 name: "mylib",
5174 srcs: ["mylib.cpp"],
5175 system_shared_libs: [],
5176 stl: "none",
5177 required: ["a", "b"],
5178 host_required: ["c", "d"],
5179 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005180 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005181 }
5182 `)
5183
5184 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5185 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5186 name := apexBundle.BaseModuleName()
5187 prefix := "TARGET_"
5188 var builder strings.Builder
5189 data.Custom(&builder, name, prefix, "", data)
5190 androidMk := builder.String()
5191 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5192 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5193 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5194}
5195
Jiyong Park7cd10e32020-01-14 09:22:18 +09005196func TestSymlinksFromApexToSystem(t *testing.T) {
5197 bp := `
5198 apex {
5199 name: "myapex",
5200 key: "myapex.key",
5201 native_shared_libs: ["mylib"],
5202 java_libs: ["myjar"],
5203 }
5204
Jiyong Park9d677202020-02-19 16:29:35 +09005205 apex {
5206 name: "myapex.updatable",
5207 key: "myapex.key",
5208 native_shared_libs: ["mylib"],
5209 java_libs: ["myjar"],
5210 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005211 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005212 }
5213
Jiyong Park7cd10e32020-01-14 09:22:18 +09005214 apex_key {
5215 name: "myapex.key",
5216 public_key: "testkey.avbpubkey",
5217 private_key: "testkey.pem",
5218 }
5219
5220 cc_library {
5221 name: "mylib",
5222 srcs: ["mylib.cpp"],
5223 shared_libs: ["myotherlib"],
5224 system_shared_libs: [],
5225 stl: "none",
5226 apex_available: [
5227 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005228 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005229 "//apex_available:platform",
5230 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005231 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005232 }
5233
5234 cc_library {
5235 name: "myotherlib",
5236 srcs: ["mylib.cpp"],
5237 system_shared_libs: [],
5238 stl: "none",
5239 apex_available: [
5240 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005241 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005242 "//apex_available:platform",
5243 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005244 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005245 }
5246
5247 java_library {
5248 name: "myjar",
5249 srcs: ["foo/bar/MyClass.java"],
5250 sdk_version: "none",
5251 system_modules: "none",
5252 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005253 apex_available: [
5254 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005255 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005256 "//apex_available:platform",
5257 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005258 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005259 }
5260
5261 java_library {
5262 name: "myotherjar",
5263 srcs: ["foo/bar/MyClass.java"],
5264 sdk_version: "none",
5265 system_modules: "none",
5266 apex_available: [
5267 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005268 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005269 "//apex_available:platform",
5270 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005271 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005272 }
5273 `
5274
5275 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5276 for _, f := range files {
5277 if f.path == file {
5278 if f.isLink {
5279 t.Errorf("%q is not a real file", file)
5280 }
5281 return
5282 }
5283 }
5284 t.Errorf("%q is not found", file)
5285 }
5286
5287 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5288 for _, f := range files {
5289 if f.path == file {
5290 if !f.isLink {
5291 t.Errorf("%q is not a symlink", file)
5292 }
5293 return
5294 }
5295 }
5296 t.Errorf("%q is not found", file)
5297 }
5298
Jiyong Park9d677202020-02-19 16:29:35 +09005299 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5300 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005301 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005302 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005303 ensureRealfileExists(t, files, "javalib/myjar.jar")
5304 ensureRealfileExists(t, files, "lib64/mylib.so")
5305 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5306
Jiyong Park9d677202020-02-19 16:29:35 +09005307 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5308 ensureRealfileExists(t, files, "javalib/myjar.jar")
5309 ensureRealfileExists(t, files, "lib64/mylib.so")
5310 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5311
5312 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005313 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005314 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005315 ensureRealfileExists(t, files, "javalib/myjar.jar")
5316 ensureRealfileExists(t, files, "lib64/mylib.so")
5317 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005318
5319 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5320 ensureRealfileExists(t, files, "javalib/myjar.jar")
5321 ensureRealfileExists(t, files, "lib64/mylib.so")
5322 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005323}
5324
Yo Chiange8128052020-07-23 20:09:18 +08005325func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5326 ctx, config := testApex(t, `
5327 apex {
5328 name: "myapex",
5329 key: "myapex.key",
5330 native_shared_libs: ["mylib"],
5331 }
5332
5333 apex_key {
5334 name: "myapex.key",
5335 public_key: "testkey.avbpubkey",
5336 private_key: "testkey.pem",
5337 }
5338
5339 cc_library_shared {
5340 name: "mylib",
5341 srcs: ["mylib.cpp"],
5342 shared_libs: ["myotherlib"],
5343 system_shared_libs: [],
5344 stl: "none",
5345 apex_available: [
5346 "myapex",
5347 "//apex_available:platform",
5348 ],
5349 }
5350
5351 cc_prebuilt_library_shared {
5352 name: "myotherlib",
5353 srcs: ["prebuilt.so"],
5354 system_shared_libs: [],
5355 stl: "none",
5356 apex_available: [
5357 "myapex",
5358 "//apex_available:platform",
5359 ],
5360 }
5361 `)
5362
5363 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5364 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5365 var builder strings.Builder
5366 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5367 androidMk := builder.String()
5368 // `myotherlib` is added to `myapex` as symlink
5369 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5370 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5371 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5372 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5373 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5374}
5375
Jooyung Han643adc42020-02-27 13:50:06 +09005376func TestApexWithJniLibs(t *testing.T) {
5377 ctx, _ := testApex(t, `
5378 apex {
5379 name: "myapex",
5380 key: "myapex.key",
5381 jni_libs: ["mylib"],
5382 }
5383
5384 apex_key {
5385 name: "myapex.key",
5386 public_key: "testkey.avbpubkey",
5387 private_key: "testkey.pem",
5388 }
5389
5390 cc_library {
5391 name: "mylib",
5392 srcs: ["mylib.cpp"],
5393 shared_libs: ["mylib2"],
5394 system_shared_libs: [],
5395 stl: "none",
5396 apex_available: [ "myapex" ],
5397 }
5398
5399 cc_library {
5400 name: "mylib2",
5401 srcs: ["mylib.cpp"],
5402 system_shared_libs: [],
5403 stl: "none",
5404 apex_available: [ "myapex" ],
5405 }
5406 `)
5407
5408 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5409 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5410 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5411 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5412 "lib64/mylib.so",
5413 "lib64/mylib2.so",
5414 })
5415}
5416
Jooyung Han49f67012020-04-17 13:43:10 +09005417func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5418 ctx, _ := testApex(t, `
5419 apex {
5420 name: "myapex",
5421 key: "myapex.key",
5422 }
5423 apex_key {
5424 name: "myapex.key",
5425 public_key: "testkey.avbpubkey",
5426 private_key: "testkey.pem",
5427 }
5428 `, func(fs map[string][]byte, config android.Config) {
5429 delete(config.Targets, android.Android)
5430 config.AndroidCommonTarget = android.Target{}
5431 })
5432
5433 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5434 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5435 }
5436}
5437
Jiyong Parkbd159612020-02-28 15:22:21 +09005438func TestAppBundle(t *testing.T) {
5439 ctx, _ := testApex(t, `
5440 apex {
5441 name: "myapex",
5442 key: "myapex.key",
5443 apps: ["AppFoo"],
5444 }
5445
5446 apex_key {
5447 name: "myapex.key",
5448 public_key: "testkey.avbpubkey",
5449 private_key: "testkey.pem",
5450 }
5451
5452 android_app {
5453 name: "AppFoo",
5454 srcs: ["foo/bar/MyClass.java"],
5455 sdk_version: "none",
5456 system_modules: "none",
5457 apex_available: [ "myapex" ],
5458 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005459 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005460
5461 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5462 content := bundleConfigRule.Args["content"]
5463
5464 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005465 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 +09005466}
5467
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005468func TestAppSetBundle(t *testing.T) {
5469 ctx, _ := testApex(t, `
5470 apex {
5471 name: "myapex",
5472 key: "myapex.key",
5473 apps: ["AppSet"],
5474 }
5475
5476 apex_key {
5477 name: "myapex.key",
5478 public_key: "testkey.avbpubkey",
5479 private_key: "testkey.pem",
5480 }
5481
5482 android_app_set {
5483 name: "AppSet",
5484 set: "AppSet.apks",
5485 }`)
5486 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5487 bundleConfigRule := mod.Description("Bundle Config")
5488 content := bundleConfigRule.Args["content"]
5489 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5490 s := mod.Rule("apexRule").Args["copy_commands"]
5491 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5492 if len(copyCmds) != 3 {
5493 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5494 }
5495 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5496 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5497 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5498}
5499
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005500func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005501 t.Helper()
5502
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005503 bp := `
5504 java_library {
5505 name: "some-updatable-apex-lib",
5506 srcs: ["a.java"],
5507 sdk_version: "current",
5508 apex_available: [
5509 "some-updatable-apex",
5510 ],
5511 }
5512
5513 java_library {
5514 name: "some-non-updatable-apex-lib",
5515 srcs: ["a.java"],
5516 apex_available: [
5517 "some-non-updatable-apex",
5518 ],
5519 }
5520
5521 java_library {
5522 name: "some-platform-lib",
5523 srcs: ["a.java"],
5524 sdk_version: "current",
5525 installable: true,
5526 }
5527
5528 java_library {
5529 name: "some-art-lib",
5530 srcs: ["a.java"],
5531 sdk_version: "current",
5532 apex_available: [
5533 "com.android.art.something",
5534 ],
5535 hostdex: true,
5536 }
5537
5538 apex {
5539 name: "some-updatable-apex",
5540 key: "some-updatable-apex.key",
5541 java_libs: ["some-updatable-apex-lib"],
5542 updatable: true,
5543 min_sdk_version: "current",
5544 }
5545
5546 apex {
5547 name: "some-non-updatable-apex",
5548 key: "some-non-updatable-apex.key",
5549 java_libs: ["some-non-updatable-apex-lib"],
5550 }
5551
5552 apex_key {
5553 name: "some-updatable-apex.key",
5554 }
5555
5556 apex_key {
5557 name: "some-non-updatable-apex.key",
5558 }
5559
5560 apex {
5561 name: "com.android.art.something",
5562 key: "com.android.art.something.key",
5563 java_libs: ["some-art-lib"],
5564 updatable: true,
5565 min_sdk_version: "current",
5566 }
5567
5568 apex_key {
5569 name: "com.android.art.something.key",
5570 }
5571
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005572 filegroup {
5573 name: "some-updatable-apex-file_contexts",
5574 srcs: [
5575 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5576 ],
5577 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005578
5579 filegroup {
5580 name: "some-non-updatable-apex-file_contexts",
5581 srcs: [
5582 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5583 ],
5584 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005585 `
5586 bp += cc.GatherRequiredDepsForTest(android.Android)
5587 bp += java.GatherRequiredDepsForTest()
5588 bp += dexpreopt.BpToolModulesForTest()
5589
5590 fs := map[string][]byte{
5591 "a.java": nil,
5592 "a.jar": nil,
5593 "build/make/target/product/security": nil,
5594 "apex_manifest.json": nil,
5595 "AndroidManifest.xml": nil,
5596 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005597 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005598 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5599 "framework/aidl/a.aidl": nil,
5600 }
5601 cc.GatherRequiredFilesForTest(fs)
5602
5603 ctx := android.NewTestArchContext()
5604 ctx.RegisterModuleType("apex", BundleFactory)
5605 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5606 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005607 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005608 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005609 cc.RegisterRequiredBuildComponentsForTest(ctx)
5610 java.RegisterJavaBuildComponents(ctx)
5611 java.RegisterSystemModulesBuildComponents(ctx)
5612 java.RegisterAppBuildComponents(ctx)
5613 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005614 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5615 ctx.PreDepsMutators(RegisterPreDepsMutators)
5616 ctx.PostDepsMutators(RegisterPostDepsMutators)
5617
5618 config := android.TestArchConfig(buildDir, nil, bp, fs)
5619 ctx.Register(config)
5620
5621 _ = dexpreopt.GlobalSoongConfigForTests(config)
5622 dexpreopt.RegisterToolModulesForTest(ctx)
5623 pathCtx := android.PathContextForTesting(config)
5624 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5625 transformDexpreoptConfig(dexpreoptConfig)
5626 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5627
5628 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5629 android.FailIfErrored(t, errs)
5630
5631 _, errs = ctx.PrepareBuildActions(config)
5632 if errmsg == "" {
5633 android.FailIfErrored(t, errs)
5634 } else if len(errs) > 0 {
5635 android.FailIfNoMatchingErrors(t, errmsg, errs)
5636 return
5637 } else {
5638 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5639 }
5640}
5641
Jooyung Han548640b2020-04-27 12:10:30 +09005642func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5643 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5644 apex {
5645 name: "myapex",
5646 key: "myapex.key",
5647 updatable: true,
5648 }
5649
5650 apex_key {
5651 name: "myapex.key",
5652 public_key: "testkey.avbpubkey",
5653 private_key: "testkey.pem",
5654 }
5655 `)
5656}
5657
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005658func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005659 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005660 var transform func(*dexpreopt.GlobalConfig)
5661
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005662 config := android.TestArchConfig(buildDir, nil, "", nil)
5663 ctx := android.PathContextForTesting(config)
5664
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005665 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5666 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005667 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005668 }
5669 testNoUpdatableJarsInBootImage(t, "", transform)
5670 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005671
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005672 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005673 err = `module "some-art-lib" from updatable apexes \["com.android.art.something"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005674 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005675 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005676 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005677 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005678 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005679
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005680 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005681 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005682 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005683 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005684 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005685 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005686 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005687
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005688 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005689 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005690 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005691 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005692 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005693 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005694 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005695
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005696 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005697 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005698 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005699 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005700 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005701 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005702 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005703
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005704 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5705 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005706 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005707 }
5708 testNoUpdatableJarsInBootImage(t, "", transform)
5709 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005710
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005711 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005712 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005713 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005714 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005715 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005716 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005717 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005718
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005719 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005720 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005721 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005722 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005723 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005724 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005725 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005726
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005727 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005728 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005729 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005730 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005731 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005732 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005733 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005734
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005735 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5736 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005737 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005738 }
5739 testNoUpdatableJarsInBootImage(t, "", transform)
5740 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005741}
5742
Andrei Onea115e7e72020-06-05 21:14:03 +01005743func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5744 t.Helper()
5745 android.ClearApexDependency()
5746 bp += `
5747 apex_key {
5748 name: "myapex.key",
5749 public_key: "testkey.avbpubkey",
5750 private_key: "testkey.pem",
5751 }`
5752 fs := map[string][]byte{
5753 "lib1/src/A.java": nil,
5754 "lib2/src/B.java": nil,
5755 "system/sepolicy/apex/myapex-file_contexts": nil,
5756 }
5757
5758 ctx := android.NewTestArchContext()
5759 ctx.RegisterModuleType("apex", BundleFactory)
5760 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5761 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5762 cc.RegisterRequiredBuildComponentsForTest(ctx)
5763 java.RegisterJavaBuildComponents(ctx)
5764 java.RegisterSystemModulesBuildComponents(ctx)
5765 java.RegisterDexpreoptBootJarsComponents(ctx)
5766 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5767 ctx.PreDepsMutators(RegisterPreDepsMutators)
5768 ctx.PostDepsMutators(RegisterPostDepsMutators)
5769 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5770
5771 config := android.TestArchConfig(buildDir, nil, bp, fs)
5772 android.SetTestNeverallowRules(config, rules)
5773 updatableBootJars := make([]string, 0, len(apexBootJars))
5774 for _, apexBootJar := range apexBootJars {
5775 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5776 }
5777 config.TestProductVariables.UpdatableBootJars = updatableBootJars
5778
5779 ctx.Register(config)
5780
5781 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5782 android.FailIfErrored(t, errs)
5783
5784 _, errs = ctx.PrepareBuildActions(config)
5785 if errmsg == "" {
5786 android.FailIfErrored(t, errs)
5787 } else if len(errs) > 0 {
5788 android.FailIfNoMatchingErrors(t, errmsg, errs)
5789 return
5790 } else {
5791 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5792 }
5793}
5794
5795func TestApexPermittedPackagesRules(t *testing.T) {
5796 testcases := []struct {
5797 name string
5798 expectedError string
5799 bp string
5800 bootJars []string
5801 modulesPackages map[string][]string
5802 }{
5803
5804 {
5805 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5806 expectedError: "",
5807 bp: `
5808 java_library {
5809 name: "bcp_lib1",
5810 srcs: ["lib1/src/*.java"],
5811 permitted_packages: ["foo.bar"],
5812 apex_available: ["myapex"],
5813 sdk_version: "none",
5814 system_modules: "none",
5815 }
5816 java_library {
5817 name: "nonbcp_lib2",
5818 srcs: ["lib2/src/*.java"],
5819 apex_available: ["myapex"],
5820 permitted_packages: ["a.b"],
5821 sdk_version: "none",
5822 system_modules: "none",
5823 }
5824 apex {
5825 name: "myapex",
5826 key: "myapex.key",
5827 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5828 }`,
5829 bootJars: []string{"bcp_lib1"},
5830 modulesPackages: map[string][]string{
5831 "myapex": []string{
5832 "foo.bar",
5833 },
5834 },
5835 },
5836 {
5837 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5838 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar. Please jarjar or move code around.`,
5839 bp: `
5840 java_library {
5841 name: "bcp_lib1",
5842 srcs: ["lib1/src/*.java"],
5843 apex_available: ["myapex"],
5844 permitted_packages: ["foo.bar"],
5845 sdk_version: "none",
5846 system_modules: "none",
5847 }
5848 java_library {
5849 name: "bcp_lib2",
5850 srcs: ["lib2/src/*.java"],
5851 apex_available: ["myapex"],
5852 permitted_packages: ["foo.bar", "bar.baz"],
5853 sdk_version: "none",
5854 system_modules: "none",
5855 }
5856 apex {
5857 name: "myapex",
5858 key: "myapex.key",
5859 java_libs: ["bcp_lib1", "bcp_lib2"],
5860 }
5861 `,
5862 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5863 modulesPackages: map[string][]string{
5864 "myapex": []string{
5865 "foo.bar",
5866 },
5867 },
5868 },
5869 }
5870 for _, tc := range testcases {
5871 t.Run(tc.name, func(t *testing.T) {
5872 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5873 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5874 })
5875 }
5876}
5877
Jiyong Park62304bb2020-04-13 16:19:48 +09005878func TestTestFor(t *testing.T) {
5879 ctx, _ := testApex(t, `
5880 apex {
5881 name: "myapex",
5882 key: "myapex.key",
5883 native_shared_libs: ["mylib", "myprivlib"],
5884 }
5885
5886 apex_key {
5887 name: "myapex.key",
5888 public_key: "testkey.avbpubkey",
5889 private_key: "testkey.pem",
5890 }
5891
5892 cc_library {
5893 name: "mylib",
5894 srcs: ["mylib.cpp"],
5895 system_shared_libs: [],
5896 stl: "none",
5897 stubs: {
5898 versions: ["1"],
5899 },
5900 apex_available: ["myapex"],
5901 }
5902
5903 cc_library {
5904 name: "myprivlib",
5905 srcs: ["mylib.cpp"],
5906 system_shared_libs: [],
5907 stl: "none",
5908 apex_available: ["myapex"],
5909 }
5910
5911
5912 cc_test {
5913 name: "mytest",
5914 gtest: false,
5915 srcs: ["mylib.cpp"],
5916 system_shared_libs: [],
5917 stl: "none",
5918 shared_libs: ["mylib", "myprivlib"],
5919 test_for: ["myapex"]
5920 }
5921 `)
5922
5923 // the test 'mytest' is a test for the apex, therefore is linked to the
5924 // actual implementation of mylib instead of its stub.
5925 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5926 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5927 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5928}
5929
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005930// TODO(jungjw): Move this to proptools
5931func intPtr(i int) *int {
5932 return &i
5933}
5934
5935func TestApexSet(t *testing.T) {
5936 ctx, config := testApex(t, `
5937 apex_set {
5938 name: "myapex",
5939 set: "myapex.apks",
5940 filename: "foo_v2.apex",
5941 overrides: ["foo"],
5942 }
5943 `, func(fs map[string][]byte, config android.Config) {
5944 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07005945 config.Targets[android.Android] = []android.Target{
5946 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
5947 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
5948 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005949 })
5950
5951 m := ctx.ModuleForTests("myapex", "android_common")
5952
5953 // Check extract_apks tool parameters.
5954 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5955 actual := extractedApex.Args["abis"]
5956 expected := "ARMEABI_V7A,ARM64_V8A"
5957 if actual != expected {
5958 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5959 }
5960 actual = extractedApex.Args["sdk-version"]
5961 expected = "30"
5962 if actual != expected {
5963 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5964 }
5965
5966 a := m.Module().(*ApexSet)
5967 expectedOverrides := []string{"foo"}
5968 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5969 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5970 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5971 }
5972}
5973
Jiyong Park7d95a512020-05-10 15:16:24 +09005974func TestNoStaticLinkingToStubsLib(t *testing.T) {
5975 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5976 apex {
5977 name: "myapex",
5978 key: "myapex.key",
5979 native_shared_libs: ["mylib"],
5980 }
5981
5982 apex_key {
5983 name: "myapex.key",
5984 public_key: "testkey.avbpubkey",
5985 private_key: "testkey.pem",
5986 }
5987
5988 cc_library {
5989 name: "mylib",
5990 srcs: ["mylib.cpp"],
5991 static_libs: ["otherlib"],
5992 system_shared_libs: [],
5993 stl: "none",
5994 apex_available: [ "myapex" ],
5995 }
5996
5997 cc_library {
5998 name: "otherlib",
5999 srcs: ["mylib.cpp"],
6000 system_shared_libs: [],
6001 stl: "none",
6002 stubs: {
6003 versions: ["1", "2", "3"],
6004 },
6005 apex_available: [ "myapex" ],
6006 }
6007 `)
6008}
6009
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006010func TestApexKeysTxt(t *testing.T) {
6011 ctx, _ := testApex(t, `
6012 apex {
6013 name: "myapex",
6014 key: "myapex.key",
6015 }
6016
6017 apex_key {
6018 name: "myapex.key",
6019 public_key: "testkey.avbpubkey",
6020 private_key: "testkey.pem",
6021 }
6022
6023 prebuilt_apex {
6024 name: "myapex",
6025 prefer: true,
6026 arch: {
6027 arm64: {
6028 src: "myapex-arm64.apex",
6029 },
6030 arm: {
6031 src: "myapex-arm.apex",
6032 },
6033 },
6034 }
6035
6036 apex_set {
6037 name: "myapex_set",
6038 set: "myapex.apks",
6039 filename: "myapex_set.apex",
6040 overrides: ["myapex"],
6041 }
6042 `)
6043
6044 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6045 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6046 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 +09006047 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 +09006048}
6049
Jooyung Han938b5932020-06-20 12:47:47 +09006050func TestAllowedFiles(t *testing.T) {
6051 ctx, _ := testApex(t, `
6052 apex {
6053 name: "myapex",
6054 key: "myapex.key",
6055 apps: ["app"],
6056 allowed_files: "allowed.txt",
6057 }
6058
6059 apex_key {
6060 name: "myapex.key",
6061 public_key: "testkey.avbpubkey",
6062 private_key: "testkey.pem",
6063 }
6064
6065 android_app {
6066 name: "app",
6067 srcs: ["foo/bar/MyClass.java"],
6068 package_name: "foo",
6069 sdk_version: "none",
6070 system_modules: "none",
6071 apex_available: [ "myapex" ],
6072 }
6073 `, withFiles(map[string][]byte{
6074 "sub/Android.bp": []byte(`
6075 override_apex {
6076 name: "override_myapex",
6077 base: "myapex",
6078 apps: ["override_app"],
6079 allowed_files: ":allowed",
6080 }
6081 // Overridable "path" property should be referenced indirectly
6082 filegroup {
6083 name: "allowed",
6084 srcs: ["allowed.txt"],
6085 }
6086 override_android_app {
6087 name: "override_app",
6088 base: "app",
6089 package_name: "bar",
6090 }
6091 `),
6092 }))
6093
6094 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6095 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6096 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6097 }
6098
6099 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6100 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6101 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6102 }
6103}
6104
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006105func TestNonPreferredPrebuiltDependency(t *testing.T) {
6106 _, _ = testApex(t, `
6107 apex {
6108 name: "myapex",
6109 key: "myapex.key",
6110 native_shared_libs: ["mylib"],
6111 }
6112
6113 apex_key {
6114 name: "myapex.key",
6115 public_key: "testkey.avbpubkey",
6116 private_key: "testkey.pem",
6117 }
6118
6119 cc_library {
6120 name: "mylib",
6121 srcs: ["mylib.cpp"],
6122 stubs: {
6123 versions: ["10000"],
6124 },
6125 apex_available: ["myapex"],
6126 }
6127
6128 cc_prebuilt_library_shared {
6129 name: "mylib",
6130 prefer: false,
6131 srcs: ["prebuilt.so"],
6132 stubs: {
6133 versions: ["10000"],
6134 },
6135 apex_available: ["myapex"],
6136 }
6137 `)
6138}
6139
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006140func TestMain(m *testing.M) {
6141 run := func() int {
6142 setUp()
6143 defer tearDown()
6144
6145 return m.Run()
6146 }
6147
6148 os.Exit(run())
6149}