blob: 33966cea21ec8492d5319e9ba15c5ac73439f194 [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)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700252 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000253 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700254 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800255 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000256 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000257 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000258 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100259 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900260 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800261 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262
Colin Cross98be1bb2019-12-13 20:41:13 -0800263 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265
266 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269}
270
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271func setUp() {
272 var err error
273 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700279func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700280 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281}
282
Jooyung Han643adc42020-02-27 13:50:06 +0900283// ensure that 'result' equals 'expected'
284func ensureEquals(t *testing.T, result string, expected string) {
285 t.Helper()
286 if result != expected {
287 t.Errorf("%q != %q", expected, result)
288 }
289}
290
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291// ensure that 'result' contains 'expected'
292func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if !strings.Contains(result, expected) {
295 t.Errorf("%q is not found in %q", expected, result)
296 }
297}
298
Liz Kammer5bd365f2020-05-27 15:15:11 -0700299// ensure that 'result' contains 'expected' exactly one time
300func ensureContainsOnce(t *testing.T, result string, expected string) {
301 t.Helper()
302 count := strings.Count(result, expected)
303 if count != 1 {
304 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// ensures that 'result' does not contain 'notExpected'
309func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900310 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311 if strings.Contains(result, notExpected) {
312 t.Errorf("%q is found in %q", notExpected, result)
313 }
314}
315
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700316func ensureMatches(t *testing.T, result string, expectedRex string) {
317 ok, err := regexp.MatchString(expectedRex, result)
318 if err != nil {
319 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
320 return
321 }
322 if !ok {
323 t.Errorf("%s does not match regular expession %s", result, expectedRex)
324 }
325}
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900328 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900329 if !android.InList(expected, result) {
330 t.Errorf("%q is not found in %v", expected, result)
331 }
332}
333
334func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900335 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900336 if android.InList(notExpected, result) {
337 t.Errorf("%q is found in %v", notExpected, result)
338 }
339}
340
Jooyung Hane1633032019-08-01 17:41:43 +0900341func ensureListEmpty(t *testing.T, result []string) {
342 t.Helper()
343 if len(result) > 0 {
344 t.Errorf("%q is expected to be empty", result)
345 }
346}
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348// Minimal test
349func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900350 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900351 apex_defaults {
352 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900353 manifest: ":myapex.manifest",
354 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 key: "myapex.key",
356 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800357 multilib: {
358 both: {
359 binaries: ["foo",],
360 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900361 },
Jiyong Park77acec62020-06-01 21:39:15 +0900362 java_libs: [
363 "myjar",
364 "myjar_dex",
365 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900366 }
367
Jiyong Park30ca9372019-02-07 16:27:23 +0900368 apex {
369 name: "myapex",
370 defaults: ["myapex-defaults"],
371 }
372
Jiyong Park25fc6a92018-11-18 18:02:45 +0900373 apex_key {
374 name: "myapex.key",
375 public_key: "testkey.avbpubkey",
376 private_key: "testkey.pem",
377 }
378
Jiyong Park809bb722019-02-13 21:33:49 +0900379 filegroup {
380 name: "myapex.manifest",
381 srcs: ["apex_manifest.json"],
382 }
383
384 filegroup {
385 name: "myapex.androidmanifest",
386 srcs: ["AndroidManifest.xml"],
387 }
388
Jiyong Park25fc6a92018-11-18 18:02:45 +0900389 cc_library {
390 name: "mylib",
391 srcs: ["mylib.cpp"],
392 shared_libs: ["mylib2"],
393 system_shared_libs: [],
394 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000395 // TODO: remove //apex_available:platform
396 apex_available: [
397 "//apex_available:platform",
398 "myapex",
399 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900400 }
401
Alex Light3d673592019-01-18 14:37:31 -0800402 cc_binary {
403 name: "foo",
404 srcs: ["mylib.cpp"],
405 compile_multilib: "both",
406 multilib: {
407 lib32: {
408 suffix: "32",
409 },
410 lib64: {
411 suffix: "64",
412 },
413 },
414 symlinks: ["foo_link_"],
415 symlink_preferred_arch: true,
416 system_shared_libs: [],
417 static_executable: true,
418 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700419 apex_available: [ "myapex", "com.android.gki.*" ],
420 }
421
422 apex {
423 name: "com.android.gki.fake",
424 binaries: ["foo"],
425 key: "myapex.key",
426 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800427 }
428
Paul Duffindddd5462020-04-07 15:25:44 +0100429 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900430 name: "mylib2",
431 srcs: ["mylib.cpp"],
432 system_shared_libs: [],
433 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900434 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
451 }
452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
458 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000459 // TODO: remove //apex_available:platform
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900464 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900465
466 java_library {
467 name: "myjar",
468 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900469 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 sdk_version: "none",
471 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900473 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000474 // TODO: remove //apex_available:platform
475 apex_available: [
476 "//apex_available:platform",
477 "myapex",
478 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Sundong Ahnabb64432019-10-22 13:58:29 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
513 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
514 data := android.AndroidMkDataForTest(t, config, "", ab)
515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900525 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700538 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540
541 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800542 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
543 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900544 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900545 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900546 // .. but not for java libs
547 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900548 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800549
Colin Cross7113d202019-11-20 16:39:12 -0800550 // Ensure that the platform variant ends with _shared or _common
551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
556
557 // Ensure that dynamic dependency to java libs are not included
558 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800559
560 // Ensure that all symlinks are present.
561 found_foo_link_64 := false
562 found_foo := false
563 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900564 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800565 if strings.HasSuffix(cmd, "bin/foo") {
566 found_foo = true
567 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
568 found_foo_link_64 = true
569 }
570 }
571 }
572 good := found_foo && found_foo_link_64
573 if !good {
574 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
575 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900576
Sundong Ahnabb64432019-10-22 13:58:29 +0900577 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700578 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900579 if len(noticeInputs) != 3 {
580 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900581 }
582 ensureListContains(t, noticeInputs, "NOTICE")
583 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900584 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900585
Artur Satayeva8bd1132020-04-27 18:07:06 +0100586 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000587 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
588 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
589 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
590 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
591 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100592
593 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000594 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
597 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
598 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800599}
600
Jooyung Hanf21c7972019-12-16 22:32:06 +0900601func TestDefaults(t *testing.T) {
602 ctx, _ := testApex(t, `
603 apex_defaults {
604 name: "myapex-defaults",
605 key: "myapex.key",
606 prebuilts: ["myetc"],
607 native_shared_libs: ["mylib"],
608 java_libs: ["myjar"],
609 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900610 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800611 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 }
613
614 prebuilt_etc {
615 name: "myetc",
616 src: "myprebuilt",
617 }
618
619 apex {
620 name: "myapex",
621 defaults: ["myapex-defaults"],
622 }
623
624 apex_key {
625 name: "myapex.key",
626 public_key: "testkey.avbpubkey",
627 private_key: "testkey.pem",
628 }
629
630 cc_library {
631 name: "mylib",
632 system_shared_libs: [],
633 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000634 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900635 }
636
637 java_library {
638 name: "myjar",
639 srcs: ["foo/bar/MyClass.java"],
640 sdk_version: "none",
641 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000642 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900643 }
644
645 android_app {
646 name: "AppFoo",
647 srcs: ["foo/bar/MyClass.java"],
648 sdk_version: "none",
649 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900652
653 runtime_resource_overlay {
654 name: "rro",
655 theme: "blue",
656 }
657
markchien2f59ec92020-09-02 16:23:38 +0800658 bpf {
659 name: "bpf",
660 srcs: ["bpf.c", "bpf2.c"],
661 }
662
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000664 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 "etc/myetc",
666 "javalib/myjar.jar",
667 "lib64/mylib.so",
668 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900669 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800670 "etc/bpf/bpf.o",
671 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900672 })
673}
674
Jooyung Han01a3ee22019-11-02 02:52:25 +0900675func TestApexManifest(t *testing.T) {
676 ctx, _ := testApex(t, `
677 apex {
678 name: "myapex",
679 key: "myapex.key",
680 }
681
682 apex_key {
683 name: "myapex.key",
684 public_key: "testkey.avbpubkey",
685 private_key: "testkey.pem",
686 }
687 `)
688
689 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900690 args := module.Rule("apexRule").Args
691 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
692 t.Error("manifest should be apex_manifest.pb, but " + manifest)
693 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694}
695
Alex Light5098a612018-11-29 17:12:15 -0800696func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700697 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800698 apex {
699 name: "myapex",
700 key: "myapex.key",
701 payload_type: "zip",
702 native_shared_libs: ["mylib"],
703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710
711 cc_library {
712 name: "mylib",
713 srcs: ["mylib.cpp"],
714 shared_libs: ["mylib2"],
715 system_shared_libs: [],
716 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000717 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800718 }
719
720 cc_library {
721 name: "mylib2",
722 srcs: ["mylib.cpp"],
723 system_shared_libs: [],
724 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000725 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800726 }
727 `)
728
Sundong Ahnabb64432019-10-22 13:58:29 +0900729 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800730 copyCmds := zipApexRule.Args["copy_commands"]
731
732 // Ensure that main rule creates an output
733 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
734
735 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700736 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800737
738 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700739 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800740
741 // Ensure that both direct and indirect deps are copied into apex
742 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
743 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900744}
745
746func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700747 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748 apex {
749 name: "myapex",
750 key: "myapex.key",
751 native_shared_libs: ["mylib", "mylib3"],
752 }
753
754 apex_key {
755 name: "myapex.key",
756 public_key: "testkey.avbpubkey",
757 private_key: "testkey.pem",
758 }
759
760 cc_library {
761 name: "mylib",
762 srcs: ["mylib.cpp"],
763 shared_libs: ["mylib2", "mylib3"],
764 system_shared_libs: [],
765 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000766 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900767 }
768
769 cc_library {
770 name: "mylib2",
771 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900772 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773 system_shared_libs: [],
774 stl: "none",
775 stubs: {
776 versions: ["1", "2", "3"],
777 },
778 }
779
780 cc_library {
781 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900782 srcs: ["mylib.cpp"],
783 shared_libs: ["mylib4"],
784 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785 stl: "none",
786 stubs: {
787 versions: ["10", "11", "12"],
788 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000789 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900791
792 cc_library {
793 name: "mylib4",
794 srcs: ["mylib.cpp"],
795 system_shared_libs: [],
796 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000797 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900798 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799 `)
800
Sundong Ahnabb64432019-10-22 13:58:29 +0900801 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 copyCmds := apexRule.Args["copy_commands"]
803
804 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800805 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900806
807 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800808 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809
810 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800811 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812
Colin Crossaede88c2020-08-11 12:17:01 -0700813 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900814
815 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900816 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900818 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900819
820 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700821 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900822 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700823 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900824
825 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900826 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900827 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900828
829 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900830 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900831
Jooyung Hana57af4a2020-01-23 05:36:59 +0000832 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900833 "lib64/mylib.so",
834 "lib64/mylib3.so",
835 "lib64/mylib4.so",
836 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700840 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900841 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900842 name: "myapex2",
843 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900844 native_shared_libs: ["mylib"],
845 }
846
847 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900848 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900849 public_key: "testkey.avbpubkey",
850 private_key: "testkey.pem",
851 }
852
853 cc_library {
854 name: "mylib",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900857 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900861 }
862
863 cc_library {
864 name: "libfoo",
865 srcs: ["mylib.cpp"],
866 shared_libs: ["libbar"],
867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["10", "20", "30"],
871 },
872 }
873
874 cc_library {
875 name: "libbar",
876 srcs: ["mylib.cpp"],
877 system_shared_libs: [],
878 stl: "none",
879 }
880
Jiyong Park678c8812020-02-07 17:25:49 +0900881 cc_library_static {
882 name: "libbaz",
883 srcs: ["mylib.cpp"],
884 system_shared_libs: [],
885 stl: "none",
886 apex_available: [ "myapex2" ],
887 }
888
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900889 `)
890
Jiyong Park83dc74b2020-01-14 18:38:44 +0900891 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892 copyCmds := apexRule.Args["copy_commands"]
893
894 // Ensure that direct non-stubs dep is always included
895 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
896
897 // Ensure that indirect stubs dep is not included
898 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
899
900 // Ensure that dependency of stubs is not included
901 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
902
Colin Crossaede88c2020-08-11 12:17:01 -0700903 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900904
905 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900906 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900907 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900908 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900909
Jiyong Park3ff16992019-12-27 14:11:47 +0900910 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900911
912 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
913 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900914
Artur Satayeva8bd1132020-04-27 18:07:06 +0100915 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000916 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
917 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
918 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900919
Artur Satayeva8bd1132020-04-27 18:07:06 +0100920 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000921 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
922 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
923 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900924}
925
Jooyung Hand3639552019-08-09 12:57:43 +0900926func TestApexWithRuntimeLibsDependency(t *testing.T) {
927 /*
928 myapex
929 |
930 v (runtime_libs)
931 mylib ------+------> libfoo [provides stub]
932 |
933 `------> libbar
934 */
935 ctx, _ := testApex(t, `
936 apex {
937 name: "myapex",
938 key: "myapex.key",
939 native_shared_libs: ["mylib"],
940 }
941
942 apex_key {
943 name: "myapex.key",
944 public_key: "testkey.avbpubkey",
945 private_key: "testkey.pem",
946 }
947
948 cc_library {
949 name: "mylib",
950 srcs: ["mylib.cpp"],
951 runtime_libs: ["libfoo", "libbar"],
952 system_shared_libs: [],
953 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000954 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900955 }
956
957 cc_library {
958 name: "libfoo",
959 srcs: ["mylib.cpp"],
960 system_shared_libs: [],
961 stl: "none",
962 stubs: {
963 versions: ["10", "20", "30"],
964 },
965 }
966
967 cc_library {
968 name: "libbar",
969 srcs: ["mylib.cpp"],
970 system_shared_libs: [],
971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000972 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900973 }
974
975 `)
976
Sundong Ahnabb64432019-10-22 13:58:29 +0900977 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900978 copyCmds := apexRule.Args["copy_commands"]
979
980 // Ensure that direct non-stubs dep is always included
981 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
982
983 // Ensure that indirect stubs dep is not included
984 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
985
986 // Ensure that runtime_libs dep in included
987 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
988
Sundong Ahnabb64432019-10-22 13:58:29 +0900989 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900990 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
991 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900992
993}
994
Jooyung Han8ce8db92020-05-15 19:05:05 +0900995func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
996 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
997 bp := `
998 apex {
999 name: "com.android.runtime",
1000 key: "com.android.runtime.key",
1001 native_shared_libs: ["libc"],
1002 }
1003
1004 apex_key {
1005 name: "com.android.runtime.key",
1006 public_key: "testkey.avbpubkey",
1007 private_key: "testkey.pem",
1008 }
1009
1010 cc_library {
1011 name: "libc",
1012 no_libcrt: true,
1013 nocrt: true,
1014 stl: "none",
1015 system_shared_libs: [],
1016 stubs: { versions: ["1"] },
1017 apex_available: ["com.android.runtime"],
1018
1019 sanitize: {
1020 hwaddress: true,
1021 }
1022 }
1023
1024 cc_prebuilt_library_shared {
1025 name: "libclang_rt.hwasan-aarch64-android",
1026 no_libcrt: true,
1027 nocrt: true,
1028 stl: "none",
1029 system_shared_libs: [],
1030 srcs: [""],
1031 stubs: { versions: ["1"] },
1032
1033 sanitize: {
1034 never: true,
1035 },
1036 }
1037 `
1038 // override bp to use hard-coded names: com.android.runtime and libc
1039 fs["Android.bp"] = []byte(bp)
1040 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1041 })
1042
1043 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1044 "lib64/bionic/libc.so",
1045 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1046 })
1047
1048 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1049
1050 installed := hwasan.Description("install libclang_rt.hwasan")
1051 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1052
1053 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1054 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1055 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1056}
1057
1058func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1059 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1060 bp := `
1061 apex {
1062 name: "com.android.runtime",
1063 key: "com.android.runtime.key",
1064 native_shared_libs: ["libc"],
1065 }
1066
1067 apex_key {
1068 name: "com.android.runtime.key",
1069 public_key: "testkey.avbpubkey",
1070 private_key: "testkey.pem",
1071 }
1072
1073 cc_library {
1074 name: "libc",
1075 no_libcrt: true,
1076 nocrt: true,
1077 stl: "none",
1078 system_shared_libs: [],
1079 stubs: { versions: ["1"] },
1080 apex_available: ["com.android.runtime"],
1081 }
1082
1083 cc_prebuilt_library_shared {
1084 name: "libclang_rt.hwasan-aarch64-android",
1085 no_libcrt: true,
1086 nocrt: true,
1087 stl: "none",
1088 system_shared_libs: [],
1089 srcs: [""],
1090 stubs: { versions: ["1"] },
1091
1092 sanitize: {
1093 never: true,
1094 },
1095 }
1096 `
1097 // override bp to use hard-coded names: com.android.runtime and libc
1098 fs["Android.bp"] = []byte(bp)
1099 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1100
1101 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1102 })
1103
1104 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1105 "lib64/bionic/libc.so",
1106 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1107 })
1108
1109 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1110
1111 installed := hwasan.Description("install libclang_rt.hwasan")
1112 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1113
1114 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1115 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1116 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1117}
1118
Jooyung Han61b66e92020-03-21 14:21:46 +00001119func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1120 testcases := []struct {
1121 name string
1122 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001123 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001124 shouldLink string
1125 shouldNotLink []string
1126 }{
1127 {
Jooyung Han75568392020-03-20 04:29:24 +09001128 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001129 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001130 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001131 shouldLink: "30",
1132 shouldNotLink: []string{"29"},
1133 },
1134 {
1135 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001136 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001137 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001138 shouldLink: "29",
1139 shouldNotLink: []string{"30"},
1140 },
1141 }
1142 for _, tc := range testcases {
1143 t.Run(tc.name, func(t *testing.T) {
1144 ctx, _ := testApex(t, `
1145 apex {
1146 name: "myapex",
1147 key: "myapex.key",
1148 use_vendor: true,
1149 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001150 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001151 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001152
Jooyung Han61b66e92020-03-21 14:21:46 +00001153 apex_key {
1154 name: "myapex.key",
1155 public_key: "testkey.avbpubkey",
1156 private_key: "testkey.pem",
1157 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001158
Jooyung Han61b66e92020-03-21 14:21:46 +00001159 cc_library {
1160 name: "mylib",
1161 srcs: ["mylib.cpp"],
1162 vendor_available: true,
1163 shared_libs: ["libbar"],
1164 system_shared_libs: [],
1165 stl: "none",
1166 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001167 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001168 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001169
Jooyung Han61b66e92020-03-21 14:21:46 +00001170 cc_library {
1171 name: "libbar",
1172 srcs: ["mylib.cpp"],
1173 system_shared_libs: [],
1174 stl: "none",
1175 stubs: { versions: ["29","30"] },
1176 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001177
Jooyung Han61b66e92020-03-21 14:21:46 +00001178 llndk_library {
1179 name: "libbar",
1180 symbol_file: "",
1181 }
1182 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001183 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001184 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001185
Jooyung Han61b66e92020-03-21 14:21:46 +00001186 // Ensure that LLNDK dep is not included
1187 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1188 "lib64/mylib.so",
1189 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001190
Jooyung Han61b66e92020-03-21 14:21:46 +00001191 // Ensure that LLNDK dep is required
1192 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1193 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1194 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001195
Colin Crossaede88c2020-08-11 12:17:01 -07001196 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001197 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1198 for _, ver := range tc.shouldNotLink {
1199 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1200 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001201
Colin Crossaede88c2020-08-11 12:17:01 -07001202 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001203 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1204 })
1205 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001206}
1207
Jiyong Park25fc6a92018-11-18 18:02:45 +09001208func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001209 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001210 apex {
1211 name: "myapex",
1212 key: "myapex.key",
1213 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1214 }
1215
1216 apex_key {
1217 name: "myapex.key",
1218 public_key: "testkey.avbpubkey",
1219 private_key: "testkey.pem",
1220 }
1221
1222 cc_library {
1223 name: "mylib",
1224 srcs: ["mylib.cpp"],
1225 shared_libs: ["libdl#27"],
1226 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001227 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001228 }
1229
1230 cc_library_shared {
1231 name: "mylib_shared",
1232 srcs: ["mylib.cpp"],
1233 shared_libs: ["libdl#27"],
1234 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001235 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001236 }
1237
1238 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001239 name: "libBootstrap",
1240 srcs: ["mylib.cpp"],
1241 stl: "none",
1242 bootstrap: true,
1243 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001244 `)
1245
Sundong Ahnabb64432019-10-22 13:58:29 +09001246 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001247 copyCmds := apexRule.Args["copy_commands"]
1248
1249 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001250 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001251 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1252 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001253
1254 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001255 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001256
Colin Crossaede88c2020-08-11 12:17:01 -07001257 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1258 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1259 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260
1261 // For dependency to libc
1262 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001263 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001264 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001265 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001266 // ... Cflags from stub is correctly exported to mylib
1267 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1268 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1269
1270 // For dependency to libm
1271 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001272 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001273 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001274 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001275 // ... and is not compiling with the stub
1276 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1277 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1278
1279 // For dependency to libdl
1280 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001282 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001283 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1284 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001285 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001286 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001287 // ... Cflags from stub is correctly exported to mylib
1288 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1289 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001290
1291 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001292 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1293 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1294 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1295 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001296}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001297
Jooyung Han749dc692020-04-15 11:03:39 +09001298func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001299 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001300 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1301 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001302 // 3) (platform) -> liba -> libz : this should be non-stub link
1303 ctx, _ := testApex(t, `
1304 apex {
1305 name: "myapex",
1306 key: "myapex.key",
1307 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001308 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001309 }
1310
1311 apex {
1312 name: "otherapex",
1313 key: "myapex.key",
1314 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001315 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001316 }
1317
1318 apex_key {
1319 name: "myapex.key",
1320 public_key: "testkey.avbpubkey",
1321 private_key: "testkey.pem",
1322 }
1323
1324 cc_library {
1325 name: "libx",
1326 shared_libs: ["liba"],
1327 system_shared_libs: [],
1328 stl: "none",
1329 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001330 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001331 }
1332
1333 cc_library {
1334 name: "liby",
1335 shared_libs: ["liba"],
1336 system_shared_libs: [],
1337 stl: "none",
1338 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001339 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001340 }
1341
1342 cc_library {
1343 name: "liba",
1344 shared_libs: ["libz"],
1345 system_shared_libs: [],
1346 stl: "none",
1347 apex_available: [
1348 "//apex_available:anyapex",
1349 "//apex_available:platform",
1350 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001351 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001352 }
1353
1354 cc_library {
1355 name: "libz",
1356 system_shared_libs: [],
1357 stl: "none",
1358 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001359 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001360 },
1361 }
Jooyung Han749dc692020-04-15 11:03:39 +09001362 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001363
1364 expectLink := func(from, from_variant, to, to_variant string) {
1365 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1366 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1367 }
1368 expectNoLink := func(from, from_variant, to, to_variant string) {
1369 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1370 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1371 }
1372 // platform liba is linked to non-stub version
1373 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001374 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001375 expectLink("liba", "shared_apex29", "libz", "shared_28")
1376 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1377 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001378 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001379 expectLink("liba", "shared_apex30", "libz", "shared_30")
1380 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1381 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001382}
1383
Jooyung Hanaed150d2020-04-02 01:41:41 +09001384func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1385 ctx, _ := testApex(t, `
1386 apex {
1387 name: "myapex",
1388 key: "myapex.key",
1389 native_shared_libs: ["libx"],
1390 min_sdk_version: "R",
1391 }
1392
1393 apex_key {
1394 name: "myapex.key",
1395 public_key: "testkey.avbpubkey",
1396 private_key: "testkey.pem",
1397 }
1398
1399 cc_library {
1400 name: "libx",
1401 shared_libs: ["libz"],
1402 system_shared_libs: [],
1403 stl: "none",
1404 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001405 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001406 }
1407
1408 cc_library {
1409 name: "libz",
1410 system_shared_libs: [],
1411 stl: "none",
1412 stubs: {
1413 versions: ["29", "R"],
1414 },
1415 }
1416 `, func(fs map[string][]byte, config android.Config) {
1417 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1418 })
1419
1420 expectLink := func(from, from_variant, to, to_variant string) {
1421 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1422 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1423 }
1424 expectNoLink := func(from, from_variant, to, to_variant string) {
1425 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1426 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1427 }
1428 // 9000 is quite a magic number.
1429 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1430 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1431 // to distinguish them from finalized and future_api(10000)
1432 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1433 // (refer android/api_levels.go)
Colin Crossaede88c2020-08-11 12:17:01 -07001434 expectLink("libx", "shared_apex10000", "libz", "shared_9000")
1435 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1436 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001437}
1438
Jooyung Han749dc692020-04-15 11:03:39 +09001439func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001440 ctx, _ := testApex(t, `
1441 apex {
1442 name: "myapex",
1443 key: "myapex.key",
1444 native_shared_libs: ["libx"],
1445 }
1446
1447 apex_key {
1448 name: "myapex.key",
1449 public_key: "testkey.avbpubkey",
1450 private_key: "testkey.pem",
1451 }
1452
1453 cc_library {
1454 name: "libx",
1455 shared_libs: ["libz"],
1456 system_shared_libs: [],
1457 stl: "none",
1458 apex_available: [ "myapex" ],
1459 }
1460
1461 cc_library {
1462 name: "libz",
1463 system_shared_libs: [],
1464 stl: "none",
1465 stubs: {
1466 versions: ["1", "2"],
1467 },
1468 }
1469 `)
1470
1471 expectLink := func(from, from_variant, to, to_variant string) {
1472 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1473 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1474 }
1475 expectNoLink := func(from, from_variant, to, to_variant string) {
1476 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1477 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1478 }
Colin Crossaede88c2020-08-11 12:17:01 -07001479 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1480 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1481 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001482}
1483
1484func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1485 ctx, _ := testApex(t, `
1486 apex {
1487 name: "myapex",
1488 key: "myapex.key",
1489 native_shared_libs: ["libx"],
1490 }
1491
1492 apex_key {
1493 name: "myapex.key",
1494 public_key: "testkey.avbpubkey",
1495 private_key: "testkey.pem",
1496 }
1497
1498 cc_library {
1499 name: "libx",
1500 system_shared_libs: [],
1501 stl: "none",
1502 apex_available: [ "myapex" ],
1503 stubs: {
1504 versions: ["1", "2"],
1505 },
1506 }
1507
1508 cc_library {
1509 name: "libz",
1510 shared_libs: ["libx"],
1511 system_shared_libs: [],
1512 stl: "none",
1513 }
1514 `)
1515
1516 expectLink := func(from, from_variant, to, to_variant string) {
1517 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1518 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1519 }
1520 expectNoLink := func(from, from_variant, to, to_variant string) {
1521 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1522 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1523 }
1524 expectLink("libz", "shared", "libx", "shared_2")
1525 expectNoLink("libz", "shared", "libz", "shared_1")
1526 expectNoLink("libz", "shared", "libz", "shared")
1527}
1528
Jooyung Han75568392020-03-20 04:29:24 +09001529func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001530 ctx, _ := testApex(t, `
1531 apex {
1532 name: "myapex",
1533 key: "myapex.key",
1534 native_shared_libs: ["libx"],
1535 min_sdk_version: "29",
1536 }
1537
1538 apex_key {
1539 name: "myapex.key",
1540 public_key: "testkey.avbpubkey",
1541 private_key: "testkey.pem",
1542 }
1543
1544 cc_library {
1545 name: "libx",
1546 shared_libs: ["libbar"],
1547 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001548 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001549 }
1550
1551 cc_library {
1552 name: "libbar",
1553 stubs: {
1554 versions: ["29", "30"],
1555 },
1556 }
Jooyung Han75568392020-03-20 04:29:24 +09001557 `, func(fs map[string][]byte, config android.Config) {
1558 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1559 })
Jooyung Han03b51852020-02-26 22:45:42 +09001560 expectLink := func(from, from_variant, to, to_variant string) {
1561 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1562 libFlags := ld.Args["libFlags"]
1563 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1564 }
Colin Crossaede88c2020-08-11 12:17:01 -07001565 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001566}
1567
Jooyung Han75568392020-03-20 04:29:24 +09001568func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001569 ctx, _ := testApex(t, `
1570 apex {
1571 name: "myapex",
1572 key: "myapex.key",
1573 native_shared_libs: ["libx"],
1574 min_sdk_version: "29",
1575 }
1576
1577 apex_key {
1578 name: "myapex.key",
1579 public_key: "testkey.avbpubkey",
1580 private_key: "testkey.pem",
1581 }
1582
1583 cc_library {
1584 name: "libx",
1585 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001586 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001587 }
Jooyung Han75568392020-03-20 04:29:24 +09001588 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001589
1590 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001591 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001592 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1593 // note that platform variant is not.
1594 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1595 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001596}
1597
Jooyung Han749dc692020-04-15 11:03:39 +09001598func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001599 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001600 apex {
1601 name: "myapex",
1602 key: "myapex.key",
1603 native_shared_libs: ["libx"],
1604 min_sdk_version: "29",
1605 }
1606
1607 apex_key {
1608 name: "myapex.key",
1609 public_key: "testkey.avbpubkey",
1610 private_key: "testkey.pem",
1611 }
1612
1613 cc_library {
1614 name: "libx",
1615 shared_libs: ["libz"],
1616 system_shared_libs: [],
1617 stl: "none",
1618 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001619 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001620 }
1621
1622 cc_library {
1623 name: "libz",
1624 system_shared_libs: [],
1625 stl: "none",
1626 stubs: {
1627 versions: ["30"],
1628 },
1629 }
Jooyung Han75568392020-03-20 04:29:24 +09001630 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001631}
Jooyung Han03b51852020-02-26 22:45:42 +09001632
Jooyung Han749dc692020-04-15 11:03:39 +09001633func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1634 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001635 apex {
1636 name: "myapex",
1637 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001638 native_shared_libs: ["mylib"],
1639 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001640 }
1641
1642 apex_key {
1643 name: "myapex.key",
1644 public_key: "testkey.avbpubkey",
1645 private_key: "testkey.pem",
1646 }
Jooyung Han749dc692020-04-15 11:03:39 +09001647
1648 cc_library {
1649 name: "mylib",
1650 srcs: ["mylib.cpp"],
1651 system_shared_libs: [],
1652 stl: "none",
1653 apex_available: [
1654 "myapex",
1655 ],
1656 min_sdk_version: "30",
1657 }
1658 `)
1659}
1660
1661func TestApexMinSdkVersion_Okay(t *testing.T) {
1662 testApex(t, `
1663 apex {
1664 name: "myapex",
1665 key: "myapex.key",
1666 native_shared_libs: ["libfoo"],
1667 java_libs: ["libbar"],
1668 min_sdk_version: "29",
1669 }
1670
1671 apex_key {
1672 name: "myapex.key",
1673 public_key: "testkey.avbpubkey",
1674 private_key: "testkey.pem",
1675 }
1676
1677 cc_library {
1678 name: "libfoo",
1679 srcs: ["mylib.cpp"],
1680 shared_libs: ["libfoo_dep"],
1681 apex_available: ["myapex"],
1682 min_sdk_version: "29",
1683 }
1684
1685 cc_library {
1686 name: "libfoo_dep",
1687 srcs: ["mylib.cpp"],
1688 apex_available: ["myapex"],
1689 min_sdk_version: "29",
1690 }
1691
1692 java_library {
1693 name: "libbar",
1694 sdk_version: "current",
1695 srcs: ["a.java"],
1696 static_libs: ["libbar_dep"],
1697 apex_available: ["myapex"],
1698 min_sdk_version: "29",
1699 }
1700
1701 java_library {
1702 name: "libbar_dep",
1703 sdk_version: "current",
1704 srcs: ["a.java"],
1705 apex_available: ["myapex"],
1706 min_sdk_version: "29",
1707 }
Jooyung Han03b51852020-02-26 22:45:42 +09001708 `)
1709}
1710
Artur Satayev8cf899a2020-04-15 17:29:42 +01001711func TestJavaStableSdkVersion(t *testing.T) {
1712 testCases := []struct {
1713 name string
1714 expectedError string
1715 bp string
1716 }{
1717 {
1718 name: "Non-updatable apex with non-stable dep",
1719 bp: `
1720 apex {
1721 name: "myapex",
1722 java_libs: ["myjar"],
1723 key: "myapex.key",
1724 }
1725 apex_key {
1726 name: "myapex.key",
1727 public_key: "testkey.avbpubkey",
1728 private_key: "testkey.pem",
1729 }
1730 java_library {
1731 name: "myjar",
1732 srcs: ["foo/bar/MyClass.java"],
1733 sdk_version: "core_platform",
1734 apex_available: ["myapex"],
1735 }
1736 `,
1737 },
1738 {
1739 name: "Updatable apex with stable dep",
1740 bp: `
1741 apex {
1742 name: "myapex",
1743 java_libs: ["myjar"],
1744 key: "myapex.key",
1745 updatable: true,
1746 min_sdk_version: "29",
1747 }
1748 apex_key {
1749 name: "myapex.key",
1750 public_key: "testkey.avbpubkey",
1751 private_key: "testkey.pem",
1752 }
1753 java_library {
1754 name: "myjar",
1755 srcs: ["foo/bar/MyClass.java"],
1756 sdk_version: "current",
1757 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001758 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001759 }
1760 `,
1761 },
1762 {
1763 name: "Updatable apex with non-stable dep",
1764 expectedError: "cannot depend on \"myjar\"",
1765 bp: `
1766 apex {
1767 name: "myapex",
1768 java_libs: ["myjar"],
1769 key: "myapex.key",
1770 updatable: true,
1771 }
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777 java_library {
1778 name: "myjar",
1779 srcs: ["foo/bar/MyClass.java"],
1780 sdk_version: "core_platform",
1781 apex_available: ["myapex"],
1782 }
1783 `,
1784 },
1785 {
1786 name: "Updatable apex with non-stable transitive dep",
1787 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1788 bp: `
1789 apex {
1790 name: "myapex",
1791 java_libs: ["myjar"],
1792 key: "myapex.key",
1793 updatable: true,
1794 }
1795 apex_key {
1796 name: "myapex.key",
1797 public_key: "testkey.avbpubkey",
1798 private_key: "testkey.pem",
1799 }
1800 java_library {
1801 name: "myjar",
1802 srcs: ["foo/bar/MyClass.java"],
1803 sdk_version: "current",
1804 apex_available: ["myapex"],
1805 static_libs: ["transitive-jar"],
1806 }
1807 java_library {
1808 name: "transitive-jar",
1809 srcs: ["foo/bar/MyClass.java"],
1810 sdk_version: "core_platform",
1811 apex_available: ["myapex"],
1812 }
1813 `,
1814 },
1815 }
1816
1817 for _, test := range testCases {
1818 t.Run(test.name, func(t *testing.T) {
1819 if test.expectedError == "" {
1820 testApex(t, test.bp)
1821 } else {
1822 testApexError(t, test.expectedError, test.bp)
1823 }
1824 })
1825 }
1826}
1827
Jooyung Han749dc692020-04-15 11:03:39 +09001828func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1829 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1830 apex {
1831 name: "myapex",
1832 key: "myapex.key",
1833 native_shared_libs: ["mylib"],
1834 min_sdk_version: "29",
1835 }
1836
1837 apex_key {
1838 name: "myapex.key",
1839 public_key: "testkey.avbpubkey",
1840 private_key: "testkey.pem",
1841 }
1842
1843 cc_library {
1844 name: "mylib",
1845 srcs: ["mylib.cpp"],
1846 shared_libs: ["mylib2"],
1847 system_shared_libs: [],
1848 stl: "none",
1849 apex_available: [
1850 "myapex",
1851 ],
1852 min_sdk_version: "29",
1853 }
1854
1855 // indirect part of the apex
1856 cc_library {
1857 name: "mylib2",
1858 srcs: ["mylib.cpp"],
1859 system_shared_libs: [],
1860 stl: "none",
1861 apex_available: [
1862 "myapex",
1863 ],
1864 min_sdk_version: "30",
1865 }
1866 `)
1867}
1868
1869func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1870 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1871 apex {
1872 name: "myapex",
1873 key: "myapex.key",
1874 apps: ["AppFoo"],
1875 min_sdk_version: "29",
1876 }
1877
1878 apex_key {
1879 name: "myapex.key",
1880 public_key: "testkey.avbpubkey",
1881 private_key: "testkey.pem",
1882 }
1883
1884 android_app {
1885 name: "AppFoo",
1886 srcs: ["foo/bar/MyClass.java"],
1887 sdk_version: "current",
1888 min_sdk_version: "29",
1889 system_modules: "none",
1890 stl: "none",
1891 static_libs: ["bar"],
1892 apex_available: [ "myapex" ],
1893 }
1894
1895 java_library {
1896 name: "bar",
1897 sdk_version: "current",
1898 srcs: ["a.java"],
1899 apex_available: [ "myapex" ],
1900 }
1901 `)
1902}
1903
1904func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1905 ctx, _ := testApex(t, `
1906 apex {
1907 name: "myapex",
1908 key: "myapex.key",
1909 native_shared_libs: ["mylib"],
1910 min_sdk_version: "29",
1911 }
1912
1913 apex_key {
1914 name: "myapex.key",
1915 public_key: "testkey.avbpubkey",
1916 private_key: "testkey.pem",
1917 }
1918
1919 // mylib in myapex will link to mylib2#29
1920 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1921 cc_library {
1922 name: "mylib",
1923 srcs: ["mylib.cpp"],
1924 shared_libs: ["mylib2"],
1925 system_shared_libs: [],
1926 stl: "none",
1927 apex_available: ["myapex", "otherapex"],
1928 min_sdk_version: "29",
1929 }
1930
1931 cc_library {
1932 name: "mylib2",
1933 srcs: ["mylib.cpp"],
1934 system_shared_libs: [],
1935 stl: "none",
1936 apex_available: ["otherapex"],
1937 stubs: { versions: ["29", "30"] },
1938 min_sdk_version: "30",
1939 }
1940
1941 apex {
1942 name: "otherapex",
1943 key: "myapex.key",
1944 native_shared_libs: ["mylib", "mylib2"],
1945 min_sdk_version: "30",
1946 }
1947 `)
1948 expectLink := func(from, from_variant, to, to_variant string) {
1949 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1950 libFlags := ld.Args["libFlags"]
1951 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1952 }
Colin Crossaede88c2020-08-11 12:17:01 -07001953 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
1954 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09001955}
1956
Jiyong Park7c2ee712018-12-07 00:42:25 +09001957func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001958 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001959 apex {
1960 name: "myapex",
1961 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001962 native_shared_libs: ["mylib"],
1963 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001964 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001965 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001966 }
1967
1968 apex_key {
1969 name: "myapex.key",
1970 public_key: "testkey.avbpubkey",
1971 private_key: "testkey.pem",
1972 }
1973
1974 prebuilt_etc {
1975 name: "myetc",
1976 src: "myprebuilt",
1977 sub_dir: "foo/bar",
1978 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001979
1980 cc_library {
1981 name: "mylib",
1982 srcs: ["mylib.cpp"],
1983 relative_install_path: "foo/bar",
1984 system_shared_libs: [],
1985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001986 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001987 }
1988
1989 cc_binary {
1990 name: "mybin",
1991 srcs: ["mylib.cpp"],
1992 relative_install_path: "foo/bar",
1993 system_shared_libs: [],
1994 static_executable: true,
1995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001996 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001997 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001998 `)
1999
Sundong Ahnabb64432019-10-22 13:58:29 +09002000 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002001 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2002
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002003 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002004 ensureListContains(t, dirs, "etc")
2005 ensureListContains(t, dirs, "etc/foo")
2006 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002007 ensureListContains(t, dirs, "lib64")
2008 ensureListContains(t, dirs, "lib64/foo")
2009 ensureListContains(t, dirs, "lib64/foo/bar")
2010 ensureListContains(t, dirs, "lib")
2011 ensureListContains(t, dirs, "lib/foo")
2012 ensureListContains(t, dirs, "lib/foo/bar")
2013
Jiyong Parkbd13e442019-03-15 18:10:35 +09002014 ensureListContains(t, dirs, "bin")
2015 ensureListContains(t, dirs, "bin/foo")
2016 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002017}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002018
Jooyung Han35155c42020-02-06 17:33:20 +09002019func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2020 ctx, _ := testApex(t, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 multilib: {
2025 both: {
2026 native_shared_libs: ["mylib"],
2027 binaries: ["mybin"],
2028 },
2029 },
2030 compile_multilib: "both",
2031 native_bridge_supported: true,
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "mylib",
2042 relative_install_path: "foo/bar",
2043 system_shared_libs: [],
2044 stl: "none",
2045 apex_available: [ "myapex" ],
2046 native_bridge_supported: true,
2047 }
2048
2049 cc_binary {
2050 name: "mybin",
2051 relative_install_path: "foo/bar",
2052 system_shared_libs: [],
2053 static_executable: true,
2054 stl: "none",
2055 apex_available: [ "myapex" ],
2056 native_bridge_supported: true,
2057 compile_multilib: "both", // default is "first" for binary
2058 multilib: {
2059 lib64: {
2060 suffix: "64",
2061 },
2062 },
2063 }
2064 `, withNativeBridgeEnabled)
2065 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2066 "bin/foo/bar/mybin",
2067 "bin/foo/bar/mybin64",
2068 "bin/arm/foo/bar/mybin",
2069 "bin/arm64/foo/bar/mybin64",
2070 "lib/foo/bar/mylib.so",
2071 "lib/arm/foo/bar/mylib.so",
2072 "lib64/foo/bar/mylib.so",
2073 "lib64/arm64/foo/bar/mylib.so",
2074 })
2075}
2076
Jiyong Parkda6eb592018-12-19 17:12:36 +09002077func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002078 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002079 apex {
2080 name: "myapex",
2081 key: "myapex.key",
2082 native_shared_libs: ["mylib"],
2083 use_vendor: true,
2084 }
2085
2086 apex_key {
2087 name: "myapex.key",
2088 public_key: "testkey.avbpubkey",
2089 private_key: "testkey.pem",
2090 }
2091
2092 cc_library {
2093 name: "mylib",
2094 srcs: ["mylib.cpp"],
2095 shared_libs: ["mylib2"],
2096 system_shared_libs: [],
2097 vendor_available: true,
2098 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002099 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002100 }
2101
2102 cc_library {
2103 name: "mylib2",
2104 srcs: ["mylib.cpp"],
2105 system_shared_libs: [],
2106 vendor_available: true,
2107 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002108 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002109 }
Jooyung Handc782442019-11-01 03:14:38 +09002110 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002111 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002112 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002113
2114 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002115 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002116 for _, implicit := range i.Implicits {
2117 inputsList = append(inputsList, implicit.String())
2118 }
2119 }
2120 inputsString := strings.Join(inputsList, " ")
2121
2122 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002123 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2124 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002125
2126 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002127 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2128 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002129}
Jiyong Park16e91a02018-12-20 18:18:08 +09002130
Jooyung Han85d61762020-06-24 23:50:26 +09002131func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002132 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2133 apex {
2134 name: "myapex",
2135 key: "myapex.key",
2136 use_vendor: true,
2137 }
2138 apex_key {
2139 name: "myapex.key",
2140 public_key: "testkey.avbpubkey",
2141 private_key: "testkey.pem",
2142 }
2143 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002144 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002145 })
Colin Cross440e0d02020-06-11 11:32:11 -07002146 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002147 testApex(t, `
2148 apex {
2149 name: "myapex",
2150 key: "myapex.key",
2151 use_vendor: true,
2152 }
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002159 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002160 })
2161}
2162
Jooyung Han5c998b92019-06-27 11:30:33 +09002163func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2164 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2165 apex {
2166 name: "myapex",
2167 key: "myapex.key",
2168 native_shared_libs: ["mylib"],
2169 use_vendor: true,
2170 }
2171
2172 apex_key {
2173 name: "myapex.key",
2174 public_key: "testkey.avbpubkey",
2175 private_key: "testkey.pem",
2176 }
2177
2178 cc_library {
2179 name: "mylib",
2180 srcs: ["mylib.cpp"],
2181 system_shared_libs: [],
2182 stl: "none",
2183 }
2184 `)
2185}
2186
Jooyung Han85d61762020-06-24 23:50:26 +09002187func TestVendorApex(t *testing.T) {
2188 ctx, config := testApex(t, `
2189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
2192 binaries: ["mybin"],
2193 vendor: true,
2194 }
2195 apex_key {
2196 name: "myapex.key",
2197 public_key: "testkey.avbpubkey",
2198 private_key: "testkey.pem",
2199 }
2200 cc_binary {
2201 name: "mybin",
2202 vendor: true,
2203 shared_libs: ["libfoo"],
2204 }
2205 cc_library {
2206 name: "libfoo",
2207 proprietary: true,
2208 }
2209 `)
2210
2211 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2212 "bin/mybin",
2213 "lib64/libfoo.so",
2214 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2215 "lib64/libc++.so",
2216 })
2217
2218 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2219 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2220 name := apexBundle.BaseModuleName()
2221 prefix := "TARGET_"
2222 var builder strings.Builder
2223 data.Custom(&builder, name, prefix, "", data)
2224 androidMk := builder.String()
2225 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002226
2227 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2228 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2229 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002230}
2231
Jooyung Handf78e212020-07-22 15:54:47 +09002232func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2233 ctx, _ := testApex(t, `
2234 apex {
2235 name: "myapex",
2236 key: "myapex.key",
2237 binaries: ["mybin"],
2238 vendor: true,
2239 use_vndk_as_stable: true,
2240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 cc_binary {
2247 name: "mybin",
2248 vendor: true,
2249 shared_libs: ["libvndk", "libvendor"],
2250 }
2251 cc_library {
2252 name: "libvndk",
2253 vndk: {
2254 enabled: true,
2255 },
2256 vendor_available: true,
2257 }
2258 cc_library {
2259 name: "libvendor",
2260 vendor: true,
2261 }
2262 `)
2263
2264 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2265
Colin Crossaede88c2020-08-11 12:17:01 -07002266 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002267 libs := names(ldRule.Args["libFlags"])
2268 // VNDK libs(libvndk/libc++) as they are
2269 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2270 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2271 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002272 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002273
2274 // VNDK libs are not included when use_vndk_as_stable: true
2275 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2276 "bin/mybin",
2277 "lib64/libvendor.so",
2278 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002279
2280 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2281 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2282 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002283}
2284
Jooyung Hanefb184e2020-06-25 17:14:25 +09002285func TestAndroidMk_UseVendorRequired(t *testing.T) {
2286 ctx, config := testApex(t, `
2287 apex {
2288 name: "myapex",
2289 key: "myapex.key",
2290 use_vendor: true,
2291 native_shared_libs: ["mylib"],
2292 }
2293
2294 apex_key {
2295 name: "myapex.key",
2296 public_key: "testkey.avbpubkey",
2297 private_key: "testkey.pem",
2298 }
2299
2300 cc_library {
2301 name: "mylib",
2302 vendor_available: true,
2303 apex_available: ["myapex"],
2304 }
2305 `, func(fs map[string][]byte, config android.Config) {
2306 setUseVendorAllowListForTest(config, []string{"myapex"})
2307 })
2308
2309 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2310 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2311 name := apexBundle.BaseModuleName()
2312 prefix := "TARGET_"
2313 var builder strings.Builder
2314 data.Custom(&builder, name, prefix, "", data)
2315 androidMk := builder.String()
2316 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2317}
2318
2319func TestAndroidMk_VendorApexRequired(t *testing.T) {
2320 ctx, config := testApex(t, `
2321 apex {
2322 name: "myapex",
2323 key: "myapex.key",
2324 vendor: true,
2325 native_shared_libs: ["mylib"],
2326 }
2327
2328 apex_key {
2329 name: "myapex.key",
2330 public_key: "testkey.avbpubkey",
2331 private_key: "testkey.pem",
2332 }
2333
2334 cc_library {
2335 name: "mylib",
2336 vendor_available: true,
2337 }
2338 `)
2339
2340 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2341 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2342 name := apexBundle.BaseModuleName()
2343 prefix := "TARGET_"
2344 var builder strings.Builder
2345 data.Custom(&builder, name, prefix, "", data)
2346 androidMk := builder.String()
2347 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2348}
2349
Jooyung Han2ed99d02020-06-24 23:26:26 +09002350func TestAndroidMkWritesCommonProperties(t *testing.T) {
2351 ctx, config := testApex(t, `
2352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
2355 vintf_fragments: ["fragment.xml"],
2356 init_rc: ["init.rc"],
2357 }
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363 cc_binary {
2364 name: "mybin",
2365 }
2366 `)
2367
2368 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2369 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2370 name := apexBundle.BaseModuleName()
2371 prefix := "TARGET_"
2372 var builder strings.Builder
2373 data.Custom(&builder, name, prefix, "", data)
2374 androidMk := builder.String()
2375 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2376 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2377}
2378
Jiyong Park16e91a02018-12-20 18:18:08 +09002379func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002380 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002381 apex {
2382 name: "myapex",
2383 key: "myapex.key",
2384 native_shared_libs: ["mylib"],
2385 }
2386
2387 apex_key {
2388 name: "myapex.key",
2389 public_key: "testkey.avbpubkey",
2390 private_key: "testkey.pem",
2391 }
2392
2393 cc_library {
2394 name: "mylib",
2395 srcs: ["mylib.cpp"],
2396 system_shared_libs: [],
2397 stl: "none",
2398 stubs: {
2399 versions: ["1", "2", "3"],
2400 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002401 apex_available: [
2402 "//apex_available:platform",
2403 "myapex",
2404 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002405 }
2406
2407 cc_binary {
2408 name: "not_in_apex",
2409 srcs: ["mylib.cpp"],
2410 static_libs: ["mylib"],
2411 static_executable: true,
2412 system_shared_libs: [],
2413 stl: "none",
2414 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002415 `)
2416
Colin Cross7113d202019-11-20 16:39:12 -08002417 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002418
2419 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002420 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002421}
Jiyong Park9335a262018-12-24 11:31:58 +09002422
2423func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002424 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002425 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002426 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002427 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002428 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002429 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002430 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002431 }
2432
2433 cc_library {
2434 name: "mylib",
2435 srcs: ["mylib.cpp"],
2436 system_shared_libs: [],
2437 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002438 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002439 }
2440
2441 apex_key {
2442 name: "myapex.key",
2443 public_key: "testkey.avbpubkey",
2444 private_key: "testkey.pem",
2445 }
2446
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002447 android_app_certificate {
2448 name: "myapex.certificate",
2449 certificate: "testkey",
2450 }
2451
2452 android_app_certificate {
2453 name: "myapex.certificate.override",
2454 certificate: "testkey.override",
2455 }
2456
Jiyong Park9335a262018-12-24 11:31:58 +09002457 `)
2458
2459 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002460 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002461
2462 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2463 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2464 "vendor/foo/devkeys/testkey.avbpubkey")
2465 }
2466 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2467 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2468 "vendor/foo/devkeys/testkey.pem")
2469 }
2470
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002471 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002472 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002473 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002474 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002475 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002476 }
2477}
Jiyong Park58e364a2019-01-19 19:24:06 +09002478
Jooyung Hanf121a652019-12-17 14:30:11 +09002479func TestCertificate(t *testing.T) {
2480 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2481 ctx, _ := testApex(t, `
2482 apex {
2483 name: "myapex",
2484 key: "myapex.key",
2485 }
2486 apex_key {
2487 name: "myapex.key",
2488 public_key: "testkey.avbpubkey",
2489 private_key: "testkey.pem",
2490 }`)
2491 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2492 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2493 if actual := rule.Args["certificates"]; actual != expected {
2494 t.Errorf("certificates should be %q, not %q", expected, actual)
2495 }
2496 })
2497 t.Run("override when unspecified", func(t *testing.T) {
2498 ctx, _ := testApex(t, `
2499 apex {
2500 name: "myapex_keytest",
2501 key: "myapex.key",
2502 file_contexts: ":myapex-file_contexts",
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 android_app_certificate {
2510 name: "myapex.certificate.override",
2511 certificate: "testkey.override",
2512 }`)
2513 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2514 expected := "testkey.override.x509.pem testkey.override.pk8"
2515 if actual := rule.Args["certificates"]; actual != expected {
2516 t.Errorf("certificates should be %q, not %q", expected, actual)
2517 }
2518 })
2519 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2520 ctx, _ := testApex(t, `
2521 apex {
2522 name: "myapex",
2523 key: "myapex.key",
2524 certificate: ":myapex.certificate",
2525 }
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
2531 android_app_certificate {
2532 name: "myapex.certificate",
2533 certificate: "testkey",
2534 }`)
2535 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2536 expected := "testkey.x509.pem testkey.pk8"
2537 if actual := rule.Args["certificates"]; actual != expected {
2538 t.Errorf("certificates should be %q, not %q", expected, actual)
2539 }
2540 })
2541 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2542 ctx, _ := testApex(t, `
2543 apex {
2544 name: "myapex_keytest",
2545 key: "myapex.key",
2546 file_contexts: ":myapex-file_contexts",
2547 certificate: ":myapex.certificate",
2548 }
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554 android_app_certificate {
2555 name: "myapex.certificate.override",
2556 certificate: "testkey.override",
2557 }`)
2558 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2559 expected := "testkey.override.x509.pem testkey.override.pk8"
2560 if actual := rule.Args["certificates"]; actual != expected {
2561 t.Errorf("certificates should be %q, not %q", expected, actual)
2562 }
2563 })
2564 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2565 ctx, _ := testApex(t, `
2566 apex {
2567 name: "myapex",
2568 key: "myapex.key",
2569 certificate: "testkey",
2570 }
2571 apex_key {
2572 name: "myapex.key",
2573 public_key: "testkey.avbpubkey",
2574 private_key: "testkey.pem",
2575 }`)
2576 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2577 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2578 if actual := rule.Args["certificates"]; actual != expected {
2579 t.Errorf("certificates should be %q, not %q", expected, actual)
2580 }
2581 })
2582 t.Run("override when specified as <name>", func(t *testing.T) {
2583 ctx, _ := testApex(t, `
2584 apex {
2585 name: "myapex_keytest",
2586 key: "myapex.key",
2587 file_contexts: ":myapex-file_contexts",
2588 certificate: "testkey",
2589 }
2590 apex_key {
2591 name: "myapex.key",
2592 public_key: "testkey.avbpubkey",
2593 private_key: "testkey.pem",
2594 }
2595 android_app_certificate {
2596 name: "myapex.certificate.override",
2597 certificate: "testkey.override",
2598 }`)
2599 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2600 expected := "testkey.override.x509.pem testkey.override.pk8"
2601 if actual := rule.Args["certificates"]; actual != expected {
2602 t.Errorf("certificates should be %q, not %q", expected, actual)
2603 }
2604 })
2605}
2606
Jiyong Park58e364a2019-01-19 19:24:06 +09002607func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002608 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002609 apex {
2610 name: "myapex",
2611 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002612 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002613 }
2614
2615 apex {
2616 name: "otherapex",
2617 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002618 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002619 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002620 }
2621
2622 apex_key {
2623 name: "myapex.key",
2624 public_key: "testkey.avbpubkey",
2625 private_key: "testkey.pem",
2626 }
2627
2628 cc_library {
2629 name: "mylib",
2630 srcs: ["mylib.cpp"],
2631 system_shared_libs: [],
2632 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002633 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002634 "myapex",
2635 "otherapex",
2636 ],
Jooyung Han24282772020-03-21 23:20:55 +09002637 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002638 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002639 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002640 cc_library {
2641 name: "mylib2",
2642 srcs: ["mylib.cpp"],
2643 system_shared_libs: [],
2644 stl: "none",
2645 apex_available: [
2646 "myapex",
2647 "otherapex",
2648 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002649 static_libs: ["mylib3"],
2650 recovery_available: true,
2651 min_sdk_version: "29",
2652 }
2653 cc_library {
2654 name: "mylib3",
2655 srcs: ["mylib.cpp"],
2656 system_shared_libs: [],
2657 stl: "none",
2658 apex_available: [
2659 "myapex",
2660 "otherapex",
2661 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002662 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002663 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002664 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002665 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002666 `)
2667
Jooyung Hanc87a0592020-03-02 17:44:33 +09002668 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002669 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002670 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002671 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002672
Jooyung Hanccce2f22020-03-07 03:45:53 +09002673 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002674 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002675 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002676 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002677 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002678
Jooyung Hanccce2f22020-03-07 03:45:53 +09002679 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002680 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002681 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002682 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002683 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002684
Colin Crossaede88c2020-08-11 12:17:01 -07002685 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2686 // each variant defines additional macros to distinguish which apex variant it is built for
2687
2688 // non-APEX variant does not have __ANDROID_APEX__ defined
2689 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2690 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2691
2692 // APEX variant has __ANDROID_APEX__ defined
2693 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2695 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2696 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2697
2698 // APEX variant has __ANDROID_APEX__ defined
2699 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2700 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2701 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2702 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2703
2704 // recovery variant does not set __ANDROID_SDK_VERSION__
2705 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2706 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2707 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2708
2709 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2710 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002711
2712 // non-APEX variant does not have __ANDROID_APEX__ defined
2713 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2714 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2715
2716 // APEX variant has __ANDROID_APEX__ defined
2717 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002718 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002719 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002720 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002721
Jooyung Hanc87a0592020-03-02 17:44:33 +09002722 // APEX variant has __ANDROID_APEX__ defined
2723 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002724 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002725 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002726 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002727
2728 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002729 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002730 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2731 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002732}
Jiyong Park7e636d02019-01-28 16:16:54 +09002733
2734func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002735 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002736 apex {
2737 name: "myapex",
2738 key: "myapex.key",
2739 native_shared_libs: ["mylib"],
2740 }
2741
2742 apex_key {
2743 name: "myapex.key",
2744 public_key: "testkey.avbpubkey",
2745 private_key: "testkey.pem",
2746 }
2747
2748 cc_library_headers {
2749 name: "mylib_headers",
2750 export_include_dirs: ["my_include"],
2751 system_shared_libs: [],
2752 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002753 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002754 }
2755
2756 cc_library {
2757 name: "mylib",
2758 srcs: ["mylib.cpp"],
2759 system_shared_libs: [],
2760 stl: "none",
2761 header_libs: ["mylib_headers"],
2762 export_header_lib_headers: ["mylib_headers"],
2763 stubs: {
2764 versions: ["1", "2", "3"],
2765 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002766 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002767 }
2768
2769 cc_library {
2770 name: "otherlib",
2771 srcs: ["mylib.cpp"],
2772 system_shared_libs: [],
2773 stl: "none",
2774 shared_libs: ["mylib"],
2775 }
2776 `)
2777
Colin Cross7113d202019-11-20 16:39:12 -08002778 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002779
2780 // Ensure that the include path of the header lib is exported to 'otherlib'
2781 ensureContains(t, cFlags, "-Imy_include")
2782}
Alex Light9670d332019-01-29 18:07:33 -08002783
Jiyong Park7cd10e32020-01-14 09:22:18 +09002784type fileInApex struct {
2785 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002786 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002787 isLink bool
2788}
2789
Jooyung Hana57af4a2020-01-23 05:36:59 +00002790func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002791 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002792 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002793 copyCmds := apexRule.Args["copy_commands"]
2794 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002795 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002796 for _, cmd := range strings.Split(copyCmds, "&&") {
2797 cmd = strings.TrimSpace(cmd)
2798 if cmd == "" {
2799 continue
2800 }
2801 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002802 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002803 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002804 switch terms[0] {
2805 case "mkdir":
2806 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002807 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002808 t.Fatal("copyCmds contains invalid cp command", cmd)
2809 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002810 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002811 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002812 isLink = false
2813 case "ln":
2814 if len(terms) != 3 && len(terms) != 4 {
2815 // ln LINK TARGET or ln -s LINK TARGET
2816 t.Fatal("copyCmds contains invalid ln command", cmd)
2817 }
2818 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002819 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002820 isLink = true
2821 default:
2822 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2823 }
2824 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002825 index := strings.Index(dst, imageApexDir)
2826 if index == -1 {
2827 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2828 }
2829 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002830 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002831 }
2832 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002833 return ret
2834}
2835
Jooyung Hana57af4a2020-01-23 05:36:59 +00002836func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2837 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002838 var failed bool
2839 var surplus []string
2840 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002841 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002842 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002843 for _, expected := range files {
2844 if matched, _ := path.Match(expected, file.path); matched {
2845 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002846 mactchFound = true
2847 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002848 }
2849 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002850 if !mactchFound {
2851 surplus = append(surplus, file.path)
2852 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002853 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002854
Jooyung Han31c470b2019-10-18 16:26:59 +09002855 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002856 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002857 t.Log("surplus files", surplus)
2858 failed = true
2859 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002860
2861 if len(files) > len(filesMatched) {
2862 var missing []string
2863 for _, expected := range files {
2864 if !filesMatched[expected] {
2865 missing = append(missing, expected)
2866 }
2867 }
2868 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002869 t.Log("missing files", missing)
2870 failed = true
2871 }
2872 if failed {
2873 t.Fail()
2874 }
2875}
2876
Jooyung Han344d5432019-08-23 11:17:39 +09002877func TestVndkApexCurrent(t *testing.T) {
2878 ctx, _ := testApex(t, `
2879 apex_vndk {
2880 name: "myapex",
2881 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002882 }
2883
2884 apex_key {
2885 name: "myapex.key",
2886 public_key: "testkey.avbpubkey",
2887 private_key: "testkey.pem",
2888 }
2889
2890 cc_library {
2891 name: "libvndk",
2892 srcs: ["mylib.cpp"],
2893 vendor_available: true,
2894 vndk: {
2895 enabled: true,
2896 },
2897 system_shared_libs: [],
2898 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002899 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002900 }
2901
2902 cc_library {
2903 name: "libvndksp",
2904 srcs: ["mylib.cpp"],
2905 vendor_available: true,
2906 vndk: {
2907 enabled: true,
2908 support_system_process: true,
2909 },
2910 system_shared_libs: [],
2911 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002912 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002913 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002914 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002915
Jooyung Hana57af4a2020-01-23 05:36:59 +00002916 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002917 "lib/libvndk.so",
2918 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002919 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002920 "lib64/libvndk.so",
2921 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002922 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002923 "etc/llndk.libraries.VER.txt",
2924 "etc/vndkcore.libraries.VER.txt",
2925 "etc/vndksp.libraries.VER.txt",
2926 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002927 })
Jooyung Han344d5432019-08-23 11:17:39 +09002928}
2929
2930func TestVndkApexWithPrebuilt(t *testing.T) {
2931 ctx, _ := testApex(t, `
2932 apex_vndk {
2933 name: "myapex",
2934 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002935 }
2936
2937 apex_key {
2938 name: "myapex.key",
2939 public_key: "testkey.avbpubkey",
2940 private_key: "testkey.pem",
2941 }
2942
2943 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002944 name: "libvndk",
2945 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002946 vendor_available: true,
2947 vndk: {
2948 enabled: true,
2949 },
2950 system_shared_libs: [],
2951 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002952 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002953 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002954
2955 cc_prebuilt_library_shared {
2956 name: "libvndk.arm",
2957 srcs: ["libvndk.arm.so"],
2958 vendor_available: true,
2959 vndk: {
2960 enabled: true,
2961 },
2962 enabled: false,
2963 arch: {
2964 arm: {
2965 enabled: true,
2966 },
2967 },
2968 system_shared_libs: [],
2969 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002970 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002971 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002972 `+vndkLibrariesTxtFiles("current"),
2973 withFiles(map[string][]byte{
2974 "libvndk.so": nil,
2975 "libvndk.arm.so": nil,
2976 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002977
Jooyung Hana57af4a2020-01-23 05:36:59 +00002978 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002979 "lib/libvndk.so",
2980 "lib/libvndk.arm.so",
2981 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002982 "lib/libc++.so",
2983 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002984 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002985 })
Jooyung Han344d5432019-08-23 11:17:39 +09002986}
2987
Jooyung Han39edb6c2019-11-06 16:53:07 +09002988func vndkLibrariesTxtFiles(vers ...string) (result string) {
2989 for _, v := range vers {
2990 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002991 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002992 result += `
2993 vndk_libraries_txt {
2994 name: "` + txt + `.libraries.txt",
2995 }
2996 `
2997 }
2998 } else {
2999 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3000 result += `
3001 prebuilt_etc {
3002 name: "` + txt + `.libraries.` + v + `.txt",
3003 src: "dummy.txt",
3004 }
3005 `
3006 }
3007 }
3008 }
3009 return
3010}
3011
Jooyung Han344d5432019-08-23 11:17:39 +09003012func TestVndkApexVersion(t *testing.T) {
3013 ctx, _ := testApex(t, `
3014 apex_vndk {
3015 name: "myapex_v27",
3016 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003017 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003018 vndk_version: "27",
3019 }
3020
3021 apex_key {
3022 name: "myapex.key",
3023 public_key: "testkey.avbpubkey",
3024 private_key: "testkey.pem",
3025 }
3026
Jooyung Han31c470b2019-10-18 16:26:59 +09003027 vndk_prebuilt_shared {
3028 name: "libvndk27",
3029 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003030 vendor_available: true,
3031 vndk: {
3032 enabled: true,
3033 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003034 target_arch: "arm64",
3035 arch: {
3036 arm: {
3037 srcs: ["libvndk27_arm.so"],
3038 },
3039 arm64: {
3040 srcs: ["libvndk27_arm64.so"],
3041 },
3042 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003043 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003044 }
3045
3046 vndk_prebuilt_shared {
3047 name: "libvndk27",
3048 version: "27",
3049 vendor_available: true,
3050 vndk: {
3051 enabled: true,
3052 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003053 target_arch: "x86_64",
3054 arch: {
3055 x86: {
3056 srcs: ["libvndk27_x86.so"],
3057 },
3058 x86_64: {
3059 srcs: ["libvndk27_x86_64.so"],
3060 },
3061 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003062 }
3063 `+vndkLibrariesTxtFiles("27"),
3064 withFiles(map[string][]byte{
3065 "libvndk27_arm.so": nil,
3066 "libvndk27_arm64.so": nil,
3067 "libvndk27_x86.so": nil,
3068 "libvndk27_x86_64.so": nil,
3069 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003070
Jooyung Hana57af4a2020-01-23 05:36:59 +00003071 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003072 "lib/libvndk27_arm.so",
3073 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003074 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003075 })
Jooyung Han344d5432019-08-23 11:17:39 +09003076}
3077
3078func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3079 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3080 apex_vndk {
3081 name: "myapex_v27",
3082 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003083 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003084 vndk_version: "27",
3085 }
3086 apex_vndk {
3087 name: "myapex_v27_other",
3088 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003089 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003090 vndk_version: "27",
3091 }
3092
3093 apex_key {
3094 name: "myapex.key",
3095 public_key: "testkey.avbpubkey",
3096 private_key: "testkey.pem",
3097 }
3098
3099 cc_library {
3100 name: "libvndk",
3101 srcs: ["mylib.cpp"],
3102 vendor_available: true,
3103 vndk: {
3104 enabled: true,
3105 },
3106 system_shared_libs: [],
3107 stl: "none",
3108 }
3109
3110 vndk_prebuilt_shared {
3111 name: "libvndk",
3112 version: "27",
3113 vendor_available: true,
3114 vndk: {
3115 enabled: true,
3116 },
3117 srcs: ["libvndk.so"],
3118 }
3119 `, withFiles(map[string][]byte{
3120 "libvndk.so": nil,
3121 }))
3122}
3123
Jooyung Han90eee022019-10-01 20:02:42 +09003124func TestVndkApexNameRule(t *testing.T) {
3125 ctx, _ := testApex(t, `
3126 apex_vndk {
3127 name: "myapex",
3128 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003129 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003130 }
3131 apex_vndk {
3132 name: "myapex_v28",
3133 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003134 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003135 vndk_version: "28",
3136 }
3137 apex_key {
3138 name: "myapex.key",
3139 public_key: "testkey.avbpubkey",
3140 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003141 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003142
3143 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003144 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003145 actual := proptools.String(bundle.properties.Apex_name)
3146 if !reflect.DeepEqual(actual, expected) {
3147 t.Errorf("Got '%v', expected '%v'", actual, expected)
3148 }
3149 }
3150
3151 assertApexName("com.android.vndk.vVER", "myapex")
3152 assertApexName("com.android.vndk.v28", "myapex_v28")
3153}
3154
Jooyung Han344d5432019-08-23 11:17:39 +09003155func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3156 ctx, _ := testApex(t, `
3157 apex_vndk {
3158 name: "myapex",
3159 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003160 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003161 }
3162
3163 apex_key {
3164 name: "myapex.key",
3165 public_key: "testkey.avbpubkey",
3166 private_key: "testkey.pem",
3167 }
3168
3169 cc_library {
3170 name: "libvndk",
3171 srcs: ["mylib.cpp"],
3172 vendor_available: true,
3173 native_bridge_supported: true,
3174 host_supported: true,
3175 vndk: {
3176 enabled: true,
3177 },
3178 system_shared_libs: [],
3179 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003180 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003181 }
Jooyung Han35155c42020-02-06 17:33:20 +09003182 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003183
Jooyung Hana57af4a2020-01-23 05:36:59 +00003184 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003185 "lib/libvndk.so",
3186 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003187 "lib/libc++.so",
3188 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003189 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003190 })
Jooyung Han344d5432019-08-23 11:17:39 +09003191}
3192
3193func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3194 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3195 apex_vndk {
3196 name: "myapex",
3197 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003198 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003199 native_bridge_supported: true,
3200 }
3201
3202 apex_key {
3203 name: "myapex.key",
3204 public_key: "testkey.avbpubkey",
3205 private_key: "testkey.pem",
3206 }
3207
3208 cc_library {
3209 name: "libvndk",
3210 srcs: ["mylib.cpp"],
3211 vendor_available: true,
3212 native_bridge_supported: true,
3213 host_supported: true,
3214 vndk: {
3215 enabled: true,
3216 },
3217 system_shared_libs: [],
3218 stl: "none",
3219 }
3220 `)
3221}
3222
Jooyung Han31c470b2019-10-18 16:26:59 +09003223func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003224 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003225 apex_vndk {
3226 name: "myapex_v27",
3227 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003228 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003229 vndk_version: "27",
3230 }
3231
3232 apex_key {
3233 name: "myapex.key",
3234 public_key: "testkey.avbpubkey",
3235 private_key: "testkey.pem",
3236 }
3237
3238 vndk_prebuilt_shared {
3239 name: "libvndk27",
3240 version: "27",
3241 target_arch: "arm",
3242 vendor_available: true,
3243 vndk: {
3244 enabled: true,
3245 },
3246 arch: {
3247 arm: {
3248 srcs: ["libvndk27.so"],
3249 }
3250 },
3251 }
3252
3253 vndk_prebuilt_shared {
3254 name: "libvndk27",
3255 version: "27",
3256 target_arch: "arm",
3257 binder32bit: true,
3258 vendor_available: true,
3259 vndk: {
3260 enabled: true,
3261 },
3262 arch: {
3263 arm: {
3264 srcs: ["libvndk27binder32.so"],
3265 }
3266 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003267 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003268 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003269 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003270 withFiles(map[string][]byte{
3271 "libvndk27.so": nil,
3272 "libvndk27binder32.so": nil,
3273 }),
3274 withBinder32bit,
3275 withTargets(map[android.OsType][]android.Target{
3276 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003277 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3278 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003279 },
3280 }),
3281 )
3282
Jooyung Hana57af4a2020-01-23 05:36:59 +00003283 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003284 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003285 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003286 })
3287}
3288
Jooyung Han45a96772020-06-15 14:59:42 +09003289func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3290 ctx, _ := testApex(t, `
3291 apex_vndk {
3292 name: "myapex",
3293 key: "myapex.key",
3294 file_contexts: ":myapex-file_contexts",
3295 }
3296
3297 apex_key {
3298 name: "myapex.key",
3299 public_key: "testkey.avbpubkey",
3300 private_key: "testkey.pem",
3301 }
3302
3303 cc_library {
3304 name: "libz",
3305 vendor_available: true,
3306 vndk: {
3307 enabled: true,
3308 },
3309 stubs: {
3310 symbol_file: "libz.map.txt",
3311 versions: ["30"],
3312 }
3313 }
3314 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3315 "libz.map.txt": nil,
3316 }))
3317
3318 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3319 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3320 ensureListEmpty(t, provideNativeLibs)
3321}
3322
Jooyung Hane1633032019-08-01 17:41:43 +09003323func TestDependenciesInApexManifest(t *testing.T) {
3324 ctx, _ := testApex(t, `
3325 apex {
3326 name: "myapex_nodep",
3327 key: "myapex.key",
3328 native_shared_libs: ["lib_nodep"],
3329 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003330 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003331 }
3332
3333 apex {
3334 name: "myapex_dep",
3335 key: "myapex.key",
3336 native_shared_libs: ["lib_dep"],
3337 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003338 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003339 }
3340
3341 apex {
3342 name: "myapex_provider",
3343 key: "myapex.key",
3344 native_shared_libs: ["libfoo"],
3345 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003346 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003347 }
3348
3349 apex {
3350 name: "myapex_selfcontained",
3351 key: "myapex.key",
3352 native_shared_libs: ["lib_dep", "libfoo"],
3353 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003354 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003355 }
3356
3357 apex_key {
3358 name: "myapex.key",
3359 public_key: "testkey.avbpubkey",
3360 private_key: "testkey.pem",
3361 }
3362
3363 cc_library {
3364 name: "lib_nodep",
3365 srcs: ["mylib.cpp"],
3366 system_shared_libs: [],
3367 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003368 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003369 }
3370
3371 cc_library {
3372 name: "lib_dep",
3373 srcs: ["mylib.cpp"],
3374 shared_libs: ["libfoo"],
3375 system_shared_libs: [],
3376 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003377 apex_available: [
3378 "myapex_dep",
3379 "myapex_provider",
3380 "myapex_selfcontained",
3381 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003382 }
3383
3384 cc_library {
3385 name: "libfoo",
3386 srcs: ["mytest.cpp"],
3387 stubs: {
3388 versions: ["1"],
3389 },
3390 system_shared_libs: [],
3391 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003392 apex_available: [
3393 "myapex_provider",
3394 "myapex_selfcontained",
3395 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003396 }
3397 `)
3398
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003399 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003400 var provideNativeLibs, requireNativeLibs []string
3401
Sundong Ahnabb64432019-10-22 13:58:29 +09003402 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003403 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3404 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003405 ensureListEmpty(t, provideNativeLibs)
3406 ensureListEmpty(t, requireNativeLibs)
3407
Sundong Ahnabb64432019-10-22 13:58:29 +09003408 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003409 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3410 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003411 ensureListEmpty(t, provideNativeLibs)
3412 ensureListContains(t, requireNativeLibs, "libfoo.so")
3413
Sundong Ahnabb64432019-10-22 13:58:29 +09003414 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003415 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3416 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003417 ensureListContains(t, provideNativeLibs, "libfoo.so")
3418 ensureListEmpty(t, requireNativeLibs)
3419
Sundong Ahnabb64432019-10-22 13:58:29 +09003420 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003421 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3422 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003423 ensureListContains(t, provideNativeLibs, "libfoo.so")
3424 ensureListEmpty(t, requireNativeLibs)
3425}
3426
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003427func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003428 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003429 apex {
3430 name: "myapex",
3431 key: "myapex.key",
3432 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003433 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003434 }
3435
3436 apex_key {
3437 name: "myapex.key",
3438 public_key: "testkey.avbpubkey",
3439 private_key: "testkey.pem",
3440 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003441
3442 cc_library {
3443 name: "mylib",
3444 srcs: ["mylib.cpp"],
3445 system_shared_libs: [],
3446 stl: "none",
3447 apex_available: [
3448 "//apex_available:platform",
3449 "myapex",
3450 ],
3451 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003452 `)
3453
Sundong Ahnabb64432019-10-22 13:58:29 +09003454 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003455 apexManifestRule := module.Rule("apexManifestRule")
3456 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3457 apexRule := module.Rule("apexRule")
3458 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003459
3460 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3461 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3462 name := apexBundle.BaseModuleName()
3463 prefix := "TARGET_"
3464 var builder strings.Builder
3465 data.Custom(&builder, name, prefix, "", data)
3466 androidMk := builder.String()
3467 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3468 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003469}
3470
Alex Light0851b882019-02-07 13:20:53 -08003471func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003472 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003473 apex {
3474 name: "myapex",
3475 key: "myapex.key",
3476 native_shared_libs: ["mylib_common"],
3477 }
3478
3479 apex_key {
3480 name: "myapex.key",
3481 public_key: "testkey.avbpubkey",
3482 private_key: "testkey.pem",
3483 }
3484
3485 cc_library {
3486 name: "mylib_common",
3487 srcs: ["mylib.cpp"],
3488 system_shared_libs: [],
3489 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003490 apex_available: [
3491 "//apex_available:platform",
3492 "myapex",
3493 ],
Alex Light0851b882019-02-07 13:20:53 -08003494 }
3495 `)
3496
Sundong Ahnabb64432019-10-22 13:58:29 +09003497 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003498 apexRule := module.Rule("apexRule")
3499 copyCmds := apexRule.Args["copy_commands"]
3500
3501 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3502 t.Log("Apex was a test apex!")
3503 t.Fail()
3504 }
3505 // Ensure that main rule creates an output
3506 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3507
3508 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003509 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003510
3511 // Ensure that both direct and indirect deps are copied into apex
3512 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3513
Colin Cross7113d202019-11-20 16:39:12 -08003514 // Ensure that the platform variant ends with _shared
3515 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003516
3517 if !android.InAnyApex("mylib_common") {
3518 t.Log("Found mylib_common not in any apex!")
3519 t.Fail()
3520 }
3521}
3522
3523func TestTestApex(t *testing.T) {
3524 if android.InAnyApex("mylib_common_test") {
3525 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!")
3526 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003527 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003528 apex_test {
3529 name: "myapex",
3530 key: "myapex.key",
3531 native_shared_libs: ["mylib_common_test"],
3532 }
3533
3534 apex_key {
3535 name: "myapex.key",
3536 public_key: "testkey.avbpubkey",
3537 private_key: "testkey.pem",
3538 }
3539
3540 cc_library {
3541 name: "mylib_common_test",
3542 srcs: ["mylib.cpp"],
3543 system_shared_libs: [],
3544 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003545 // TODO: remove //apex_available:platform
3546 apex_available: [
3547 "//apex_available:platform",
3548 "myapex",
3549 ],
Alex Light0851b882019-02-07 13:20:53 -08003550 }
3551 `)
3552
Sundong Ahnabb64432019-10-22 13:58:29 +09003553 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003554 apexRule := module.Rule("apexRule")
3555 copyCmds := apexRule.Args["copy_commands"]
3556
3557 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3558 t.Log("Apex was not a test apex!")
3559 t.Fail()
3560 }
3561 // Ensure that main rule creates an output
3562 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3563
3564 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003565 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003566
3567 // Ensure that both direct and indirect deps are copied into apex
3568 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3569
Colin Cross7113d202019-11-20 16:39:12 -08003570 // Ensure that the platform variant ends with _shared
3571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003572}
3573
Alex Light9670d332019-01-29 18:07:33 -08003574func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003575 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003576 apex {
3577 name: "myapex",
3578 key: "myapex.key",
3579 multilib: {
3580 first: {
3581 native_shared_libs: ["mylib_common"],
3582 }
3583 },
3584 target: {
3585 android: {
3586 multilib: {
3587 first: {
3588 native_shared_libs: ["mylib"],
3589 }
3590 }
3591 },
3592 host: {
3593 multilib: {
3594 first: {
3595 native_shared_libs: ["mylib2"],
3596 }
3597 }
3598 }
3599 }
3600 }
3601
3602 apex_key {
3603 name: "myapex.key",
3604 public_key: "testkey.avbpubkey",
3605 private_key: "testkey.pem",
3606 }
3607
3608 cc_library {
3609 name: "mylib",
3610 srcs: ["mylib.cpp"],
3611 system_shared_libs: [],
3612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003613 // TODO: remove //apex_available:platform
3614 apex_available: [
3615 "//apex_available:platform",
3616 "myapex",
3617 ],
Alex Light9670d332019-01-29 18:07:33 -08003618 }
3619
3620 cc_library {
3621 name: "mylib_common",
3622 srcs: ["mylib.cpp"],
3623 system_shared_libs: [],
3624 stl: "none",
3625 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003626 // TODO: remove //apex_available:platform
3627 apex_available: [
3628 "//apex_available:platform",
3629 "myapex",
3630 ],
Alex Light9670d332019-01-29 18:07:33 -08003631 }
3632
3633 cc_library {
3634 name: "mylib2",
3635 srcs: ["mylib.cpp"],
3636 system_shared_libs: [],
3637 stl: "none",
3638 compile_multilib: "first",
3639 }
3640 `)
3641
Sundong Ahnabb64432019-10-22 13:58:29 +09003642 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003643 copyCmds := apexRule.Args["copy_commands"]
3644
3645 // Ensure that main rule creates an output
3646 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3647
3648 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003649 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3650 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3651 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003652
3653 // Ensure that both direct and indirect deps are copied into apex
3654 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3655 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3656 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3657
Colin Cross7113d202019-11-20 16:39:12 -08003658 // Ensure that the platform variant ends with _shared
3659 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3660 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3661 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003662}
Jiyong Park04480cf2019-02-06 00:16:29 +09003663
3664func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003665 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003666 apex {
3667 name: "myapex",
3668 key: "myapex.key",
3669 binaries: ["myscript"],
3670 }
3671
3672 apex_key {
3673 name: "myapex.key",
3674 public_key: "testkey.avbpubkey",
3675 private_key: "testkey.pem",
3676 }
3677
3678 sh_binary {
3679 name: "myscript",
3680 src: "mylib.cpp",
3681 filename: "myscript.sh",
3682 sub_dir: "script",
3683 }
3684 `)
3685
Sundong Ahnabb64432019-10-22 13:58:29 +09003686 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003687 copyCmds := apexRule.Args["copy_commands"]
3688
3689 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3690}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003691
Jooyung Han91df2082019-11-20 01:49:42 +09003692func TestApexInVariousPartition(t *testing.T) {
3693 testcases := []struct {
3694 propName, parition, flattenedPartition string
3695 }{
3696 {"", "system", "system_ext"},
3697 {"product_specific: true", "product", "product"},
3698 {"soc_specific: true", "vendor", "vendor"},
3699 {"proprietary: true", "vendor", "vendor"},
3700 {"vendor: true", "vendor", "vendor"},
3701 {"system_ext_specific: true", "system_ext", "system_ext"},
3702 }
3703 for _, tc := range testcases {
3704 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3705 ctx, _ := testApex(t, `
3706 apex {
3707 name: "myapex",
3708 key: "myapex.key",
3709 `+tc.propName+`
3710 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003711
Jooyung Han91df2082019-11-20 01:49:42 +09003712 apex_key {
3713 name: "myapex.key",
3714 public_key: "testkey.avbpubkey",
3715 private_key: "testkey.pem",
3716 }
3717 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003718
Jooyung Han91df2082019-11-20 01:49:42 +09003719 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3720 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3721 actual := apex.installDir.String()
3722 if actual != expected {
3723 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3724 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003725
Jooyung Han91df2082019-11-20 01:49:42 +09003726 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3727 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3728 actual = flattened.installDir.String()
3729 if actual != expected {
3730 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3731 }
3732 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003733 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003734}
Jiyong Park67882562019-03-21 01:11:21 +09003735
Jooyung Han580eb4f2020-06-24 19:33:06 +09003736func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003737 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003738 apex {
3739 name: "myapex",
3740 key: "myapex.key",
3741 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003742
Jooyung Han580eb4f2020-06-24 19:33:06 +09003743 apex_key {
3744 name: "myapex.key",
3745 public_key: "testkey.avbpubkey",
3746 private_key: "testkey.pem",
3747 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003748 `)
3749 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003750 rule := module.Output("file_contexts")
3751 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3752}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003753
Jooyung Han580eb4f2020-06-24 19:33:06 +09003754func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003755 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003756 apex {
3757 name: "myapex",
3758 key: "myapex.key",
3759 file_contexts: "my_own_file_contexts",
3760 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003761
Jooyung Han580eb4f2020-06-24 19:33:06 +09003762 apex_key {
3763 name: "myapex.key",
3764 public_key: "testkey.avbpubkey",
3765 private_key: "testkey.pem",
3766 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003767 `, withFiles(map[string][]byte{
3768 "my_own_file_contexts": nil,
3769 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003770}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003771
Jooyung Han580eb4f2020-06-24 19:33:06 +09003772func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003773 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003774 apex {
3775 name: "myapex",
3776 key: "myapex.key",
3777 product_specific: true,
3778 file_contexts: "product_specific_file_contexts",
3779 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003780
Jooyung Han580eb4f2020-06-24 19:33:06 +09003781 apex_key {
3782 name: "myapex.key",
3783 public_key: "testkey.avbpubkey",
3784 private_key: "testkey.pem",
3785 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003786 `)
3787
Jooyung Han580eb4f2020-06-24 19:33:06 +09003788 ctx, _ := testApex(t, `
3789 apex {
3790 name: "myapex",
3791 key: "myapex.key",
3792 product_specific: true,
3793 file_contexts: "product_specific_file_contexts",
3794 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003795
Jooyung Han580eb4f2020-06-24 19:33:06 +09003796 apex_key {
3797 name: "myapex.key",
3798 public_key: "testkey.avbpubkey",
3799 private_key: "testkey.pem",
3800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003801 `, withFiles(map[string][]byte{
3802 "product_specific_file_contexts": nil,
3803 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003804 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3805 rule := module.Output("file_contexts")
3806 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3807}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003808
Jooyung Han580eb4f2020-06-24 19:33:06 +09003809func TestFileContexts_SetViaFileGroup(t *testing.T) {
3810 ctx, _ := testApex(t, `
3811 apex {
3812 name: "myapex",
3813 key: "myapex.key",
3814 product_specific: true,
3815 file_contexts: ":my-file-contexts",
3816 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003817
Jooyung Han580eb4f2020-06-24 19:33:06 +09003818 apex_key {
3819 name: "myapex.key",
3820 public_key: "testkey.avbpubkey",
3821 private_key: "testkey.pem",
3822 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003823
Jooyung Han580eb4f2020-06-24 19:33:06 +09003824 filegroup {
3825 name: "my-file-contexts",
3826 srcs: ["product_specific_file_contexts"],
3827 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003828 `, withFiles(map[string][]byte{
3829 "product_specific_file_contexts": nil,
3830 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003831 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3832 rule := module.Output("file_contexts")
3833 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003834}
3835
Jiyong Park67882562019-03-21 01:11:21 +09003836func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003837 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003838 apex_key {
3839 name: "myapex.key",
3840 public_key: ":my.avbpubkey",
3841 private_key: ":my.pem",
3842 product_specific: true,
3843 }
3844
3845 filegroup {
3846 name: "my.avbpubkey",
3847 srcs: ["testkey2.avbpubkey"],
3848 }
3849
3850 filegroup {
3851 name: "my.pem",
3852 srcs: ["testkey2.pem"],
3853 }
3854 `)
3855
3856 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3857 expected_pubkey := "testkey2.avbpubkey"
3858 actual_pubkey := apex_key.public_key_file.String()
3859 if actual_pubkey != expected_pubkey {
3860 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3861 }
3862 expected_privkey := "testkey2.pem"
3863 actual_privkey := apex_key.private_key_file.String()
3864 if actual_privkey != expected_privkey {
3865 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3866 }
3867}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003868
3869func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003870 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003871 prebuilt_apex {
3872 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003873 arch: {
3874 arm64: {
3875 src: "myapex-arm64.apex",
3876 },
3877 arm: {
3878 src: "myapex-arm.apex",
3879 },
3880 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003881 }
3882 `)
3883
3884 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3885
Jiyong Parkc95714e2019-03-29 14:23:10 +09003886 expectedInput := "myapex-arm64.apex"
3887 if prebuilt.inputApex.String() != expectedInput {
3888 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3889 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003890}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003891
3892func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003893 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003894 prebuilt_apex {
3895 name: "myapex",
3896 src: "myapex-arm.apex",
3897 filename: "notmyapex.apex",
3898 }
3899 `)
3900
3901 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3902
3903 expected := "notmyapex.apex"
3904 if p.installFilename != expected {
3905 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3906 }
3907}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003908
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003909func TestPrebuiltOverrides(t *testing.T) {
3910 ctx, config := testApex(t, `
3911 prebuilt_apex {
3912 name: "myapex.prebuilt",
3913 src: "myapex-arm.apex",
3914 overrides: [
3915 "myapex",
3916 ],
3917 }
3918 `)
3919
3920 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3921
3922 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003923 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003924 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003925 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003926 }
3927}
3928
Roland Levillain630846d2019-06-26 12:48:34 +01003929func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003930 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003931 apex_test {
3932 name: "myapex",
3933 key: "myapex.key",
3934 tests: [
3935 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003936 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003937 ],
3938 }
3939
3940 apex_key {
3941 name: "myapex.key",
3942 public_key: "testkey.avbpubkey",
3943 private_key: "testkey.pem",
3944 }
3945
Liz Kammer1c14a212020-05-12 15:26:55 -07003946 filegroup {
3947 name: "fg",
3948 srcs: [
3949 "baz",
3950 "bar/baz"
3951 ],
3952 }
3953
Roland Levillain630846d2019-06-26 12:48:34 +01003954 cc_test {
3955 name: "mytest",
3956 gtest: false,
3957 srcs: ["mytest.cpp"],
3958 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003959 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003960 system_shared_libs: [],
3961 static_executable: true,
3962 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003963 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003964 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003965
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003966 cc_library {
3967 name: "mylib",
3968 srcs: ["mylib.cpp"],
3969 system_shared_libs: [],
3970 stl: "none",
3971 }
3972
Liz Kammer5bd365f2020-05-27 15:15:11 -07003973 filegroup {
3974 name: "fg2",
3975 srcs: [
3976 "testdata/baz"
3977 ],
3978 }
3979
Roland Levillain9b5fde92019-06-28 15:41:19 +01003980 cc_test {
3981 name: "mytests",
3982 gtest: false,
3983 srcs: [
3984 "mytest1.cpp",
3985 "mytest2.cpp",
3986 "mytest3.cpp",
3987 ],
3988 test_per_src: true,
3989 relative_install_path: "test",
3990 system_shared_libs: [],
3991 static_executable: true,
3992 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003993 data: [
3994 ":fg",
3995 ":fg2",
3996 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003997 }
Roland Levillain630846d2019-06-26 12:48:34 +01003998 `)
3999
Sundong Ahnabb64432019-10-22 13:58:29 +09004000 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004001 copyCmds := apexRule.Args["copy_commands"]
4002
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004003 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004004 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004005 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004006
Liz Kammer1c14a212020-05-12 15:26:55 -07004007 //Ensure that test data are copied into apex.
4008 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4009 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4010
Roland Levillain9b5fde92019-06-28 15:41:19 +01004011 // Ensure that test deps built with `test_per_src` are copied into apex.
4012 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4013 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4014 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004015
4016 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004017 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4018 data := android.AndroidMkDataForTest(t, config, "", bundle)
4019 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004020 prefix := "TARGET_"
4021 var builder strings.Builder
4022 data.Custom(&builder, name, prefix, "", data)
4023 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004024 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4025 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4026 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4027 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004028 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004029 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004030 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004031
4032 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4033 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4034 data.Custom(&builder, name, prefix, "", data)
4035 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004036 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4037 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004038}
4039
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004040func TestInstallExtraFlattenedApexes(t *testing.T) {
4041 ctx, config := testApex(t, `
4042 apex {
4043 name: "myapex",
4044 key: "myapex.key",
4045 }
4046 apex_key {
4047 name: "myapex.key",
4048 public_key: "testkey.avbpubkey",
4049 private_key: "testkey.pem",
4050 }
4051 `, func(fs map[string][]byte, config android.Config) {
4052 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4053 })
4054 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004055 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004056 mk := android.AndroidMkDataForTest(t, config, "", ab)
4057 var builder strings.Builder
4058 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4059 androidMk := builder.String()
4060 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4061}
4062
Jooyung Han5c998b92019-06-27 11:30:33 +09004063func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004064 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004065 apex {
4066 name: "myapex",
4067 key: "myapex.key",
4068 native_shared_libs: ["mylib"],
4069 uses: ["commonapex"],
4070 }
4071
4072 apex {
4073 name: "commonapex",
4074 key: "myapex.key",
4075 native_shared_libs: ["libcommon"],
4076 provide_cpp_shared_libs: true,
4077 }
4078
4079 apex_key {
4080 name: "myapex.key",
4081 public_key: "testkey.avbpubkey",
4082 private_key: "testkey.pem",
4083 }
4084
4085 cc_library {
4086 name: "mylib",
4087 srcs: ["mylib.cpp"],
4088 shared_libs: ["libcommon"],
4089 system_shared_libs: [],
4090 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004091 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004092 }
4093
4094 cc_library {
4095 name: "libcommon",
4096 srcs: ["mylib_common.cpp"],
4097 system_shared_libs: [],
4098 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004099 // TODO: remove //apex_available:platform
4100 apex_available: [
4101 "//apex_available:platform",
4102 "commonapex",
4103 "myapex",
4104 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004105 }
4106 `)
4107
Sundong Ahnabb64432019-10-22 13:58:29 +09004108 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004109 apexRule1 := module1.Rule("apexRule")
4110 copyCmds1 := apexRule1.Args["copy_commands"]
4111
Sundong Ahnabb64432019-10-22 13:58:29 +09004112 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004113 apexRule2 := module2.Rule("apexRule")
4114 copyCmds2 := apexRule2.Args["copy_commands"]
4115
Colin Crossaede88c2020-08-11 12:17:01 -07004116 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4117 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004118 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4119 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4120 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4121}
4122
4123func TestApexUsesFailsIfNotProvided(t *testing.T) {
4124 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4125 apex {
4126 name: "myapex",
4127 key: "myapex.key",
4128 uses: ["commonapex"],
4129 }
4130
4131 apex {
4132 name: "commonapex",
4133 key: "myapex.key",
4134 }
4135
4136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141 `)
4142 testApexError(t, `uses: "commonapex" is not a provider`, `
4143 apex {
4144 name: "myapex",
4145 key: "myapex.key",
4146 uses: ["commonapex"],
4147 }
4148
4149 cc_library {
4150 name: "commonapex",
4151 system_shared_libs: [],
4152 stl: "none",
4153 }
4154
4155 apex_key {
4156 name: "myapex.key",
4157 public_key: "testkey.avbpubkey",
4158 private_key: "testkey.pem",
4159 }
4160 `)
4161}
4162
4163func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4164 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4165 apex {
4166 name: "myapex",
4167 key: "myapex.key",
4168 use_vendor: true,
4169 uses: ["commonapex"],
4170 }
4171
4172 apex {
4173 name: "commonapex",
4174 key: "myapex.key",
4175 provide_cpp_shared_libs: true,
4176 }
4177
4178 apex_key {
4179 name: "myapex.key",
4180 public_key: "testkey.avbpubkey",
4181 private_key: "testkey.pem",
4182 }
Jooyung Handc782442019-11-01 03:14:38 +09004183 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004184 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004185 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004186}
4187
Jooyung Hand48f3c32019-08-23 11:18:57 +09004188func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4189 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4190 apex {
4191 name: "myapex",
4192 key: "myapex.key",
4193 native_shared_libs: ["libfoo"],
4194 }
4195
4196 apex_key {
4197 name: "myapex.key",
4198 public_key: "testkey.avbpubkey",
4199 private_key: "testkey.pem",
4200 }
4201
4202 cc_library {
4203 name: "libfoo",
4204 stl: "none",
4205 system_shared_libs: [],
4206 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004207 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004208 }
4209 `)
4210 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4211 apex {
4212 name: "myapex",
4213 key: "myapex.key",
4214 java_libs: ["myjar"],
4215 }
4216
4217 apex_key {
4218 name: "myapex.key",
4219 public_key: "testkey.avbpubkey",
4220 private_key: "testkey.pem",
4221 }
4222
4223 java_library {
4224 name: "myjar",
4225 srcs: ["foo/bar/MyClass.java"],
4226 sdk_version: "none",
4227 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004228 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004229 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004230 }
4231 `)
4232}
4233
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004234func TestApexWithApps(t *testing.T) {
4235 ctx, _ := testApex(t, `
4236 apex {
4237 name: "myapex",
4238 key: "myapex.key",
4239 apps: [
4240 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004241 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004242 ],
4243 }
4244
4245 apex_key {
4246 name: "myapex.key",
4247 public_key: "testkey.avbpubkey",
4248 private_key: "testkey.pem",
4249 }
4250
4251 android_app {
4252 name: "AppFoo",
4253 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004254 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004255 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004256 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004258 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004259 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004260
4261 android_app {
4262 name: "AppFooPriv",
4263 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004264 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004265 system_modules: "none",
4266 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004267 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004268 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004269 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004270
4271 cc_library_shared {
4272 name: "libjni",
4273 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004274 shared_libs: ["libfoo"],
4275 stl: "none",
4276 system_shared_libs: [],
4277 apex_available: [ "myapex" ],
4278 sdk_version: "current",
4279 }
4280
4281 cc_library_shared {
4282 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004283 stl: "none",
4284 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004285 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004286 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004287 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004288 `)
4289
Sundong Ahnabb64432019-10-22 13:58:29 +09004290 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004291 apexRule := module.Rule("apexRule")
4292 copyCmds := apexRule.Args["copy_commands"]
4293
4294 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004295 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004296
Colin Crossaede88c2020-08-11 12:17:01 -07004297 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004298 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004299 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004300 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004301 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004302 // JNI libraries including transitive deps are
4303 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004304 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004305 // ... embedded inside APK (jnilibs.zip)
4306 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4307 // ... and not directly inside the APEX
4308 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4309 }
Dario Frenicde2a032019-10-27 00:29:22 +01004310}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004311
Dario Frenicde2a032019-10-27 00:29:22 +01004312func TestApexWithAppImports(t *testing.T) {
4313 ctx, _ := testApex(t, `
4314 apex {
4315 name: "myapex",
4316 key: "myapex.key",
4317 apps: [
4318 "AppFooPrebuilt",
4319 "AppFooPrivPrebuilt",
4320 ],
4321 }
4322
4323 apex_key {
4324 name: "myapex.key",
4325 public_key: "testkey.avbpubkey",
4326 private_key: "testkey.pem",
4327 }
4328
4329 android_app_import {
4330 name: "AppFooPrebuilt",
4331 apk: "PrebuiltAppFoo.apk",
4332 presigned: true,
4333 dex_preopt: {
4334 enabled: false,
4335 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004336 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004337 }
4338
4339 android_app_import {
4340 name: "AppFooPrivPrebuilt",
4341 apk: "PrebuiltAppFooPriv.apk",
4342 privileged: true,
4343 presigned: true,
4344 dex_preopt: {
4345 enabled: false,
4346 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004347 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004348 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004349 }
4350 `)
4351
Sundong Ahnabb64432019-10-22 13:58:29 +09004352 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004353 apexRule := module.Rule("apexRule")
4354 copyCmds := apexRule.Args["copy_commands"]
4355
4356 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004357 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4358}
4359
4360func TestApexWithAppImportsPrefer(t *testing.T) {
4361 ctx, _ := testApex(t, `
4362 apex {
4363 name: "myapex",
4364 key: "myapex.key",
4365 apps: [
4366 "AppFoo",
4367 ],
4368 }
4369
4370 apex_key {
4371 name: "myapex.key",
4372 public_key: "testkey.avbpubkey",
4373 private_key: "testkey.pem",
4374 }
4375
4376 android_app {
4377 name: "AppFoo",
4378 srcs: ["foo/bar/MyClass.java"],
4379 sdk_version: "none",
4380 system_modules: "none",
4381 apex_available: [ "myapex" ],
4382 }
4383
4384 android_app_import {
4385 name: "AppFoo",
4386 apk: "AppFooPrebuilt.apk",
4387 filename: "AppFooPrebuilt.apk",
4388 presigned: true,
4389 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004390 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004391 }
4392 `, withFiles(map[string][]byte{
4393 "AppFooPrebuilt.apk": nil,
4394 }))
4395
4396 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4397 "app/AppFoo/AppFooPrebuilt.apk",
4398 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004399}
4400
Dario Freni6f3937c2019-12-20 22:58:03 +00004401func TestApexWithTestHelperApp(t *testing.T) {
4402 ctx, _ := testApex(t, `
4403 apex {
4404 name: "myapex",
4405 key: "myapex.key",
4406 apps: [
4407 "TesterHelpAppFoo",
4408 ],
4409 }
4410
4411 apex_key {
4412 name: "myapex.key",
4413 public_key: "testkey.avbpubkey",
4414 private_key: "testkey.pem",
4415 }
4416
4417 android_test_helper_app {
4418 name: "TesterHelpAppFoo",
4419 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004420 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004421 }
4422
4423 `)
4424
4425 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4426 apexRule := module.Rule("apexRule")
4427 copyCmds := apexRule.Args["copy_commands"]
4428
4429 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4430}
4431
Jooyung Han18020ea2019-11-13 10:50:48 +09004432func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4433 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004434 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004435 apex {
4436 name: "myapex",
4437 key: "myapex.key",
4438 native_shared_libs: ["libfoo"],
4439 }
4440
4441 apex_key {
4442 name: "myapex.key",
4443 public_key: "testkey.avbpubkey",
4444 private_key: "testkey.pem",
4445 }
4446
4447 apex {
4448 name: "otherapex",
4449 key: "myapex.key",
4450 native_shared_libs: ["libfoo"],
4451 }
4452
4453 cc_defaults {
4454 name: "libfoo-defaults",
4455 apex_available: ["otherapex"],
4456 }
4457
4458 cc_library {
4459 name: "libfoo",
4460 defaults: ["libfoo-defaults"],
4461 stl: "none",
4462 system_shared_libs: [],
4463 }`)
4464}
4465
Paul Duffine52e66f2020-03-30 17:54:29 +01004466func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004467 // libfoo is not available to myapex, but only to otherapex
4468 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4469 apex {
4470 name: "myapex",
4471 key: "myapex.key",
4472 native_shared_libs: ["libfoo"],
4473 }
4474
4475 apex_key {
4476 name: "myapex.key",
4477 public_key: "testkey.avbpubkey",
4478 private_key: "testkey.pem",
4479 }
4480
4481 apex {
4482 name: "otherapex",
4483 key: "otherapex.key",
4484 native_shared_libs: ["libfoo"],
4485 }
4486
4487 apex_key {
4488 name: "otherapex.key",
4489 public_key: "testkey.avbpubkey",
4490 private_key: "testkey.pem",
4491 }
4492
4493 cc_library {
4494 name: "libfoo",
4495 stl: "none",
4496 system_shared_libs: [],
4497 apex_available: ["otherapex"],
4498 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004499}
Jiyong Park127b40b2019-09-30 16:04:35 +09004500
Paul Duffine52e66f2020-03-30 17:54:29 +01004501func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004502 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004503 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004504.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004505.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004506.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004507.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004508.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004509.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004510 apex {
4511 name: "myapex",
4512 key: "myapex.key",
4513 native_shared_libs: ["libfoo"],
4514 }
4515
4516 apex_key {
4517 name: "myapex.key",
4518 public_key: "testkey.avbpubkey",
4519 private_key: "testkey.pem",
4520 }
4521
Jiyong Park127b40b2019-09-30 16:04:35 +09004522 cc_library {
4523 name: "libfoo",
4524 stl: "none",
4525 shared_libs: ["libbar"],
4526 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004527 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004528 }
4529
4530 cc_library {
4531 name: "libbar",
4532 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004533 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004534 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004535 apex_available: ["myapex"],
4536 }
4537
4538 cc_library {
4539 name: "libbaz",
4540 stl: "none",
4541 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004542 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004543}
Jiyong Park127b40b2019-09-30 16:04:35 +09004544
Paul Duffine52e66f2020-03-30 17:54:29 +01004545func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004546 testApexError(t, "\"otherapex\" is not a valid module name", `
4547 apex {
4548 name: "myapex",
4549 key: "myapex.key",
4550 native_shared_libs: ["libfoo"],
4551 }
4552
4553 apex_key {
4554 name: "myapex.key",
4555 public_key: "testkey.avbpubkey",
4556 private_key: "testkey.pem",
4557 }
4558
4559 cc_library {
4560 name: "libfoo",
4561 stl: "none",
4562 system_shared_libs: [],
4563 apex_available: ["otherapex"],
4564 }`)
4565
Paul Duffine52e66f2020-03-30 17:54:29 +01004566 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004567 apex {
4568 name: "myapex",
4569 key: "myapex.key",
4570 native_shared_libs: ["libfoo", "libbar"],
4571 }
4572
4573 apex_key {
4574 name: "myapex.key",
4575 public_key: "testkey.avbpubkey",
4576 private_key: "testkey.pem",
4577 }
4578
4579 cc_library {
4580 name: "libfoo",
4581 stl: "none",
4582 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004583 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004584 apex_available: ["myapex"],
4585 }
4586
4587 cc_library {
4588 name: "libbar",
4589 stl: "none",
4590 system_shared_libs: [],
4591 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004592 }
4593
4594 cc_library {
4595 name: "libbaz",
4596 stl: "none",
4597 system_shared_libs: [],
4598 stubs: {
4599 versions: ["10", "20", "30"],
4600 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004601 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004602}
Jiyong Park127b40b2019-09-30 16:04:35 +09004603
Jiyong Park89e850a2020-04-07 16:37:39 +09004604func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004605 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004606 apex {
4607 name: "myapex",
4608 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004609 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004610 }
4611
4612 apex_key {
4613 name: "myapex.key",
4614 public_key: "testkey.avbpubkey",
4615 private_key: "testkey.pem",
4616 }
4617
4618 cc_library {
4619 name: "libfoo",
4620 stl: "none",
4621 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004622 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004623 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004624 }
4625
4626 cc_library {
4627 name: "libfoo2",
4628 stl: "none",
4629 system_shared_libs: [],
4630 shared_libs: ["libbaz"],
4631 apex_available: ["//apex_available:platform"],
4632 }
4633
4634 cc_library {
4635 name: "libbar",
4636 stl: "none",
4637 system_shared_libs: [],
4638 apex_available: ["myapex"],
4639 }
4640
4641 cc_library {
4642 name: "libbaz",
4643 stl: "none",
4644 system_shared_libs: [],
4645 apex_available: ["myapex"],
4646 stubs: {
4647 versions: ["1"],
4648 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004649 }`)
4650
Jiyong Park89e850a2020-04-07 16:37:39 +09004651 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4652 // because it depends on libbar which isn't available to platform
4653 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4654 if libfoo.NotAvailableForPlatform() != true {
4655 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4656 }
4657
4658 // libfoo2 however can be available to platform because it depends on libbaz which provides
4659 // stubs
4660 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4661 if libfoo2.NotAvailableForPlatform() == true {
4662 t.Errorf("%q should be available to platform", libfoo2.String())
4663 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004664}
Jiyong Parka90ca002019-10-07 15:47:24 +09004665
Paul Duffine52e66f2020-03-30 17:54:29 +01004666func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004667 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004668 apex {
4669 name: "myapex",
4670 key: "myapex.key",
4671 native_shared_libs: ["libfoo"],
4672 }
4673
4674 apex_key {
4675 name: "myapex.key",
4676 public_key: "testkey.avbpubkey",
4677 private_key: "testkey.pem",
4678 }
4679
4680 cc_library {
4681 name: "libfoo",
4682 stl: "none",
4683 system_shared_libs: [],
4684 apex_available: ["myapex"],
4685 static: {
4686 apex_available: ["//apex_available:platform"],
4687 },
4688 }`)
4689
Jiyong Park89e850a2020-04-07 16:37:39 +09004690 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4691 if libfooShared.NotAvailableForPlatform() != true {
4692 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4693 }
4694 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4695 if libfooStatic.NotAvailableForPlatform() != false {
4696 t.Errorf("%q should be available to platform", libfooStatic.String())
4697 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004698}
4699
Jiyong Park5d790c32019-11-15 18:40:32 +09004700func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004701 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004702 apex {
4703 name: "myapex",
4704 key: "myapex.key",
4705 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004706 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004707 }
4708
4709 override_apex {
4710 name: "override_myapex",
4711 base: "myapex",
4712 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004713 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004714 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004715 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004716 }
4717
4718 apex_key {
4719 name: "myapex.key",
4720 public_key: "testkey.avbpubkey",
4721 private_key: "testkey.pem",
4722 }
4723
4724 android_app {
4725 name: "app",
4726 srcs: ["foo/bar/MyClass.java"],
4727 package_name: "foo",
4728 sdk_version: "none",
4729 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004730 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004731 }
4732
4733 override_android_app {
4734 name: "override_app",
4735 base: "app",
4736 package_name: "bar",
4737 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004738 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004739
Jiyong Park317645e2019-12-05 13:20:58 +09004740 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4741 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4742 if originalVariant.GetOverriddenBy() != "" {
4743 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4744 }
4745 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4746 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4747 }
4748
Jiyong Park5d790c32019-11-15 18:40:32 +09004749 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4750 apexRule := module.Rule("apexRule")
4751 copyCmds := apexRule.Args["copy_commands"]
4752
4753 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004754 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004755
4756 apexBundle := module.Module().(*apexBundle)
4757 name := apexBundle.Name()
4758 if name != "override_myapex" {
4759 t.Errorf("name should be \"override_myapex\", but was %q", name)
4760 }
4761
Baligh Uddin004d7172020-02-19 21:29:28 -08004762 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4763 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4764 }
4765
Jiyong Park20bacab2020-03-03 11:45:41 +09004766 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004767 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004768
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004769 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4770 var builder strings.Builder
4771 data.Custom(&builder, name, "TARGET_", "", data)
4772 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004773 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004774 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4775 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004776 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004777 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004778 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004779 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4780 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004781}
4782
Jooyung Han214bf372019-11-12 13:03:50 +09004783func TestLegacyAndroid10Support(t *testing.T) {
4784 ctx, _ := testApex(t, `
4785 apex {
4786 name: "myapex",
4787 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004788 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004789 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004790 }
4791
4792 apex_key {
4793 name: "myapex.key",
4794 public_key: "testkey.avbpubkey",
4795 private_key: "testkey.pem",
4796 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004797
4798 cc_library {
4799 name: "mylib",
4800 srcs: ["mylib.cpp"],
4801 stl: "libc++",
4802 system_shared_libs: [],
4803 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004804 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004805 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004806 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004807
4808 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4809 args := module.Rule("apexRule").Args
4810 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004811 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004812
4813 // The copies of the libraries in the apex should have one more dependency than
4814 // the ones outside the apex, namely the unwinder. Ideally we should check
4815 // the dependency names directly here but for some reason the names are blank in
4816 // this test.
4817 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004818 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004819 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4820 if len(apexImplicits) != len(nonApexImplicits)+1 {
4821 t.Errorf("%q missing unwinder dep", lib)
4822 }
4823 }
Jooyung Han214bf372019-11-12 13:03:50 +09004824}
4825
Paul Duffin9b879592020-05-26 13:21:35 +01004826var filesForSdkLibrary = map[string][]byte{
4827 "api/current.txt": nil,
4828 "api/removed.txt": nil,
4829 "api/system-current.txt": nil,
4830 "api/system-removed.txt": nil,
4831 "api/test-current.txt": nil,
4832 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004833
4834 // For java_sdk_library_import
4835 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004836}
4837
Jooyung Han58f26ab2019-12-18 15:34:32 +09004838func TestJavaSDKLibrary(t *testing.T) {
4839 ctx, _ := testApex(t, `
4840 apex {
4841 name: "myapex",
4842 key: "myapex.key",
4843 java_libs: ["foo"],
4844 }
4845
4846 apex_key {
4847 name: "myapex.key",
4848 public_key: "testkey.avbpubkey",
4849 private_key: "testkey.pem",
4850 }
4851
4852 java_sdk_library {
4853 name: "foo",
4854 srcs: ["a.java"],
4855 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004856 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004857 }
Paul Duffin9b879592020-05-26 13:21:35 +01004858 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004859
4860 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004861 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004862 "javalib/foo.jar",
4863 "etc/permissions/foo.xml",
4864 })
4865 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004866 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4867 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004868}
4869
Paul Duffin9b879592020-05-26 13:21:35 +01004870func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4871 ctx, _ := testApex(t, `
4872 apex {
4873 name: "myapex",
4874 key: "myapex.key",
4875 java_libs: ["foo", "bar"],
4876 }
4877
4878 apex_key {
4879 name: "myapex.key",
4880 public_key: "testkey.avbpubkey",
4881 private_key: "testkey.pem",
4882 }
4883
4884 java_sdk_library {
4885 name: "foo",
4886 srcs: ["a.java"],
4887 api_packages: ["foo"],
4888 apex_available: ["myapex"],
4889 sdk_version: "none",
4890 system_modules: "none",
4891 }
4892
4893 java_library {
4894 name: "bar",
4895 srcs: ["a.java"],
4896 libs: ["foo"],
4897 apex_available: ["myapex"],
4898 sdk_version: "none",
4899 system_modules: "none",
4900 }
4901 `, withFiles(filesForSdkLibrary))
4902
4903 // java_sdk_library installs both impl jar and permission XML
4904 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4905 "javalib/bar.jar",
4906 "javalib/foo.jar",
4907 "etc/permissions/foo.xml",
4908 })
4909
4910 // The bar library should depend on the implementation jar.
4911 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4912 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4913 t.Errorf("expected %q, found %#q", expected, actual)
4914 }
4915}
4916
4917func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4918 ctx, _ := testApex(t, `
4919 apex {
4920 name: "myapex",
4921 key: "myapex.key",
4922 java_libs: ["foo"],
4923 }
4924
4925 apex_key {
4926 name: "myapex.key",
4927 public_key: "testkey.avbpubkey",
4928 private_key: "testkey.pem",
4929 }
4930
4931 java_sdk_library {
4932 name: "foo",
4933 srcs: ["a.java"],
4934 api_packages: ["foo"],
4935 apex_available: ["myapex"],
4936 sdk_version: "none",
4937 system_modules: "none",
4938 }
4939
4940 java_library {
4941 name: "bar",
4942 srcs: ["a.java"],
4943 libs: ["foo"],
4944 sdk_version: "none",
4945 system_modules: "none",
4946 }
4947 `, withFiles(filesForSdkLibrary))
4948
4949 // java_sdk_library installs both impl jar and permission XML
4950 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4951 "javalib/foo.jar",
4952 "etc/permissions/foo.xml",
4953 })
4954
4955 // The bar library should depend on the stubs jar.
4956 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4957 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4958 t.Errorf("expected %q, found %#q", expected, actual)
4959 }
4960}
4961
Paul Duffineedc5d52020-06-12 17:46:39 +01004962func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4963 ctx, _ := testApex(t, ``,
4964 withFiles(map[string][]byte{
4965 "apex/a.java": nil,
4966 "apex/apex_manifest.json": nil,
4967 "apex/Android.bp": []byte(`
4968 package {
4969 default_visibility: ["//visibility:private"],
4970 }
4971
4972 apex {
4973 name: "myapex",
4974 key: "myapex.key",
4975 java_libs: ["foo", "bar"],
4976 }
4977
4978 apex_key {
4979 name: "myapex.key",
4980 public_key: "testkey.avbpubkey",
4981 private_key: "testkey.pem",
4982 }
4983
4984 java_library {
4985 name: "bar",
4986 srcs: ["a.java"],
4987 libs: ["foo"],
4988 apex_available: ["myapex"],
4989 sdk_version: "none",
4990 system_modules: "none",
4991 }
4992`),
4993 "source/a.java": nil,
4994 "source/api/current.txt": nil,
4995 "source/api/removed.txt": nil,
4996 "source/Android.bp": []byte(`
4997 package {
4998 default_visibility: ["//visibility:private"],
4999 }
5000
5001 java_sdk_library {
5002 name: "foo",
5003 visibility: ["//apex"],
5004 srcs: ["a.java"],
5005 api_packages: ["foo"],
5006 apex_available: ["myapex"],
5007 sdk_version: "none",
5008 system_modules: "none",
5009 public: {
5010 enabled: true,
5011 },
5012 }
5013`),
5014 "prebuilt/a.jar": nil,
5015 "prebuilt/Android.bp": []byte(`
5016 package {
5017 default_visibility: ["//visibility:private"],
5018 }
5019
5020 java_sdk_library_import {
5021 name: "foo",
5022 visibility: ["//apex", "//source"],
5023 apex_available: ["myapex"],
5024 prefer: true,
5025 public: {
5026 jars: ["a.jar"],
5027 },
5028 }
5029`),
5030 }),
5031 )
5032
5033 // java_sdk_library installs both impl jar and permission XML
5034 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5035 "javalib/bar.jar",
5036 "javalib/foo.jar",
5037 "etc/permissions/foo.xml",
5038 })
5039
5040 // The bar library should depend on the implementation jar.
5041 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5042 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5043 t.Errorf("expected %q, found %#q", expected, actual)
5044 }
5045}
5046
5047func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5048 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5049 apex {
5050 name: "myapex",
5051 key: "myapex.key",
5052 java_libs: ["foo"],
5053 }
5054
5055 apex_key {
5056 name: "myapex.key",
5057 public_key: "testkey.avbpubkey",
5058 private_key: "testkey.pem",
5059 }
5060
5061 java_sdk_library_import {
5062 name: "foo",
5063 apex_available: ["myapex"],
5064 prefer: true,
5065 public: {
5066 jars: ["a.jar"],
5067 },
5068 }
5069
5070 `, withFiles(filesForSdkLibrary))
5071}
5072
atrost6e126252020-01-27 17:01:16 +00005073func TestCompatConfig(t *testing.T) {
5074 ctx, _ := testApex(t, `
5075 apex {
5076 name: "myapex",
5077 key: "myapex.key",
5078 prebuilts: ["myjar-platform-compat-config"],
5079 java_libs: ["myjar"],
5080 }
5081
5082 apex_key {
5083 name: "myapex.key",
5084 public_key: "testkey.avbpubkey",
5085 private_key: "testkey.pem",
5086 }
5087
5088 platform_compat_config {
5089 name: "myjar-platform-compat-config",
5090 src: ":myjar",
5091 }
5092
5093 java_library {
5094 name: "myjar",
5095 srcs: ["foo/bar/MyClass.java"],
5096 sdk_version: "none",
5097 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005098 apex_available: [ "myapex" ],
5099 }
5100 `)
5101 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5102 "etc/compatconfig/myjar-platform-compat-config.xml",
5103 "javalib/myjar.jar",
5104 })
5105}
5106
Jiyong Park479321d2019-12-16 11:47:12 +09005107func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5108 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5109 apex {
5110 name: "myapex",
5111 key: "myapex.key",
5112 java_libs: ["myjar"],
5113 }
5114
5115 apex_key {
5116 name: "myapex.key",
5117 public_key: "testkey.avbpubkey",
5118 private_key: "testkey.pem",
5119 }
5120
5121 java_library {
5122 name: "myjar",
5123 srcs: ["foo/bar/MyClass.java"],
5124 sdk_version: "none",
5125 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005126 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005127 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005128 }
5129 `)
5130}
5131
Jiyong Park7afd1072019-12-30 16:56:33 +09005132func TestCarryRequiredModuleNames(t *testing.T) {
5133 ctx, config := testApex(t, `
5134 apex {
5135 name: "myapex",
5136 key: "myapex.key",
5137 native_shared_libs: ["mylib"],
5138 }
5139
5140 apex_key {
5141 name: "myapex.key",
5142 public_key: "testkey.avbpubkey",
5143 private_key: "testkey.pem",
5144 }
5145
5146 cc_library {
5147 name: "mylib",
5148 srcs: ["mylib.cpp"],
5149 system_shared_libs: [],
5150 stl: "none",
5151 required: ["a", "b"],
5152 host_required: ["c", "d"],
5153 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005154 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005155 }
5156 `)
5157
5158 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5159 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5160 name := apexBundle.BaseModuleName()
5161 prefix := "TARGET_"
5162 var builder strings.Builder
5163 data.Custom(&builder, name, prefix, "", data)
5164 androidMk := builder.String()
5165 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5166 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5167 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5168}
5169
Jiyong Park7cd10e32020-01-14 09:22:18 +09005170func TestSymlinksFromApexToSystem(t *testing.T) {
5171 bp := `
5172 apex {
5173 name: "myapex",
5174 key: "myapex.key",
5175 native_shared_libs: ["mylib"],
5176 java_libs: ["myjar"],
5177 }
5178
Jiyong Park9d677202020-02-19 16:29:35 +09005179 apex {
5180 name: "myapex.updatable",
5181 key: "myapex.key",
5182 native_shared_libs: ["mylib"],
5183 java_libs: ["myjar"],
5184 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005185 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005186 }
5187
Jiyong Park7cd10e32020-01-14 09:22:18 +09005188 apex_key {
5189 name: "myapex.key",
5190 public_key: "testkey.avbpubkey",
5191 private_key: "testkey.pem",
5192 }
5193
5194 cc_library {
5195 name: "mylib",
5196 srcs: ["mylib.cpp"],
5197 shared_libs: ["myotherlib"],
5198 system_shared_libs: [],
5199 stl: "none",
5200 apex_available: [
5201 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005202 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005203 "//apex_available:platform",
5204 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005205 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005206 }
5207
5208 cc_library {
5209 name: "myotherlib",
5210 srcs: ["mylib.cpp"],
5211 system_shared_libs: [],
5212 stl: "none",
5213 apex_available: [
5214 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005215 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005216 "//apex_available:platform",
5217 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005218 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005219 }
5220
5221 java_library {
5222 name: "myjar",
5223 srcs: ["foo/bar/MyClass.java"],
5224 sdk_version: "none",
5225 system_modules: "none",
5226 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005227 apex_available: [
5228 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005229 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005230 "//apex_available:platform",
5231 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005232 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005233 }
5234
5235 java_library {
5236 name: "myotherjar",
5237 srcs: ["foo/bar/MyClass.java"],
5238 sdk_version: "none",
5239 system_modules: "none",
5240 apex_available: [
5241 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005242 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005243 "//apex_available:platform",
5244 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005245 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005246 }
5247 `
5248
5249 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5250 for _, f := range files {
5251 if f.path == file {
5252 if f.isLink {
5253 t.Errorf("%q is not a real file", file)
5254 }
5255 return
5256 }
5257 }
5258 t.Errorf("%q is not found", file)
5259 }
5260
5261 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5262 for _, f := range files {
5263 if f.path == file {
5264 if !f.isLink {
5265 t.Errorf("%q is not a symlink", file)
5266 }
5267 return
5268 }
5269 }
5270 t.Errorf("%q is not found", file)
5271 }
5272
Jiyong Park9d677202020-02-19 16:29:35 +09005273 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5274 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005275 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005276 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005277 ensureRealfileExists(t, files, "javalib/myjar.jar")
5278 ensureRealfileExists(t, files, "lib64/mylib.so")
5279 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5280
Jiyong Park9d677202020-02-19 16:29:35 +09005281 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5282 ensureRealfileExists(t, files, "javalib/myjar.jar")
5283 ensureRealfileExists(t, files, "lib64/mylib.so")
5284 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5285
5286 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005287 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005288 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005289 ensureRealfileExists(t, files, "javalib/myjar.jar")
5290 ensureRealfileExists(t, files, "lib64/mylib.so")
5291 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005292
5293 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5294 ensureRealfileExists(t, files, "javalib/myjar.jar")
5295 ensureRealfileExists(t, files, "lib64/mylib.so")
5296 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005297}
5298
Yo Chiange8128052020-07-23 20:09:18 +08005299func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5300 ctx, config := testApex(t, `
5301 apex {
5302 name: "myapex",
5303 key: "myapex.key",
5304 native_shared_libs: ["mylib"],
5305 }
5306
5307 apex_key {
5308 name: "myapex.key",
5309 public_key: "testkey.avbpubkey",
5310 private_key: "testkey.pem",
5311 }
5312
5313 cc_library_shared {
5314 name: "mylib",
5315 srcs: ["mylib.cpp"],
5316 shared_libs: ["myotherlib"],
5317 system_shared_libs: [],
5318 stl: "none",
5319 apex_available: [
5320 "myapex",
5321 "//apex_available:platform",
5322 ],
5323 }
5324
5325 cc_prebuilt_library_shared {
5326 name: "myotherlib",
5327 srcs: ["prebuilt.so"],
5328 system_shared_libs: [],
5329 stl: "none",
5330 apex_available: [
5331 "myapex",
5332 "//apex_available:platform",
5333 ],
5334 }
5335 `)
5336
5337 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5338 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5339 var builder strings.Builder
5340 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5341 androidMk := builder.String()
5342 // `myotherlib` is added to `myapex` as symlink
5343 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5344 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5345 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5346 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5347 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5348}
5349
Jooyung Han643adc42020-02-27 13:50:06 +09005350func TestApexWithJniLibs(t *testing.T) {
5351 ctx, _ := testApex(t, `
5352 apex {
5353 name: "myapex",
5354 key: "myapex.key",
5355 jni_libs: ["mylib"],
5356 }
5357
5358 apex_key {
5359 name: "myapex.key",
5360 public_key: "testkey.avbpubkey",
5361 private_key: "testkey.pem",
5362 }
5363
5364 cc_library {
5365 name: "mylib",
5366 srcs: ["mylib.cpp"],
5367 shared_libs: ["mylib2"],
5368 system_shared_libs: [],
5369 stl: "none",
5370 apex_available: [ "myapex" ],
5371 }
5372
5373 cc_library {
5374 name: "mylib2",
5375 srcs: ["mylib.cpp"],
5376 system_shared_libs: [],
5377 stl: "none",
5378 apex_available: [ "myapex" ],
5379 }
5380 `)
5381
5382 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5383 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5384 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5385 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5386 "lib64/mylib.so",
5387 "lib64/mylib2.so",
5388 })
5389}
5390
Jooyung Han49f67012020-04-17 13:43:10 +09005391func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5392 ctx, _ := testApex(t, `
5393 apex {
5394 name: "myapex",
5395 key: "myapex.key",
5396 }
5397 apex_key {
5398 name: "myapex.key",
5399 public_key: "testkey.avbpubkey",
5400 private_key: "testkey.pem",
5401 }
5402 `, func(fs map[string][]byte, config android.Config) {
5403 delete(config.Targets, android.Android)
5404 config.AndroidCommonTarget = android.Target{}
5405 })
5406
5407 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5408 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5409 }
5410}
5411
Jooyung Han643adc42020-02-27 13:50:06 +09005412func TestApexWithJniLibs_Errors(t *testing.T) {
5413 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5414 apex {
5415 name: "myapex",
5416 key: "myapex.key",
5417 jni_libs: ["xxx"],
5418 }
5419
5420 apex_key {
5421 name: "myapex.key",
5422 public_key: "testkey.avbpubkey",
5423 private_key: "testkey.pem",
5424 }
5425
5426 prebuilt_etc {
5427 name: "xxx",
5428 src: "xxx",
5429 }
5430 `, withFiles(map[string][]byte{
5431 "xxx": nil,
5432 }))
5433}
5434
Jiyong Parkbd159612020-02-28 15:22:21 +09005435func TestAppBundle(t *testing.T) {
5436 ctx, _ := testApex(t, `
5437 apex {
5438 name: "myapex",
5439 key: "myapex.key",
5440 apps: ["AppFoo"],
5441 }
5442
5443 apex_key {
5444 name: "myapex.key",
5445 public_key: "testkey.avbpubkey",
5446 private_key: "testkey.pem",
5447 }
5448
5449 android_app {
5450 name: "AppFoo",
5451 srcs: ["foo/bar/MyClass.java"],
5452 sdk_version: "none",
5453 system_modules: "none",
5454 apex_available: [ "myapex" ],
5455 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005456 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005457
5458 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5459 content := bundleConfigRule.Args["content"]
5460
5461 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005462 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 +09005463}
5464
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005465func TestAppSetBundle(t *testing.T) {
5466 ctx, _ := testApex(t, `
5467 apex {
5468 name: "myapex",
5469 key: "myapex.key",
5470 apps: ["AppSet"],
5471 }
5472
5473 apex_key {
5474 name: "myapex.key",
5475 public_key: "testkey.avbpubkey",
5476 private_key: "testkey.pem",
5477 }
5478
5479 android_app_set {
5480 name: "AppSet",
5481 set: "AppSet.apks",
5482 }`)
5483 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5484 bundleConfigRule := mod.Description("Bundle Config")
5485 content := bundleConfigRule.Args["content"]
5486 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5487 s := mod.Rule("apexRule").Args["copy_commands"]
5488 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5489 if len(copyCmds) != 3 {
5490 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5491 }
5492 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5493 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5494 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5495}
5496
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005497func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005498 t.Helper()
5499
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005500 bp := `
5501 java_library {
5502 name: "some-updatable-apex-lib",
5503 srcs: ["a.java"],
5504 sdk_version: "current",
5505 apex_available: [
5506 "some-updatable-apex",
5507 ],
5508 }
5509
5510 java_library {
5511 name: "some-non-updatable-apex-lib",
5512 srcs: ["a.java"],
5513 apex_available: [
5514 "some-non-updatable-apex",
5515 ],
5516 }
5517
5518 java_library {
5519 name: "some-platform-lib",
5520 srcs: ["a.java"],
5521 sdk_version: "current",
5522 installable: true,
5523 }
5524
5525 java_library {
5526 name: "some-art-lib",
5527 srcs: ["a.java"],
5528 sdk_version: "current",
5529 apex_available: [
5530 "com.android.art.something",
5531 ],
5532 hostdex: true,
5533 }
5534
5535 apex {
5536 name: "some-updatable-apex",
5537 key: "some-updatable-apex.key",
5538 java_libs: ["some-updatable-apex-lib"],
5539 updatable: true,
5540 min_sdk_version: "current",
5541 }
5542
5543 apex {
5544 name: "some-non-updatable-apex",
5545 key: "some-non-updatable-apex.key",
5546 java_libs: ["some-non-updatable-apex-lib"],
5547 }
5548
5549 apex_key {
5550 name: "some-updatable-apex.key",
5551 }
5552
5553 apex_key {
5554 name: "some-non-updatable-apex.key",
5555 }
5556
5557 apex {
5558 name: "com.android.art.something",
5559 key: "com.android.art.something.key",
5560 java_libs: ["some-art-lib"],
5561 updatable: true,
5562 min_sdk_version: "current",
5563 }
5564
5565 apex_key {
5566 name: "com.android.art.something.key",
5567 }
5568
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005569 filegroup {
5570 name: "some-updatable-apex-file_contexts",
5571 srcs: [
5572 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5573 ],
5574 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005575
5576 filegroup {
5577 name: "some-non-updatable-apex-file_contexts",
5578 srcs: [
5579 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5580 ],
5581 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005582 `
5583 bp += cc.GatherRequiredDepsForTest(android.Android)
5584 bp += java.GatherRequiredDepsForTest()
5585 bp += dexpreopt.BpToolModulesForTest()
5586
5587 fs := map[string][]byte{
5588 "a.java": nil,
5589 "a.jar": nil,
5590 "build/make/target/product/security": nil,
5591 "apex_manifest.json": nil,
5592 "AndroidManifest.xml": nil,
5593 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005594 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005595 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5596 "framework/aidl/a.aidl": nil,
5597 }
5598 cc.GatherRequiredFilesForTest(fs)
5599
5600 ctx := android.NewTestArchContext()
5601 ctx.RegisterModuleType("apex", BundleFactory)
5602 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5603 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005604 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005605 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005606 cc.RegisterRequiredBuildComponentsForTest(ctx)
5607 java.RegisterJavaBuildComponents(ctx)
5608 java.RegisterSystemModulesBuildComponents(ctx)
5609 java.RegisterAppBuildComponents(ctx)
5610 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005611 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5612 ctx.PreDepsMutators(RegisterPreDepsMutators)
5613 ctx.PostDepsMutators(RegisterPostDepsMutators)
5614
5615 config := android.TestArchConfig(buildDir, nil, bp, fs)
5616 ctx.Register(config)
5617
5618 _ = dexpreopt.GlobalSoongConfigForTests(config)
5619 dexpreopt.RegisterToolModulesForTest(ctx)
5620 pathCtx := android.PathContextForTesting(config)
5621 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5622 transformDexpreoptConfig(dexpreoptConfig)
5623 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5624
5625 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5626 android.FailIfErrored(t, errs)
5627
5628 _, errs = ctx.PrepareBuildActions(config)
5629 if errmsg == "" {
5630 android.FailIfErrored(t, errs)
5631 } else if len(errs) > 0 {
5632 android.FailIfNoMatchingErrors(t, errmsg, errs)
5633 return
5634 } else {
5635 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5636 }
5637}
5638
Jooyung Han548640b2020-04-27 12:10:30 +09005639func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5640 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5641 apex {
5642 name: "myapex",
5643 key: "myapex.key",
5644 updatable: true,
5645 }
5646
5647 apex_key {
5648 name: "myapex.key",
5649 public_key: "testkey.avbpubkey",
5650 private_key: "testkey.pem",
5651 }
5652 `)
5653}
5654
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005655func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005656 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005657 var transform func(*dexpreopt.GlobalConfig)
5658
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005659 config := android.TestArchConfig(buildDir, nil, "", nil)
5660 ctx := android.PathContextForTesting(config)
5661
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005662 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5663 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005664 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005665 }
5666 testNoUpdatableJarsInBootImage(t, "", transform)
5667 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005668
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005669 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005670 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 +01005671 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005672 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005673 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005674 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005675 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005676
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005677 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 -07005678 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 +01005679 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005680 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005681 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005682 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005683 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005684
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005685 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 -07005686 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005687 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005688 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005689 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005690 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005691 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005692
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005693 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 -07005694 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 +01005695 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005696 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005697 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005698 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005699 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005700
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005701 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5702 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005703 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005704 }
5705 testNoUpdatableJarsInBootImage(t, "", transform)
5706 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005707
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005708 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005709 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005710 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005711 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005712 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005713 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005714 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005715
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005716 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005717 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005718 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005719 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005720 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005721 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005722 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005723
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005724 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005725 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005726 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005727 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005728 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005729 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005730 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005731
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005732 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5733 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005734 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005735 }
5736 testNoUpdatableJarsInBootImage(t, "", transform)
5737 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005738}
5739
Jiyong Park62304bb2020-04-13 16:19:48 +09005740func TestTestFor(t *testing.T) {
5741 ctx, _ := testApex(t, `
5742 apex {
5743 name: "myapex",
5744 key: "myapex.key",
5745 native_shared_libs: ["mylib", "myprivlib"],
5746 }
5747
5748 apex_key {
5749 name: "myapex.key",
5750 public_key: "testkey.avbpubkey",
5751 private_key: "testkey.pem",
5752 }
5753
5754 cc_library {
5755 name: "mylib",
5756 srcs: ["mylib.cpp"],
5757 system_shared_libs: [],
5758 stl: "none",
5759 stubs: {
5760 versions: ["1"],
5761 },
5762 apex_available: ["myapex"],
5763 }
5764
5765 cc_library {
5766 name: "myprivlib",
5767 srcs: ["mylib.cpp"],
5768 system_shared_libs: [],
5769 stl: "none",
5770 apex_available: ["myapex"],
5771 }
5772
5773
5774 cc_test {
5775 name: "mytest",
5776 gtest: false,
5777 srcs: ["mylib.cpp"],
5778 system_shared_libs: [],
5779 stl: "none",
5780 shared_libs: ["mylib", "myprivlib"],
5781 test_for: ["myapex"]
5782 }
5783 `)
5784
5785 // the test 'mytest' is a test for the apex, therefore is linked to the
5786 // actual implementation of mylib instead of its stub.
5787 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5788 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5789 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5790}
5791
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005792// TODO(jungjw): Move this to proptools
5793func intPtr(i int) *int {
5794 return &i
5795}
5796
5797func TestApexSet(t *testing.T) {
5798 ctx, config := testApex(t, `
5799 apex_set {
5800 name: "myapex",
5801 set: "myapex.apks",
5802 filename: "foo_v2.apex",
5803 overrides: ["foo"],
5804 }
5805 `, func(fs map[string][]byte, config android.Config) {
5806 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5807 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5808 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5809 })
5810
5811 m := ctx.ModuleForTests("myapex", "android_common")
5812
5813 // Check extract_apks tool parameters.
5814 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5815 actual := extractedApex.Args["abis"]
5816 expected := "ARMEABI_V7A,ARM64_V8A"
5817 if actual != expected {
5818 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5819 }
5820 actual = extractedApex.Args["sdk-version"]
5821 expected = "30"
5822 if actual != expected {
5823 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5824 }
5825
5826 a := m.Module().(*ApexSet)
5827 expectedOverrides := []string{"foo"}
5828 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5829 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5830 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5831 }
5832}
5833
Jiyong Park7d95a512020-05-10 15:16:24 +09005834func TestNoStaticLinkingToStubsLib(t *testing.T) {
5835 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5836 apex {
5837 name: "myapex",
5838 key: "myapex.key",
5839 native_shared_libs: ["mylib"],
5840 }
5841
5842 apex_key {
5843 name: "myapex.key",
5844 public_key: "testkey.avbpubkey",
5845 private_key: "testkey.pem",
5846 }
5847
5848 cc_library {
5849 name: "mylib",
5850 srcs: ["mylib.cpp"],
5851 static_libs: ["otherlib"],
5852 system_shared_libs: [],
5853 stl: "none",
5854 apex_available: [ "myapex" ],
5855 }
5856
5857 cc_library {
5858 name: "otherlib",
5859 srcs: ["mylib.cpp"],
5860 system_shared_libs: [],
5861 stl: "none",
5862 stubs: {
5863 versions: ["1", "2", "3"],
5864 },
5865 apex_available: [ "myapex" ],
5866 }
5867 `)
5868}
5869
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005870func TestApexKeysTxt(t *testing.T) {
5871 ctx, _ := testApex(t, `
5872 apex {
5873 name: "myapex",
5874 key: "myapex.key",
5875 }
5876
5877 apex_key {
5878 name: "myapex.key",
5879 public_key: "testkey.avbpubkey",
5880 private_key: "testkey.pem",
5881 }
5882
5883 prebuilt_apex {
5884 name: "myapex",
5885 prefer: true,
5886 arch: {
5887 arm64: {
5888 src: "myapex-arm64.apex",
5889 },
5890 arm: {
5891 src: "myapex-arm.apex",
5892 },
5893 },
5894 }
5895
5896 apex_set {
5897 name: "myapex_set",
5898 set: "myapex.apks",
5899 filename: "myapex_set.apex",
5900 overrides: ["myapex"],
5901 }
5902 `)
5903
5904 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5905 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5906 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 +09005907 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 +09005908}
5909
Jooyung Han938b5932020-06-20 12:47:47 +09005910func TestAllowedFiles(t *testing.T) {
5911 ctx, _ := testApex(t, `
5912 apex {
5913 name: "myapex",
5914 key: "myapex.key",
5915 apps: ["app"],
5916 allowed_files: "allowed.txt",
5917 }
5918
5919 apex_key {
5920 name: "myapex.key",
5921 public_key: "testkey.avbpubkey",
5922 private_key: "testkey.pem",
5923 }
5924
5925 android_app {
5926 name: "app",
5927 srcs: ["foo/bar/MyClass.java"],
5928 package_name: "foo",
5929 sdk_version: "none",
5930 system_modules: "none",
5931 apex_available: [ "myapex" ],
5932 }
5933 `, withFiles(map[string][]byte{
5934 "sub/Android.bp": []byte(`
5935 override_apex {
5936 name: "override_myapex",
5937 base: "myapex",
5938 apps: ["override_app"],
5939 allowed_files: ":allowed",
5940 }
5941 // Overridable "path" property should be referenced indirectly
5942 filegroup {
5943 name: "allowed",
5944 srcs: ["allowed.txt"],
5945 }
5946 override_android_app {
5947 name: "override_app",
5948 base: "app",
5949 package_name: "bar",
5950 }
5951 `),
5952 }))
5953
5954 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5955 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5956 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5957 }
5958
5959 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5960 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5961 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5962 }
5963}
5964
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005965func TestNonPreferredPrebuiltDependency(t *testing.T) {
5966 _, _ = testApex(t, `
5967 apex {
5968 name: "myapex",
5969 key: "myapex.key",
5970 native_shared_libs: ["mylib"],
5971 }
5972
5973 apex_key {
5974 name: "myapex.key",
5975 public_key: "testkey.avbpubkey",
5976 private_key: "testkey.pem",
5977 }
5978
5979 cc_library {
5980 name: "mylib",
5981 srcs: ["mylib.cpp"],
5982 stubs: {
5983 versions: ["10000"],
5984 },
5985 apex_available: ["myapex"],
5986 }
5987
5988 cc_prebuilt_library_shared {
5989 name: "mylib",
5990 prefer: false,
5991 srcs: ["prebuilt.so"],
5992 stubs: {
5993 versions: ["10000"],
5994 },
5995 apex_available: ["myapex"],
5996 }
5997 `)
5998}
5999
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006000func TestMain(m *testing.M) {
6001 run := func() int {
6002 setUp()
6003 defer tearDown()
6004
6005 return m.Run()
6006 }
6007
6008 os.Exit(run())
6009}