blob: cb125be4cd89d8fb2ba96ec86099aece2a82a2b2 [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 }
Dan Albertc8060532020-07-22 22:32:17 -07001428 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001429 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1430 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001431}
1432
Jooyung Han749dc692020-04-15 11:03:39 +09001433func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001434 ctx, _ := testApex(t, `
1435 apex {
1436 name: "myapex",
1437 key: "myapex.key",
1438 native_shared_libs: ["libx"],
1439 }
1440
1441 apex_key {
1442 name: "myapex.key",
1443 public_key: "testkey.avbpubkey",
1444 private_key: "testkey.pem",
1445 }
1446
1447 cc_library {
1448 name: "libx",
1449 shared_libs: ["libz"],
1450 system_shared_libs: [],
1451 stl: "none",
1452 apex_available: [ "myapex" ],
1453 }
1454
1455 cc_library {
1456 name: "libz",
1457 system_shared_libs: [],
1458 stl: "none",
1459 stubs: {
1460 versions: ["1", "2"],
1461 },
1462 }
1463 `)
1464
1465 expectLink := func(from, from_variant, to, to_variant string) {
1466 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1467 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1468 }
1469 expectNoLink := func(from, from_variant, to, to_variant string) {
1470 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1471 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1472 }
Colin Crossaede88c2020-08-11 12:17:01 -07001473 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1474 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1475 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001476}
1477
1478func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1479 ctx, _ := testApex(t, `
1480 apex {
1481 name: "myapex",
1482 key: "myapex.key",
1483 native_shared_libs: ["libx"],
1484 }
1485
1486 apex_key {
1487 name: "myapex.key",
1488 public_key: "testkey.avbpubkey",
1489 private_key: "testkey.pem",
1490 }
1491
1492 cc_library {
1493 name: "libx",
1494 system_shared_libs: [],
1495 stl: "none",
1496 apex_available: [ "myapex" ],
1497 stubs: {
1498 versions: ["1", "2"],
1499 },
1500 }
1501
1502 cc_library {
1503 name: "libz",
1504 shared_libs: ["libx"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 }
1508 `)
1509
1510 expectLink := func(from, from_variant, to, to_variant string) {
1511 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1512 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1513 }
1514 expectNoLink := func(from, from_variant, to, to_variant string) {
1515 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1516 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1517 }
1518 expectLink("libz", "shared", "libx", "shared_2")
1519 expectNoLink("libz", "shared", "libz", "shared_1")
1520 expectNoLink("libz", "shared", "libz", "shared")
1521}
1522
Jooyung Han75568392020-03-20 04:29:24 +09001523func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001524 ctx, _ := testApex(t, `
1525 apex {
1526 name: "myapex",
1527 key: "myapex.key",
1528 native_shared_libs: ["libx"],
1529 min_sdk_version: "29",
1530 }
1531
1532 apex_key {
1533 name: "myapex.key",
1534 public_key: "testkey.avbpubkey",
1535 private_key: "testkey.pem",
1536 }
1537
1538 cc_library {
1539 name: "libx",
1540 shared_libs: ["libbar"],
1541 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001542 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001543 }
1544
1545 cc_library {
1546 name: "libbar",
1547 stubs: {
1548 versions: ["29", "30"],
1549 },
1550 }
Jooyung Han75568392020-03-20 04:29:24 +09001551 `, func(fs map[string][]byte, config android.Config) {
1552 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1553 })
Jooyung Han03b51852020-02-26 22:45:42 +09001554 expectLink := func(from, from_variant, to, to_variant string) {
1555 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1556 libFlags := ld.Args["libFlags"]
1557 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1558 }
Colin Crossaede88c2020-08-11 12:17:01 -07001559 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001560}
1561
Jooyung Han75568392020-03-20 04:29:24 +09001562func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001563 ctx, _ := testApex(t, `
1564 apex {
1565 name: "myapex",
1566 key: "myapex.key",
1567 native_shared_libs: ["libx"],
1568 min_sdk_version: "29",
1569 }
1570
1571 apex_key {
1572 name: "myapex.key",
1573 public_key: "testkey.avbpubkey",
1574 private_key: "testkey.pem",
1575 }
1576
1577 cc_library {
1578 name: "libx",
1579 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001580 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001581 }
Jooyung Han75568392020-03-20 04:29:24 +09001582 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001583
1584 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001585 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001586 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1587 // note that platform variant is not.
1588 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1589 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001590}
1591
Jooyung Han749dc692020-04-15 11:03:39 +09001592func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001593 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001594 apex {
1595 name: "myapex",
1596 key: "myapex.key",
1597 native_shared_libs: ["libx"],
1598 min_sdk_version: "29",
1599 }
1600
1601 apex_key {
1602 name: "myapex.key",
1603 public_key: "testkey.avbpubkey",
1604 private_key: "testkey.pem",
1605 }
1606
1607 cc_library {
1608 name: "libx",
1609 shared_libs: ["libz"],
1610 system_shared_libs: [],
1611 stl: "none",
1612 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001613 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001614 }
1615
1616 cc_library {
1617 name: "libz",
1618 system_shared_libs: [],
1619 stl: "none",
1620 stubs: {
1621 versions: ["30"],
1622 },
1623 }
Jooyung Han75568392020-03-20 04:29:24 +09001624 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001625}
Jooyung Han03b51852020-02-26 22:45:42 +09001626
Jooyung Han749dc692020-04-15 11:03:39 +09001627func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1628 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001629 apex {
1630 name: "myapex",
1631 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001632 native_shared_libs: ["mylib"],
1633 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001634 }
1635
1636 apex_key {
1637 name: "myapex.key",
1638 public_key: "testkey.avbpubkey",
1639 private_key: "testkey.pem",
1640 }
Jooyung Han749dc692020-04-15 11:03:39 +09001641
1642 cc_library {
1643 name: "mylib",
1644 srcs: ["mylib.cpp"],
1645 system_shared_libs: [],
1646 stl: "none",
1647 apex_available: [
1648 "myapex",
1649 ],
1650 min_sdk_version: "30",
1651 }
1652 `)
1653}
1654
1655func TestApexMinSdkVersion_Okay(t *testing.T) {
1656 testApex(t, `
1657 apex {
1658 name: "myapex",
1659 key: "myapex.key",
1660 native_shared_libs: ["libfoo"],
1661 java_libs: ["libbar"],
1662 min_sdk_version: "29",
1663 }
1664
1665 apex_key {
1666 name: "myapex.key",
1667 public_key: "testkey.avbpubkey",
1668 private_key: "testkey.pem",
1669 }
1670
1671 cc_library {
1672 name: "libfoo",
1673 srcs: ["mylib.cpp"],
1674 shared_libs: ["libfoo_dep"],
1675 apex_available: ["myapex"],
1676 min_sdk_version: "29",
1677 }
1678
1679 cc_library {
1680 name: "libfoo_dep",
1681 srcs: ["mylib.cpp"],
1682 apex_available: ["myapex"],
1683 min_sdk_version: "29",
1684 }
1685
1686 java_library {
1687 name: "libbar",
1688 sdk_version: "current",
1689 srcs: ["a.java"],
1690 static_libs: ["libbar_dep"],
1691 apex_available: ["myapex"],
1692 min_sdk_version: "29",
1693 }
1694
1695 java_library {
1696 name: "libbar_dep",
1697 sdk_version: "current",
1698 srcs: ["a.java"],
1699 apex_available: ["myapex"],
1700 min_sdk_version: "29",
1701 }
Jooyung Han03b51852020-02-26 22:45:42 +09001702 `)
1703}
1704
Artur Satayev8cf899a2020-04-15 17:29:42 +01001705func TestJavaStableSdkVersion(t *testing.T) {
1706 testCases := []struct {
1707 name string
1708 expectedError string
1709 bp string
1710 }{
1711 {
1712 name: "Non-updatable apex with non-stable dep",
1713 bp: `
1714 apex {
1715 name: "myapex",
1716 java_libs: ["myjar"],
1717 key: "myapex.key",
1718 }
1719 apex_key {
1720 name: "myapex.key",
1721 public_key: "testkey.avbpubkey",
1722 private_key: "testkey.pem",
1723 }
1724 java_library {
1725 name: "myjar",
1726 srcs: ["foo/bar/MyClass.java"],
1727 sdk_version: "core_platform",
1728 apex_available: ["myapex"],
1729 }
1730 `,
1731 },
1732 {
1733 name: "Updatable apex with stable dep",
1734 bp: `
1735 apex {
1736 name: "myapex",
1737 java_libs: ["myjar"],
1738 key: "myapex.key",
1739 updatable: true,
1740 min_sdk_version: "29",
1741 }
1742 apex_key {
1743 name: "myapex.key",
1744 public_key: "testkey.avbpubkey",
1745 private_key: "testkey.pem",
1746 }
1747 java_library {
1748 name: "myjar",
1749 srcs: ["foo/bar/MyClass.java"],
1750 sdk_version: "current",
1751 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001752 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001753 }
1754 `,
1755 },
1756 {
1757 name: "Updatable apex with non-stable dep",
1758 expectedError: "cannot depend on \"myjar\"",
1759 bp: `
1760 apex {
1761 name: "myapex",
1762 java_libs: ["myjar"],
1763 key: "myapex.key",
1764 updatable: true,
1765 }
1766 apex_key {
1767 name: "myapex.key",
1768 public_key: "testkey.avbpubkey",
1769 private_key: "testkey.pem",
1770 }
1771 java_library {
1772 name: "myjar",
1773 srcs: ["foo/bar/MyClass.java"],
1774 sdk_version: "core_platform",
1775 apex_available: ["myapex"],
1776 }
1777 `,
1778 },
1779 {
1780 name: "Updatable apex with non-stable transitive dep",
1781 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1782 bp: `
1783 apex {
1784 name: "myapex",
1785 java_libs: ["myjar"],
1786 key: "myapex.key",
1787 updatable: true,
1788 }
1789 apex_key {
1790 name: "myapex.key",
1791 public_key: "testkey.avbpubkey",
1792 private_key: "testkey.pem",
1793 }
1794 java_library {
1795 name: "myjar",
1796 srcs: ["foo/bar/MyClass.java"],
1797 sdk_version: "current",
1798 apex_available: ["myapex"],
1799 static_libs: ["transitive-jar"],
1800 }
1801 java_library {
1802 name: "transitive-jar",
1803 srcs: ["foo/bar/MyClass.java"],
1804 sdk_version: "core_platform",
1805 apex_available: ["myapex"],
1806 }
1807 `,
1808 },
1809 }
1810
1811 for _, test := range testCases {
1812 t.Run(test.name, func(t *testing.T) {
1813 if test.expectedError == "" {
1814 testApex(t, test.bp)
1815 } else {
1816 testApexError(t, test.expectedError, test.bp)
1817 }
1818 })
1819 }
1820}
1821
Jooyung Han749dc692020-04-15 11:03:39 +09001822func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1823 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1824 apex {
1825 name: "myapex",
1826 key: "myapex.key",
1827 native_shared_libs: ["mylib"],
1828 min_sdk_version: "29",
1829 }
1830
1831 apex_key {
1832 name: "myapex.key",
1833 public_key: "testkey.avbpubkey",
1834 private_key: "testkey.pem",
1835 }
1836
1837 cc_library {
1838 name: "mylib",
1839 srcs: ["mylib.cpp"],
1840 shared_libs: ["mylib2"],
1841 system_shared_libs: [],
1842 stl: "none",
1843 apex_available: [
1844 "myapex",
1845 ],
1846 min_sdk_version: "29",
1847 }
1848
1849 // indirect part of the apex
1850 cc_library {
1851 name: "mylib2",
1852 srcs: ["mylib.cpp"],
1853 system_shared_libs: [],
1854 stl: "none",
1855 apex_available: [
1856 "myapex",
1857 ],
1858 min_sdk_version: "30",
1859 }
1860 `)
1861}
1862
1863func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1864 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1865 apex {
1866 name: "myapex",
1867 key: "myapex.key",
1868 apps: ["AppFoo"],
1869 min_sdk_version: "29",
1870 }
1871
1872 apex_key {
1873 name: "myapex.key",
1874 public_key: "testkey.avbpubkey",
1875 private_key: "testkey.pem",
1876 }
1877
1878 android_app {
1879 name: "AppFoo",
1880 srcs: ["foo/bar/MyClass.java"],
1881 sdk_version: "current",
1882 min_sdk_version: "29",
1883 system_modules: "none",
1884 stl: "none",
1885 static_libs: ["bar"],
1886 apex_available: [ "myapex" ],
1887 }
1888
1889 java_library {
1890 name: "bar",
1891 sdk_version: "current",
1892 srcs: ["a.java"],
1893 apex_available: [ "myapex" ],
1894 }
1895 `)
1896}
1897
1898func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1899 ctx, _ := testApex(t, `
1900 apex {
1901 name: "myapex",
1902 key: "myapex.key",
1903 native_shared_libs: ["mylib"],
1904 min_sdk_version: "29",
1905 }
1906
1907 apex_key {
1908 name: "myapex.key",
1909 public_key: "testkey.avbpubkey",
1910 private_key: "testkey.pem",
1911 }
1912
1913 // mylib in myapex will link to mylib2#29
1914 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1915 cc_library {
1916 name: "mylib",
1917 srcs: ["mylib.cpp"],
1918 shared_libs: ["mylib2"],
1919 system_shared_libs: [],
1920 stl: "none",
1921 apex_available: ["myapex", "otherapex"],
1922 min_sdk_version: "29",
1923 }
1924
1925 cc_library {
1926 name: "mylib2",
1927 srcs: ["mylib.cpp"],
1928 system_shared_libs: [],
1929 stl: "none",
1930 apex_available: ["otherapex"],
1931 stubs: { versions: ["29", "30"] },
1932 min_sdk_version: "30",
1933 }
1934
1935 apex {
1936 name: "otherapex",
1937 key: "myapex.key",
1938 native_shared_libs: ["mylib", "mylib2"],
1939 min_sdk_version: "30",
1940 }
1941 `)
1942 expectLink := func(from, from_variant, to, to_variant string) {
1943 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1944 libFlags := ld.Args["libFlags"]
1945 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1946 }
Colin Crossaede88c2020-08-11 12:17:01 -07001947 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
1948 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09001949}
1950
Jiyong Park7c2ee712018-12-07 00:42:25 +09001951func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001952 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001953 apex {
1954 name: "myapex",
1955 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001956 native_shared_libs: ["mylib"],
1957 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001958 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001959 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001960 }
1961
1962 apex_key {
1963 name: "myapex.key",
1964 public_key: "testkey.avbpubkey",
1965 private_key: "testkey.pem",
1966 }
1967
1968 prebuilt_etc {
1969 name: "myetc",
1970 src: "myprebuilt",
1971 sub_dir: "foo/bar",
1972 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001973
1974 cc_library {
1975 name: "mylib",
1976 srcs: ["mylib.cpp"],
1977 relative_install_path: "foo/bar",
1978 system_shared_libs: [],
1979 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001980 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001981 }
1982
1983 cc_binary {
1984 name: "mybin",
1985 srcs: ["mylib.cpp"],
1986 relative_install_path: "foo/bar",
1987 system_shared_libs: [],
1988 static_executable: true,
1989 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001990 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001991 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001992 `)
1993
Sundong Ahnabb64432019-10-22 13:58:29 +09001994 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001995 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1996
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001997 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001998 ensureListContains(t, dirs, "etc")
1999 ensureListContains(t, dirs, "etc/foo")
2000 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002001 ensureListContains(t, dirs, "lib64")
2002 ensureListContains(t, dirs, "lib64/foo")
2003 ensureListContains(t, dirs, "lib64/foo/bar")
2004 ensureListContains(t, dirs, "lib")
2005 ensureListContains(t, dirs, "lib/foo")
2006 ensureListContains(t, dirs, "lib/foo/bar")
2007
Jiyong Parkbd13e442019-03-15 18:10:35 +09002008 ensureListContains(t, dirs, "bin")
2009 ensureListContains(t, dirs, "bin/foo")
2010 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002011}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002012
Jooyung Han35155c42020-02-06 17:33:20 +09002013func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2014 ctx, _ := testApex(t, `
2015 apex {
2016 name: "myapex",
2017 key: "myapex.key",
2018 multilib: {
2019 both: {
2020 native_shared_libs: ["mylib"],
2021 binaries: ["mybin"],
2022 },
2023 },
2024 compile_multilib: "both",
2025 native_bridge_supported: true,
2026 }
2027
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033
2034 cc_library {
2035 name: "mylib",
2036 relative_install_path: "foo/bar",
2037 system_shared_libs: [],
2038 stl: "none",
2039 apex_available: [ "myapex" ],
2040 native_bridge_supported: true,
2041 }
2042
2043 cc_binary {
2044 name: "mybin",
2045 relative_install_path: "foo/bar",
2046 system_shared_libs: [],
2047 static_executable: true,
2048 stl: "none",
2049 apex_available: [ "myapex" ],
2050 native_bridge_supported: true,
2051 compile_multilib: "both", // default is "first" for binary
2052 multilib: {
2053 lib64: {
2054 suffix: "64",
2055 },
2056 },
2057 }
2058 `, withNativeBridgeEnabled)
2059 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2060 "bin/foo/bar/mybin",
2061 "bin/foo/bar/mybin64",
2062 "bin/arm/foo/bar/mybin",
2063 "bin/arm64/foo/bar/mybin64",
2064 "lib/foo/bar/mylib.so",
2065 "lib/arm/foo/bar/mylib.so",
2066 "lib64/foo/bar/mylib.so",
2067 "lib64/arm64/foo/bar/mylib.so",
2068 })
2069}
2070
Jiyong Parkda6eb592018-12-19 17:12:36 +09002071func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002072 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002073 apex {
2074 name: "myapex",
2075 key: "myapex.key",
2076 native_shared_libs: ["mylib"],
2077 use_vendor: true,
2078 }
2079
2080 apex_key {
2081 name: "myapex.key",
2082 public_key: "testkey.avbpubkey",
2083 private_key: "testkey.pem",
2084 }
2085
2086 cc_library {
2087 name: "mylib",
2088 srcs: ["mylib.cpp"],
2089 shared_libs: ["mylib2"],
2090 system_shared_libs: [],
2091 vendor_available: true,
2092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002093 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002094 }
2095
2096 cc_library {
2097 name: "mylib2",
2098 srcs: ["mylib.cpp"],
2099 system_shared_libs: [],
2100 vendor_available: true,
2101 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002102 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002103 }
Jooyung Handc782442019-11-01 03:14:38 +09002104 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002105 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002106 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002107
2108 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002109 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002110 for _, implicit := range i.Implicits {
2111 inputsList = append(inputsList, implicit.String())
2112 }
2113 }
2114 inputsString := strings.Join(inputsList, " ")
2115
2116 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002117 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2118 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002119
2120 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002121 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2122 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002123}
Jiyong Park16e91a02018-12-20 18:18:08 +09002124
Jooyung Han85d61762020-06-24 23:50:26 +09002125func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002126 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
2130 use_vendor: true,
2131 }
2132 apex_key {
2133 name: "myapex.key",
2134 public_key: "testkey.avbpubkey",
2135 private_key: "testkey.pem",
2136 }
2137 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002138 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002139 })
Colin Cross440e0d02020-06-11 11:32:11 -07002140 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002141 testApex(t, `
2142 apex {
2143 name: "myapex",
2144 key: "myapex.key",
2145 use_vendor: true,
2146 }
2147 apex_key {
2148 name: "myapex.key",
2149 public_key: "testkey.avbpubkey",
2150 private_key: "testkey.pem",
2151 }
2152 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002153 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002154 })
2155}
2156
Jooyung Han5c998b92019-06-27 11:30:33 +09002157func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2158 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2159 apex {
2160 name: "myapex",
2161 key: "myapex.key",
2162 native_shared_libs: ["mylib"],
2163 use_vendor: true,
2164 }
2165
2166 apex_key {
2167 name: "myapex.key",
2168 public_key: "testkey.avbpubkey",
2169 private_key: "testkey.pem",
2170 }
2171
2172 cc_library {
2173 name: "mylib",
2174 srcs: ["mylib.cpp"],
2175 system_shared_libs: [],
2176 stl: "none",
2177 }
2178 `)
2179}
2180
Jooyung Han85d61762020-06-24 23:50:26 +09002181func TestVendorApex(t *testing.T) {
2182 ctx, config := testApex(t, `
2183 apex {
2184 name: "myapex",
2185 key: "myapex.key",
2186 binaries: ["mybin"],
2187 vendor: true,
2188 }
2189 apex_key {
2190 name: "myapex.key",
2191 public_key: "testkey.avbpubkey",
2192 private_key: "testkey.pem",
2193 }
2194 cc_binary {
2195 name: "mybin",
2196 vendor: true,
2197 shared_libs: ["libfoo"],
2198 }
2199 cc_library {
2200 name: "libfoo",
2201 proprietary: true,
2202 }
2203 `)
2204
2205 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2206 "bin/mybin",
2207 "lib64/libfoo.so",
2208 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2209 "lib64/libc++.so",
2210 })
2211
2212 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2213 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2214 name := apexBundle.BaseModuleName()
2215 prefix := "TARGET_"
2216 var builder strings.Builder
2217 data.Custom(&builder, name, prefix, "", data)
2218 androidMk := builder.String()
2219 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002220
2221 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2222 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2223 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002224}
2225
Jooyung Handf78e212020-07-22 15:54:47 +09002226func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2227 ctx, _ := testApex(t, `
2228 apex {
2229 name: "myapex",
2230 key: "myapex.key",
2231 binaries: ["mybin"],
2232 vendor: true,
2233 use_vndk_as_stable: true,
2234 }
2235 apex_key {
2236 name: "myapex.key",
2237 public_key: "testkey.avbpubkey",
2238 private_key: "testkey.pem",
2239 }
2240 cc_binary {
2241 name: "mybin",
2242 vendor: true,
2243 shared_libs: ["libvndk", "libvendor"],
2244 }
2245 cc_library {
2246 name: "libvndk",
2247 vndk: {
2248 enabled: true,
2249 },
2250 vendor_available: true,
2251 }
2252 cc_library {
2253 name: "libvendor",
2254 vendor: true,
2255 }
2256 `)
2257
2258 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2259
Colin Crossaede88c2020-08-11 12:17:01 -07002260 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002261 libs := names(ldRule.Args["libFlags"])
2262 // VNDK libs(libvndk/libc++) as they are
2263 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2264 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2265 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002266 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002267
2268 // VNDK libs are not included when use_vndk_as_stable: true
2269 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2270 "bin/mybin",
2271 "lib64/libvendor.so",
2272 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002273
2274 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2275 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2276 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002277}
2278
Jooyung Han8e5685d2020-09-21 11:02:57 +09002279func TestApex_withPrebuiltFirmware(t *testing.T) {
2280 testCases := []struct {
2281 name string
2282 additionalProp string
2283 }{
2284 {"system apex with prebuilt_firmware", ""},
2285 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2286 }
2287 for _, tc := range testCases {
2288 t.Run(tc.name, func(t *testing.T) {
2289 ctx, _ := testApex(t, `
2290 apex {
2291 name: "myapex",
2292 key: "myapex.key",
2293 prebuilts: ["myfirmware"],
2294 `+tc.additionalProp+`
2295 }
2296 apex_key {
2297 name: "myapex.key",
2298 public_key: "testkey.avbpubkey",
2299 private_key: "testkey.pem",
2300 }
2301 prebuilt_firmware {
2302 name: "myfirmware",
2303 src: "myfirmware.bin",
2304 filename_from_src: true,
2305 `+tc.additionalProp+`
2306 }
2307 `)
2308 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2309 "etc/firmware/myfirmware.bin",
2310 })
2311 })
2312 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002313}
2314
Jooyung Hanefb184e2020-06-25 17:14:25 +09002315func TestAndroidMk_UseVendorRequired(t *testing.T) {
2316 ctx, config := testApex(t, `
2317 apex {
2318 name: "myapex",
2319 key: "myapex.key",
2320 use_vendor: true,
2321 native_shared_libs: ["mylib"],
2322 }
2323
2324 apex_key {
2325 name: "myapex.key",
2326 public_key: "testkey.avbpubkey",
2327 private_key: "testkey.pem",
2328 }
2329
2330 cc_library {
2331 name: "mylib",
2332 vendor_available: true,
2333 apex_available: ["myapex"],
2334 }
2335 `, func(fs map[string][]byte, config android.Config) {
2336 setUseVendorAllowListForTest(config, []string{"myapex"})
2337 })
2338
2339 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2340 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2341 name := apexBundle.BaseModuleName()
2342 prefix := "TARGET_"
2343 var builder strings.Builder
2344 data.Custom(&builder, name, prefix, "", data)
2345 androidMk := builder.String()
2346 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2347}
2348
2349func TestAndroidMk_VendorApexRequired(t *testing.T) {
2350 ctx, config := testApex(t, `
2351 apex {
2352 name: "myapex",
2353 key: "myapex.key",
2354 vendor: true,
2355 native_shared_libs: ["mylib"],
2356 }
2357
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363
2364 cc_library {
2365 name: "mylib",
2366 vendor_available: true,
2367 }
2368 `)
2369
2370 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2371 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2372 name := apexBundle.BaseModuleName()
2373 prefix := "TARGET_"
2374 var builder strings.Builder
2375 data.Custom(&builder, name, prefix, "", data)
2376 androidMk := builder.String()
2377 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2378}
2379
Jooyung Han2ed99d02020-06-24 23:26:26 +09002380func TestAndroidMkWritesCommonProperties(t *testing.T) {
2381 ctx, config := testApex(t, `
2382 apex {
2383 name: "myapex",
2384 key: "myapex.key",
2385 vintf_fragments: ["fragment.xml"],
2386 init_rc: ["init.rc"],
2387 }
2388 apex_key {
2389 name: "myapex.key",
2390 public_key: "testkey.avbpubkey",
2391 private_key: "testkey.pem",
2392 }
2393 cc_binary {
2394 name: "mybin",
2395 }
2396 `)
2397
2398 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2399 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2400 name := apexBundle.BaseModuleName()
2401 prefix := "TARGET_"
2402 var builder strings.Builder
2403 data.Custom(&builder, name, prefix, "", data)
2404 androidMk := builder.String()
2405 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2406 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2407}
2408
Jiyong Park16e91a02018-12-20 18:18:08 +09002409func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002410 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002411 apex {
2412 name: "myapex",
2413 key: "myapex.key",
2414 native_shared_libs: ["mylib"],
2415 }
2416
2417 apex_key {
2418 name: "myapex.key",
2419 public_key: "testkey.avbpubkey",
2420 private_key: "testkey.pem",
2421 }
2422
2423 cc_library {
2424 name: "mylib",
2425 srcs: ["mylib.cpp"],
2426 system_shared_libs: [],
2427 stl: "none",
2428 stubs: {
2429 versions: ["1", "2", "3"],
2430 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002431 apex_available: [
2432 "//apex_available:platform",
2433 "myapex",
2434 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002435 }
2436
2437 cc_binary {
2438 name: "not_in_apex",
2439 srcs: ["mylib.cpp"],
2440 static_libs: ["mylib"],
2441 static_executable: true,
2442 system_shared_libs: [],
2443 stl: "none",
2444 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002445 `)
2446
Colin Cross7113d202019-11-20 16:39:12 -08002447 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002448
2449 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002450 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002451}
Jiyong Park9335a262018-12-24 11:31:58 +09002452
2453func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002454 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002455 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002456 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002457 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002458 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002459 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002460 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002461 }
2462
2463 cc_library {
2464 name: "mylib",
2465 srcs: ["mylib.cpp"],
2466 system_shared_libs: [],
2467 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002468 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002469 }
2470
2471 apex_key {
2472 name: "myapex.key",
2473 public_key: "testkey.avbpubkey",
2474 private_key: "testkey.pem",
2475 }
2476
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002477 android_app_certificate {
2478 name: "myapex.certificate",
2479 certificate: "testkey",
2480 }
2481
2482 android_app_certificate {
2483 name: "myapex.certificate.override",
2484 certificate: "testkey.override",
2485 }
2486
Jiyong Park9335a262018-12-24 11:31:58 +09002487 `)
2488
2489 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002490 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002491
2492 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2493 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2494 "vendor/foo/devkeys/testkey.avbpubkey")
2495 }
2496 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2497 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2498 "vendor/foo/devkeys/testkey.pem")
2499 }
2500
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002501 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002502 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002503 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002504 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002505 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002506 }
2507}
Jiyong Park58e364a2019-01-19 19:24:06 +09002508
Jooyung Hanf121a652019-12-17 14:30:11 +09002509func TestCertificate(t *testing.T) {
2510 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2511 ctx, _ := testApex(t, `
2512 apex {
2513 name: "myapex",
2514 key: "myapex.key",
2515 }
2516 apex_key {
2517 name: "myapex.key",
2518 public_key: "testkey.avbpubkey",
2519 private_key: "testkey.pem",
2520 }`)
2521 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2522 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2523 if actual := rule.Args["certificates"]; actual != expected {
2524 t.Errorf("certificates should be %q, not %q", expected, actual)
2525 }
2526 })
2527 t.Run("override when unspecified", func(t *testing.T) {
2528 ctx, _ := testApex(t, `
2529 apex {
2530 name: "myapex_keytest",
2531 key: "myapex.key",
2532 file_contexts: ":myapex-file_contexts",
2533 }
2534 apex_key {
2535 name: "myapex.key",
2536 public_key: "testkey.avbpubkey",
2537 private_key: "testkey.pem",
2538 }
2539 android_app_certificate {
2540 name: "myapex.certificate.override",
2541 certificate: "testkey.override",
2542 }`)
2543 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2544 expected := "testkey.override.x509.pem testkey.override.pk8"
2545 if actual := rule.Args["certificates"]; actual != expected {
2546 t.Errorf("certificates should be %q, not %q", expected, actual)
2547 }
2548 })
2549 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2550 ctx, _ := testApex(t, `
2551 apex {
2552 name: "myapex",
2553 key: "myapex.key",
2554 certificate: ":myapex.certificate",
2555 }
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561 android_app_certificate {
2562 name: "myapex.certificate",
2563 certificate: "testkey",
2564 }`)
2565 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2566 expected := "testkey.x509.pem testkey.pk8"
2567 if actual := rule.Args["certificates"]; actual != expected {
2568 t.Errorf("certificates should be %q, not %q", expected, actual)
2569 }
2570 })
2571 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2572 ctx, _ := testApex(t, `
2573 apex {
2574 name: "myapex_keytest",
2575 key: "myapex.key",
2576 file_contexts: ":myapex-file_contexts",
2577 certificate: ":myapex.certificate",
2578 }
2579 apex_key {
2580 name: "myapex.key",
2581 public_key: "testkey.avbpubkey",
2582 private_key: "testkey.pem",
2583 }
2584 android_app_certificate {
2585 name: "myapex.certificate.override",
2586 certificate: "testkey.override",
2587 }`)
2588 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2589 expected := "testkey.override.x509.pem testkey.override.pk8"
2590 if actual := rule.Args["certificates"]; actual != expected {
2591 t.Errorf("certificates should be %q, not %q", expected, actual)
2592 }
2593 })
2594 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2595 ctx, _ := testApex(t, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 certificate: "testkey",
2600 }
2601 apex_key {
2602 name: "myapex.key",
2603 public_key: "testkey.avbpubkey",
2604 private_key: "testkey.pem",
2605 }`)
2606 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2607 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2608 if actual := rule.Args["certificates"]; actual != expected {
2609 t.Errorf("certificates should be %q, not %q", expected, actual)
2610 }
2611 })
2612 t.Run("override when specified as <name>", func(t *testing.T) {
2613 ctx, _ := testApex(t, `
2614 apex {
2615 name: "myapex_keytest",
2616 key: "myapex.key",
2617 file_contexts: ":myapex-file_contexts",
2618 certificate: "testkey",
2619 }
2620 apex_key {
2621 name: "myapex.key",
2622 public_key: "testkey.avbpubkey",
2623 private_key: "testkey.pem",
2624 }
2625 android_app_certificate {
2626 name: "myapex.certificate.override",
2627 certificate: "testkey.override",
2628 }`)
2629 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2630 expected := "testkey.override.x509.pem testkey.override.pk8"
2631 if actual := rule.Args["certificates"]; actual != expected {
2632 t.Errorf("certificates should be %q, not %q", expected, actual)
2633 }
2634 })
2635}
2636
Jiyong Park58e364a2019-01-19 19:24:06 +09002637func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002638 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002639 apex {
2640 name: "myapex",
2641 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002642 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002643 }
2644
2645 apex {
2646 name: "otherapex",
2647 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002648 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002649 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002650 }
2651
2652 apex_key {
2653 name: "myapex.key",
2654 public_key: "testkey.avbpubkey",
2655 private_key: "testkey.pem",
2656 }
2657
2658 cc_library {
2659 name: "mylib",
2660 srcs: ["mylib.cpp"],
2661 system_shared_libs: [],
2662 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002663 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002664 "myapex",
2665 "otherapex",
2666 ],
Jooyung Han24282772020-03-21 23:20:55 +09002667 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002668 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002669 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002670 cc_library {
2671 name: "mylib2",
2672 srcs: ["mylib.cpp"],
2673 system_shared_libs: [],
2674 stl: "none",
2675 apex_available: [
2676 "myapex",
2677 "otherapex",
2678 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002679 static_libs: ["mylib3"],
2680 recovery_available: true,
2681 min_sdk_version: "29",
2682 }
2683 cc_library {
2684 name: "mylib3",
2685 srcs: ["mylib.cpp"],
2686 system_shared_libs: [],
2687 stl: "none",
2688 apex_available: [
2689 "myapex",
2690 "otherapex",
2691 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002692 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002693 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002694 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002695 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002696 `)
2697
Jooyung Hanc87a0592020-03-02 17:44:33 +09002698 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002699 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002700 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002701 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002702
Jooyung Hanccce2f22020-03-07 03:45:53 +09002703 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002704 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002705 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002706 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002707 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002708
Jooyung Hanccce2f22020-03-07 03:45:53 +09002709 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002710 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002711 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002712 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002714
Colin Crossaede88c2020-08-11 12:17:01 -07002715 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2716 // each variant defines additional macros to distinguish which apex variant it is built for
2717
2718 // non-APEX variant does not have __ANDROID_APEX__ defined
2719 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2720 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2721
2722 // APEX variant has __ANDROID_APEX__ defined
2723 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2724 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2725 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2726 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2727
2728 // APEX variant has __ANDROID_APEX__ defined
2729 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2730 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2731 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2732 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2733
2734 // recovery variant does not set __ANDROID_SDK_VERSION__
2735 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2736 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2737 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2738
2739 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2740 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002741
2742 // non-APEX variant does not have __ANDROID_APEX__ defined
2743 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2744 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2745
2746 // APEX variant has __ANDROID_APEX__ defined
2747 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002748 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002749 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002750 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002751
Jooyung Hanc87a0592020-03-02 17:44:33 +09002752 // APEX variant has __ANDROID_APEX__ defined
2753 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002754 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002755 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002756 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002757
2758 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002759 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002760 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2761 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002762}
Jiyong Park7e636d02019-01-28 16:16:54 +09002763
2764func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002765 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002766 apex {
2767 name: "myapex",
2768 key: "myapex.key",
2769 native_shared_libs: ["mylib"],
2770 }
2771
2772 apex_key {
2773 name: "myapex.key",
2774 public_key: "testkey.avbpubkey",
2775 private_key: "testkey.pem",
2776 }
2777
2778 cc_library_headers {
2779 name: "mylib_headers",
2780 export_include_dirs: ["my_include"],
2781 system_shared_libs: [],
2782 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002783 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002784 }
2785
2786 cc_library {
2787 name: "mylib",
2788 srcs: ["mylib.cpp"],
2789 system_shared_libs: [],
2790 stl: "none",
2791 header_libs: ["mylib_headers"],
2792 export_header_lib_headers: ["mylib_headers"],
2793 stubs: {
2794 versions: ["1", "2", "3"],
2795 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002796 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002797 }
2798
2799 cc_library {
2800 name: "otherlib",
2801 srcs: ["mylib.cpp"],
2802 system_shared_libs: [],
2803 stl: "none",
2804 shared_libs: ["mylib"],
2805 }
2806 `)
2807
Colin Cross7113d202019-11-20 16:39:12 -08002808 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002809
2810 // Ensure that the include path of the header lib is exported to 'otherlib'
2811 ensureContains(t, cFlags, "-Imy_include")
2812}
Alex Light9670d332019-01-29 18:07:33 -08002813
Jiyong Park7cd10e32020-01-14 09:22:18 +09002814type fileInApex struct {
2815 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002816 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002817 isLink bool
2818}
2819
Jooyung Hana57af4a2020-01-23 05:36:59 +00002820func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002821 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002822 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002823 copyCmds := apexRule.Args["copy_commands"]
2824 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002825 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002826 for _, cmd := range strings.Split(copyCmds, "&&") {
2827 cmd = strings.TrimSpace(cmd)
2828 if cmd == "" {
2829 continue
2830 }
2831 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002832 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002833 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002834 switch terms[0] {
2835 case "mkdir":
2836 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002837 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002838 t.Fatal("copyCmds contains invalid cp command", cmd)
2839 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002840 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002841 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002842 isLink = false
2843 case "ln":
2844 if len(terms) != 3 && len(terms) != 4 {
2845 // ln LINK TARGET or ln -s LINK TARGET
2846 t.Fatal("copyCmds contains invalid ln command", cmd)
2847 }
2848 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002849 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002850 isLink = true
2851 default:
2852 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2853 }
2854 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002855 index := strings.Index(dst, imageApexDir)
2856 if index == -1 {
2857 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2858 }
2859 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002860 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002861 }
2862 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002863 return ret
2864}
2865
Jooyung Hana57af4a2020-01-23 05:36:59 +00002866func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2867 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002868 var failed bool
2869 var surplus []string
2870 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002871 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002872 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002873 for _, expected := range files {
2874 if matched, _ := path.Match(expected, file.path); matched {
2875 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002876 mactchFound = true
2877 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002878 }
2879 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002880 if !mactchFound {
2881 surplus = append(surplus, file.path)
2882 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002883 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002884
Jooyung Han31c470b2019-10-18 16:26:59 +09002885 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002886 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002887 t.Log("surplus files", surplus)
2888 failed = true
2889 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002890
2891 if len(files) > len(filesMatched) {
2892 var missing []string
2893 for _, expected := range files {
2894 if !filesMatched[expected] {
2895 missing = append(missing, expected)
2896 }
2897 }
2898 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002899 t.Log("missing files", missing)
2900 failed = true
2901 }
2902 if failed {
2903 t.Fail()
2904 }
2905}
2906
Jooyung Han344d5432019-08-23 11:17:39 +09002907func TestVndkApexCurrent(t *testing.T) {
2908 ctx, _ := testApex(t, `
2909 apex_vndk {
2910 name: "myapex",
2911 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002912 }
2913
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919
2920 cc_library {
2921 name: "libvndk",
2922 srcs: ["mylib.cpp"],
2923 vendor_available: true,
2924 vndk: {
2925 enabled: true,
2926 },
2927 system_shared_libs: [],
2928 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002929 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002930 }
2931
2932 cc_library {
2933 name: "libvndksp",
2934 srcs: ["mylib.cpp"],
2935 vendor_available: true,
2936 vndk: {
2937 enabled: true,
2938 support_system_process: true,
2939 },
2940 system_shared_libs: [],
2941 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002942 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002943 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002944 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002945
Jooyung Hana57af4a2020-01-23 05:36:59 +00002946 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002947 "lib/libvndk.so",
2948 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002949 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002950 "lib64/libvndk.so",
2951 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002952 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002953 "etc/llndk.libraries.VER.txt",
2954 "etc/vndkcore.libraries.VER.txt",
2955 "etc/vndksp.libraries.VER.txt",
2956 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002957 })
Jooyung Han344d5432019-08-23 11:17:39 +09002958}
2959
2960func TestVndkApexWithPrebuilt(t *testing.T) {
2961 ctx, _ := testApex(t, `
2962 apex_vndk {
2963 name: "myapex",
2964 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002965 }
2966
2967 apex_key {
2968 name: "myapex.key",
2969 public_key: "testkey.avbpubkey",
2970 private_key: "testkey.pem",
2971 }
2972
2973 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002974 name: "libvndk",
2975 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002976 vendor_available: true,
2977 vndk: {
2978 enabled: true,
2979 },
2980 system_shared_libs: [],
2981 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002982 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002983 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002984
2985 cc_prebuilt_library_shared {
2986 name: "libvndk.arm",
2987 srcs: ["libvndk.arm.so"],
2988 vendor_available: true,
2989 vndk: {
2990 enabled: true,
2991 },
2992 enabled: false,
2993 arch: {
2994 arm: {
2995 enabled: true,
2996 },
2997 },
2998 system_shared_libs: [],
2999 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003000 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003001 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003002 `+vndkLibrariesTxtFiles("current"),
3003 withFiles(map[string][]byte{
3004 "libvndk.so": nil,
3005 "libvndk.arm.so": nil,
3006 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003007
Jooyung Hana57af4a2020-01-23 05:36:59 +00003008 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003009 "lib/libvndk.so",
3010 "lib/libvndk.arm.so",
3011 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003012 "lib/libc++.so",
3013 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003014 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003015 })
Jooyung Han344d5432019-08-23 11:17:39 +09003016}
3017
Jooyung Han39edb6c2019-11-06 16:53:07 +09003018func vndkLibrariesTxtFiles(vers ...string) (result string) {
3019 for _, v := range vers {
3020 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003021 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003022 result += `
3023 vndk_libraries_txt {
3024 name: "` + txt + `.libraries.txt",
3025 }
3026 `
3027 }
3028 } else {
3029 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3030 result += `
3031 prebuilt_etc {
3032 name: "` + txt + `.libraries.` + v + `.txt",
3033 src: "dummy.txt",
3034 }
3035 `
3036 }
3037 }
3038 }
3039 return
3040}
3041
Jooyung Han344d5432019-08-23 11:17:39 +09003042func TestVndkApexVersion(t *testing.T) {
3043 ctx, _ := testApex(t, `
3044 apex_vndk {
3045 name: "myapex_v27",
3046 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003047 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003048 vndk_version: "27",
3049 }
3050
3051 apex_key {
3052 name: "myapex.key",
3053 public_key: "testkey.avbpubkey",
3054 private_key: "testkey.pem",
3055 }
3056
Jooyung Han31c470b2019-10-18 16:26:59 +09003057 vndk_prebuilt_shared {
3058 name: "libvndk27",
3059 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003060 vendor_available: true,
3061 vndk: {
3062 enabled: true,
3063 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003064 target_arch: "arm64",
3065 arch: {
3066 arm: {
3067 srcs: ["libvndk27_arm.so"],
3068 },
3069 arm64: {
3070 srcs: ["libvndk27_arm64.so"],
3071 },
3072 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003073 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003074 }
3075
3076 vndk_prebuilt_shared {
3077 name: "libvndk27",
3078 version: "27",
3079 vendor_available: true,
3080 vndk: {
3081 enabled: true,
3082 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003083 target_arch: "x86_64",
3084 arch: {
3085 x86: {
3086 srcs: ["libvndk27_x86.so"],
3087 },
3088 x86_64: {
3089 srcs: ["libvndk27_x86_64.so"],
3090 },
3091 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003092 }
3093 `+vndkLibrariesTxtFiles("27"),
3094 withFiles(map[string][]byte{
3095 "libvndk27_arm.so": nil,
3096 "libvndk27_arm64.so": nil,
3097 "libvndk27_x86.so": nil,
3098 "libvndk27_x86_64.so": nil,
3099 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003100
Jooyung Hana57af4a2020-01-23 05:36:59 +00003101 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003102 "lib/libvndk27_arm.so",
3103 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003104 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003105 })
Jooyung Han344d5432019-08-23 11:17:39 +09003106}
3107
3108func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3109 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3110 apex_vndk {
3111 name: "myapex_v27",
3112 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003113 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003114 vndk_version: "27",
3115 }
3116 apex_vndk {
3117 name: "myapex_v27_other",
3118 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003119 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003120 vndk_version: "27",
3121 }
3122
3123 apex_key {
3124 name: "myapex.key",
3125 public_key: "testkey.avbpubkey",
3126 private_key: "testkey.pem",
3127 }
3128
3129 cc_library {
3130 name: "libvndk",
3131 srcs: ["mylib.cpp"],
3132 vendor_available: true,
3133 vndk: {
3134 enabled: true,
3135 },
3136 system_shared_libs: [],
3137 stl: "none",
3138 }
3139
3140 vndk_prebuilt_shared {
3141 name: "libvndk",
3142 version: "27",
3143 vendor_available: true,
3144 vndk: {
3145 enabled: true,
3146 },
3147 srcs: ["libvndk.so"],
3148 }
3149 `, withFiles(map[string][]byte{
3150 "libvndk.so": nil,
3151 }))
3152}
3153
Jooyung Han90eee022019-10-01 20:02:42 +09003154func TestVndkApexNameRule(t *testing.T) {
3155 ctx, _ := testApex(t, `
3156 apex_vndk {
3157 name: "myapex",
3158 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003159 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003160 }
3161 apex_vndk {
3162 name: "myapex_v28",
3163 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003164 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003165 vndk_version: "28",
3166 }
3167 apex_key {
3168 name: "myapex.key",
3169 public_key: "testkey.avbpubkey",
3170 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003171 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003172
3173 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003174 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003175 actual := proptools.String(bundle.properties.Apex_name)
3176 if !reflect.DeepEqual(actual, expected) {
3177 t.Errorf("Got '%v', expected '%v'", actual, expected)
3178 }
3179 }
3180
3181 assertApexName("com.android.vndk.vVER", "myapex")
3182 assertApexName("com.android.vndk.v28", "myapex_v28")
3183}
3184
Jooyung Han344d5432019-08-23 11:17:39 +09003185func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3186 ctx, _ := testApex(t, `
3187 apex_vndk {
3188 name: "myapex",
3189 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003190 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003191 }
3192
3193 apex_key {
3194 name: "myapex.key",
3195 public_key: "testkey.avbpubkey",
3196 private_key: "testkey.pem",
3197 }
3198
3199 cc_library {
3200 name: "libvndk",
3201 srcs: ["mylib.cpp"],
3202 vendor_available: true,
3203 native_bridge_supported: true,
3204 host_supported: true,
3205 vndk: {
3206 enabled: true,
3207 },
3208 system_shared_libs: [],
3209 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003210 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003211 }
Jooyung Han35155c42020-02-06 17:33:20 +09003212 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003213
Jooyung Hana57af4a2020-01-23 05:36:59 +00003214 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003215 "lib/libvndk.so",
3216 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003217 "lib/libc++.so",
3218 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003219 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003220 })
Jooyung Han344d5432019-08-23 11:17:39 +09003221}
3222
3223func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3224 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3225 apex_vndk {
3226 name: "myapex",
3227 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003228 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003229 native_bridge_supported: true,
3230 }
3231
3232 apex_key {
3233 name: "myapex.key",
3234 public_key: "testkey.avbpubkey",
3235 private_key: "testkey.pem",
3236 }
3237
3238 cc_library {
3239 name: "libvndk",
3240 srcs: ["mylib.cpp"],
3241 vendor_available: true,
3242 native_bridge_supported: true,
3243 host_supported: true,
3244 vndk: {
3245 enabled: true,
3246 },
3247 system_shared_libs: [],
3248 stl: "none",
3249 }
3250 `)
3251}
3252
Jooyung Han31c470b2019-10-18 16:26:59 +09003253func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003254 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003255 apex_vndk {
3256 name: "myapex_v27",
3257 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003258 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003259 vndk_version: "27",
3260 }
3261
3262 apex_key {
3263 name: "myapex.key",
3264 public_key: "testkey.avbpubkey",
3265 private_key: "testkey.pem",
3266 }
3267
3268 vndk_prebuilt_shared {
3269 name: "libvndk27",
3270 version: "27",
3271 target_arch: "arm",
3272 vendor_available: true,
3273 vndk: {
3274 enabled: true,
3275 },
3276 arch: {
3277 arm: {
3278 srcs: ["libvndk27.so"],
3279 }
3280 },
3281 }
3282
3283 vndk_prebuilt_shared {
3284 name: "libvndk27",
3285 version: "27",
3286 target_arch: "arm",
3287 binder32bit: true,
3288 vendor_available: true,
3289 vndk: {
3290 enabled: true,
3291 },
3292 arch: {
3293 arm: {
3294 srcs: ["libvndk27binder32.so"],
3295 }
3296 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003297 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003298 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003299 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003300 withFiles(map[string][]byte{
3301 "libvndk27.so": nil,
3302 "libvndk27binder32.so": nil,
3303 }),
3304 withBinder32bit,
3305 withTargets(map[android.OsType][]android.Target{
3306 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003307 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3308 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003309 },
3310 }),
3311 )
3312
Jooyung Hana57af4a2020-01-23 05:36:59 +00003313 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003314 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003315 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003316 })
3317}
3318
Jooyung Han45a96772020-06-15 14:59:42 +09003319func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3320 ctx, _ := testApex(t, `
3321 apex_vndk {
3322 name: "myapex",
3323 key: "myapex.key",
3324 file_contexts: ":myapex-file_contexts",
3325 }
3326
3327 apex_key {
3328 name: "myapex.key",
3329 public_key: "testkey.avbpubkey",
3330 private_key: "testkey.pem",
3331 }
3332
3333 cc_library {
3334 name: "libz",
3335 vendor_available: true,
3336 vndk: {
3337 enabled: true,
3338 },
3339 stubs: {
3340 symbol_file: "libz.map.txt",
3341 versions: ["30"],
3342 }
3343 }
3344 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3345 "libz.map.txt": nil,
3346 }))
3347
3348 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3349 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3350 ensureListEmpty(t, provideNativeLibs)
3351}
3352
Jooyung Hane1633032019-08-01 17:41:43 +09003353func TestDependenciesInApexManifest(t *testing.T) {
3354 ctx, _ := testApex(t, `
3355 apex {
3356 name: "myapex_nodep",
3357 key: "myapex.key",
3358 native_shared_libs: ["lib_nodep"],
3359 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003360 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003361 }
3362
3363 apex {
3364 name: "myapex_dep",
3365 key: "myapex.key",
3366 native_shared_libs: ["lib_dep"],
3367 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003368 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003369 }
3370
3371 apex {
3372 name: "myapex_provider",
3373 key: "myapex.key",
3374 native_shared_libs: ["libfoo"],
3375 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003376 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003377 }
3378
3379 apex {
3380 name: "myapex_selfcontained",
3381 key: "myapex.key",
3382 native_shared_libs: ["lib_dep", "libfoo"],
3383 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003384 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003385 }
3386
3387 apex_key {
3388 name: "myapex.key",
3389 public_key: "testkey.avbpubkey",
3390 private_key: "testkey.pem",
3391 }
3392
3393 cc_library {
3394 name: "lib_nodep",
3395 srcs: ["mylib.cpp"],
3396 system_shared_libs: [],
3397 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003398 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003399 }
3400
3401 cc_library {
3402 name: "lib_dep",
3403 srcs: ["mylib.cpp"],
3404 shared_libs: ["libfoo"],
3405 system_shared_libs: [],
3406 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003407 apex_available: [
3408 "myapex_dep",
3409 "myapex_provider",
3410 "myapex_selfcontained",
3411 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003412 }
3413
3414 cc_library {
3415 name: "libfoo",
3416 srcs: ["mytest.cpp"],
3417 stubs: {
3418 versions: ["1"],
3419 },
3420 system_shared_libs: [],
3421 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003422 apex_available: [
3423 "myapex_provider",
3424 "myapex_selfcontained",
3425 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003426 }
3427 `)
3428
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003429 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003430 var provideNativeLibs, requireNativeLibs []string
3431
Sundong Ahnabb64432019-10-22 13:58:29 +09003432 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003433 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3434 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003435 ensureListEmpty(t, provideNativeLibs)
3436 ensureListEmpty(t, requireNativeLibs)
3437
Sundong Ahnabb64432019-10-22 13:58:29 +09003438 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003439 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3440 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003441 ensureListEmpty(t, provideNativeLibs)
3442 ensureListContains(t, requireNativeLibs, "libfoo.so")
3443
Sundong Ahnabb64432019-10-22 13:58:29 +09003444 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003445 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3446 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003447 ensureListContains(t, provideNativeLibs, "libfoo.so")
3448 ensureListEmpty(t, requireNativeLibs)
3449
Sundong Ahnabb64432019-10-22 13:58:29 +09003450 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003451 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3452 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003453 ensureListContains(t, provideNativeLibs, "libfoo.so")
3454 ensureListEmpty(t, requireNativeLibs)
3455}
3456
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003457func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003458 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003459 apex {
3460 name: "myapex",
3461 key: "myapex.key",
3462 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003463 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003464 }
3465
3466 apex_key {
3467 name: "myapex.key",
3468 public_key: "testkey.avbpubkey",
3469 private_key: "testkey.pem",
3470 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003471
3472 cc_library {
3473 name: "mylib",
3474 srcs: ["mylib.cpp"],
3475 system_shared_libs: [],
3476 stl: "none",
3477 apex_available: [
3478 "//apex_available:platform",
3479 "myapex",
3480 ],
3481 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003482 `)
3483
Sundong Ahnabb64432019-10-22 13:58:29 +09003484 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003485 apexManifestRule := module.Rule("apexManifestRule")
3486 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3487 apexRule := module.Rule("apexRule")
3488 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003489
3490 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3491 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3492 name := apexBundle.BaseModuleName()
3493 prefix := "TARGET_"
3494 var builder strings.Builder
3495 data.Custom(&builder, name, prefix, "", data)
3496 androidMk := builder.String()
3497 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3498 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003499}
3500
Alex Light0851b882019-02-07 13:20:53 -08003501func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003502 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003503 apex {
3504 name: "myapex",
3505 key: "myapex.key",
3506 native_shared_libs: ["mylib_common"],
3507 }
3508
3509 apex_key {
3510 name: "myapex.key",
3511 public_key: "testkey.avbpubkey",
3512 private_key: "testkey.pem",
3513 }
3514
3515 cc_library {
3516 name: "mylib_common",
3517 srcs: ["mylib.cpp"],
3518 system_shared_libs: [],
3519 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003520 apex_available: [
3521 "//apex_available:platform",
3522 "myapex",
3523 ],
Alex Light0851b882019-02-07 13:20:53 -08003524 }
3525 `)
3526
Sundong Ahnabb64432019-10-22 13:58:29 +09003527 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003528 apexRule := module.Rule("apexRule")
3529 copyCmds := apexRule.Args["copy_commands"]
3530
3531 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3532 t.Log("Apex was a test apex!")
3533 t.Fail()
3534 }
3535 // Ensure that main rule creates an output
3536 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3537
3538 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003539 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003540
3541 // Ensure that both direct and indirect deps are copied into apex
3542 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3543
Colin Cross7113d202019-11-20 16:39:12 -08003544 // Ensure that the platform variant ends with _shared
3545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003546
3547 if !android.InAnyApex("mylib_common") {
3548 t.Log("Found mylib_common not in any apex!")
3549 t.Fail()
3550 }
3551}
3552
3553func TestTestApex(t *testing.T) {
3554 if android.InAnyApex("mylib_common_test") {
3555 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!")
3556 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003557 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003558 apex_test {
3559 name: "myapex",
3560 key: "myapex.key",
3561 native_shared_libs: ["mylib_common_test"],
3562 }
3563
3564 apex_key {
3565 name: "myapex.key",
3566 public_key: "testkey.avbpubkey",
3567 private_key: "testkey.pem",
3568 }
3569
3570 cc_library {
3571 name: "mylib_common_test",
3572 srcs: ["mylib.cpp"],
3573 system_shared_libs: [],
3574 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003575 // TODO: remove //apex_available:platform
3576 apex_available: [
3577 "//apex_available:platform",
3578 "myapex",
3579 ],
Alex Light0851b882019-02-07 13:20:53 -08003580 }
3581 `)
3582
Sundong Ahnabb64432019-10-22 13:58:29 +09003583 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003584 apexRule := module.Rule("apexRule")
3585 copyCmds := apexRule.Args["copy_commands"]
3586
3587 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3588 t.Log("Apex was not a test apex!")
3589 t.Fail()
3590 }
3591 // Ensure that main rule creates an output
3592 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3593
3594 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003595 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003596
3597 // Ensure that both direct and indirect deps are copied into apex
3598 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3599
Colin Cross7113d202019-11-20 16:39:12 -08003600 // Ensure that the platform variant ends with _shared
3601 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003602}
3603
Alex Light9670d332019-01-29 18:07:33 -08003604func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003605 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003606 apex {
3607 name: "myapex",
3608 key: "myapex.key",
3609 multilib: {
3610 first: {
3611 native_shared_libs: ["mylib_common"],
3612 }
3613 },
3614 target: {
3615 android: {
3616 multilib: {
3617 first: {
3618 native_shared_libs: ["mylib"],
3619 }
3620 }
3621 },
3622 host: {
3623 multilib: {
3624 first: {
3625 native_shared_libs: ["mylib2"],
3626 }
3627 }
3628 }
3629 }
3630 }
3631
3632 apex_key {
3633 name: "myapex.key",
3634 public_key: "testkey.avbpubkey",
3635 private_key: "testkey.pem",
3636 }
3637
3638 cc_library {
3639 name: "mylib",
3640 srcs: ["mylib.cpp"],
3641 system_shared_libs: [],
3642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003643 // TODO: remove //apex_available:platform
3644 apex_available: [
3645 "//apex_available:platform",
3646 "myapex",
3647 ],
Alex Light9670d332019-01-29 18:07:33 -08003648 }
3649
3650 cc_library {
3651 name: "mylib_common",
3652 srcs: ["mylib.cpp"],
3653 system_shared_libs: [],
3654 stl: "none",
3655 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003656 // TODO: remove //apex_available:platform
3657 apex_available: [
3658 "//apex_available:platform",
3659 "myapex",
3660 ],
Alex Light9670d332019-01-29 18:07:33 -08003661 }
3662
3663 cc_library {
3664 name: "mylib2",
3665 srcs: ["mylib.cpp"],
3666 system_shared_libs: [],
3667 stl: "none",
3668 compile_multilib: "first",
3669 }
3670 `)
3671
Sundong Ahnabb64432019-10-22 13:58:29 +09003672 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003673 copyCmds := apexRule.Args["copy_commands"]
3674
3675 // Ensure that main rule creates an output
3676 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3677
3678 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003679 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3680 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3681 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003682
3683 // Ensure that both direct and indirect deps are copied into apex
3684 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3685 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3686 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3687
Colin Cross7113d202019-11-20 16:39:12 -08003688 // Ensure that the platform variant ends with _shared
3689 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3690 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3691 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003692}
Jiyong Park04480cf2019-02-06 00:16:29 +09003693
3694func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003695 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003696 apex {
3697 name: "myapex",
3698 key: "myapex.key",
3699 binaries: ["myscript"],
3700 }
3701
3702 apex_key {
3703 name: "myapex.key",
3704 public_key: "testkey.avbpubkey",
3705 private_key: "testkey.pem",
3706 }
3707
3708 sh_binary {
3709 name: "myscript",
3710 src: "mylib.cpp",
3711 filename: "myscript.sh",
3712 sub_dir: "script",
3713 }
3714 `)
3715
Sundong Ahnabb64432019-10-22 13:58:29 +09003716 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003717 copyCmds := apexRule.Args["copy_commands"]
3718
3719 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3720}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003721
Jooyung Han91df2082019-11-20 01:49:42 +09003722func TestApexInVariousPartition(t *testing.T) {
3723 testcases := []struct {
3724 propName, parition, flattenedPartition string
3725 }{
3726 {"", "system", "system_ext"},
3727 {"product_specific: true", "product", "product"},
3728 {"soc_specific: true", "vendor", "vendor"},
3729 {"proprietary: true", "vendor", "vendor"},
3730 {"vendor: true", "vendor", "vendor"},
3731 {"system_ext_specific: true", "system_ext", "system_ext"},
3732 }
3733 for _, tc := range testcases {
3734 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3735 ctx, _ := testApex(t, `
3736 apex {
3737 name: "myapex",
3738 key: "myapex.key",
3739 `+tc.propName+`
3740 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003741
Jooyung Han91df2082019-11-20 01:49:42 +09003742 apex_key {
3743 name: "myapex.key",
3744 public_key: "testkey.avbpubkey",
3745 private_key: "testkey.pem",
3746 }
3747 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003748
Jooyung Han91df2082019-11-20 01:49:42 +09003749 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3750 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3751 actual := apex.installDir.String()
3752 if actual != expected {
3753 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3754 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003755
Jooyung Han91df2082019-11-20 01:49:42 +09003756 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3757 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3758 actual = flattened.installDir.String()
3759 if actual != expected {
3760 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3761 }
3762 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003763 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003764}
Jiyong Park67882562019-03-21 01:11:21 +09003765
Jooyung Han580eb4f2020-06-24 19:33:06 +09003766func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003767 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003768 apex {
3769 name: "myapex",
3770 key: "myapex.key",
3771 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003772
Jooyung Han580eb4f2020-06-24 19:33:06 +09003773 apex_key {
3774 name: "myapex.key",
3775 public_key: "testkey.avbpubkey",
3776 private_key: "testkey.pem",
3777 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003778 `)
3779 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003780 rule := module.Output("file_contexts")
3781 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3782}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003783
Jooyung Han580eb4f2020-06-24 19:33:06 +09003784func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003785 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003786 apex {
3787 name: "myapex",
3788 key: "myapex.key",
3789 file_contexts: "my_own_file_contexts",
3790 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003791
Jooyung Han580eb4f2020-06-24 19:33:06 +09003792 apex_key {
3793 name: "myapex.key",
3794 public_key: "testkey.avbpubkey",
3795 private_key: "testkey.pem",
3796 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003797 `, withFiles(map[string][]byte{
3798 "my_own_file_contexts": nil,
3799 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003800}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003801
Jooyung Han580eb4f2020-06-24 19:33:06 +09003802func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003803 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003804 apex {
3805 name: "myapex",
3806 key: "myapex.key",
3807 product_specific: true,
3808 file_contexts: "product_specific_file_contexts",
3809 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003810
Jooyung Han580eb4f2020-06-24 19:33:06 +09003811 apex_key {
3812 name: "myapex.key",
3813 public_key: "testkey.avbpubkey",
3814 private_key: "testkey.pem",
3815 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003816 `)
3817
Jooyung Han580eb4f2020-06-24 19:33:06 +09003818 ctx, _ := testApex(t, `
3819 apex {
3820 name: "myapex",
3821 key: "myapex.key",
3822 product_specific: true,
3823 file_contexts: "product_specific_file_contexts",
3824 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003825
Jooyung Han580eb4f2020-06-24 19:33:06 +09003826 apex_key {
3827 name: "myapex.key",
3828 public_key: "testkey.avbpubkey",
3829 private_key: "testkey.pem",
3830 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003831 `, withFiles(map[string][]byte{
3832 "product_specific_file_contexts": nil,
3833 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003834 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3835 rule := module.Output("file_contexts")
3836 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3837}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003838
Jooyung Han580eb4f2020-06-24 19:33:06 +09003839func TestFileContexts_SetViaFileGroup(t *testing.T) {
3840 ctx, _ := testApex(t, `
3841 apex {
3842 name: "myapex",
3843 key: "myapex.key",
3844 product_specific: true,
3845 file_contexts: ":my-file-contexts",
3846 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003847
Jooyung Han580eb4f2020-06-24 19:33:06 +09003848 apex_key {
3849 name: "myapex.key",
3850 public_key: "testkey.avbpubkey",
3851 private_key: "testkey.pem",
3852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003853
Jooyung Han580eb4f2020-06-24 19:33:06 +09003854 filegroup {
3855 name: "my-file-contexts",
3856 srcs: ["product_specific_file_contexts"],
3857 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003858 `, withFiles(map[string][]byte{
3859 "product_specific_file_contexts": nil,
3860 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003861 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3862 rule := module.Output("file_contexts")
3863 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003864}
3865
Jiyong Park67882562019-03-21 01:11:21 +09003866func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003867 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003868 apex_key {
3869 name: "myapex.key",
3870 public_key: ":my.avbpubkey",
3871 private_key: ":my.pem",
3872 product_specific: true,
3873 }
3874
3875 filegroup {
3876 name: "my.avbpubkey",
3877 srcs: ["testkey2.avbpubkey"],
3878 }
3879
3880 filegroup {
3881 name: "my.pem",
3882 srcs: ["testkey2.pem"],
3883 }
3884 `)
3885
3886 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3887 expected_pubkey := "testkey2.avbpubkey"
3888 actual_pubkey := apex_key.public_key_file.String()
3889 if actual_pubkey != expected_pubkey {
3890 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3891 }
3892 expected_privkey := "testkey2.pem"
3893 actual_privkey := apex_key.private_key_file.String()
3894 if actual_privkey != expected_privkey {
3895 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3896 }
3897}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003898
3899func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003900 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003901 prebuilt_apex {
3902 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003903 arch: {
3904 arm64: {
3905 src: "myapex-arm64.apex",
3906 },
3907 arm: {
3908 src: "myapex-arm.apex",
3909 },
3910 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003911 }
3912 `)
3913
3914 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3915
Jiyong Parkc95714e2019-03-29 14:23:10 +09003916 expectedInput := "myapex-arm64.apex"
3917 if prebuilt.inputApex.String() != expectedInput {
3918 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3919 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003920}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003921
3922func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003923 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003924 prebuilt_apex {
3925 name: "myapex",
3926 src: "myapex-arm.apex",
3927 filename: "notmyapex.apex",
3928 }
3929 `)
3930
3931 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3932
3933 expected := "notmyapex.apex"
3934 if p.installFilename != expected {
3935 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3936 }
3937}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003938
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003939func TestPrebuiltOverrides(t *testing.T) {
3940 ctx, config := testApex(t, `
3941 prebuilt_apex {
3942 name: "myapex.prebuilt",
3943 src: "myapex-arm.apex",
3944 overrides: [
3945 "myapex",
3946 ],
3947 }
3948 `)
3949
3950 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3951
3952 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003953 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003954 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003955 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003956 }
3957}
3958
Roland Levillain630846d2019-06-26 12:48:34 +01003959func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003960 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003961 apex_test {
3962 name: "myapex",
3963 key: "myapex.key",
3964 tests: [
3965 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003966 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003967 ],
3968 }
3969
3970 apex_key {
3971 name: "myapex.key",
3972 public_key: "testkey.avbpubkey",
3973 private_key: "testkey.pem",
3974 }
3975
Liz Kammer1c14a212020-05-12 15:26:55 -07003976 filegroup {
3977 name: "fg",
3978 srcs: [
3979 "baz",
3980 "bar/baz"
3981 ],
3982 }
3983
Roland Levillain630846d2019-06-26 12:48:34 +01003984 cc_test {
3985 name: "mytest",
3986 gtest: false,
3987 srcs: ["mytest.cpp"],
3988 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003989 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003990 system_shared_libs: [],
3991 static_executable: true,
3992 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003993 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003994 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003995
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003996 cc_library {
3997 name: "mylib",
3998 srcs: ["mylib.cpp"],
3999 system_shared_libs: [],
4000 stl: "none",
4001 }
4002
Liz Kammer5bd365f2020-05-27 15:15:11 -07004003 filegroup {
4004 name: "fg2",
4005 srcs: [
4006 "testdata/baz"
4007 ],
4008 }
4009
Roland Levillain9b5fde92019-06-28 15:41:19 +01004010 cc_test {
4011 name: "mytests",
4012 gtest: false,
4013 srcs: [
4014 "mytest1.cpp",
4015 "mytest2.cpp",
4016 "mytest3.cpp",
4017 ],
4018 test_per_src: true,
4019 relative_install_path: "test",
4020 system_shared_libs: [],
4021 static_executable: true,
4022 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004023 data: [
4024 ":fg",
4025 ":fg2",
4026 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004027 }
Roland Levillain630846d2019-06-26 12:48:34 +01004028 `)
4029
Sundong Ahnabb64432019-10-22 13:58:29 +09004030 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004031 copyCmds := apexRule.Args["copy_commands"]
4032
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004033 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004034 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004035 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004036
Liz Kammer1c14a212020-05-12 15:26:55 -07004037 //Ensure that test data are copied into apex.
4038 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4039 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4040
Roland Levillain9b5fde92019-06-28 15:41:19 +01004041 // Ensure that test deps built with `test_per_src` are copied into apex.
4042 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4043 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4044 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004045
4046 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004047 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4048 data := android.AndroidMkDataForTest(t, config, "", bundle)
4049 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004050 prefix := "TARGET_"
4051 var builder strings.Builder
4052 data.Custom(&builder, name, prefix, "", data)
4053 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004054 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4055 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4056 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4057 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004058 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004059 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004060 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004061
4062 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4063 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4064 data.Custom(&builder, name, prefix, "", data)
4065 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004066 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4067 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004068}
4069
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004070func TestInstallExtraFlattenedApexes(t *testing.T) {
4071 ctx, config := testApex(t, `
4072 apex {
4073 name: "myapex",
4074 key: "myapex.key",
4075 }
4076 apex_key {
4077 name: "myapex.key",
4078 public_key: "testkey.avbpubkey",
4079 private_key: "testkey.pem",
4080 }
4081 `, func(fs map[string][]byte, config android.Config) {
4082 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4083 })
4084 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004085 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004086 mk := android.AndroidMkDataForTest(t, config, "", ab)
4087 var builder strings.Builder
4088 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4089 androidMk := builder.String()
4090 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4091}
4092
Jooyung Han5c998b92019-06-27 11:30:33 +09004093func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004094 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004095 apex {
4096 name: "myapex",
4097 key: "myapex.key",
4098 native_shared_libs: ["mylib"],
4099 uses: ["commonapex"],
4100 }
4101
4102 apex {
4103 name: "commonapex",
4104 key: "myapex.key",
4105 native_shared_libs: ["libcommon"],
4106 provide_cpp_shared_libs: true,
4107 }
4108
4109 apex_key {
4110 name: "myapex.key",
4111 public_key: "testkey.avbpubkey",
4112 private_key: "testkey.pem",
4113 }
4114
4115 cc_library {
4116 name: "mylib",
4117 srcs: ["mylib.cpp"],
4118 shared_libs: ["libcommon"],
4119 system_shared_libs: [],
4120 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004121 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004122 }
4123
4124 cc_library {
4125 name: "libcommon",
4126 srcs: ["mylib_common.cpp"],
4127 system_shared_libs: [],
4128 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004129 // TODO: remove //apex_available:platform
4130 apex_available: [
4131 "//apex_available:platform",
4132 "commonapex",
4133 "myapex",
4134 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004135 }
4136 `)
4137
Sundong Ahnabb64432019-10-22 13:58:29 +09004138 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004139 apexRule1 := module1.Rule("apexRule")
4140 copyCmds1 := apexRule1.Args["copy_commands"]
4141
Sundong Ahnabb64432019-10-22 13:58:29 +09004142 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004143 apexRule2 := module2.Rule("apexRule")
4144 copyCmds2 := apexRule2.Args["copy_commands"]
4145
Colin Crossaede88c2020-08-11 12:17:01 -07004146 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4147 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004148 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4149 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4150 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4151}
4152
4153func TestApexUsesFailsIfNotProvided(t *testing.T) {
4154 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4155 apex {
4156 name: "myapex",
4157 key: "myapex.key",
4158 uses: ["commonapex"],
4159 }
4160
4161 apex {
4162 name: "commonapex",
4163 key: "myapex.key",
4164 }
4165
4166 apex_key {
4167 name: "myapex.key",
4168 public_key: "testkey.avbpubkey",
4169 private_key: "testkey.pem",
4170 }
4171 `)
4172 testApexError(t, `uses: "commonapex" is not a provider`, `
4173 apex {
4174 name: "myapex",
4175 key: "myapex.key",
4176 uses: ["commonapex"],
4177 }
4178
4179 cc_library {
4180 name: "commonapex",
4181 system_shared_libs: [],
4182 stl: "none",
4183 }
4184
4185 apex_key {
4186 name: "myapex.key",
4187 public_key: "testkey.avbpubkey",
4188 private_key: "testkey.pem",
4189 }
4190 `)
4191}
4192
4193func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4194 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4195 apex {
4196 name: "myapex",
4197 key: "myapex.key",
4198 use_vendor: true,
4199 uses: ["commonapex"],
4200 }
4201
4202 apex {
4203 name: "commonapex",
4204 key: "myapex.key",
4205 provide_cpp_shared_libs: true,
4206 }
4207
4208 apex_key {
4209 name: "myapex.key",
4210 public_key: "testkey.avbpubkey",
4211 private_key: "testkey.pem",
4212 }
Jooyung Handc782442019-11-01 03:14:38 +09004213 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004214 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004215 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004216}
4217
Jooyung Hand48f3c32019-08-23 11:18:57 +09004218func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4219 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4220 apex {
4221 name: "myapex",
4222 key: "myapex.key",
4223 native_shared_libs: ["libfoo"],
4224 }
4225
4226 apex_key {
4227 name: "myapex.key",
4228 public_key: "testkey.avbpubkey",
4229 private_key: "testkey.pem",
4230 }
4231
4232 cc_library {
4233 name: "libfoo",
4234 stl: "none",
4235 system_shared_libs: [],
4236 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004237 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004238 }
4239 `)
4240 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4241 apex {
4242 name: "myapex",
4243 key: "myapex.key",
4244 java_libs: ["myjar"],
4245 }
4246
4247 apex_key {
4248 name: "myapex.key",
4249 public_key: "testkey.avbpubkey",
4250 private_key: "testkey.pem",
4251 }
4252
4253 java_library {
4254 name: "myjar",
4255 srcs: ["foo/bar/MyClass.java"],
4256 sdk_version: "none",
4257 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004258 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004259 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004260 }
4261 `)
4262}
4263
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004264func TestApexWithApps(t *testing.T) {
4265 ctx, _ := testApex(t, `
4266 apex {
4267 name: "myapex",
4268 key: "myapex.key",
4269 apps: [
4270 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004271 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004272 ],
4273 }
4274
4275 apex_key {
4276 name: "myapex.key",
4277 public_key: "testkey.avbpubkey",
4278 private_key: "testkey.pem",
4279 }
4280
4281 android_app {
4282 name: "AppFoo",
4283 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004284 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004285 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004286 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004287 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004288 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004289 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004290
4291 android_app {
4292 name: "AppFooPriv",
4293 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004294 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004295 system_modules: "none",
4296 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004297 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004298 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004299 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004300
4301 cc_library_shared {
4302 name: "libjni",
4303 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004304 shared_libs: ["libfoo"],
4305 stl: "none",
4306 system_shared_libs: [],
4307 apex_available: [ "myapex" ],
4308 sdk_version: "current",
4309 }
4310
4311 cc_library_shared {
4312 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004313 stl: "none",
4314 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004315 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004316 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004317 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004318 `)
4319
Sundong Ahnabb64432019-10-22 13:58:29 +09004320 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004321 apexRule := module.Rule("apexRule")
4322 copyCmds := apexRule.Args["copy_commands"]
4323
4324 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004325 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004326
Colin Crossaede88c2020-08-11 12:17:01 -07004327 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004328 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004329 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004330 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004331 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004332 // JNI libraries including transitive deps are
4333 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004334 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004335 // ... embedded inside APK (jnilibs.zip)
4336 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4337 // ... and not directly inside the APEX
4338 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4339 }
Dario Frenicde2a032019-10-27 00:29:22 +01004340}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004341
Dario Frenicde2a032019-10-27 00:29:22 +01004342func TestApexWithAppImports(t *testing.T) {
4343 ctx, _ := testApex(t, `
4344 apex {
4345 name: "myapex",
4346 key: "myapex.key",
4347 apps: [
4348 "AppFooPrebuilt",
4349 "AppFooPrivPrebuilt",
4350 ],
4351 }
4352
4353 apex_key {
4354 name: "myapex.key",
4355 public_key: "testkey.avbpubkey",
4356 private_key: "testkey.pem",
4357 }
4358
4359 android_app_import {
4360 name: "AppFooPrebuilt",
4361 apk: "PrebuiltAppFoo.apk",
4362 presigned: true,
4363 dex_preopt: {
4364 enabled: false,
4365 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004366 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004367 }
4368
4369 android_app_import {
4370 name: "AppFooPrivPrebuilt",
4371 apk: "PrebuiltAppFooPriv.apk",
4372 privileged: true,
4373 presigned: true,
4374 dex_preopt: {
4375 enabled: false,
4376 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004377 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004378 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004379 }
4380 `)
4381
Sundong Ahnabb64432019-10-22 13:58:29 +09004382 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004383 apexRule := module.Rule("apexRule")
4384 copyCmds := apexRule.Args["copy_commands"]
4385
4386 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004387 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4388}
4389
4390func TestApexWithAppImportsPrefer(t *testing.T) {
4391 ctx, _ := testApex(t, `
4392 apex {
4393 name: "myapex",
4394 key: "myapex.key",
4395 apps: [
4396 "AppFoo",
4397 ],
4398 }
4399
4400 apex_key {
4401 name: "myapex.key",
4402 public_key: "testkey.avbpubkey",
4403 private_key: "testkey.pem",
4404 }
4405
4406 android_app {
4407 name: "AppFoo",
4408 srcs: ["foo/bar/MyClass.java"],
4409 sdk_version: "none",
4410 system_modules: "none",
4411 apex_available: [ "myapex" ],
4412 }
4413
4414 android_app_import {
4415 name: "AppFoo",
4416 apk: "AppFooPrebuilt.apk",
4417 filename: "AppFooPrebuilt.apk",
4418 presigned: true,
4419 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004420 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004421 }
4422 `, withFiles(map[string][]byte{
4423 "AppFooPrebuilt.apk": nil,
4424 }))
4425
4426 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4427 "app/AppFoo/AppFooPrebuilt.apk",
4428 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004429}
4430
Dario Freni6f3937c2019-12-20 22:58:03 +00004431func TestApexWithTestHelperApp(t *testing.T) {
4432 ctx, _ := testApex(t, `
4433 apex {
4434 name: "myapex",
4435 key: "myapex.key",
4436 apps: [
4437 "TesterHelpAppFoo",
4438 ],
4439 }
4440
4441 apex_key {
4442 name: "myapex.key",
4443 public_key: "testkey.avbpubkey",
4444 private_key: "testkey.pem",
4445 }
4446
4447 android_test_helper_app {
4448 name: "TesterHelpAppFoo",
4449 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004450 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004451 }
4452
4453 `)
4454
4455 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4456 apexRule := module.Rule("apexRule")
4457 copyCmds := apexRule.Args["copy_commands"]
4458
4459 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4460}
4461
Jooyung Han18020ea2019-11-13 10:50:48 +09004462func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4463 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004464 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004465 apex {
4466 name: "myapex",
4467 key: "myapex.key",
4468 native_shared_libs: ["libfoo"],
4469 }
4470
4471 apex_key {
4472 name: "myapex.key",
4473 public_key: "testkey.avbpubkey",
4474 private_key: "testkey.pem",
4475 }
4476
4477 apex {
4478 name: "otherapex",
4479 key: "myapex.key",
4480 native_shared_libs: ["libfoo"],
4481 }
4482
4483 cc_defaults {
4484 name: "libfoo-defaults",
4485 apex_available: ["otherapex"],
4486 }
4487
4488 cc_library {
4489 name: "libfoo",
4490 defaults: ["libfoo-defaults"],
4491 stl: "none",
4492 system_shared_libs: [],
4493 }`)
4494}
4495
Paul Duffine52e66f2020-03-30 17:54:29 +01004496func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004497 // libfoo is not available to myapex, but only to otherapex
4498 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4499 apex {
4500 name: "myapex",
4501 key: "myapex.key",
4502 native_shared_libs: ["libfoo"],
4503 }
4504
4505 apex_key {
4506 name: "myapex.key",
4507 public_key: "testkey.avbpubkey",
4508 private_key: "testkey.pem",
4509 }
4510
4511 apex {
4512 name: "otherapex",
4513 key: "otherapex.key",
4514 native_shared_libs: ["libfoo"],
4515 }
4516
4517 apex_key {
4518 name: "otherapex.key",
4519 public_key: "testkey.avbpubkey",
4520 private_key: "testkey.pem",
4521 }
4522
4523 cc_library {
4524 name: "libfoo",
4525 stl: "none",
4526 system_shared_libs: [],
4527 apex_available: ["otherapex"],
4528 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004529}
Jiyong Park127b40b2019-09-30 16:04:35 +09004530
Paul Duffine52e66f2020-03-30 17:54:29 +01004531func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004532 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004533 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004534.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004535.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004536.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004537.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004538.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004539.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004540 apex {
4541 name: "myapex",
4542 key: "myapex.key",
4543 native_shared_libs: ["libfoo"],
4544 }
4545
4546 apex_key {
4547 name: "myapex.key",
4548 public_key: "testkey.avbpubkey",
4549 private_key: "testkey.pem",
4550 }
4551
Jiyong Park127b40b2019-09-30 16:04:35 +09004552 cc_library {
4553 name: "libfoo",
4554 stl: "none",
4555 shared_libs: ["libbar"],
4556 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004557 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004558 }
4559
4560 cc_library {
4561 name: "libbar",
4562 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004563 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004564 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004565 apex_available: ["myapex"],
4566 }
4567
4568 cc_library {
4569 name: "libbaz",
4570 stl: "none",
4571 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004572 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004573}
Jiyong Park127b40b2019-09-30 16:04:35 +09004574
Paul Duffine52e66f2020-03-30 17:54:29 +01004575func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004576 testApexError(t, "\"otherapex\" is not a valid module name", `
4577 apex {
4578 name: "myapex",
4579 key: "myapex.key",
4580 native_shared_libs: ["libfoo"],
4581 }
4582
4583 apex_key {
4584 name: "myapex.key",
4585 public_key: "testkey.avbpubkey",
4586 private_key: "testkey.pem",
4587 }
4588
4589 cc_library {
4590 name: "libfoo",
4591 stl: "none",
4592 system_shared_libs: [],
4593 apex_available: ["otherapex"],
4594 }`)
4595
Paul Duffine52e66f2020-03-30 17:54:29 +01004596 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004597 apex {
4598 name: "myapex",
4599 key: "myapex.key",
4600 native_shared_libs: ["libfoo", "libbar"],
4601 }
4602
4603 apex_key {
4604 name: "myapex.key",
4605 public_key: "testkey.avbpubkey",
4606 private_key: "testkey.pem",
4607 }
4608
4609 cc_library {
4610 name: "libfoo",
4611 stl: "none",
4612 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004613 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004614 apex_available: ["myapex"],
4615 }
4616
4617 cc_library {
4618 name: "libbar",
4619 stl: "none",
4620 system_shared_libs: [],
4621 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004622 }
4623
4624 cc_library {
4625 name: "libbaz",
4626 stl: "none",
4627 system_shared_libs: [],
4628 stubs: {
4629 versions: ["10", "20", "30"],
4630 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004631 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004632}
Jiyong Park127b40b2019-09-30 16:04:35 +09004633
Jiyong Park89e850a2020-04-07 16:37:39 +09004634func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004635 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004636 apex {
4637 name: "myapex",
4638 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004639 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004640 }
4641
4642 apex_key {
4643 name: "myapex.key",
4644 public_key: "testkey.avbpubkey",
4645 private_key: "testkey.pem",
4646 }
4647
4648 cc_library {
4649 name: "libfoo",
4650 stl: "none",
4651 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004652 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004653 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004654 }
4655
4656 cc_library {
4657 name: "libfoo2",
4658 stl: "none",
4659 system_shared_libs: [],
4660 shared_libs: ["libbaz"],
4661 apex_available: ["//apex_available:platform"],
4662 }
4663
4664 cc_library {
4665 name: "libbar",
4666 stl: "none",
4667 system_shared_libs: [],
4668 apex_available: ["myapex"],
4669 }
4670
4671 cc_library {
4672 name: "libbaz",
4673 stl: "none",
4674 system_shared_libs: [],
4675 apex_available: ["myapex"],
4676 stubs: {
4677 versions: ["1"],
4678 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004679 }`)
4680
Jiyong Park89e850a2020-04-07 16:37:39 +09004681 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4682 // because it depends on libbar which isn't available to platform
4683 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4684 if libfoo.NotAvailableForPlatform() != true {
4685 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4686 }
4687
4688 // libfoo2 however can be available to platform because it depends on libbaz which provides
4689 // stubs
4690 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4691 if libfoo2.NotAvailableForPlatform() == true {
4692 t.Errorf("%q should be available to platform", libfoo2.String())
4693 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004694}
Jiyong Parka90ca002019-10-07 15:47:24 +09004695
Paul Duffine52e66f2020-03-30 17:54:29 +01004696func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004697 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004698 apex {
4699 name: "myapex",
4700 key: "myapex.key",
4701 native_shared_libs: ["libfoo"],
4702 }
4703
4704 apex_key {
4705 name: "myapex.key",
4706 public_key: "testkey.avbpubkey",
4707 private_key: "testkey.pem",
4708 }
4709
4710 cc_library {
4711 name: "libfoo",
4712 stl: "none",
4713 system_shared_libs: [],
4714 apex_available: ["myapex"],
4715 static: {
4716 apex_available: ["//apex_available:platform"],
4717 },
4718 }`)
4719
Jiyong Park89e850a2020-04-07 16:37:39 +09004720 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4721 if libfooShared.NotAvailableForPlatform() != true {
4722 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4723 }
4724 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4725 if libfooStatic.NotAvailableForPlatform() != false {
4726 t.Errorf("%q should be available to platform", libfooStatic.String())
4727 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004728}
4729
Jiyong Park5d790c32019-11-15 18:40:32 +09004730func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004731 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004732 apex {
4733 name: "myapex",
4734 key: "myapex.key",
4735 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004736 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004737 }
4738
4739 override_apex {
4740 name: "override_myapex",
4741 base: "myapex",
4742 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004743 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004744 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004745 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004746 }
4747
4748 apex_key {
4749 name: "myapex.key",
4750 public_key: "testkey.avbpubkey",
4751 private_key: "testkey.pem",
4752 }
4753
4754 android_app {
4755 name: "app",
4756 srcs: ["foo/bar/MyClass.java"],
4757 package_name: "foo",
4758 sdk_version: "none",
4759 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004760 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004761 }
4762
4763 override_android_app {
4764 name: "override_app",
4765 base: "app",
4766 package_name: "bar",
4767 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004768 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004769
Jiyong Park317645e2019-12-05 13:20:58 +09004770 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4771 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4772 if originalVariant.GetOverriddenBy() != "" {
4773 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4774 }
4775 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4776 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4777 }
4778
Jiyong Park5d790c32019-11-15 18:40:32 +09004779 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4780 apexRule := module.Rule("apexRule")
4781 copyCmds := apexRule.Args["copy_commands"]
4782
4783 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004784 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004785
4786 apexBundle := module.Module().(*apexBundle)
4787 name := apexBundle.Name()
4788 if name != "override_myapex" {
4789 t.Errorf("name should be \"override_myapex\", but was %q", name)
4790 }
4791
Baligh Uddin004d7172020-02-19 21:29:28 -08004792 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4793 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4794 }
4795
Jiyong Park20bacab2020-03-03 11:45:41 +09004796 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004797 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004798
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004799 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4800 var builder strings.Builder
4801 data.Custom(&builder, name, "TARGET_", "", data)
4802 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004803 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004804 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4805 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004806 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004807 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004808 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004809 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4810 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004811}
4812
Jooyung Han214bf372019-11-12 13:03:50 +09004813func TestLegacyAndroid10Support(t *testing.T) {
4814 ctx, _ := testApex(t, `
4815 apex {
4816 name: "myapex",
4817 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004818 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004819 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004820 }
4821
4822 apex_key {
4823 name: "myapex.key",
4824 public_key: "testkey.avbpubkey",
4825 private_key: "testkey.pem",
4826 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004827
4828 cc_library {
4829 name: "mylib",
4830 srcs: ["mylib.cpp"],
4831 stl: "libc++",
4832 system_shared_libs: [],
4833 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004834 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004835 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004836 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004837
4838 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4839 args := module.Rule("apexRule").Args
4840 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004841 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004842
4843 // The copies of the libraries in the apex should have one more dependency than
4844 // the ones outside the apex, namely the unwinder. Ideally we should check
4845 // the dependency names directly here but for some reason the names are blank in
4846 // this test.
4847 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004848 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004849 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4850 if len(apexImplicits) != len(nonApexImplicits)+1 {
4851 t.Errorf("%q missing unwinder dep", lib)
4852 }
4853 }
Jooyung Han214bf372019-11-12 13:03:50 +09004854}
4855
Paul Duffin9b879592020-05-26 13:21:35 +01004856var filesForSdkLibrary = map[string][]byte{
4857 "api/current.txt": nil,
4858 "api/removed.txt": nil,
4859 "api/system-current.txt": nil,
4860 "api/system-removed.txt": nil,
4861 "api/test-current.txt": nil,
4862 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004863
4864 // For java_sdk_library_import
4865 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004866}
4867
Jooyung Han58f26ab2019-12-18 15:34:32 +09004868func TestJavaSDKLibrary(t *testing.T) {
4869 ctx, _ := testApex(t, `
4870 apex {
4871 name: "myapex",
4872 key: "myapex.key",
4873 java_libs: ["foo"],
4874 }
4875
4876 apex_key {
4877 name: "myapex.key",
4878 public_key: "testkey.avbpubkey",
4879 private_key: "testkey.pem",
4880 }
4881
4882 java_sdk_library {
4883 name: "foo",
4884 srcs: ["a.java"],
4885 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004886 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004887 }
Paul Duffin9b879592020-05-26 13:21:35 +01004888 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004889
4890 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004891 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004892 "javalib/foo.jar",
4893 "etc/permissions/foo.xml",
4894 })
4895 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004896 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4897 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004898}
4899
Paul Duffin9b879592020-05-26 13:21:35 +01004900func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4901 ctx, _ := testApex(t, `
4902 apex {
4903 name: "myapex",
4904 key: "myapex.key",
4905 java_libs: ["foo", "bar"],
4906 }
4907
4908 apex_key {
4909 name: "myapex.key",
4910 public_key: "testkey.avbpubkey",
4911 private_key: "testkey.pem",
4912 }
4913
4914 java_sdk_library {
4915 name: "foo",
4916 srcs: ["a.java"],
4917 api_packages: ["foo"],
4918 apex_available: ["myapex"],
4919 sdk_version: "none",
4920 system_modules: "none",
4921 }
4922
4923 java_library {
4924 name: "bar",
4925 srcs: ["a.java"],
4926 libs: ["foo"],
4927 apex_available: ["myapex"],
4928 sdk_version: "none",
4929 system_modules: "none",
4930 }
4931 `, withFiles(filesForSdkLibrary))
4932
4933 // java_sdk_library installs both impl jar and permission XML
4934 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4935 "javalib/bar.jar",
4936 "javalib/foo.jar",
4937 "etc/permissions/foo.xml",
4938 })
4939
4940 // The bar library should depend on the implementation jar.
4941 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4942 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4943 t.Errorf("expected %q, found %#q", expected, actual)
4944 }
4945}
4946
4947func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4948 ctx, _ := testApex(t, `
4949 apex {
4950 name: "myapex",
4951 key: "myapex.key",
4952 java_libs: ["foo"],
4953 }
4954
4955 apex_key {
4956 name: "myapex.key",
4957 public_key: "testkey.avbpubkey",
4958 private_key: "testkey.pem",
4959 }
4960
4961 java_sdk_library {
4962 name: "foo",
4963 srcs: ["a.java"],
4964 api_packages: ["foo"],
4965 apex_available: ["myapex"],
4966 sdk_version: "none",
4967 system_modules: "none",
4968 }
4969
4970 java_library {
4971 name: "bar",
4972 srcs: ["a.java"],
4973 libs: ["foo"],
4974 sdk_version: "none",
4975 system_modules: "none",
4976 }
4977 `, withFiles(filesForSdkLibrary))
4978
4979 // java_sdk_library installs both impl jar and permission XML
4980 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4981 "javalib/foo.jar",
4982 "etc/permissions/foo.xml",
4983 })
4984
4985 // The bar library should depend on the stubs jar.
4986 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4987 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4988 t.Errorf("expected %q, found %#q", expected, actual)
4989 }
4990}
4991
Paul Duffineedc5d52020-06-12 17:46:39 +01004992func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4993 ctx, _ := testApex(t, ``,
4994 withFiles(map[string][]byte{
4995 "apex/a.java": nil,
4996 "apex/apex_manifest.json": nil,
4997 "apex/Android.bp": []byte(`
4998 package {
4999 default_visibility: ["//visibility:private"],
5000 }
5001
5002 apex {
5003 name: "myapex",
5004 key: "myapex.key",
5005 java_libs: ["foo", "bar"],
5006 }
5007
5008 apex_key {
5009 name: "myapex.key",
5010 public_key: "testkey.avbpubkey",
5011 private_key: "testkey.pem",
5012 }
5013
5014 java_library {
5015 name: "bar",
5016 srcs: ["a.java"],
5017 libs: ["foo"],
5018 apex_available: ["myapex"],
5019 sdk_version: "none",
5020 system_modules: "none",
5021 }
5022`),
5023 "source/a.java": nil,
5024 "source/api/current.txt": nil,
5025 "source/api/removed.txt": nil,
5026 "source/Android.bp": []byte(`
5027 package {
5028 default_visibility: ["//visibility:private"],
5029 }
5030
5031 java_sdk_library {
5032 name: "foo",
5033 visibility: ["//apex"],
5034 srcs: ["a.java"],
5035 api_packages: ["foo"],
5036 apex_available: ["myapex"],
5037 sdk_version: "none",
5038 system_modules: "none",
5039 public: {
5040 enabled: true,
5041 },
5042 }
5043`),
5044 "prebuilt/a.jar": nil,
5045 "prebuilt/Android.bp": []byte(`
5046 package {
5047 default_visibility: ["//visibility:private"],
5048 }
5049
5050 java_sdk_library_import {
5051 name: "foo",
5052 visibility: ["//apex", "//source"],
5053 apex_available: ["myapex"],
5054 prefer: true,
5055 public: {
5056 jars: ["a.jar"],
5057 },
5058 }
5059`),
5060 }),
5061 )
5062
5063 // java_sdk_library installs both impl jar and permission XML
5064 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5065 "javalib/bar.jar",
5066 "javalib/foo.jar",
5067 "etc/permissions/foo.xml",
5068 })
5069
5070 // The bar library should depend on the implementation jar.
5071 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5072 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5073 t.Errorf("expected %q, found %#q", expected, actual)
5074 }
5075}
5076
5077func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5078 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5079 apex {
5080 name: "myapex",
5081 key: "myapex.key",
5082 java_libs: ["foo"],
5083 }
5084
5085 apex_key {
5086 name: "myapex.key",
5087 public_key: "testkey.avbpubkey",
5088 private_key: "testkey.pem",
5089 }
5090
5091 java_sdk_library_import {
5092 name: "foo",
5093 apex_available: ["myapex"],
5094 prefer: true,
5095 public: {
5096 jars: ["a.jar"],
5097 },
5098 }
5099
5100 `, withFiles(filesForSdkLibrary))
5101}
5102
atrost6e126252020-01-27 17:01:16 +00005103func TestCompatConfig(t *testing.T) {
5104 ctx, _ := testApex(t, `
5105 apex {
5106 name: "myapex",
5107 key: "myapex.key",
5108 prebuilts: ["myjar-platform-compat-config"],
5109 java_libs: ["myjar"],
5110 }
5111
5112 apex_key {
5113 name: "myapex.key",
5114 public_key: "testkey.avbpubkey",
5115 private_key: "testkey.pem",
5116 }
5117
5118 platform_compat_config {
5119 name: "myjar-platform-compat-config",
5120 src: ":myjar",
5121 }
5122
5123 java_library {
5124 name: "myjar",
5125 srcs: ["foo/bar/MyClass.java"],
5126 sdk_version: "none",
5127 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005128 apex_available: [ "myapex" ],
5129 }
5130 `)
5131 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5132 "etc/compatconfig/myjar-platform-compat-config.xml",
5133 "javalib/myjar.jar",
5134 })
5135}
5136
Jiyong Park479321d2019-12-16 11:47:12 +09005137func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5138 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5139 apex {
5140 name: "myapex",
5141 key: "myapex.key",
5142 java_libs: ["myjar"],
5143 }
5144
5145 apex_key {
5146 name: "myapex.key",
5147 public_key: "testkey.avbpubkey",
5148 private_key: "testkey.pem",
5149 }
5150
5151 java_library {
5152 name: "myjar",
5153 srcs: ["foo/bar/MyClass.java"],
5154 sdk_version: "none",
5155 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005156 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005157 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005158 }
5159 `)
5160}
5161
Jiyong Park7afd1072019-12-30 16:56:33 +09005162func TestCarryRequiredModuleNames(t *testing.T) {
5163 ctx, config := testApex(t, `
5164 apex {
5165 name: "myapex",
5166 key: "myapex.key",
5167 native_shared_libs: ["mylib"],
5168 }
5169
5170 apex_key {
5171 name: "myapex.key",
5172 public_key: "testkey.avbpubkey",
5173 private_key: "testkey.pem",
5174 }
5175
5176 cc_library {
5177 name: "mylib",
5178 srcs: ["mylib.cpp"],
5179 system_shared_libs: [],
5180 stl: "none",
5181 required: ["a", "b"],
5182 host_required: ["c", "d"],
5183 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005184 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005185 }
5186 `)
5187
5188 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5189 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5190 name := apexBundle.BaseModuleName()
5191 prefix := "TARGET_"
5192 var builder strings.Builder
5193 data.Custom(&builder, name, prefix, "", data)
5194 androidMk := builder.String()
5195 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5196 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5197 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5198}
5199
Jiyong Park7cd10e32020-01-14 09:22:18 +09005200func TestSymlinksFromApexToSystem(t *testing.T) {
5201 bp := `
5202 apex {
5203 name: "myapex",
5204 key: "myapex.key",
5205 native_shared_libs: ["mylib"],
5206 java_libs: ["myjar"],
5207 }
5208
Jiyong Park9d677202020-02-19 16:29:35 +09005209 apex {
5210 name: "myapex.updatable",
5211 key: "myapex.key",
5212 native_shared_libs: ["mylib"],
5213 java_libs: ["myjar"],
5214 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005215 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005216 }
5217
Jiyong Park7cd10e32020-01-14 09:22:18 +09005218 apex_key {
5219 name: "myapex.key",
5220 public_key: "testkey.avbpubkey",
5221 private_key: "testkey.pem",
5222 }
5223
5224 cc_library {
5225 name: "mylib",
5226 srcs: ["mylib.cpp"],
5227 shared_libs: ["myotherlib"],
5228 system_shared_libs: [],
5229 stl: "none",
5230 apex_available: [
5231 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005232 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005233 "//apex_available:platform",
5234 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005235 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005236 }
5237
5238 cc_library {
5239 name: "myotherlib",
5240 srcs: ["mylib.cpp"],
5241 system_shared_libs: [],
5242 stl: "none",
5243 apex_available: [
5244 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005245 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005246 "//apex_available:platform",
5247 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005248 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005249 }
5250
5251 java_library {
5252 name: "myjar",
5253 srcs: ["foo/bar/MyClass.java"],
5254 sdk_version: "none",
5255 system_modules: "none",
5256 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005257 apex_available: [
5258 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005259 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005260 "//apex_available:platform",
5261 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005262 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005263 }
5264
5265 java_library {
5266 name: "myotherjar",
5267 srcs: ["foo/bar/MyClass.java"],
5268 sdk_version: "none",
5269 system_modules: "none",
5270 apex_available: [
5271 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005272 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005273 "//apex_available:platform",
5274 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005275 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005276 }
5277 `
5278
5279 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5280 for _, f := range files {
5281 if f.path == file {
5282 if f.isLink {
5283 t.Errorf("%q is not a real file", file)
5284 }
5285 return
5286 }
5287 }
5288 t.Errorf("%q is not found", file)
5289 }
5290
5291 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5292 for _, f := range files {
5293 if f.path == file {
5294 if !f.isLink {
5295 t.Errorf("%q is not a symlink", file)
5296 }
5297 return
5298 }
5299 }
5300 t.Errorf("%q is not found", file)
5301 }
5302
Jiyong Park9d677202020-02-19 16:29:35 +09005303 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5304 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005305 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005306 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005307 ensureRealfileExists(t, files, "javalib/myjar.jar")
5308 ensureRealfileExists(t, files, "lib64/mylib.so")
5309 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5310
Jiyong Park9d677202020-02-19 16:29:35 +09005311 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5312 ensureRealfileExists(t, files, "javalib/myjar.jar")
5313 ensureRealfileExists(t, files, "lib64/mylib.so")
5314 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5315
5316 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005317 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005318 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005319 ensureRealfileExists(t, files, "javalib/myjar.jar")
5320 ensureRealfileExists(t, files, "lib64/mylib.so")
5321 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005322
5323 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5324 ensureRealfileExists(t, files, "javalib/myjar.jar")
5325 ensureRealfileExists(t, files, "lib64/mylib.so")
5326 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005327}
5328
Yo Chiange8128052020-07-23 20:09:18 +08005329func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5330 ctx, config := testApex(t, `
5331 apex {
5332 name: "myapex",
5333 key: "myapex.key",
5334 native_shared_libs: ["mylib"],
5335 }
5336
5337 apex_key {
5338 name: "myapex.key",
5339 public_key: "testkey.avbpubkey",
5340 private_key: "testkey.pem",
5341 }
5342
5343 cc_library_shared {
5344 name: "mylib",
5345 srcs: ["mylib.cpp"],
5346 shared_libs: ["myotherlib"],
5347 system_shared_libs: [],
5348 stl: "none",
5349 apex_available: [
5350 "myapex",
5351 "//apex_available:platform",
5352 ],
5353 }
5354
5355 cc_prebuilt_library_shared {
5356 name: "myotherlib",
5357 srcs: ["prebuilt.so"],
5358 system_shared_libs: [],
5359 stl: "none",
5360 apex_available: [
5361 "myapex",
5362 "//apex_available:platform",
5363 ],
5364 }
5365 `)
5366
5367 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5368 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5369 var builder strings.Builder
5370 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5371 androidMk := builder.String()
5372 // `myotherlib` is added to `myapex` as symlink
5373 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5374 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5375 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5376 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5377 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5378}
5379
Jooyung Han643adc42020-02-27 13:50:06 +09005380func TestApexWithJniLibs(t *testing.T) {
5381 ctx, _ := testApex(t, `
5382 apex {
5383 name: "myapex",
5384 key: "myapex.key",
5385 jni_libs: ["mylib"],
5386 }
5387
5388 apex_key {
5389 name: "myapex.key",
5390 public_key: "testkey.avbpubkey",
5391 private_key: "testkey.pem",
5392 }
5393
5394 cc_library {
5395 name: "mylib",
5396 srcs: ["mylib.cpp"],
5397 shared_libs: ["mylib2"],
5398 system_shared_libs: [],
5399 stl: "none",
5400 apex_available: [ "myapex" ],
5401 }
5402
5403 cc_library {
5404 name: "mylib2",
5405 srcs: ["mylib.cpp"],
5406 system_shared_libs: [],
5407 stl: "none",
5408 apex_available: [ "myapex" ],
5409 }
5410 `)
5411
5412 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5413 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5414 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5415 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5416 "lib64/mylib.so",
5417 "lib64/mylib2.so",
5418 })
5419}
5420
Jooyung Han49f67012020-04-17 13:43:10 +09005421func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5422 ctx, _ := testApex(t, `
5423 apex {
5424 name: "myapex",
5425 key: "myapex.key",
5426 }
5427 apex_key {
5428 name: "myapex.key",
5429 public_key: "testkey.avbpubkey",
5430 private_key: "testkey.pem",
5431 }
5432 `, func(fs map[string][]byte, config android.Config) {
5433 delete(config.Targets, android.Android)
5434 config.AndroidCommonTarget = android.Target{}
5435 })
5436
5437 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5438 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5439 }
5440}
5441
Jiyong Parkbd159612020-02-28 15:22:21 +09005442func TestAppBundle(t *testing.T) {
5443 ctx, _ := testApex(t, `
5444 apex {
5445 name: "myapex",
5446 key: "myapex.key",
5447 apps: ["AppFoo"],
5448 }
5449
5450 apex_key {
5451 name: "myapex.key",
5452 public_key: "testkey.avbpubkey",
5453 private_key: "testkey.pem",
5454 }
5455
5456 android_app {
5457 name: "AppFoo",
5458 srcs: ["foo/bar/MyClass.java"],
5459 sdk_version: "none",
5460 system_modules: "none",
5461 apex_available: [ "myapex" ],
5462 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005463 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005464
5465 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5466 content := bundleConfigRule.Args["content"]
5467
5468 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005469 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 +09005470}
5471
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005472func TestAppSetBundle(t *testing.T) {
5473 ctx, _ := testApex(t, `
5474 apex {
5475 name: "myapex",
5476 key: "myapex.key",
5477 apps: ["AppSet"],
5478 }
5479
5480 apex_key {
5481 name: "myapex.key",
5482 public_key: "testkey.avbpubkey",
5483 private_key: "testkey.pem",
5484 }
5485
5486 android_app_set {
5487 name: "AppSet",
5488 set: "AppSet.apks",
5489 }`)
5490 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5491 bundleConfigRule := mod.Description("Bundle Config")
5492 content := bundleConfigRule.Args["content"]
5493 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5494 s := mod.Rule("apexRule").Args["copy_commands"]
5495 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5496 if len(copyCmds) != 3 {
5497 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5498 }
5499 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5500 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5501 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5502}
5503
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005504func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005505 t.Helper()
5506
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005507 bp := `
5508 java_library {
5509 name: "some-updatable-apex-lib",
5510 srcs: ["a.java"],
5511 sdk_version: "current",
5512 apex_available: [
5513 "some-updatable-apex",
5514 ],
5515 }
5516
5517 java_library {
5518 name: "some-non-updatable-apex-lib",
5519 srcs: ["a.java"],
5520 apex_available: [
5521 "some-non-updatable-apex",
5522 ],
5523 }
5524
5525 java_library {
5526 name: "some-platform-lib",
5527 srcs: ["a.java"],
5528 sdk_version: "current",
5529 installable: true,
5530 }
5531
5532 java_library {
5533 name: "some-art-lib",
5534 srcs: ["a.java"],
5535 sdk_version: "current",
5536 apex_available: [
5537 "com.android.art.something",
5538 ],
5539 hostdex: true,
5540 }
5541
5542 apex {
5543 name: "some-updatable-apex",
5544 key: "some-updatable-apex.key",
5545 java_libs: ["some-updatable-apex-lib"],
5546 updatable: true,
5547 min_sdk_version: "current",
5548 }
5549
5550 apex {
5551 name: "some-non-updatable-apex",
5552 key: "some-non-updatable-apex.key",
5553 java_libs: ["some-non-updatable-apex-lib"],
5554 }
5555
5556 apex_key {
5557 name: "some-updatable-apex.key",
5558 }
5559
5560 apex_key {
5561 name: "some-non-updatable-apex.key",
5562 }
5563
5564 apex {
5565 name: "com.android.art.something",
5566 key: "com.android.art.something.key",
5567 java_libs: ["some-art-lib"],
5568 updatable: true,
5569 min_sdk_version: "current",
5570 }
5571
5572 apex_key {
5573 name: "com.android.art.something.key",
5574 }
5575
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005576 filegroup {
5577 name: "some-updatable-apex-file_contexts",
5578 srcs: [
5579 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5580 ],
5581 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005582
5583 filegroup {
5584 name: "some-non-updatable-apex-file_contexts",
5585 srcs: [
5586 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5587 ],
5588 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005589 `
5590 bp += cc.GatherRequiredDepsForTest(android.Android)
5591 bp += java.GatherRequiredDepsForTest()
5592 bp += dexpreopt.BpToolModulesForTest()
5593
5594 fs := map[string][]byte{
5595 "a.java": nil,
5596 "a.jar": nil,
5597 "build/make/target/product/security": nil,
5598 "apex_manifest.json": nil,
5599 "AndroidManifest.xml": nil,
5600 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005601 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005602 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5603 "framework/aidl/a.aidl": nil,
5604 }
5605 cc.GatherRequiredFilesForTest(fs)
5606
5607 ctx := android.NewTestArchContext()
5608 ctx.RegisterModuleType("apex", BundleFactory)
5609 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5610 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005611 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005612 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005613 cc.RegisterRequiredBuildComponentsForTest(ctx)
5614 java.RegisterJavaBuildComponents(ctx)
5615 java.RegisterSystemModulesBuildComponents(ctx)
5616 java.RegisterAppBuildComponents(ctx)
5617 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005618 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5619 ctx.PreDepsMutators(RegisterPreDepsMutators)
5620 ctx.PostDepsMutators(RegisterPostDepsMutators)
5621
5622 config := android.TestArchConfig(buildDir, nil, bp, fs)
5623 ctx.Register(config)
5624
5625 _ = dexpreopt.GlobalSoongConfigForTests(config)
5626 dexpreopt.RegisterToolModulesForTest(ctx)
5627 pathCtx := android.PathContextForTesting(config)
5628 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5629 transformDexpreoptConfig(dexpreoptConfig)
5630 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5631
5632 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5633 android.FailIfErrored(t, errs)
5634
5635 _, errs = ctx.PrepareBuildActions(config)
5636 if errmsg == "" {
5637 android.FailIfErrored(t, errs)
5638 } else if len(errs) > 0 {
5639 android.FailIfNoMatchingErrors(t, errmsg, errs)
5640 return
5641 } else {
5642 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5643 }
5644}
5645
Jooyung Han548640b2020-04-27 12:10:30 +09005646func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5647 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5648 apex {
5649 name: "myapex",
5650 key: "myapex.key",
5651 updatable: true,
5652 }
5653
5654 apex_key {
5655 name: "myapex.key",
5656 public_key: "testkey.avbpubkey",
5657 private_key: "testkey.pem",
5658 }
5659 `)
5660}
5661
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005662func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005663 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005664 var transform func(*dexpreopt.GlobalConfig)
5665
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005666 config := android.TestArchConfig(buildDir, nil, "", nil)
5667 ctx := android.PathContextForTesting(config)
5668
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005669 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5670 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005671 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005672 }
5673 testNoUpdatableJarsInBootImage(t, "", transform)
5674 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005675
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005676 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005677 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 +01005678 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005679 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005680 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005681 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005682 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005683
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005684 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 -07005685 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 +01005686 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005687 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005688 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005689 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005690 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005691
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005692 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 -07005693 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005694 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005695 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005696 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005697 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005698 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005699
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005700 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 -07005701 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 +01005702 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005703 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005704 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005705 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005706 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005707
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005708 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5709 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005710 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005711 }
5712 testNoUpdatableJarsInBootImage(t, "", transform)
5713 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005714
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005715 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005716 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005717 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005718 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005719 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005720 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005721 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005722
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005723 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005724 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005725 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005726 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005727 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005728 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005729 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005730
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005731 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005732 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005733 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005734 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005735 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005736 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005737 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005738
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005739 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5740 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005741 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005742 }
5743 testNoUpdatableJarsInBootImage(t, "", transform)
5744 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005745}
5746
Andrei Onea115e7e72020-06-05 21:14:03 +01005747func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5748 t.Helper()
5749 android.ClearApexDependency()
5750 bp += `
5751 apex_key {
5752 name: "myapex.key",
5753 public_key: "testkey.avbpubkey",
5754 private_key: "testkey.pem",
5755 }`
5756 fs := map[string][]byte{
5757 "lib1/src/A.java": nil,
5758 "lib2/src/B.java": nil,
5759 "system/sepolicy/apex/myapex-file_contexts": nil,
5760 }
5761
5762 ctx := android.NewTestArchContext()
5763 ctx.RegisterModuleType("apex", BundleFactory)
5764 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5765 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5766 cc.RegisterRequiredBuildComponentsForTest(ctx)
5767 java.RegisterJavaBuildComponents(ctx)
5768 java.RegisterSystemModulesBuildComponents(ctx)
5769 java.RegisterDexpreoptBootJarsComponents(ctx)
5770 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5771 ctx.PreDepsMutators(RegisterPreDepsMutators)
5772 ctx.PostDepsMutators(RegisterPostDepsMutators)
5773 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5774
5775 config := android.TestArchConfig(buildDir, nil, bp, fs)
5776 android.SetTestNeverallowRules(config, rules)
5777 updatableBootJars := make([]string, 0, len(apexBootJars))
5778 for _, apexBootJar := range apexBootJars {
5779 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5780 }
5781 config.TestProductVariables.UpdatableBootJars = updatableBootJars
5782
5783 ctx.Register(config)
5784
5785 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5786 android.FailIfErrored(t, errs)
5787
5788 _, errs = ctx.PrepareBuildActions(config)
5789 if errmsg == "" {
5790 android.FailIfErrored(t, errs)
5791 } else if len(errs) > 0 {
5792 android.FailIfNoMatchingErrors(t, errmsg, errs)
5793 return
5794 } else {
5795 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5796 }
5797}
5798
5799func TestApexPermittedPackagesRules(t *testing.T) {
5800 testcases := []struct {
5801 name string
5802 expectedError string
5803 bp string
5804 bootJars []string
5805 modulesPackages map[string][]string
5806 }{
5807
5808 {
5809 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5810 expectedError: "",
5811 bp: `
5812 java_library {
5813 name: "bcp_lib1",
5814 srcs: ["lib1/src/*.java"],
5815 permitted_packages: ["foo.bar"],
5816 apex_available: ["myapex"],
5817 sdk_version: "none",
5818 system_modules: "none",
5819 }
5820 java_library {
5821 name: "nonbcp_lib2",
5822 srcs: ["lib2/src/*.java"],
5823 apex_available: ["myapex"],
5824 permitted_packages: ["a.b"],
5825 sdk_version: "none",
5826 system_modules: "none",
5827 }
5828 apex {
5829 name: "myapex",
5830 key: "myapex.key",
5831 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5832 }`,
5833 bootJars: []string{"bcp_lib1"},
5834 modulesPackages: map[string][]string{
5835 "myapex": []string{
5836 "foo.bar",
5837 },
5838 },
5839 },
5840 {
5841 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5842 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.`,
5843 bp: `
5844 java_library {
5845 name: "bcp_lib1",
5846 srcs: ["lib1/src/*.java"],
5847 apex_available: ["myapex"],
5848 permitted_packages: ["foo.bar"],
5849 sdk_version: "none",
5850 system_modules: "none",
5851 }
5852 java_library {
5853 name: "bcp_lib2",
5854 srcs: ["lib2/src/*.java"],
5855 apex_available: ["myapex"],
5856 permitted_packages: ["foo.bar", "bar.baz"],
5857 sdk_version: "none",
5858 system_modules: "none",
5859 }
5860 apex {
5861 name: "myapex",
5862 key: "myapex.key",
5863 java_libs: ["bcp_lib1", "bcp_lib2"],
5864 }
5865 `,
5866 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5867 modulesPackages: map[string][]string{
5868 "myapex": []string{
5869 "foo.bar",
5870 },
5871 },
5872 },
5873 }
5874 for _, tc := range testcases {
5875 t.Run(tc.name, func(t *testing.T) {
5876 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5877 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5878 })
5879 }
5880}
5881
Jiyong Park62304bb2020-04-13 16:19:48 +09005882func TestTestFor(t *testing.T) {
5883 ctx, _ := testApex(t, `
5884 apex {
5885 name: "myapex",
5886 key: "myapex.key",
5887 native_shared_libs: ["mylib", "myprivlib"],
5888 }
5889
5890 apex_key {
5891 name: "myapex.key",
5892 public_key: "testkey.avbpubkey",
5893 private_key: "testkey.pem",
5894 }
5895
5896 cc_library {
5897 name: "mylib",
5898 srcs: ["mylib.cpp"],
5899 system_shared_libs: [],
5900 stl: "none",
5901 stubs: {
5902 versions: ["1"],
5903 },
5904 apex_available: ["myapex"],
5905 }
5906
5907 cc_library {
5908 name: "myprivlib",
5909 srcs: ["mylib.cpp"],
5910 system_shared_libs: [],
5911 stl: "none",
5912 apex_available: ["myapex"],
5913 }
5914
5915
5916 cc_test {
5917 name: "mytest",
5918 gtest: false,
5919 srcs: ["mylib.cpp"],
5920 system_shared_libs: [],
5921 stl: "none",
5922 shared_libs: ["mylib", "myprivlib"],
5923 test_for: ["myapex"]
5924 }
5925 `)
5926
5927 // the test 'mytest' is a test for the apex, therefore is linked to the
5928 // actual implementation of mylib instead of its stub.
5929 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5930 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5931 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5932}
5933
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005934// TODO(jungjw): Move this to proptools
5935func intPtr(i int) *int {
5936 return &i
5937}
5938
5939func TestApexSet(t *testing.T) {
5940 ctx, config := testApex(t, `
5941 apex_set {
5942 name: "myapex",
5943 set: "myapex.apks",
5944 filename: "foo_v2.apex",
5945 overrides: ["foo"],
5946 }
5947 `, func(fs map[string][]byte, config android.Config) {
5948 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07005949 config.Targets[android.Android] = []android.Target{
5950 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
5951 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
5952 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005953 })
5954
5955 m := ctx.ModuleForTests("myapex", "android_common")
5956
5957 // Check extract_apks tool parameters.
5958 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5959 actual := extractedApex.Args["abis"]
5960 expected := "ARMEABI_V7A,ARM64_V8A"
5961 if actual != expected {
5962 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5963 }
5964 actual = extractedApex.Args["sdk-version"]
5965 expected = "30"
5966 if actual != expected {
5967 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5968 }
5969
5970 a := m.Module().(*ApexSet)
5971 expectedOverrides := []string{"foo"}
5972 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5973 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5974 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5975 }
5976}
5977
Jiyong Park7d95a512020-05-10 15:16:24 +09005978func TestNoStaticLinkingToStubsLib(t *testing.T) {
5979 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5980 apex {
5981 name: "myapex",
5982 key: "myapex.key",
5983 native_shared_libs: ["mylib"],
5984 }
5985
5986 apex_key {
5987 name: "myapex.key",
5988 public_key: "testkey.avbpubkey",
5989 private_key: "testkey.pem",
5990 }
5991
5992 cc_library {
5993 name: "mylib",
5994 srcs: ["mylib.cpp"],
5995 static_libs: ["otherlib"],
5996 system_shared_libs: [],
5997 stl: "none",
5998 apex_available: [ "myapex" ],
5999 }
6000
6001 cc_library {
6002 name: "otherlib",
6003 srcs: ["mylib.cpp"],
6004 system_shared_libs: [],
6005 stl: "none",
6006 stubs: {
6007 versions: ["1", "2", "3"],
6008 },
6009 apex_available: [ "myapex" ],
6010 }
6011 `)
6012}
6013
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006014func TestApexKeysTxt(t *testing.T) {
6015 ctx, _ := testApex(t, `
6016 apex {
6017 name: "myapex",
6018 key: "myapex.key",
6019 }
6020
6021 apex_key {
6022 name: "myapex.key",
6023 public_key: "testkey.avbpubkey",
6024 private_key: "testkey.pem",
6025 }
6026
6027 prebuilt_apex {
6028 name: "myapex",
6029 prefer: true,
6030 arch: {
6031 arm64: {
6032 src: "myapex-arm64.apex",
6033 },
6034 arm: {
6035 src: "myapex-arm.apex",
6036 },
6037 },
6038 }
6039
6040 apex_set {
6041 name: "myapex_set",
6042 set: "myapex.apks",
6043 filename: "myapex_set.apex",
6044 overrides: ["myapex"],
6045 }
6046 `)
6047
6048 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6049 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6050 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 +09006051 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 +09006052}
6053
Jooyung Han938b5932020-06-20 12:47:47 +09006054func TestAllowedFiles(t *testing.T) {
6055 ctx, _ := testApex(t, `
6056 apex {
6057 name: "myapex",
6058 key: "myapex.key",
6059 apps: ["app"],
6060 allowed_files: "allowed.txt",
6061 }
6062
6063 apex_key {
6064 name: "myapex.key",
6065 public_key: "testkey.avbpubkey",
6066 private_key: "testkey.pem",
6067 }
6068
6069 android_app {
6070 name: "app",
6071 srcs: ["foo/bar/MyClass.java"],
6072 package_name: "foo",
6073 sdk_version: "none",
6074 system_modules: "none",
6075 apex_available: [ "myapex" ],
6076 }
6077 `, withFiles(map[string][]byte{
6078 "sub/Android.bp": []byte(`
6079 override_apex {
6080 name: "override_myapex",
6081 base: "myapex",
6082 apps: ["override_app"],
6083 allowed_files: ":allowed",
6084 }
6085 // Overridable "path" property should be referenced indirectly
6086 filegroup {
6087 name: "allowed",
6088 srcs: ["allowed.txt"],
6089 }
6090 override_android_app {
6091 name: "override_app",
6092 base: "app",
6093 package_name: "bar",
6094 }
6095 `),
6096 }))
6097
6098 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6099 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6100 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6101 }
6102
6103 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6104 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6105 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6106 }
6107}
6108
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006109func TestNonPreferredPrebuiltDependency(t *testing.T) {
6110 _, _ = testApex(t, `
6111 apex {
6112 name: "myapex",
6113 key: "myapex.key",
6114 native_shared_libs: ["mylib"],
6115 }
6116
6117 apex_key {
6118 name: "myapex.key",
6119 public_key: "testkey.avbpubkey",
6120 private_key: "testkey.pem",
6121 }
6122
6123 cc_library {
6124 name: "mylib",
6125 srcs: ["mylib.cpp"],
6126 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006127 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006128 },
6129 apex_available: ["myapex"],
6130 }
6131
6132 cc_prebuilt_library_shared {
6133 name: "mylib",
6134 prefer: false,
6135 srcs: ["prebuilt.so"],
6136 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006137 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006138 },
6139 apex_available: ["myapex"],
6140 }
6141 `)
6142}
6143
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006144func TestMain(m *testing.M) {
6145 run := func() int {
6146 setUp()
6147 defer tearDown()
6148
6149 return m.Run()
6150 }
6151
6152 os.Exit(run())
6153}