blob: 5c49667e5852aa4ef39c1c4d74238fccf542b4a0 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080030 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000032 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070033 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090034 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090036)
37
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070038var buildDir string
39
Jooyung Hand3639552019-08-09 12:57:43 +090040// names returns name list from white space separated string
41func names(s string) (ns []string) {
42 for _, n := range strings.Split(s, " ") {
43 if len(n) > 0 {
44 ns = append(ns, n)
45 }
46 }
47 return
48}
49
Jooyung Han344d5432019-08-23 11:17:39 +090050func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
51 t.Helper()
52 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090053 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
54 if len(errs) > 0 {
55 android.FailIfNoMatchingErrors(t, pattern, errs)
56 return
57 }
58 _, errs = ctx.PrepareBuildActions(config)
59 if len(errs) > 0 {
60 android.FailIfNoMatchingErrors(t, pattern, errs)
61 return
62 }
63
64 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
65}
66
Jooyung Han344d5432019-08-23 11:17:39 +090067func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
68 t.Helper()
69 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010070 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090071 android.FailIfErrored(t, errs)
72 _, errs = ctx.PrepareBuildActions(config)
73 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070074 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090075}
76
Jooyung Han344d5432019-08-23 11:17:39 +090077type testCustomizer func(fs map[string][]byte, config android.Config)
78
79func withFiles(files map[string][]byte) testCustomizer {
80 return func(fs map[string][]byte, config android.Config) {
81 for k, v := range files {
82 fs[k] = v
83 }
84 }
85}
86
87func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
88 return func(fs map[string][]byte, config android.Config) {
89 for k, v := range targets {
90 config.Targets[k] = v
91 }
92 }
93}
94
Jooyung Han35155c42020-02-06 17:33:20 +090095// withNativeBridgeTargets sets configuration with targets including:
96// - X86_64 (primary)
97// - X86 (secondary)
98// - Arm64 on X86_64 (native bridge)
99// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700100func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900101 config.Targets[android.Android] = []android.Target{
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
110 }
111}
112
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900113func withManifestPackageNameOverrides(specs []string) testCustomizer {
114 return func(fs map[string][]byte, config android.Config) {
115 config.TestProductVariables.ManifestPackageNameOverrides = specs
116 }
117}
118
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700119func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900120 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
121}
122
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700123func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900124 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
125}
126
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700127func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900128 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900129
130 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900131 filegroup {
132 name: "myapex-file_contexts",
133 srcs: [
134 "system/sepolicy/apex/myapex-file_contexts",
135 ],
136 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900137 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800138
Colin Crossf9aabd72020-02-15 11:29:50 -0800139 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
140
Dario Frenicde2a032019-10-27 00:29:22 +0100141 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900142
Jooyung Han344d5432019-08-23 11:17:39 +0900143 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900144 "a.java": nil,
145 "PrebuiltAppFoo.apk": nil,
146 "PrebuiltAppFooPriv.apk": nil,
147 "build/make/target/product/security": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
150 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900151 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900152 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900153 "system/sepolicy/apex/otherapex-file_contexts": nil,
154 "system/sepolicy/apex/commonapex-file_contexts": nil,
155 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800156 "mylib.cpp": nil,
157 "mylib_common.cpp": nil,
158 "mytest.cpp": nil,
159 "mytest1.cpp": nil,
160 "mytest2.cpp": nil,
161 "mytest3.cpp": nil,
162 "myprebuilt": nil,
163 "my_include": nil,
164 "foo/bar/MyClass.java": nil,
165 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100166 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800167 "vendor/foo/devkeys/test.x509.pem": nil,
168 "vendor/foo/devkeys/test.pk8": nil,
169 "testkey.x509.pem": nil,
170 "testkey.pk8": nil,
171 "testkey.override.x509.pem": nil,
172 "testkey.override.pk8": nil,
173 "vendor/foo/devkeys/testkey.avbpubkey": nil,
174 "vendor/foo/devkeys/testkey.pem": nil,
175 "NOTICE": nil,
176 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900177 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800178 "testkey2.avbpubkey": nil,
179 "testkey2.pem": nil,
180 "myapex-arm64.apex": nil,
181 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700182 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800183 "frameworks/base/api/current.txt": nil,
184 "framework/aidl/a.aidl": nil,
185 "build/make/core/proguard.flags": nil,
186 "build/make/core/proguard_basic_keeps.flags": nil,
187 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700188 "baz": nil,
189 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700190 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700191 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900192 }
193
Colin Crossf9aabd72020-02-15 11:29:50 -0800194 cc.GatherRequiredFilesForTest(fs)
195
Jooyung Han344d5432019-08-23 11:17:39 +0900196 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800197 // The fs now needs to be populated before creating the config, call handlers twice
198 // for now, once to get any fs changes, and later after the config was created to
199 // set product variables or targets.
200 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
201 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900202 }
203
Colin Cross98be1bb2019-12-13 20:41:13 -0800204 config := android.TestArchConfig(buildDir, nil, bp, fs)
205 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
206 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
207 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
208 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
209 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jooyung Han749dc692020-04-15 11:03:39 +0900210 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800211 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
212
213 for _, handler := range handlers {
214 // The fs now needs to be populated before creating the config, call handlers twice
215 // for now, earlier to get any fs changes, and now after the config was created to
216 // set product variables or targets.
217 tempFS := map[string][]byte{}
218 handler(tempFS, config)
219 }
220
221 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100222
223 // from android package
224 android.RegisterPackageBuildComponents(ctx)
225 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
226
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("apex", BundleFactory)
228 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
229 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
230 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
231 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
232 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
233 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700234 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100237 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000238 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100241
Paul Duffin021f4e52020-07-30 16:04:17 +0100242 // Register these after the prebuilt mutators have been registered to match what
243 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100244 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
245 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
246
Paul Duffin021f4e52020-07-30 16:04:17 +0100247 cc.RegisterRequiredBuildComponentsForTest(ctx)
248
Colin Cross98be1bb2019-12-13 20:41:13 -0800249 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800250 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
251 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900252 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000253 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700254 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800255 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000256 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000257 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000258 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100259 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900260 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800261 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262
Colin Cross98be1bb2019-12-13 20:41:13 -0800263 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265
266 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269}
270
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271func setUp() {
272 var err error
273 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700279func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700280 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281}
282
Jooyung Han643adc42020-02-27 13:50:06 +0900283// ensure that 'result' equals 'expected'
284func ensureEquals(t *testing.T, result string, expected string) {
285 t.Helper()
286 if result != expected {
287 t.Errorf("%q != %q", expected, result)
288 }
289}
290
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291// ensure that 'result' contains 'expected'
292func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if !strings.Contains(result, expected) {
295 t.Errorf("%q is not found in %q", expected, result)
296 }
297}
298
Liz Kammer5bd365f2020-05-27 15:15:11 -0700299// ensure that 'result' contains 'expected' exactly one time
300func ensureContainsOnce(t *testing.T, result string, expected string) {
301 t.Helper()
302 count := strings.Count(result, expected)
303 if count != 1 {
304 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// ensures that 'result' does not contain 'notExpected'
309func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900310 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311 if strings.Contains(result, notExpected) {
312 t.Errorf("%q is found in %q", notExpected, result)
313 }
314}
315
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700316func ensureMatches(t *testing.T, result string, expectedRex string) {
317 ok, err := regexp.MatchString(expectedRex, result)
318 if err != nil {
319 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
320 return
321 }
322 if !ok {
323 t.Errorf("%s does not match regular expession %s", result, expectedRex)
324 }
325}
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900328 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900329 if !android.InList(expected, result) {
330 t.Errorf("%q is not found in %v", expected, result)
331 }
332}
333
334func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900335 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900336 if android.InList(notExpected, result) {
337 t.Errorf("%q is found in %v", notExpected, result)
338 }
339}
340
Jooyung Hane1633032019-08-01 17:41:43 +0900341func ensureListEmpty(t *testing.T, result []string) {
342 t.Helper()
343 if len(result) > 0 {
344 t.Errorf("%q is expected to be empty", result)
345 }
346}
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348// Minimal test
349func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900350 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900351 apex_defaults {
352 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900353 manifest: ":myapex.manifest",
354 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 key: "myapex.key",
356 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800357 multilib: {
358 both: {
359 binaries: ["foo",],
360 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900361 },
Jiyong Park77acec62020-06-01 21:39:15 +0900362 java_libs: [
363 "myjar",
364 "myjar_dex",
365 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900366 }
367
Jiyong Park30ca9372019-02-07 16:27:23 +0900368 apex {
369 name: "myapex",
370 defaults: ["myapex-defaults"],
371 }
372
Jiyong Park25fc6a92018-11-18 18:02:45 +0900373 apex_key {
374 name: "myapex.key",
375 public_key: "testkey.avbpubkey",
376 private_key: "testkey.pem",
377 }
378
Jiyong Park809bb722019-02-13 21:33:49 +0900379 filegroup {
380 name: "myapex.manifest",
381 srcs: ["apex_manifest.json"],
382 }
383
384 filegroup {
385 name: "myapex.androidmanifest",
386 srcs: ["AndroidManifest.xml"],
387 }
388
Jiyong Park25fc6a92018-11-18 18:02:45 +0900389 cc_library {
390 name: "mylib",
391 srcs: ["mylib.cpp"],
392 shared_libs: ["mylib2"],
393 system_shared_libs: [],
394 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000395 // TODO: remove //apex_available:platform
396 apex_available: [
397 "//apex_available:platform",
398 "myapex",
399 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900400 }
401
Alex Light3d673592019-01-18 14:37:31 -0800402 cc_binary {
403 name: "foo",
404 srcs: ["mylib.cpp"],
405 compile_multilib: "both",
406 multilib: {
407 lib32: {
408 suffix: "32",
409 },
410 lib64: {
411 suffix: "64",
412 },
413 },
414 symlinks: ["foo_link_"],
415 symlink_preferred_arch: true,
416 system_shared_libs: [],
417 static_executable: true,
418 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700419 apex_available: [ "myapex", "com.android.gki.*" ],
420 }
421
422 apex {
423 name: "com.android.gki.fake",
424 binaries: ["foo"],
425 key: "myapex.key",
426 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800427 }
428
Paul Duffindddd5462020-04-07 15:25:44 +0100429 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900430 name: "mylib2",
431 srcs: ["mylib.cpp"],
432 system_shared_libs: [],
433 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900434 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
451 }
452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
458 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000459 // TODO: remove //apex_available:platform
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900464 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900465
466 java_library {
467 name: "myjar",
468 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900469 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 sdk_version: "none",
471 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900473 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000474 // TODO: remove //apex_available:platform
475 apex_available: [
476 "//apex_available:platform",
477 "myapex",
478 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Sundong Ahnabb64432019-10-22 13:58:29 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
513 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
514 data := android.AndroidMkDataForTest(t, config, "", ab)
515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900525 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700538 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540
541 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800542 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
543 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900544 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900545 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900546 // .. but not for java libs
547 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900548 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800549
Colin Cross7113d202019-11-20 16:39:12 -0800550 // Ensure that the platform variant ends with _shared or _common
551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
556
557 // Ensure that dynamic dependency to java libs are not included
558 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800559
560 // Ensure that all symlinks are present.
561 found_foo_link_64 := false
562 found_foo := false
563 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900564 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800565 if strings.HasSuffix(cmd, "bin/foo") {
566 found_foo = true
567 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
568 found_foo_link_64 = true
569 }
570 }
571 }
572 good := found_foo && found_foo_link_64
573 if !good {
574 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
575 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900576
Sundong Ahnabb64432019-10-22 13:58:29 +0900577 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700578 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900579 if len(noticeInputs) != 3 {
580 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900581 }
582 ensureListContains(t, noticeInputs, "NOTICE")
583 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900584 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900585
Artur Satayeva8bd1132020-04-27 18:07:06 +0100586 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000587 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
588 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
589 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
590 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
591 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100592
593 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000594 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
597 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
598 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800599}
600
Jooyung Hanf21c7972019-12-16 22:32:06 +0900601func TestDefaults(t *testing.T) {
602 ctx, _ := testApex(t, `
603 apex_defaults {
604 name: "myapex-defaults",
605 key: "myapex.key",
606 prebuilts: ["myetc"],
607 native_shared_libs: ["mylib"],
608 java_libs: ["myjar"],
609 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900610 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800611 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 }
613
614 prebuilt_etc {
615 name: "myetc",
616 src: "myprebuilt",
617 }
618
619 apex {
620 name: "myapex",
621 defaults: ["myapex-defaults"],
622 }
623
624 apex_key {
625 name: "myapex.key",
626 public_key: "testkey.avbpubkey",
627 private_key: "testkey.pem",
628 }
629
630 cc_library {
631 name: "mylib",
632 system_shared_libs: [],
633 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000634 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900635 }
636
637 java_library {
638 name: "myjar",
639 srcs: ["foo/bar/MyClass.java"],
640 sdk_version: "none",
641 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000642 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900643 }
644
645 android_app {
646 name: "AppFoo",
647 srcs: ["foo/bar/MyClass.java"],
648 sdk_version: "none",
649 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900652
653 runtime_resource_overlay {
654 name: "rro",
655 theme: "blue",
656 }
657
markchien2f59ec92020-09-02 16:23:38 +0800658 bpf {
659 name: "bpf",
660 srcs: ["bpf.c", "bpf2.c"],
661 }
662
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000664 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 "etc/myetc",
666 "javalib/myjar.jar",
667 "lib64/mylib.so",
668 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900669 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800670 "etc/bpf/bpf.o",
671 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900672 })
673}
674
Jooyung Han01a3ee22019-11-02 02:52:25 +0900675func TestApexManifest(t *testing.T) {
676 ctx, _ := testApex(t, `
677 apex {
678 name: "myapex",
679 key: "myapex.key",
680 }
681
682 apex_key {
683 name: "myapex.key",
684 public_key: "testkey.avbpubkey",
685 private_key: "testkey.pem",
686 }
687 `)
688
689 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900690 args := module.Rule("apexRule").Args
691 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
692 t.Error("manifest should be apex_manifest.pb, but " + manifest)
693 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694}
695
Alex Light5098a612018-11-29 17:12:15 -0800696func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700697 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800698 apex {
699 name: "myapex",
700 key: "myapex.key",
701 payload_type: "zip",
702 native_shared_libs: ["mylib"],
703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710
711 cc_library {
712 name: "mylib",
713 srcs: ["mylib.cpp"],
714 shared_libs: ["mylib2"],
715 system_shared_libs: [],
716 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000717 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800718 }
719
720 cc_library {
721 name: "mylib2",
722 srcs: ["mylib.cpp"],
723 system_shared_libs: [],
724 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000725 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800726 }
727 `)
728
Sundong Ahnabb64432019-10-22 13:58:29 +0900729 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800730 copyCmds := zipApexRule.Args["copy_commands"]
731
732 // Ensure that main rule creates an output
733 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
734
735 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700736 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800737
738 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700739 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800740
741 // Ensure that both direct and indirect deps are copied into apex
742 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
743 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900744}
745
746func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700747 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748 apex {
749 name: "myapex",
750 key: "myapex.key",
751 native_shared_libs: ["mylib", "mylib3"],
752 }
753
754 apex_key {
755 name: "myapex.key",
756 public_key: "testkey.avbpubkey",
757 private_key: "testkey.pem",
758 }
759
760 cc_library {
761 name: "mylib",
762 srcs: ["mylib.cpp"],
763 shared_libs: ["mylib2", "mylib3"],
764 system_shared_libs: [],
765 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000766 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900767 }
768
769 cc_library {
770 name: "mylib2",
771 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900772 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773 system_shared_libs: [],
774 stl: "none",
775 stubs: {
776 versions: ["1", "2", "3"],
777 },
778 }
779
780 cc_library {
781 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900782 srcs: ["mylib.cpp"],
783 shared_libs: ["mylib4"],
784 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785 stl: "none",
786 stubs: {
787 versions: ["10", "11", "12"],
788 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000789 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900791
792 cc_library {
793 name: "mylib4",
794 srcs: ["mylib.cpp"],
795 system_shared_libs: [],
796 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000797 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900798 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799 `)
800
Sundong Ahnabb64432019-10-22 13:58:29 +0900801 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 copyCmds := apexRule.Args["copy_commands"]
803
804 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800805 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900806
807 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800808 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809
810 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800811 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812
Colin Crossaede88c2020-08-11 12:17:01 -0700813 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900814
815 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900816 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900817 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900818 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900819
820 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700821 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900822 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700823 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900824
825 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900826 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900827 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900828
829 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900830 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900831
Jooyung Hana57af4a2020-01-23 05:36:59 +0000832 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900833 "lib64/mylib.so",
834 "lib64/mylib3.so",
835 "lib64/mylib4.so",
836 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700840 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900841 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900842 name: "myapex2",
843 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900844 native_shared_libs: ["mylib"],
845 }
846
847 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900848 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900849 public_key: "testkey.avbpubkey",
850 private_key: "testkey.pem",
851 }
852
853 cc_library {
854 name: "mylib",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900857 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900861 }
862
863 cc_library {
864 name: "libfoo",
865 srcs: ["mylib.cpp"],
866 shared_libs: ["libbar"],
867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["10", "20", "30"],
871 },
872 }
873
874 cc_library {
875 name: "libbar",
876 srcs: ["mylib.cpp"],
877 system_shared_libs: [],
878 stl: "none",
879 }
880
Jiyong Park678c8812020-02-07 17:25:49 +0900881 cc_library_static {
882 name: "libbaz",
883 srcs: ["mylib.cpp"],
884 system_shared_libs: [],
885 stl: "none",
886 apex_available: [ "myapex2" ],
887 }
888
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900889 `)
890
Jiyong Park83dc74b2020-01-14 18:38:44 +0900891 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892 copyCmds := apexRule.Args["copy_commands"]
893
894 // Ensure that direct non-stubs dep is always included
895 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
896
897 // Ensure that indirect stubs dep is not included
898 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
899
900 // Ensure that dependency of stubs is not included
901 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
902
Colin Crossaede88c2020-08-11 12:17:01 -0700903 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900904
905 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900906 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900907 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900908 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900909
Jiyong Park3ff16992019-12-27 14:11:47 +0900910 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900911
912 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
913 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900914
Artur Satayeva8bd1132020-04-27 18:07:06 +0100915 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000916 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
917 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
918 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900919
Artur Satayeva8bd1132020-04-27 18:07:06 +0100920 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000921 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
922 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
923 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900924}
925
Jooyung Hand3639552019-08-09 12:57:43 +0900926func TestApexWithRuntimeLibsDependency(t *testing.T) {
927 /*
928 myapex
929 |
930 v (runtime_libs)
931 mylib ------+------> libfoo [provides stub]
932 |
933 `------> libbar
934 */
935 ctx, _ := testApex(t, `
936 apex {
937 name: "myapex",
938 key: "myapex.key",
939 native_shared_libs: ["mylib"],
940 }
941
942 apex_key {
943 name: "myapex.key",
944 public_key: "testkey.avbpubkey",
945 private_key: "testkey.pem",
946 }
947
948 cc_library {
949 name: "mylib",
950 srcs: ["mylib.cpp"],
951 runtime_libs: ["libfoo", "libbar"],
952 system_shared_libs: [],
953 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000954 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900955 }
956
957 cc_library {
958 name: "libfoo",
959 srcs: ["mylib.cpp"],
960 system_shared_libs: [],
961 stl: "none",
962 stubs: {
963 versions: ["10", "20", "30"],
964 },
965 }
966
967 cc_library {
968 name: "libbar",
969 srcs: ["mylib.cpp"],
970 system_shared_libs: [],
971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000972 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900973 }
974
975 `)
976
Sundong Ahnabb64432019-10-22 13:58:29 +0900977 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900978 copyCmds := apexRule.Args["copy_commands"]
979
980 // Ensure that direct non-stubs dep is always included
981 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
982
983 // Ensure that indirect stubs dep is not included
984 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
985
986 // Ensure that runtime_libs dep in included
987 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
988
Sundong Ahnabb64432019-10-22 13:58:29 +0900989 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900990 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
991 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900992
993}
994
Jooyung Han8ce8db92020-05-15 19:05:05 +0900995func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
996 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
997 bp := `
998 apex {
999 name: "com.android.runtime",
1000 key: "com.android.runtime.key",
1001 native_shared_libs: ["libc"],
1002 }
1003
1004 apex_key {
1005 name: "com.android.runtime.key",
1006 public_key: "testkey.avbpubkey",
1007 private_key: "testkey.pem",
1008 }
1009
1010 cc_library {
1011 name: "libc",
1012 no_libcrt: true,
1013 nocrt: true,
1014 stl: "none",
1015 system_shared_libs: [],
1016 stubs: { versions: ["1"] },
1017 apex_available: ["com.android.runtime"],
1018
1019 sanitize: {
1020 hwaddress: true,
1021 }
1022 }
1023
1024 cc_prebuilt_library_shared {
1025 name: "libclang_rt.hwasan-aarch64-android",
1026 no_libcrt: true,
1027 nocrt: true,
1028 stl: "none",
1029 system_shared_libs: [],
1030 srcs: [""],
1031 stubs: { versions: ["1"] },
1032
1033 sanitize: {
1034 never: true,
1035 },
1036 }
1037 `
1038 // override bp to use hard-coded names: com.android.runtime and libc
1039 fs["Android.bp"] = []byte(bp)
1040 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1041 })
1042
1043 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1044 "lib64/bionic/libc.so",
1045 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1046 })
1047
1048 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1049
1050 installed := hwasan.Description("install libclang_rt.hwasan")
1051 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1052
1053 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1054 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1055 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1056}
1057
1058func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1059 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1060 bp := `
1061 apex {
1062 name: "com.android.runtime",
1063 key: "com.android.runtime.key",
1064 native_shared_libs: ["libc"],
1065 }
1066
1067 apex_key {
1068 name: "com.android.runtime.key",
1069 public_key: "testkey.avbpubkey",
1070 private_key: "testkey.pem",
1071 }
1072
1073 cc_library {
1074 name: "libc",
1075 no_libcrt: true,
1076 nocrt: true,
1077 stl: "none",
1078 system_shared_libs: [],
1079 stubs: { versions: ["1"] },
1080 apex_available: ["com.android.runtime"],
1081 }
1082
1083 cc_prebuilt_library_shared {
1084 name: "libclang_rt.hwasan-aarch64-android",
1085 no_libcrt: true,
1086 nocrt: true,
1087 stl: "none",
1088 system_shared_libs: [],
1089 srcs: [""],
1090 stubs: { versions: ["1"] },
1091
1092 sanitize: {
1093 never: true,
1094 },
1095 }
1096 `
1097 // override bp to use hard-coded names: com.android.runtime and libc
1098 fs["Android.bp"] = []byte(bp)
1099 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1100
1101 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1102 })
1103
1104 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1105 "lib64/bionic/libc.so",
1106 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1107 })
1108
1109 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1110
1111 installed := hwasan.Description("install libclang_rt.hwasan")
1112 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1113
1114 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1115 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1116 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1117}
1118
Jooyung Han61b66e92020-03-21 14:21:46 +00001119func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1120 testcases := []struct {
1121 name string
1122 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001123 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001124 shouldLink string
1125 shouldNotLink []string
1126 }{
1127 {
Jooyung Han75568392020-03-20 04:29:24 +09001128 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001129 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001130 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001131 shouldLink: "30",
1132 shouldNotLink: []string{"29"},
1133 },
1134 {
1135 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001136 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001137 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001138 shouldLink: "29",
1139 shouldNotLink: []string{"30"},
1140 },
1141 }
1142 for _, tc := range testcases {
1143 t.Run(tc.name, func(t *testing.T) {
1144 ctx, _ := testApex(t, `
1145 apex {
1146 name: "myapex",
1147 key: "myapex.key",
1148 use_vendor: true,
1149 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001150 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001151 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001152
Jooyung Han61b66e92020-03-21 14:21:46 +00001153 apex_key {
1154 name: "myapex.key",
1155 public_key: "testkey.avbpubkey",
1156 private_key: "testkey.pem",
1157 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001158
Jooyung Han61b66e92020-03-21 14:21:46 +00001159 cc_library {
1160 name: "mylib",
1161 srcs: ["mylib.cpp"],
1162 vendor_available: true,
1163 shared_libs: ["libbar"],
1164 system_shared_libs: [],
1165 stl: "none",
1166 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001167 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001168 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001169
Jooyung Han61b66e92020-03-21 14:21:46 +00001170 cc_library {
1171 name: "libbar",
1172 srcs: ["mylib.cpp"],
1173 system_shared_libs: [],
1174 stl: "none",
1175 stubs: { versions: ["29","30"] },
1176 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001177
Jooyung Han61b66e92020-03-21 14:21:46 +00001178 llndk_library {
1179 name: "libbar",
1180 symbol_file: "",
1181 }
1182 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001183 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001184 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001185
Jooyung Han61b66e92020-03-21 14:21:46 +00001186 // Ensure that LLNDK dep is not included
1187 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1188 "lib64/mylib.so",
1189 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001190
Jooyung Han61b66e92020-03-21 14:21:46 +00001191 // Ensure that LLNDK dep is required
1192 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1193 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1194 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001195
Colin Crossaede88c2020-08-11 12:17:01 -07001196 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001197 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1198 for _, ver := range tc.shouldNotLink {
1199 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1200 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001201
Colin Crossaede88c2020-08-11 12:17:01 -07001202 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001203 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1204 })
1205 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001206}
1207
Jiyong Park25fc6a92018-11-18 18:02:45 +09001208func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001209 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001210 apex {
1211 name: "myapex",
1212 key: "myapex.key",
1213 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1214 }
1215
1216 apex_key {
1217 name: "myapex.key",
1218 public_key: "testkey.avbpubkey",
1219 private_key: "testkey.pem",
1220 }
1221
1222 cc_library {
1223 name: "mylib",
1224 srcs: ["mylib.cpp"],
1225 shared_libs: ["libdl#27"],
1226 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001227 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001228 }
1229
1230 cc_library_shared {
1231 name: "mylib_shared",
1232 srcs: ["mylib.cpp"],
1233 shared_libs: ["libdl#27"],
1234 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001235 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001236 }
1237
1238 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001239 name: "libBootstrap",
1240 srcs: ["mylib.cpp"],
1241 stl: "none",
1242 bootstrap: true,
1243 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001244 `)
1245
Sundong Ahnabb64432019-10-22 13:58:29 +09001246 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001247 copyCmds := apexRule.Args["copy_commands"]
1248
1249 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001250 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001251 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1252 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001253
1254 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001255 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001256
Colin Crossaede88c2020-08-11 12:17:01 -07001257 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1258 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1259 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260
1261 // For dependency to libc
1262 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001263 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001264 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001265 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001266 // ... Cflags from stub is correctly exported to mylib
1267 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1268 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1269
1270 // For dependency to libm
1271 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001272 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001273 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001274 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001275 // ... and is not compiling with the stub
1276 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1277 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1278
1279 // For dependency to libdl
1280 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001282 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001283 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1284 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001285 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001286 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001287 // ... Cflags from stub is correctly exported to mylib
1288 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1289 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001290
1291 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001292 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1293 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1294 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1295 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001296}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001297
Jooyung Han749dc692020-04-15 11:03:39 +09001298func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001299 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001300 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1301 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001302 // 3) (platform) -> liba -> libz : this should be non-stub link
1303 ctx, _ := testApex(t, `
1304 apex {
1305 name: "myapex",
1306 key: "myapex.key",
1307 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001308 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001309 }
1310
1311 apex {
1312 name: "otherapex",
1313 key: "myapex.key",
1314 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001315 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001316 }
1317
1318 apex_key {
1319 name: "myapex.key",
1320 public_key: "testkey.avbpubkey",
1321 private_key: "testkey.pem",
1322 }
1323
1324 cc_library {
1325 name: "libx",
1326 shared_libs: ["liba"],
1327 system_shared_libs: [],
1328 stl: "none",
1329 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001330 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001331 }
1332
1333 cc_library {
1334 name: "liby",
1335 shared_libs: ["liba"],
1336 system_shared_libs: [],
1337 stl: "none",
1338 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001339 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001340 }
1341
1342 cc_library {
1343 name: "liba",
1344 shared_libs: ["libz"],
1345 system_shared_libs: [],
1346 stl: "none",
1347 apex_available: [
1348 "//apex_available:anyapex",
1349 "//apex_available:platform",
1350 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001351 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001352 }
1353
1354 cc_library {
1355 name: "libz",
1356 system_shared_libs: [],
1357 stl: "none",
1358 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001359 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001360 },
1361 }
Jooyung Han749dc692020-04-15 11:03:39 +09001362 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001363
1364 expectLink := func(from, from_variant, to, to_variant string) {
1365 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1366 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1367 }
1368 expectNoLink := func(from, from_variant, to, to_variant string) {
1369 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1370 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1371 }
1372 // platform liba is linked to non-stub version
1373 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001374 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001375 expectLink("liba", "shared_apex29", "libz", "shared_28")
1376 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1377 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001378 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001379 expectLink("liba", "shared_apex30", "libz", "shared_30")
1380 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1381 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001382}
1383
Jooyung Hanaed150d2020-04-02 01:41:41 +09001384func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1385 ctx, _ := testApex(t, `
1386 apex {
1387 name: "myapex",
1388 key: "myapex.key",
1389 native_shared_libs: ["libx"],
1390 min_sdk_version: "R",
1391 }
1392
1393 apex_key {
1394 name: "myapex.key",
1395 public_key: "testkey.avbpubkey",
1396 private_key: "testkey.pem",
1397 }
1398
1399 cc_library {
1400 name: "libx",
1401 shared_libs: ["libz"],
1402 system_shared_libs: [],
1403 stl: "none",
1404 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001405 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001406 }
1407
1408 cc_library {
1409 name: "libz",
1410 system_shared_libs: [],
1411 stl: "none",
1412 stubs: {
1413 versions: ["29", "R"],
1414 },
1415 }
1416 `, func(fs map[string][]byte, config android.Config) {
1417 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1418 })
1419
1420 expectLink := func(from, from_variant, to, to_variant string) {
1421 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1422 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1423 }
1424 expectNoLink := func(from, from_variant, to, to_variant string) {
1425 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1426 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1427 }
1428 // 9000 is quite a magic number.
1429 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1430 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1431 // to distinguish them from finalized and future_api(10000)
1432 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1433 // (refer android/api_levels.go)
Colin Crossaede88c2020-08-11 12:17:01 -07001434 expectLink("libx", "shared_apex10000", "libz", "shared_9000")
1435 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1436 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001437}
1438
Jooyung Han749dc692020-04-15 11:03:39 +09001439func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001440 ctx, _ := testApex(t, `
1441 apex {
1442 name: "myapex",
1443 key: "myapex.key",
1444 native_shared_libs: ["libx"],
1445 }
1446
1447 apex_key {
1448 name: "myapex.key",
1449 public_key: "testkey.avbpubkey",
1450 private_key: "testkey.pem",
1451 }
1452
1453 cc_library {
1454 name: "libx",
1455 shared_libs: ["libz"],
1456 system_shared_libs: [],
1457 stl: "none",
1458 apex_available: [ "myapex" ],
1459 }
1460
1461 cc_library {
1462 name: "libz",
1463 system_shared_libs: [],
1464 stl: "none",
1465 stubs: {
1466 versions: ["1", "2"],
1467 },
1468 }
1469 `)
1470
1471 expectLink := func(from, from_variant, to, to_variant string) {
1472 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1473 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1474 }
1475 expectNoLink := func(from, from_variant, to, to_variant string) {
1476 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1477 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1478 }
Colin Crossaede88c2020-08-11 12:17:01 -07001479 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1480 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1481 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001482}
1483
1484func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1485 ctx, _ := testApex(t, `
1486 apex {
1487 name: "myapex",
1488 key: "myapex.key",
1489 native_shared_libs: ["libx"],
1490 }
1491
1492 apex_key {
1493 name: "myapex.key",
1494 public_key: "testkey.avbpubkey",
1495 private_key: "testkey.pem",
1496 }
1497
1498 cc_library {
1499 name: "libx",
1500 system_shared_libs: [],
1501 stl: "none",
1502 apex_available: [ "myapex" ],
1503 stubs: {
1504 versions: ["1", "2"],
1505 },
1506 }
1507
1508 cc_library {
1509 name: "libz",
1510 shared_libs: ["libx"],
1511 system_shared_libs: [],
1512 stl: "none",
1513 }
1514 `)
1515
1516 expectLink := func(from, from_variant, to, to_variant string) {
1517 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1518 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1519 }
1520 expectNoLink := func(from, from_variant, to, to_variant string) {
1521 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1522 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1523 }
1524 expectLink("libz", "shared", "libx", "shared_2")
1525 expectNoLink("libz", "shared", "libz", "shared_1")
1526 expectNoLink("libz", "shared", "libz", "shared")
1527}
1528
Jooyung Han75568392020-03-20 04:29:24 +09001529func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001530 ctx, _ := testApex(t, `
1531 apex {
1532 name: "myapex",
1533 key: "myapex.key",
1534 native_shared_libs: ["libx"],
1535 min_sdk_version: "29",
1536 }
1537
1538 apex_key {
1539 name: "myapex.key",
1540 public_key: "testkey.avbpubkey",
1541 private_key: "testkey.pem",
1542 }
1543
1544 cc_library {
1545 name: "libx",
1546 shared_libs: ["libbar"],
1547 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001548 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001549 }
1550
1551 cc_library {
1552 name: "libbar",
1553 stubs: {
1554 versions: ["29", "30"],
1555 },
1556 }
Jooyung Han75568392020-03-20 04:29:24 +09001557 `, func(fs map[string][]byte, config android.Config) {
1558 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1559 })
Jooyung Han03b51852020-02-26 22:45:42 +09001560 expectLink := func(from, from_variant, to, to_variant string) {
1561 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1562 libFlags := ld.Args["libFlags"]
1563 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1564 }
Colin Crossaede88c2020-08-11 12:17:01 -07001565 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001566}
1567
Jooyung Han75568392020-03-20 04:29:24 +09001568func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001569 ctx, _ := testApex(t, `
1570 apex {
1571 name: "myapex",
1572 key: "myapex.key",
1573 native_shared_libs: ["libx"],
1574 min_sdk_version: "29",
1575 }
1576
1577 apex_key {
1578 name: "myapex.key",
1579 public_key: "testkey.avbpubkey",
1580 private_key: "testkey.pem",
1581 }
1582
1583 cc_library {
1584 name: "libx",
1585 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001586 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001587 }
Jooyung Han75568392020-03-20 04:29:24 +09001588 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001589
1590 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001591 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001592 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1593 // note that platform variant is not.
1594 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1595 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001596}
1597
Jooyung Han749dc692020-04-15 11:03:39 +09001598func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001599 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001600 apex {
1601 name: "myapex",
1602 key: "myapex.key",
1603 native_shared_libs: ["libx"],
1604 min_sdk_version: "29",
1605 }
1606
1607 apex_key {
1608 name: "myapex.key",
1609 public_key: "testkey.avbpubkey",
1610 private_key: "testkey.pem",
1611 }
1612
1613 cc_library {
1614 name: "libx",
1615 shared_libs: ["libz"],
1616 system_shared_libs: [],
1617 stl: "none",
1618 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001619 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001620 }
1621
1622 cc_library {
1623 name: "libz",
1624 system_shared_libs: [],
1625 stl: "none",
1626 stubs: {
1627 versions: ["30"],
1628 },
1629 }
Jooyung Han75568392020-03-20 04:29:24 +09001630 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001631}
Jooyung Han03b51852020-02-26 22:45:42 +09001632
Jooyung Han749dc692020-04-15 11:03:39 +09001633func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1634 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001635 apex {
1636 name: "myapex",
1637 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001638 native_shared_libs: ["mylib"],
1639 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001640 }
1641
1642 apex_key {
1643 name: "myapex.key",
1644 public_key: "testkey.avbpubkey",
1645 private_key: "testkey.pem",
1646 }
Jooyung Han749dc692020-04-15 11:03:39 +09001647
1648 cc_library {
1649 name: "mylib",
1650 srcs: ["mylib.cpp"],
1651 system_shared_libs: [],
1652 stl: "none",
1653 apex_available: [
1654 "myapex",
1655 ],
1656 min_sdk_version: "30",
1657 }
1658 `)
1659}
1660
1661func TestApexMinSdkVersion_Okay(t *testing.T) {
1662 testApex(t, `
1663 apex {
1664 name: "myapex",
1665 key: "myapex.key",
1666 native_shared_libs: ["libfoo"],
1667 java_libs: ["libbar"],
1668 min_sdk_version: "29",
1669 }
1670
1671 apex_key {
1672 name: "myapex.key",
1673 public_key: "testkey.avbpubkey",
1674 private_key: "testkey.pem",
1675 }
1676
1677 cc_library {
1678 name: "libfoo",
1679 srcs: ["mylib.cpp"],
1680 shared_libs: ["libfoo_dep"],
1681 apex_available: ["myapex"],
1682 min_sdk_version: "29",
1683 }
1684
1685 cc_library {
1686 name: "libfoo_dep",
1687 srcs: ["mylib.cpp"],
1688 apex_available: ["myapex"],
1689 min_sdk_version: "29",
1690 }
1691
1692 java_library {
1693 name: "libbar",
1694 sdk_version: "current",
1695 srcs: ["a.java"],
1696 static_libs: ["libbar_dep"],
1697 apex_available: ["myapex"],
1698 min_sdk_version: "29",
1699 }
1700
1701 java_library {
1702 name: "libbar_dep",
1703 sdk_version: "current",
1704 srcs: ["a.java"],
1705 apex_available: ["myapex"],
1706 min_sdk_version: "29",
1707 }
Jooyung Han03b51852020-02-26 22:45:42 +09001708 `)
1709}
1710
Artur Satayev8cf899a2020-04-15 17:29:42 +01001711func TestJavaStableSdkVersion(t *testing.T) {
1712 testCases := []struct {
1713 name string
1714 expectedError string
1715 bp string
1716 }{
1717 {
1718 name: "Non-updatable apex with non-stable dep",
1719 bp: `
1720 apex {
1721 name: "myapex",
1722 java_libs: ["myjar"],
1723 key: "myapex.key",
1724 }
1725 apex_key {
1726 name: "myapex.key",
1727 public_key: "testkey.avbpubkey",
1728 private_key: "testkey.pem",
1729 }
1730 java_library {
1731 name: "myjar",
1732 srcs: ["foo/bar/MyClass.java"],
1733 sdk_version: "core_platform",
1734 apex_available: ["myapex"],
1735 }
1736 `,
1737 },
1738 {
1739 name: "Updatable apex with stable dep",
1740 bp: `
1741 apex {
1742 name: "myapex",
1743 java_libs: ["myjar"],
1744 key: "myapex.key",
1745 updatable: true,
1746 min_sdk_version: "29",
1747 }
1748 apex_key {
1749 name: "myapex.key",
1750 public_key: "testkey.avbpubkey",
1751 private_key: "testkey.pem",
1752 }
1753 java_library {
1754 name: "myjar",
1755 srcs: ["foo/bar/MyClass.java"],
1756 sdk_version: "current",
1757 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001758 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001759 }
1760 `,
1761 },
1762 {
1763 name: "Updatable apex with non-stable dep",
1764 expectedError: "cannot depend on \"myjar\"",
1765 bp: `
1766 apex {
1767 name: "myapex",
1768 java_libs: ["myjar"],
1769 key: "myapex.key",
1770 updatable: true,
1771 }
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777 java_library {
1778 name: "myjar",
1779 srcs: ["foo/bar/MyClass.java"],
1780 sdk_version: "core_platform",
1781 apex_available: ["myapex"],
1782 }
1783 `,
1784 },
1785 {
1786 name: "Updatable apex with non-stable transitive dep",
1787 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1788 bp: `
1789 apex {
1790 name: "myapex",
1791 java_libs: ["myjar"],
1792 key: "myapex.key",
1793 updatable: true,
1794 }
1795 apex_key {
1796 name: "myapex.key",
1797 public_key: "testkey.avbpubkey",
1798 private_key: "testkey.pem",
1799 }
1800 java_library {
1801 name: "myjar",
1802 srcs: ["foo/bar/MyClass.java"],
1803 sdk_version: "current",
1804 apex_available: ["myapex"],
1805 static_libs: ["transitive-jar"],
1806 }
1807 java_library {
1808 name: "transitive-jar",
1809 srcs: ["foo/bar/MyClass.java"],
1810 sdk_version: "core_platform",
1811 apex_available: ["myapex"],
1812 }
1813 `,
1814 },
1815 }
1816
1817 for _, test := range testCases {
1818 t.Run(test.name, func(t *testing.T) {
1819 if test.expectedError == "" {
1820 testApex(t, test.bp)
1821 } else {
1822 testApexError(t, test.expectedError, test.bp)
1823 }
1824 })
1825 }
1826}
1827
Jooyung Han749dc692020-04-15 11:03:39 +09001828func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1829 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1830 apex {
1831 name: "myapex",
1832 key: "myapex.key",
1833 native_shared_libs: ["mylib"],
1834 min_sdk_version: "29",
1835 }
1836
1837 apex_key {
1838 name: "myapex.key",
1839 public_key: "testkey.avbpubkey",
1840 private_key: "testkey.pem",
1841 }
1842
1843 cc_library {
1844 name: "mylib",
1845 srcs: ["mylib.cpp"],
1846 shared_libs: ["mylib2"],
1847 system_shared_libs: [],
1848 stl: "none",
1849 apex_available: [
1850 "myapex",
1851 ],
1852 min_sdk_version: "29",
1853 }
1854
1855 // indirect part of the apex
1856 cc_library {
1857 name: "mylib2",
1858 srcs: ["mylib.cpp"],
1859 system_shared_libs: [],
1860 stl: "none",
1861 apex_available: [
1862 "myapex",
1863 ],
1864 min_sdk_version: "30",
1865 }
1866 `)
1867}
1868
1869func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1870 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1871 apex {
1872 name: "myapex",
1873 key: "myapex.key",
1874 apps: ["AppFoo"],
1875 min_sdk_version: "29",
1876 }
1877
1878 apex_key {
1879 name: "myapex.key",
1880 public_key: "testkey.avbpubkey",
1881 private_key: "testkey.pem",
1882 }
1883
1884 android_app {
1885 name: "AppFoo",
1886 srcs: ["foo/bar/MyClass.java"],
1887 sdk_version: "current",
1888 min_sdk_version: "29",
1889 system_modules: "none",
1890 stl: "none",
1891 static_libs: ["bar"],
1892 apex_available: [ "myapex" ],
1893 }
1894
1895 java_library {
1896 name: "bar",
1897 sdk_version: "current",
1898 srcs: ["a.java"],
1899 apex_available: [ "myapex" ],
1900 }
1901 `)
1902}
1903
1904func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1905 ctx, _ := testApex(t, `
1906 apex {
1907 name: "myapex",
1908 key: "myapex.key",
1909 native_shared_libs: ["mylib"],
1910 min_sdk_version: "29",
1911 }
1912
1913 apex_key {
1914 name: "myapex.key",
1915 public_key: "testkey.avbpubkey",
1916 private_key: "testkey.pem",
1917 }
1918
1919 // mylib in myapex will link to mylib2#29
1920 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1921 cc_library {
1922 name: "mylib",
1923 srcs: ["mylib.cpp"],
1924 shared_libs: ["mylib2"],
1925 system_shared_libs: [],
1926 stl: "none",
1927 apex_available: ["myapex", "otherapex"],
1928 min_sdk_version: "29",
1929 }
1930
1931 cc_library {
1932 name: "mylib2",
1933 srcs: ["mylib.cpp"],
1934 system_shared_libs: [],
1935 stl: "none",
1936 apex_available: ["otherapex"],
1937 stubs: { versions: ["29", "30"] },
1938 min_sdk_version: "30",
1939 }
1940
1941 apex {
1942 name: "otherapex",
1943 key: "myapex.key",
1944 native_shared_libs: ["mylib", "mylib2"],
1945 min_sdk_version: "30",
1946 }
1947 `)
1948 expectLink := func(from, from_variant, to, to_variant string) {
1949 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1950 libFlags := ld.Args["libFlags"]
1951 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1952 }
Colin Crossaede88c2020-08-11 12:17:01 -07001953 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
1954 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09001955}
1956
Jiyong Park7c2ee712018-12-07 00:42:25 +09001957func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001958 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001959 apex {
1960 name: "myapex",
1961 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001962 native_shared_libs: ["mylib"],
1963 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001964 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001965 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001966 }
1967
1968 apex_key {
1969 name: "myapex.key",
1970 public_key: "testkey.avbpubkey",
1971 private_key: "testkey.pem",
1972 }
1973
1974 prebuilt_etc {
1975 name: "myetc",
1976 src: "myprebuilt",
1977 sub_dir: "foo/bar",
1978 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001979
1980 cc_library {
1981 name: "mylib",
1982 srcs: ["mylib.cpp"],
1983 relative_install_path: "foo/bar",
1984 system_shared_libs: [],
1985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001986 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001987 }
1988
1989 cc_binary {
1990 name: "mybin",
1991 srcs: ["mylib.cpp"],
1992 relative_install_path: "foo/bar",
1993 system_shared_libs: [],
1994 static_executable: true,
1995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001996 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001997 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001998 `)
1999
Sundong Ahnabb64432019-10-22 13:58:29 +09002000 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002001 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2002
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002003 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002004 ensureListContains(t, dirs, "etc")
2005 ensureListContains(t, dirs, "etc/foo")
2006 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002007 ensureListContains(t, dirs, "lib64")
2008 ensureListContains(t, dirs, "lib64/foo")
2009 ensureListContains(t, dirs, "lib64/foo/bar")
2010 ensureListContains(t, dirs, "lib")
2011 ensureListContains(t, dirs, "lib/foo")
2012 ensureListContains(t, dirs, "lib/foo/bar")
2013
Jiyong Parkbd13e442019-03-15 18:10:35 +09002014 ensureListContains(t, dirs, "bin")
2015 ensureListContains(t, dirs, "bin/foo")
2016 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002017}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002018
Jooyung Han35155c42020-02-06 17:33:20 +09002019func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2020 ctx, _ := testApex(t, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 multilib: {
2025 both: {
2026 native_shared_libs: ["mylib"],
2027 binaries: ["mybin"],
2028 },
2029 },
2030 compile_multilib: "both",
2031 native_bridge_supported: true,
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "mylib",
2042 relative_install_path: "foo/bar",
2043 system_shared_libs: [],
2044 stl: "none",
2045 apex_available: [ "myapex" ],
2046 native_bridge_supported: true,
2047 }
2048
2049 cc_binary {
2050 name: "mybin",
2051 relative_install_path: "foo/bar",
2052 system_shared_libs: [],
2053 static_executable: true,
2054 stl: "none",
2055 apex_available: [ "myapex" ],
2056 native_bridge_supported: true,
2057 compile_multilib: "both", // default is "first" for binary
2058 multilib: {
2059 lib64: {
2060 suffix: "64",
2061 },
2062 },
2063 }
2064 `, withNativeBridgeEnabled)
2065 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2066 "bin/foo/bar/mybin",
2067 "bin/foo/bar/mybin64",
2068 "bin/arm/foo/bar/mybin",
2069 "bin/arm64/foo/bar/mybin64",
2070 "lib/foo/bar/mylib.so",
2071 "lib/arm/foo/bar/mylib.so",
2072 "lib64/foo/bar/mylib.so",
2073 "lib64/arm64/foo/bar/mylib.so",
2074 })
2075}
2076
Jiyong Parkda6eb592018-12-19 17:12:36 +09002077func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002078 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002079 apex {
2080 name: "myapex",
2081 key: "myapex.key",
2082 native_shared_libs: ["mylib"],
2083 use_vendor: true,
2084 }
2085
2086 apex_key {
2087 name: "myapex.key",
2088 public_key: "testkey.avbpubkey",
2089 private_key: "testkey.pem",
2090 }
2091
2092 cc_library {
2093 name: "mylib",
2094 srcs: ["mylib.cpp"],
2095 shared_libs: ["mylib2"],
2096 system_shared_libs: [],
2097 vendor_available: true,
2098 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002099 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002100 }
2101
2102 cc_library {
2103 name: "mylib2",
2104 srcs: ["mylib.cpp"],
2105 system_shared_libs: [],
2106 vendor_available: true,
2107 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002108 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002109 }
Jooyung Handc782442019-11-01 03:14:38 +09002110 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002111 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002112 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002113
2114 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002115 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002116 for _, implicit := range i.Implicits {
2117 inputsList = append(inputsList, implicit.String())
2118 }
2119 }
2120 inputsString := strings.Join(inputsList, " ")
2121
2122 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002123 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2124 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002125
2126 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002127 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2128 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002129}
Jiyong Park16e91a02018-12-20 18:18:08 +09002130
Jooyung Han85d61762020-06-24 23:50:26 +09002131func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002132 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2133 apex {
2134 name: "myapex",
2135 key: "myapex.key",
2136 use_vendor: true,
2137 }
2138 apex_key {
2139 name: "myapex.key",
2140 public_key: "testkey.avbpubkey",
2141 private_key: "testkey.pem",
2142 }
2143 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002144 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002145 })
Colin Cross440e0d02020-06-11 11:32:11 -07002146 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002147 testApex(t, `
2148 apex {
2149 name: "myapex",
2150 key: "myapex.key",
2151 use_vendor: true,
2152 }
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002159 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002160 })
2161}
2162
Jooyung Han5c998b92019-06-27 11:30:33 +09002163func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2164 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2165 apex {
2166 name: "myapex",
2167 key: "myapex.key",
2168 native_shared_libs: ["mylib"],
2169 use_vendor: true,
2170 }
2171
2172 apex_key {
2173 name: "myapex.key",
2174 public_key: "testkey.avbpubkey",
2175 private_key: "testkey.pem",
2176 }
2177
2178 cc_library {
2179 name: "mylib",
2180 srcs: ["mylib.cpp"],
2181 system_shared_libs: [],
2182 stl: "none",
2183 }
2184 `)
2185}
2186
Jooyung Han85d61762020-06-24 23:50:26 +09002187func TestVendorApex(t *testing.T) {
2188 ctx, config := testApex(t, `
2189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
2192 binaries: ["mybin"],
2193 vendor: true,
2194 }
2195 apex_key {
2196 name: "myapex.key",
2197 public_key: "testkey.avbpubkey",
2198 private_key: "testkey.pem",
2199 }
2200 cc_binary {
2201 name: "mybin",
2202 vendor: true,
2203 shared_libs: ["libfoo"],
2204 }
2205 cc_library {
2206 name: "libfoo",
2207 proprietary: true,
2208 }
2209 `)
2210
2211 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2212 "bin/mybin",
2213 "lib64/libfoo.so",
2214 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2215 "lib64/libc++.so",
2216 })
2217
2218 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2219 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2220 name := apexBundle.BaseModuleName()
2221 prefix := "TARGET_"
2222 var builder strings.Builder
2223 data.Custom(&builder, name, prefix, "", data)
2224 androidMk := builder.String()
2225 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002226
2227 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2228 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2229 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002230}
2231
Jooyung Handf78e212020-07-22 15:54:47 +09002232func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2233 ctx, _ := testApex(t, `
2234 apex {
2235 name: "myapex",
2236 key: "myapex.key",
2237 binaries: ["mybin"],
2238 vendor: true,
2239 use_vndk_as_stable: true,
2240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 cc_binary {
2247 name: "mybin",
2248 vendor: true,
2249 shared_libs: ["libvndk", "libvendor"],
2250 }
2251 cc_library {
2252 name: "libvndk",
2253 vndk: {
2254 enabled: true,
2255 },
2256 vendor_available: true,
2257 }
2258 cc_library {
2259 name: "libvendor",
2260 vendor: true,
2261 }
2262 `)
2263
2264 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2265
Colin Crossaede88c2020-08-11 12:17:01 -07002266 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002267 libs := names(ldRule.Args["libFlags"])
2268 // VNDK libs(libvndk/libc++) as they are
2269 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2270 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2271 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002272 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002273
2274 // VNDK libs are not included when use_vndk_as_stable: true
2275 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2276 "bin/mybin",
2277 "lib64/libvendor.so",
2278 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002279
2280 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2281 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2282 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002283}
2284
Jooyung Han8e5685d2020-09-21 11:02:57 +09002285func TestApex_withPrebuiltFirmware(t *testing.T) {
2286 testCases := []struct {
2287 name string
2288 additionalProp string
2289 }{
2290 {"system apex with prebuilt_firmware", ""},
2291 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2292 }
2293 for _, tc := range testCases {
2294 t.Run(tc.name, func(t *testing.T) {
2295 ctx, _ := testApex(t, `
2296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 prebuilts: ["myfirmware"],
2300 `+tc.additionalProp+`
2301 }
2302 apex_key {
2303 name: "myapex.key",
2304 public_key: "testkey.avbpubkey",
2305 private_key: "testkey.pem",
2306 }
2307 prebuilt_firmware {
2308 name: "myfirmware",
2309 src: "myfirmware.bin",
2310 filename_from_src: true,
2311 `+tc.additionalProp+`
2312 }
2313 `)
2314 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2315 "etc/firmware/myfirmware.bin",
2316 })
2317 })
2318 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002319}
2320
Jooyung Hanefb184e2020-06-25 17:14:25 +09002321func TestAndroidMk_UseVendorRequired(t *testing.T) {
2322 ctx, config := testApex(t, `
2323 apex {
2324 name: "myapex",
2325 key: "myapex.key",
2326 use_vendor: true,
2327 native_shared_libs: ["mylib"],
2328 }
2329
2330 apex_key {
2331 name: "myapex.key",
2332 public_key: "testkey.avbpubkey",
2333 private_key: "testkey.pem",
2334 }
2335
2336 cc_library {
2337 name: "mylib",
2338 vendor_available: true,
2339 apex_available: ["myapex"],
2340 }
2341 `, func(fs map[string][]byte, config android.Config) {
2342 setUseVendorAllowListForTest(config, []string{"myapex"})
2343 })
2344
2345 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2346 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2347 name := apexBundle.BaseModuleName()
2348 prefix := "TARGET_"
2349 var builder strings.Builder
2350 data.Custom(&builder, name, prefix, "", data)
2351 androidMk := builder.String()
2352 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2353}
2354
2355func TestAndroidMk_VendorApexRequired(t *testing.T) {
2356 ctx, config := testApex(t, `
2357 apex {
2358 name: "myapex",
2359 key: "myapex.key",
2360 vendor: true,
2361 native_shared_libs: ["mylib"],
2362 }
2363
2364 apex_key {
2365 name: "myapex.key",
2366 public_key: "testkey.avbpubkey",
2367 private_key: "testkey.pem",
2368 }
2369
2370 cc_library {
2371 name: "mylib",
2372 vendor_available: true,
2373 }
2374 `)
2375
2376 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2377 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2378 name := apexBundle.BaseModuleName()
2379 prefix := "TARGET_"
2380 var builder strings.Builder
2381 data.Custom(&builder, name, prefix, "", data)
2382 androidMk := builder.String()
2383 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2384}
2385
Jooyung Han2ed99d02020-06-24 23:26:26 +09002386func TestAndroidMkWritesCommonProperties(t *testing.T) {
2387 ctx, config := testApex(t, `
2388 apex {
2389 name: "myapex",
2390 key: "myapex.key",
2391 vintf_fragments: ["fragment.xml"],
2392 init_rc: ["init.rc"],
2393 }
2394 apex_key {
2395 name: "myapex.key",
2396 public_key: "testkey.avbpubkey",
2397 private_key: "testkey.pem",
2398 }
2399 cc_binary {
2400 name: "mybin",
2401 }
2402 `)
2403
2404 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2405 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2406 name := apexBundle.BaseModuleName()
2407 prefix := "TARGET_"
2408 var builder strings.Builder
2409 data.Custom(&builder, name, prefix, "", data)
2410 androidMk := builder.String()
2411 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2412 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2413}
2414
Jiyong Park16e91a02018-12-20 18:18:08 +09002415func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002416 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002417 apex {
2418 name: "myapex",
2419 key: "myapex.key",
2420 native_shared_libs: ["mylib"],
2421 }
2422
2423 apex_key {
2424 name: "myapex.key",
2425 public_key: "testkey.avbpubkey",
2426 private_key: "testkey.pem",
2427 }
2428
2429 cc_library {
2430 name: "mylib",
2431 srcs: ["mylib.cpp"],
2432 system_shared_libs: [],
2433 stl: "none",
2434 stubs: {
2435 versions: ["1", "2", "3"],
2436 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002437 apex_available: [
2438 "//apex_available:platform",
2439 "myapex",
2440 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002441 }
2442
2443 cc_binary {
2444 name: "not_in_apex",
2445 srcs: ["mylib.cpp"],
2446 static_libs: ["mylib"],
2447 static_executable: true,
2448 system_shared_libs: [],
2449 stl: "none",
2450 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002451 `)
2452
Colin Cross7113d202019-11-20 16:39:12 -08002453 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002454
2455 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002456 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002457}
Jiyong Park9335a262018-12-24 11:31:58 +09002458
2459func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002460 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002461 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002462 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002463 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002464 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002465 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002466 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002467 }
2468
2469 cc_library {
2470 name: "mylib",
2471 srcs: ["mylib.cpp"],
2472 system_shared_libs: [],
2473 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002474 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002475 }
2476
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002483 android_app_certificate {
2484 name: "myapex.certificate",
2485 certificate: "testkey",
2486 }
2487
2488 android_app_certificate {
2489 name: "myapex.certificate.override",
2490 certificate: "testkey.override",
2491 }
2492
Jiyong Park9335a262018-12-24 11:31:58 +09002493 `)
2494
2495 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002496 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002497
2498 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2499 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2500 "vendor/foo/devkeys/testkey.avbpubkey")
2501 }
2502 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2503 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2504 "vendor/foo/devkeys/testkey.pem")
2505 }
2506
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002507 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002508 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002509 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002510 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002511 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002512 }
2513}
Jiyong Park58e364a2019-01-19 19:24:06 +09002514
Jooyung Hanf121a652019-12-17 14:30:11 +09002515func TestCertificate(t *testing.T) {
2516 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2517 ctx, _ := testApex(t, `
2518 apex {
2519 name: "myapex",
2520 key: "myapex.key",
2521 }
2522 apex_key {
2523 name: "myapex.key",
2524 public_key: "testkey.avbpubkey",
2525 private_key: "testkey.pem",
2526 }`)
2527 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2528 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2529 if actual := rule.Args["certificates"]; actual != expected {
2530 t.Errorf("certificates should be %q, not %q", expected, actual)
2531 }
2532 })
2533 t.Run("override when unspecified", func(t *testing.T) {
2534 ctx, _ := testApex(t, `
2535 apex {
2536 name: "myapex_keytest",
2537 key: "myapex.key",
2538 file_contexts: ":myapex-file_contexts",
2539 }
2540 apex_key {
2541 name: "myapex.key",
2542 public_key: "testkey.avbpubkey",
2543 private_key: "testkey.pem",
2544 }
2545 android_app_certificate {
2546 name: "myapex.certificate.override",
2547 certificate: "testkey.override",
2548 }`)
2549 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2550 expected := "testkey.override.x509.pem testkey.override.pk8"
2551 if actual := rule.Args["certificates"]; actual != expected {
2552 t.Errorf("certificates should be %q, not %q", expected, actual)
2553 }
2554 })
2555 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2556 ctx, _ := testApex(t, `
2557 apex {
2558 name: "myapex",
2559 key: "myapex.key",
2560 certificate: ":myapex.certificate",
2561 }
2562 apex_key {
2563 name: "myapex.key",
2564 public_key: "testkey.avbpubkey",
2565 private_key: "testkey.pem",
2566 }
2567 android_app_certificate {
2568 name: "myapex.certificate",
2569 certificate: "testkey",
2570 }`)
2571 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2572 expected := "testkey.x509.pem testkey.pk8"
2573 if actual := rule.Args["certificates"]; actual != expected {
2574 t.Errorf("certificates should be %q, not %q", expected, actual)
2575 }
2576 })
2577 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2578 ctx, _ := testApex(t, `
2579 apex {
2580 name: "myapex_keytest",
2581 key: "myapex.key",
2582 file_contexts: ":myapex-file_contexts",
2583 certificate: ":myapex.certificate",
2584 }
2585 apex_key {
2586 name: "myapex.key",
2587 public_key: "testkey.avbpubkey",
2588 private_key: "testkey.pem",
2589 }
2590 android_app_certificate {
2591 name: "myapex.certificate.override",
2592 certificate: "testkey.override",
2593 }`)
2594 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2595 expected := "testkey.override.x509.pem testkey.override.pk8"
2596 if actual := rule.Args["certificates"]; actual != expected {
2597 t.Errorf("certificates should be %q, not %q", expected, actual)
2598 }
2599 })
2600 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2601 ctx, _ := testApex(t, `
2602 apex {
2603 name: "myapex",
2604 key: "myapex.key",
2605 certificate: "testkey",
2606 }
2607 apex_key {
2608 name: "myapex.key",
2609 public_key: "testkey.avbpubkey",
2610 private_key: "testkey.pem",
2611 }`)
2612 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2613 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2614 if actual := rule.Args["certificates"]; actual != expected {
2615 t.Errorf("certificates should be %q, not %q", expected, actual)
2616 }
2617 })
2618 t.Run("override when specified as <name>", func(t *testing.T) {
2619 ctx, _ := testApex(t, `
2620 apex {
2621 name: "myapex_keytest",
2622 key: "myapex.key",
2623 file_contexts: ":myapex-file_contexts",
2624 certificate: "testkey",
2625 }
2626 apex_key {
2627 name: "myapex.key",
2628 public_key: "testkey.avbpubkey",
2629 private_key: "testkey.pem",
2630 }
2631 android_app_certificate {
2632 name: "myapex.certificate.override",
2633 certificate: "testkey.override",
2634 }`)
2635 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2636 expected := "testkey.override.x509.pem testkey.override.pk8"
2637 if actual := rule.Args["certificates"]; actual != expected {
2638 t.Errorf("certificates should be %q, not %q", expected, actual)
2639 }
2640 })
2641}
2642
Jiyong Park58e364a2019-01-19 19:24:06 +09002643func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002644 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002645 apex {
2646 name: "myapex",
2647 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002648 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002649 }
2650
2651 apex {
2652 name: "otherapex",
2653 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002654 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002655 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 srcs: ["mylib.cpp"],
2667 system_shared_libs: [],
2668 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002669 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002670 "myapex",
2671 "otherapex",
2672 ],
Jooyung Han24282772020-03-21 23:20:55 +09002673 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002674 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002675 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002676 cc_library {
2677 name: "mylib2",
2678 srcs: ["mylib.cpp"],
2679 system_shared_libs: [],
2680 stl: "none",
2681 apex_available: [
2682 "myapex",
2683 "otherapex",
2684 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002685 static_libs: ["mylib3"],
2686 recovery_available: true,
2687 min_sdk_version: "29",
2688 }
2689 cc_library {
2690 name: "mylib3",
2691 srcs: ["mylib.cpp"],
2692 system_shared_libs: [],
2693 stl: "none",
2694 apex_available: [
2695 "myapex",
2696 "otherapex",
2697 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002698 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002699 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002700 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002701 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002702 `)
2703
Jooyung Hanc87a0592020-03-02 17:44:33 +09002704 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002705 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002706 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002707 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002708
Jooyung Hanccce2f22020-03-07 03:45:53 +09002709 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002710 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002711 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002712 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002714
Jooyung Hanccce2f22020-03-07 03:45:53 +09002715 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002716 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002717 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002718 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002719 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002720
Colin Crossaede88c2020-08-11 12:17:01 -07002721 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2722 // each variant defines additional macros to distinguish which apex variant it is built for
2723
2724 // non-APEX variant does not have __ANDROID_APEX__ defined
2725 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2726 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2727
2728 // APEX variant has __ANDROID_APEX__ defined
2729 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2730 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2731 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2732 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2733
2734 // APEX variant has __ANDROID_APEX__ defined
2735 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2736 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2737 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2738 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2739
2740 // recovery variant does not set __ANDROID_SDK_VERSION__
2741 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2742 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2743 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2744
2745 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2746 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002747
2748 // non-APEX variant does not have __ANDROID_APEX__ defined
2749 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2750 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2751
2752 // APEX variant has __ANDROID_APEX__ defined
2753 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002754 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002755 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002756 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002757
Jooyung Hanc87a0592020-03-02 17:44:33 +09002758 // APEX variant has __ANDROID_APEX__ defined
2759 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002760 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002761 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002762 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002763
2764 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002765 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002766 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2767 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002768}
Jiyong Park7e636d02019-01-28 16:16:54 +09002769
2770func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002771 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002772 apex {
2773 name: "myapex",
2774 key: "myapex.key",
2775 native_shared_libs: ["mylib"],
2776 }
2777
2778 apex_key {
2779 name: "myapex.key",
2780 public_key: "testkey.avbpubkey",
2781 private_key: "testkey.pem",
2782 }
2783
2784 cc_library_headers {
2785 name: "mylib_headers",
2786 export_include_dirs: ["my_include"],
2787 system_shared_libs: [],
2788 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002789 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002790 }
2791
2792 cc_library {
2793 name: "mylib",
2794 srcs: ["mylib.cpp"],
2795 system_shared_libs: [],
2796 stl: "none",
2797 header_libs: ["mylib_headers"],
2798 export_header_lib_headers: ["mylib_headers"],
2799 stubs: {
2800 versions: ["1", "2", "3"],
2801 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002802 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002803 }
2804
2805 cc_library {
2806 name: "otherlib",
2807 srcs: ["mylib.cpp"],
2808 system_shared_libs: [],
2809 stl: "none",
2810 shared_libs: ["mylib"],
2811 }
2812 `)
2813
Colin Cross7113d202019-11-20 16:39:12 -08002814 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002815
2816 // Ensure that the include path of the header lib is exported to 'otherlib'
2817 ensureContains(t, cFlags, "-Imy_include")
2818}
Alex Light9670d332019-01-29 18:07:33 -08002819
Jiyong Park7cd10e32020-01-14 09:22:18 +09002820type fileInApex struct {
2821 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002822 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002823 isLink bool
2824}
2825
Jooyung Hana57af4a2020-01-23 05:36:59 +00002826func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002827 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002828 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002829 copyCmds := apexRule.Args["copy_commands"]
2830 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002831 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002832 for _, cmd := range strings.Split(copyCmds, "&&") {
2833 cmd = strings.TrimSpace(cmd)
2834 if cmd == "" {
2835 continue
2836 }
2837 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002838 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002839 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002840 switch terms[0] {
2841 case "mkdir":
2842 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002843 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002844 t.Fatal("copyCmds contains invalid cp command", cmd)
2845 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002846 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002847 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002848 isLink = false
2849 case "ln":
2850 if len(terms) != 3 && len(terms) != 4 {
2851 // ln LINK TARGET or ln -s LINK TARGET
2852 t.Fatal("copyCmds contains invalid ln command", cmd)
2853 }
2854 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002855 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002856 isLink = true
2857 default:
2858 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2859 }
2860 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002861 index := strings.Index(dst, imageApexDir)
2862 if index == -1 {
2863 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2864 }
2865 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002866 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002867 }
2868 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002869 return ret
2870}
2871
Jooyung Hana57af4a2020-01-23 05:36:59 +00002872func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2873 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002874 var failed bool
2875 var surplus []string
2876 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002877 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002878 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002879 for _, expected := range files {
2880 if matched, _ := path.Match(expected, file.path); matched {
2881 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002882 mactchFound = true
2883 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002884 }
2885 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002886 if !mactchFound {
2887 surplus = append(surplus, file.path)
2888 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002889 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002890
Jooyung Han31c470b2019-10-18 16:26:59 +09002891 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002892 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002893 t.Log("surplus files", surplus)
2894 failed = true
2895 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002896
2897 if len(files) > len(filesMatched) {
2898 var missing []string
2899 for _, expected := range files {
2900 if !filesMatched[expected] {
2901 missing = append(missing, expected)
2902 }
2903 }
2904 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002905 t.Log("missing files", missing)
2906 failed = true
2907 }
2908 if failed {
2909 t.Fail()
2910 }
2911}
2912
Jooyung Han344d5432019-08-23 11:17:39 +09002913func TestVndkApexCurrent(t *testing.T) {
2914 ctx, _ := testApex(t, `
2915 apex_vndk {
2916 name: "myapex",
2917 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002918 }
2919
2920 apex_key {
2921 name: "myapex.key",
2922 public_key: "testkey.avbpubkey",
2923 private_key: "testkey.pem",
2924 }
2925
2926 cc_library {
2927 name: "libvndk",
2928 srcs: ["mylib.cpp"],
2929 vendor_available: true,
2930 vndk: {
2931 enabled: true,
2932 },
2933 system_shared_libs: [],
2934 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002935 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002936 }
2937
2938 cc_library {
2939 name: "libvndksp",
2940 srcs: ["mylib.cpp"],
2941 vendor_available: true,
2942 vndk: {
2943 enabled: true,
2944 support_system_process: true,
2945 },
2946 system_shared_libs: [],
2947 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002948 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002949 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002950 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002951
Jooyung Hana57af4a2020-01-23 05:36:59 +00002952 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002953 "lib/libvndk.so",
2954 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002955 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002956 "lib64/libvndk.so",
2957 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002958 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002959 "etc/llndk.libraries.VER.txt",
2960 "etc/vndkcore.libraries.VER.txt",
2961 "etc/vndksp.libraries.VER.txt",
2962 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002963 })
Jooyung Han344d5432019-08-23 11:17:39 +09002964}
2965
2966func TestVndkApexWithPrebuilt(t *testing.T) {
2967 ctx, _ := testApex(t, `
2968 apex_vndk {
2969 name: "myapex",
2970 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002971 }
2972
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }
2978
2979 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002980 name: "libvndk",
2981 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002982 vendor_available: true,
2983 vndk: {
2984 enabled: true,
2985 },
2986 system_shared_libs: [],
2987 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002988 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002989 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002990
2991 cc_prebuilt_library_shared {
2992 name: "libvndk.arm",
2993 srcs: ["libvndk.arm.so"],
2994 vendor_available: true,
2995 vndk: {
2996 enabled: true,
2997 },
2998 enabled: false,
2999 arch: {
3000 arm: {
3001 enabled: true,
3002 },
3003 },
3004 system_shared_libs: [],
3005 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003006 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003007 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003008 `+vndkLibrariesTxtFiles("current"),
3009 withFiles(map[string][]byte{
3010 "libvndk.so": nil,
3011 "libvndk.arm.so": nil,
3012 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003013
Jooyung Hana57af4a2020-01-23 05:36:59 +00003014 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003015 "lib/libvndk.so",
3016 "lib/libvndk.arm.so",
3017 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003018 "lib/libc++.so",
3019 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003020 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003021 })
Jooyung Han344d5432019-08-23 11:17:39 +09003022}
3023
Jooyung Han39edb6c2019-11-06 16:53:07 +09003024func vndkLibrariesTxtFiles(vers ...string) (result string) {
3025 for _, v := range vers {
3026 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003027 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003028 result += `
3029 vndk_libraries_txt {
3030 name: "` + txt + `.libraries.txt",
3031 }
3032 `
3033 }
3034 } else {
3035 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3036 result += `
3037 prebuilt_etc {
3038 name: "` + txt + `.libraries.` + v + `.txt",
3039 src: "dummy.txt",
3040 }
3041 `
3042 }
3043 }
3044 }
3045 return
3046}
3047
Jooyung Han344d5432019-08-23 11:17:39 +09003048func TestVndkApexVersion(t *testing.T) {
3049 ctx, _ := testApex(t, `
3050 apex_vndk {
3051 name: "myapex_v27",
3052 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003053 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003054 vndk_version: "27",
3055 }
3056
3057 apex_key {
3058 name: "myapex.key",
3059 public_key: "testkey.avbpubkey",
3060 private_key: "testkey.pem",
3061 }
3062
Jooyung Han31c470b2019-10-18 16:26:59 +09003063 vndk_prebuilt_shared {
3064 name: "libvndk27",
3065 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003066 vendor_available: true,
3067 vndk: {
3068 enabled: true,
3069 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003070 target_arch: "arm64",
3071 arch: {
3072 arm: {
3073 srcs: ["libvndk27_arm.so"],
3074 },
3075 arm64: {
3076 srcs: ["libvndk27_arm64.so"],
3077 },
3078 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003079 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003080 }
3081
3082 vndk_prebuilt_shared {
3083 name: "libvndk27",
3084 version: "27",
3085 vendor_available: true,
3086 vndk: {
3087 enabled: true,
3088 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003089 target_arch: "x86_64",
3090 arch: {
3091 x86: {
3092 srcs: ["libvndk27_x86.so"],
3093 },
3094 x86_64: {
3095 srcs: ["libvndk27_x86_64.so"],
3096 },
3097 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003098 }
3099 `+vndkLibrariesTxtFiles("27"),
3100 withFiles(map[string][]byte{
3101 "libvndk27_arm.so": nil,
3102 "libvndk27_arm64.so": nil,
3103 "libvndk27_x86.so": nil,
3104 "libvndk27_x86_64.so": nil,
3105 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003106
Jooyung Hana57af4a2020-01-23 05:36:59 +00003107 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003108 "lib/libvndk27_arm.so",
3109 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003110 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003111 })
Jooyung Han344d5432019-08-23 11:17:39 +09003112}
3113
3114func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3115 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3116 apex_vndk {
3117 name: "myapex_v27",
3118 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003119 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003120 vndk_version: "27",
3121 }
3122 apex_vndk {
3123 name: "myapex_v27_other",
3124 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003125 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003126 vndk_version: "27",
3127 }
3128
3129 apex_key {
3130 name: "myapex.key",
3131 public_key: "testkey.avbpubkey",
3132 private_key: "testkey.pem",
3133 }
3134
3135 cc_library {
3136 name: "libvndk",
3137 srcs: ["mylib.cpp"],
3138 vendor_available: true,
3139 vndk: {
3140 enabled: true,
3141 },
3142 system_shared_libs: [],
3143 stl: "none",
3144 }
3145
3146 vndk_prebuilt_shared {
3147 name: "libvndk",
3148 version: "27",
3149 vendor_available: true,
3150 vndk: {
3151 enabled: true,
3152 },
3153 srcs: ["libvndk.so"],
3154 }
3155 `, withFiles(map[string][]byte{
3156 "libvndk.so": nil,
3157 }))
3158}
3159
Jooyung Han90eee022019-10-01 20:02:42 +09003160func TestVndkApexNameRule(t *testing.T) {
3161 ctx, _ := testApex(t, `
3162 apex_vndk {
3163 name: "myapex",
3164 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003165 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003166 }
3167 apex_vndk {
3168 name: "myapex_v28",
3169 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003170 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003171 vndk_version: "28",
3172 }
3173 apex_key {
3174 name: "myapex.key",
3175 public_key: "testkey.avbpubkey",
3176 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003177 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003178
3179 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003180 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003181 actual := proptools.String(bundle.properties.Apex_name)
3182 if !reflect.DeepEqual(actual, expected) {
3183 t.Errorf("Got '%v', expected '%v'", actual, expected)
3184 }
3185 }
3186
3187 assertApexName("com.android.vndk.vVER", "myapex")
3188 assertApexName("com.android.vndk.v28", "myapex_v28")
3189}
3190
Jooyung Han344d5432019-08-23 11:17:39 +09003191func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3192 ctx, _ := testApex(t, `
3193 apex_vndk {
3194 name: "myapex",
3195 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003196 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003197 }
3198
3199 apex_key {
3200 name: "myapex.key",
3201 public_key: "testkey.avbpubkey",
3202 private_key: "testkey.pem",
3203 }
3204
3205 cc_library {
3206 name: "libvndk",
3207 srcs: ["mylib.cpp"],
3208 vendor_available: true,
3209 native_bridge_supported: true,
3210 host_supported: true,
3211 vndk: {
3212 enabled: true,
3213 },
3214 system_shared_libs: [],
3215 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003216 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003217 }
Jooyung Han35155c42020-02-06 17:33:20 +09003218 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003219
Jooyung Hana57af4a2020-01-23 05:36:59 +00003220 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003221 "lib/libvndk.so",
3222 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003223 "lib/libc++.so",
3224 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003225 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003226 })
Jooyung Han344d5432019-08-23 11:17:39 +09003227}
3228
3229func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3230 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3231 apex_vndk {
3232 name: "myapex",
3233 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003234 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003235 native_bridge_supported: true,
3236 }
3237
3238 apex_key {
3239 name: "myapex.key",
3240 public_key: "testkey.avbpubkey",
3241 private_key: "testkey.pem",
3242 }
3243
3244 cc_library {
3245 name: "libvndk",
3246 srcs: ["mylib.cpp"],
3247 vendor_available: true,
3248 native_bridge_supported: true,
3249 host_supported: true,
3250 vndk: {
3251 enabled: true,
3252 },
3253 system_shared_libs: [],
3254 stl: "none",
3255 }
3256 `)
3257}
3258
Jooyung Han31c470b2019-10-18 16:26:59 +09003259func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003260 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003261 apex_vndk {
3262 name: "myapex_v27",
3263 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003264 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003265 vndk_version: "27",
3266 }
3267
3268 apex_key {
3269 name: "myapex.key",
3270 public_key: "testkey.avbpubkey",
3271 private_key: "testkey.pem",
3272 }
3273
3274 vndk_prebuilt_shared {
3275 name: "libvndk27",
3276 version: "27",
3277 target_arch: "arm",
3278 vendor_available: true,
3279 vndk: {
3280 enabled: true,
3281 },
3282 arch: {
3283 arm: {
3284 srcs: ["libvndk27.so"],
3285 }
3286 },
3287 }
3288
3289 vndk_prebuilt_shared {
3290 name: "libvndk27",
3291 version: "27",
3292 target_arch: "arm",
3293 binder32bit: true,
3294 vendor_available: true,
3295 vndk: {
3296 enabled: true,
3297 },
3298 arch: {
3299 arm: {
3300 srcs: ["libvndk27binder32.so"],
3301 }
3302 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003303 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003304 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003305 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003306 withFiles(map[string][]byte{
3307 "libvndk27.so": nil,
3308 "libvndk27binder32.so": nil,
3309 }),
3310 withBinder32bit,
3311 withTargets(map[android.OsType][]android.Target{
3312 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003313 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3314 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003315 },
3316 }),
3317 )
3318
Jooyung Hana57af4a2020-01-23 05:36:59 +00003319 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003320 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003321 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003322 })
3323}
3324
Jooyung Han45a96772020-06-15 14:59:42 +09003325func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3326 ctx, _ := testApex(t, `
3327 apex_vndk {
3328 name: "myapex",
3329 key: "myapex.key",
3330 file_contexts: ":myapex-file_contexts",
3331 }
3332
3333 apex_key {
3334 name: "myapex.key",
3335 public_key: "testkey.avbpubkey",
3336 private_key: "testkey.pem",
3337 }
3338
3339 cc_library {
3340 name: "libz",
3341 vendor_available: true,
3342 vndk: {
3343 enabled: true,
3344 },
3345 stubs: {
3346 symbol_file: "libz.map.txt",
3347 versions: ["30"],
3348 }
3349 }
3350 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3351 "libz.map.txt": nil,
3352 }))
3353
3354 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3355 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3356 ensureListEmpty(t, provideNativeLibs)
3357}
3358
Jooyung Hane1633032019-08-01 17:41:43 +09003359func TestDependenciesInApexManifest(t *testing.T) {
3360 ctx, _ := testApex(t, `
3361 apex {
3362 name: "myapex_nodep",
3363 key: "myapex.key",
3364 native_shared_libs: ["lib_nodep"],
3365 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003366 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003367 }
3368
3369 apex {
3370 name: "myapex_dep",
3371 key: "myapex.key",
3372 native_shared_libs: ["lib_dep"],
3373 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003374 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003375 }
3376
3377 apex {
3378 name: "myapex_provider",
3379 key: "myapex.key",
3380 native_shared_libs: ["libfoo"],
3381 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003382 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003383 }
3384
3385 apex {
3386 name: "myapex_selfcontained",
3387 key: "myapex.key",
3388 native_shared_libs: ["lib_dep", "libfoo"],
3389 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003390 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003391 }
3392
3393 apex_key {
3394 name: "myapex.key",
3395 public_key: "testkey.avbpubkey",
3396 private_key: "testkey.pem",
3397 }
3398
3399 cc_library {
3400 name: "lib_nodep",
3401 srcs: ["mylib.cpp"],
3402 system_shared_libs: [],
3403 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003404 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003405 }
3406
3407 cc_library {
3408 name: "lib_dep",
3409 srcs: ["mylib.cpp"],
3410 shared_libs: ["libfoo"],
3411 system_shared_libs: [],
3412 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003413 apex_available: [
3414 "myapex_dep",
3415 "myapex_provider",
3416 "myapex_selfcontained",
3417 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003418 }
3419
3420 cc_library {
3421 name: "libfoo",
3422 srcs: ["mytest.cpp"],
3423 stubs: {
3424 versions: ["1"],
3425 },
3426 system_shared_libs: [],
3427 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003428 apex_available: [
3429 "myapex_provider",
3430 "myapex_selfcontained",
3431 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003432 }
3433 `)
3434
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003435 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003436 var provideNativeLibs, requireNativeLibs []string
3437
Sundong Ahnabb64432019-10-22 13:58:29 +09003438 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003439 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3440 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003441 ensureListEmpty(t, provideNativeLibs)
3442 ensureListEmpty(t, requireNativeLibs)
3443
Sundong Ahnabb64432019-10-22 13:58:29 +09003444 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003445 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3446 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003447 ensureListEmpty(t, provideNativeLibs)
3448 ensureListContains(t, requireNativeLibs, "libfoo.so")
3449
Sundong Ahnabb64432019-10-22 13:58:29 +09003450 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003451 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3452 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003453 ensureListContains(t, provideNativeLibs, "libfoo.so")
3454 ensureListEmpty(t, requireNativeLibs)
3455
Sundong Ahnabb64432019-10-22 13:58:29 +09003456 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003457 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3458 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003459 ensureListContains(t, provideNativeLibs, "libfoo.so")
3460 ensureListEmpty(t, requireNativeLibs)
3461}
3462
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003463func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003464 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003465 apex {
3466 name: "myapex",
3467 key: "myapex.key",
3468 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003469 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003470 }
3471
3472 apex_key {
3473 name: "myapex.key",
3474 public_key: "testkey.avbpubkey",
3475 private_key: "testkey.pem",
3476 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003477
3478 cc_library {
3479 name: "mylib",
3480 srcs: ["mylib.cpp"],
3481 system_shared_libs: [],
3482 stl: "none",
3483 apex_available: [
3484 "//apex_available:platform",
3485 "myapex",
3486 ],
3487 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003488 `)
3489
Sundong Ahnabb64432019-10-22 13:58:29 +09003490 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003491 apexManifestRule := module.Rule("apexManifestRule")
3492 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3493 apexRule := module.Rule("apexRule")
3494 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003495
3496 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3497 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3498 name := apexBundle.BaseModuleName()
3499 prefix := "TARGET_"
3500 var builder strings.Builder
3501 data.Custom(&builder, name, prefix, "", data)
3502 androidMk := builder.String()
3503 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3504 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003505}
3506
Alex Light0851b882019-02-07 13:20:53 -08003507func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003508 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003509 apex {
3510 name: "myapex",
3511 key: "myapex.key",
3512 native_shared_libs: ["mylib_common"],
3513 }
3514
3515 apex_key {
3516 name: "myapex.key",
3517 public_key: "testkey.avbpubkey",
3518 private_key: "testkey.pem",
3519 }
3520
3521 cc_library {
3522 name: "mylib_common",
3523 srcs: ["mylib.cpp"],
3524 system_shared_libs: [],
3525 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003526 apex_available: [
3527 "//apex_available:platform",
3528 "myapex",
3529 ],
Alex Light0851b882019-02-07 13:20:53 -08003530 }
3531 `)
3532
Sundong Ahnabb64432019-10-22 13:58:29 +09003533 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003534 apexRule := module.Rule("apexRule")
3535 copyCmds := apexRule.Args["copy_commands"]
3536
3537 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3538 t.Log("Apex was a test apex!")
3539 t.Fail()
3540 }
3541 // Ensure that main rule creates an output
3542 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3543
3544 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003546
3547 // Ensure that both direct and indirect deps are copied into apex
3548 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3549
Colin Cross7113d202019-11-20 16:39:12 -08003550 // Ensure that the platform variant ends with _shared
3551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003552
3553 if !android.InAnyApex("mylib_common") {
3554 t.Log("Found mylib_common not in any apex!")
3555 t.Fail()
3556 }
3557}
3558
3559func TestTestApex(t *testing.T) {
3560 if android.InAnyApex("mylib_common_test") {
3561 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!")
3562 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003563 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003564 apex_test {
3565 name: "myapex",
3566 key: "myapex.key",
3567 native_shared_libs: ["mylib_common_test"],
3568 }
3569
3570 apex_key {
3571 name: "myapex.key",
3572 public_key: "testkey.avbpubkey",
3573 private_key: "testkey.pem",
3574 }
3575
3576 cc_library {
3577 name: "mylib_common_test",
3578 srcs: ["mylib.cpp"],
3579 system_shared_libs: [],
3580 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003581 // TODO: remove //apex_available:platform
3582 apex_available: [
3583 "//apex_available:platform",
3584 "myapex",
3585 ],
Alex Light0851b882019-02-07 13:20:53 -08003586 }
3587 `)
3588
Sundong Ahnabb64432019-10-22 13:58:29 +09003589 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003590 apexRule := module.Rule("apexRule")
3591 copyCmds := apexRule.Args["copy_commands"]
3592
3593 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3594 t.Log("Apex was not a test apex!")
3595 t.Fail()
3596 }
3597 // Ensure that main rule creates an output
3598 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3599
3600 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003601 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003602
3603 // Ensure that both direct and indirect deps are copied into apex
3604 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3605
Colin Cross7113d202019-11-20 16:39:12 -08003606 // Ensure that the platform variant ends with _shared
3607 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003608}
3609
Alex Light9670d332019-01-29 18:07:33 -08003610func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003611 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003612 apex {
3613 name: "myapex",
3614 key: "myapex.key",
3615 multilib: {
3616 first: {
3617 native_shared_libs: ["mylib_common"],
3618 }
3619 },
3620 target: {
3621 android: {
3622 multilib: {
3623 first: {
3624 native_shared_libs: ["mylib"],
3625 }
3626 }
3627 },
3628 host: {
3629 multilib: {
3630 first: {
3631 native_shared_libs: ["mylib2"],
3632 }
3633 }
3634 }
3635 }
3636 }
3637
3638 apex_key {
3639 name: "myapex.key",
3640 public_key: "testkey.avbpubkey",
3641 private_key: "testkey.pem",
3642 }
3643
3644 cc_library {
3645 name: "mylib",
3646 srcs: ["mylib.cpp"],
3647 system_shared_libs: [],
3648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003649 // TODO: remove //apex_available:platform
3650 apex_available: [
3651 "//apex_available:platform",
3652 "myapex",
3653 ],
Alex Light9670d332019-01-29 18:07:33 -08003654 }
3655
3656 cc_library {
3657 name: "mylib_common",
3658 srcs: ["mylib.cpp"],
3659 system_shared_libs: [],
3660 stl: "none",
3661 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003662 // TODO: remove //apex_available:platform
3663 apex_available: [
3664 "//apex_available:platform",
3665 "myapex",
3666 ],
Alex Light9670d332019-01-29 18:07:33 -08003667 }
3668
3669 cc_library {
3670 name: "mylib2",
3671 srcs: ["mylib.cpp"],
3672 system_shared_libs: [],
3673 stl: "none",
3674 compile_multilib: "first",
3675 }
3676 `)
3677
Sundong Ahnabb64432019-10-22 13:58:29 +09003678 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003679 copyCmds := apexRule.Args["copy_commands"]
3680
3681 // Ensure that main rule creates an output
3682 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3683
3684 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003685 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3687 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003688
3689 // Ensure that both direct and indirect deps are copied into apex
3690 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3691 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3692 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3693
Colin Cross7113d202019-11-20 16:39:12 -08003694 // Ensure that the platform variant ends with _shared
3695 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3696 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3697 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003698}
Jiyong Park04480cf2019-02-06 00:16:29 +09003699
3700func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003701 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003702 apex {
3703 name: "myapex",
3704 key: "myapex.key",
3705 binaries: ["myscript"],
3706 }
3707
3708 apex_key {
3709 name: "myapex.key",
3710 public_key: "testkey.avbpubkey",
3711 private_key: "testkey.pem",
3712 }
3713
3714 sh_binary {
3715 name: "myscript",
3716 src: "mylib.cpp",
3717 filename: "myscript.sh",
3718 sub_dir: "script",
3719 }
3720 `)
3721
Sundong Ahnabb64432019-10-22 13:58:29 +09003722 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003723 copyCmds := apexRule.Args["copy_commands"]
3724
3725 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3726}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003727
Jooyung Han91df2082019-11-20 01:49:42 +09003728func TestApexInVariousPartition(t *testing.T) {
3729 testcases := []struct {
3730 propName, parition, flattenedPartition string
3731 }{
3732 {"", "system", "system_ext"},
3733 {"product_specific: true", "product", "product"},
3734 {"soc_specific: true", "vendor", "vendor"},
3735 {"proprietary: true", "vendor", "vendor"},
3736 {"vendor: true", "vendor", "vendor"},
3737 {"system_ext_specific: true", "system_ext", "system_ext"},
3738 }
3739 for _, tc := range testcases {
3740 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3741 ctx, _ := testApex(t, `
3742 apex {
3743 name: "myapex",
3744 key: "myapex.key",
3745 `+tc.propName+`
3746 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003747
Jooyung Han91df2082019-11-20 01:49:42 +09003748 apex_key {
3749 name: "myapex.key",
3750 public_key: "testkey.avbpubkey",
3751 private_key: "testkey.pem",
3752 }
3753 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003754
Jooyung Han91df2082019-11-20 01:49:42 +09003755 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3756 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3757 actual := apex.installDir.String()
3758 if actual != expected {
3759 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3760 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003761
Jooyung Han91df2082019-11-20 01:49:42 +09003762 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3763 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3764 actual = flattened.installDir.String()
3765 if actual != expected {
3766 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3767 }
3768 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003769 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003770}
Jiyong Park67882562019-03-21 01:11:21 +09003771
Jooyung Han580eb4f2020-06-24 19:33:06 +09003772func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003773 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003774 apex {
3775 name: "myapex",
3776 key: "myapex.key",
3777 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003778
Jooyung Han580eb4f2020-06-24 19:33:06 +09003779 apex_key {
3780 name: "myapex.key",
3781 public_key: "testkey.avbpubkey",
3782 private_key: "testkey.pem",
3783 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003784 `)
3785 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003786 rule := module.Output("file_contexts")
3787 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3788}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003789
Jooyung Han580eb4f2020-06-24 19:33:06 +09003790func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003791 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003792 apex {
3793 name: "myapex",
3794 key: "myapex.key",
3795 file_contexts: "my_own_file_contexts",
3796 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003797
Jooyung Han580eb4f2020-06-24 19:33:06 +09003798 apex_key {
3799 name: "myapex.key",
3800 public_key: "testkey.avbpubkey",
3801 private_key: "testkey.pem",
3802 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003803 `, withFiles(map[string][]byte{
3804 "my_own_file_contexts": nil,
3805 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003806}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003807
Jooyung Han580eb4f2020-06-24 19:33:06 +09003808func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003809 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003810 apex {
3811 name: "myapex",
3812 key: "myapex.key",
3813 product_specific: true,
3814 file_contexts: "product_specific_file_contexts",
3815 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003816
Jooyung Han580eb4f2020-06-24 19:33:06 +09003817 apex_key {
3818 name: "myapex.key",
3819 public_key: "testkey.avbpubkey",
3820 private_key: "testkey.pem",
3821 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003822 `)
3823
Jooyung Han580eb4f2020-06-24 19:33:06 +09003824 ctx, _ := testApex(t, `
3825 apex {
3826 name: "myapex",
3827 key: "myapex.key",
3828 product_specific: true,
3829 file_contexts: "product_specific_file_contexts",
3830 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003831
Jooyung Han580eb4f2020-06-24 19:33:06 +09003832 apex_key {
3833 name: "myapex.key",
3834 public_key: "testkey.avbpubkey",
3835 private_key: "testkey.pem",
3836 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003837 `, withFiles(map[string][]byte{
3838 "product_specific_file_contexts": nil,
3839 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003840 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3841 rule := module.Output("file_contexts")
3842 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3843}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003844
Jooyung Han580eb4f2020-06-24 19:33:06 +09003845func TestFileContexts_SetViaFileGroup(t *testing.T) {
3846 ctx, _ := testApex(t, `
3847 apex {
3848 name: "myapex",
3849 key: "myapex.key",
3850 product_specific: true,
3851 file_contexts: ":my-file-contexts",
3852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003853
Jooyung Han580eb4f2020-06-24 19:33:06 +09003854 apex_key {
3855 name: "myapex.key",
3856 public_key: "testkey.avbpubkey",
3857 private_key: "testkey.pem",
3858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003859
Jooyung Han580eb4f2020-06-24 19:33:06 +09003860 filegroup {
3861 name: "my-file-contexts",
3862 srcs: ["product_specific_file_contexts"],
3863 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003864 `, withFiles(map[string][]byte{
3865 "product_specific_file_contexts": nil,
3866 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003867 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3868 rule := module.Output("file_contexts")
3869 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003870}
3871
Jiyong Park67882562019-03-21 01:11:21 +09003872func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003873 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003874 apex_key {
3875 name: "myapex.key",
3876 public_key: ":my.avbpubkey",
3877 private_key: ":my.pem",
3878 product_specific: true,
3879 }
3880
3881 filegroup {
3882 name: "my.avbpubkey",
3883 srcs: ["testkey2.avbpubkey"],
3884 }
3885
3886 filegroup {
3887 name: "my.pem",
3888 srcs: ["testkey2.pem"],
3889 }
3890 `)
3891
3892 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3893 expected_pubkey := "testkey2.avbpubkey"
3894 actual_pubkey := apex_key.public_key_file.String()
3895 if actual_pubkey != expected_pubkey {
3896 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3897 }
3898 expected_privkey := "testkey2.pem"
3899 actual_privkey := apex_key.private_key_file.String()
3900 if actual_privkey != expected_privkey {
3901 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3902 }
3903}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003904
3905func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003906 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003907 prebuilt_apex {
3908 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003909 arch: {
3910 arm64: {
3911 src: "myapex-arm64.apex",
3912 },
3913 arm: {
3914 src: "myapex-arm.apex",
3915 },
3916 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003917 }
3918 `)
3919
3920 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3921
Jiyong Parkc95714e2019-03-29 14:23:10 +09003922 expectedInput := "myapex-arm64.apex"
3923 if prebuilt.inputApex.String() != expectedInput {
3924 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3925 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003926}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003927
3928func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003929 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003930 prebuilt_apex {
3931 name: "myapex",
3932 src: "myapex-arm.apex",
3933 filename: "notmyapex.apex",
3934 }
3935 `)
3936
3937 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3938
3939 expected := "notmyapex.apex"
3940 if p.installFilename != expected {
3941 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3942 }
3943}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003944
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003945func TestPrebuiltOverrides(t *testing.T) {
3946 ctx, config := testApex(t, `
3947 prebuilt_apex {
3948 name: "myapex.prebuilt",
3949 src: "myapex-arm.apex",
3950 overrides: [
3951 "myapex",
3952 ],
3953 }
3954 `)
3955
3956 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3957
3958 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003959 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003960 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003961 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003962 }
3963}
3964
Roland Levillain630846d2019-06-26 12:48:34 +01003965func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003966 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003967 apex_test {
3968 name: "myapex",
3969 key: "myapex.key",
3970 tests: [
3971 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003972 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003973 ],
3974 }
3975
3976 apex_key {
3977 name: "myapex.key",
3978 public_key: "testkey.avbpubkey",
3979 private_key: "testkey.pem",
3980 }
3981
Liz Kammer1c14a212020-05-12 15:26:55 -07003982 filegroup {
3983 name: "fg",
3984 srcs: [
3985 "baz",
3986 "bar/baz"
3987 ],
3988 }
3989
Roland Levillain630846d2019-06-26 12:48:34 +01003990 cc_test {
3991 name: "mytest",
3992 gtest: false,
3993 srcs: ["mytest.cpp"],
3994 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003995 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003996 system_shared_libs: [],
3997 static_executable: true,
3998 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003999 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004000 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004001
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004002 cc_library {
4003 name: "mylib",
4004 srcs: ["mylib.cpp"],
4005 system_shared_libs: [],
4006 stl: "none",
4007 }
4008
Liz Kammer5bd365f2020-05-27 15:15:11 -07004009 filegroup {
4010 name: "fg2",
4011 srcs: [
4012 "testdata/baz"
4013 ],
4014 }
4015
Roland Levillain9b5fde92019-06-28 15:41:19 +01004016 cc_test {
4017 name: "mytests",
4018 gtest: false,
4019 srcs: [
4020 "mytest1.cpp",
4021 "mytest2.cpp",
4022 "mytest3.cpp",
4023 ],
4024 test_per_src: true,
4025 relative_install_path: "test",
4026 system_shared_libs: [],
4027 static_executable: true,
4028 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004029 data: [
4030 ":fg",
4031 ":fg2",
4032 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004033 }
Roland Levillain630846d2019-06-26 12:48:34 +01004034 `)
4035
Sundong Ahnabb64432019-10-22 13:58:29 +09004036 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004037 copyCmds := apexRule.Args["copy_commands"]
4038
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004039 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004040 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004041 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004042
Liz Kammer1c14a212020-05-12 15:26:55 -07004043 //Ensure that test data are copied into apex.
4044 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4045 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4046
Roland Levillain9b5fde92019-06-28 15:41:19 +01004047 // Ensure that test deps built with `test_per_src` are copied into apex.
4048 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4049 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4050 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004051
4052 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004053 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4054 data := android.AndroidMkDataForTest(t, config, "", bundle)
4055 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004056 prefix := "TARGET_"
4057 var builder strings.Builder
4058 data.Custom(&builder, name, prefix, "", data)
4059 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004060 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4061 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4062 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4063 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004064 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004065 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004066 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004067
4068 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4069 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4070 data.Custom(&builder, name, prefix, "", data)
4071 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004072 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4073 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004074}
4075
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004076func TestInstallExtraFlattenedApexes(t *testing.T) {
4077 ctx, config := testApex(t, `
4078 apex {
4079 name: "myapex",
4080 key: "myapex.key",
4081 }
4082 apex_key {
4083 name: "myapex.key",
4084 public_key: "testkey.avbpubkey",
4085 private_key: "testkey.pem",
4086 }
4087 `, func(fs map[string][]byte, config android.Config) {
4088 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4089 })
4090 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004091 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004092 mk := android.AndroidMkDataForTest(t, config, "", ab)
4093 var builder strings.Builder
4094 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4095 androidMk := builder.String()
4096 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4097}
4098
Jooyung Han5c998b92019-06-27 11:30:33 +09004099func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004100 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004101 apex {
4102 name: "myapex",
4103 key: "myapex.key",
4104 native_shared_libs: ["mylib"],
4105 uses: ["commonapex"],
4106 }
4107
4108 apex {
4109 name: "commonapex",
4110 key: "myapex.key",
4111 native_shared_libs: ["libcommon"],
4112 provide_cpp_shared_libs: true,
4113 }
4114
4115 apex_key {
4116 name: "myapex.key",
4117 public_key: "testkey.avbpubkey",
4118 private_key: "testkey.pem",
4119 }
4120
4121 cc_library {
4122 name: "mylib",
4123 srcs: ["mylib.cpp"],
4124 shared_libs: ["libcommon"],
4125 system_shared_libs: [],
4126 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004127 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004128 }
4129
4130 cc_library {
4131 name: "libcommon",
4132 srcs: ["mylib_common.cpp"],
4133 system_shared_libs: [],
4134 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004135 // TODO: remove //apex_available:platform
4136 apex_available: [
4137 "//apex_available:platform",
4138 "commonapex",
4139 "myapex",
4140 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004141 }
4142 `)
4143
Sundong Ahnabb64432019-10-22 13:58:29 +09004144 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004145 apexRule1 := module1.Rule("apexRule")
4146 copyCmds1 := apexRule1.Args["copy_commands"]
4147
Sundong Ahnabb64432019-10-22 13:58:29 +09004148 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004149 apexRule2 := module2.Rule("apexRule")
4150 copyCmds2 := apexRule2.Args["copy_commands"]
4151
Colin Crossaede88c2020-08-11 12:17:01 -07004152 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4153 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004154 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4155 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4156 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4157}
4158
4159func TestApexUsesFailsIfNotProvided(t *testing.T) {
4160 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4161 apex {
4162 name: "myapex",
4163 key: "myapex.key",
4164 uses: ["commonapex"],
4165 }
4166
4167 apex {
4168 name: "commonapex",
4169 key: "myapex.key",
4170 }
4171
4172 apex_key {
4173 name: "myapex.key",
4174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
4177 `)
4178 testApexError(t, `uses: "commonapex" is not a provider`, `
4179 apex {
4180 name: "myapex",
4181 key: "myapex.key",
4182 uses: ["commonapex"],
4183 }
4184
4185 cc_library {
4186 name: "commonapex",
4187 system_shared_libs: [],
4188 stl: "none",
4189 }
4190
4191 apex_key {
4192 name: "myapex.key",
4193 public_key: "testkey.avbpubkey",
4194 private_key: "testkey.pem",
4195 }
4196 `)
4197}
4198
4199func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4200 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4201 apex {
4202 name: "myapex",
4203 key: "myapex.key",
4204 use_vendor: true,
4205 uses: ["commonapex"],
4206 }
4207
4208 apex {
4209 name: "commonapex",
4210 key: "myapex.key",
4211 provide_cpp_shared_libs: true,
4212 }
4213
4214 apex_key {
4215 name: "myapex.key",
4216 public_key: "testkey.avbpubkey",
4217 private_key: "testkey.pem",
4218 }
Jooyung Handc782442019-11-01 03:14:38 +09004219 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004220 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004221 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004222}
4223
Jooyung Hand48f3c32019-08-23 11:18:57 +09004224func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4225 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4226 apex {
4227 name: "myapex",
4228 key: "myapex.key",
4229 native_shared_libs: ["libfoo"],
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237
4238 cc_library {
4239 name: "libfoo",
4240 stl: "none",
4241 system_shared_libs: [],
4242 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004243 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004244 }
4245 `)
4246 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4247 apex {
4248 name: "myapex",
4249 key: "myapex.key",
4250 java_libs: ["myjar"],
4251 }
4252
4253 apex_key {
4254 name: "myapex.key",
4255 public_key: "testkey.avbpubkey",
4256 private_key: "testkey.pem",
4257 }
4258
4259 java_library {
4260 name: "myjar",
4261 srcs: ["foo/bar/MyClass.java"],
4262 sdk_version: "none",
4263 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004264 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004265 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004266 }
4267 `)
4268}
4269
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004270func TestApexWithApps(t *testing.T) {
4271 ctx, _ := testApex(t, `
4272 apex {
4273 name: "myapex",
4274 key: "myapex.key",
4275 apps: [
4276 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004277 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004278 ],
4279 }
4280
4281 apex_key {
4282 name: "myapex.key",
4283 public_key: "testkey.avbpubkey",
4284 private_key: "testkey.pem",
4285 }
4286
4287 android_app {
4288 name: "AppFoo",
4289 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004290 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004291 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004292 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004293 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004294 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004295 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004296
4297 android_app {
4298 name: "AppFooPriv",
4299 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004300 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004301 system_modules: "none",
4302 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004303 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004304 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004305 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004306
4307 cc_library_shared {
4308 name: "libjni",
4309 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004310 shared_libs: ["libfoo"],
4311 stl: "none",
4312 system_shared_libs: [],
4313 apex_available: [ "myapex" ],
4314 sdk_version: "current",
4315 }
4316
4317 cc_library_shared {
4318 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004319 stl: "none",
4320 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004321 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004322 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004323 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004324 `)
4325
Sundong Ahnabb64432019-10-22 13:58:29 +09004326 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004327 apexRule := module.Rule("apexRule")
4328 copyCmds := apexRule.Args["copy_commands"]
4329
4330 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004331 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004332
Colin Crossaede88c2020-08-11 12:17:01 -07004333 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004334 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004335 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004336 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004337 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004338 // JNI libraries including transitive deps are
4339 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004340 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004341 // ... embedded inside APK (jnilibs.zip)
4342 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4343 // ... and not directly inside the APEX
4344 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4345 }
Dario Frenicde2a032019-10-27 00:29:22 +01004346}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004347
Dario Frenicde2a032019-10-27 00:29:22 +01004348func TestApexWithAppImports(t *testing.T) {
4349 ctx, _ := testApex(t, `
4350 apex {
4351 name: "myapex",
4352 key: "myapex.key",
4353 apps: [
4354 "AppFooPrebuilt",
4355 "AppFooPrivPrebuilt",
4356 ],
4357 }
4358
4359 apex_key {
4360 name: "myapex.key",
4361 public_key: "testkey.avbpubkey",
4362 private_key: "testkey.pem",
4363 }
4364
4365 android_app_import {
4366 name: "AppFooPrebuilt",
4367 apk: "PrebuiltAppFoo.apk",
4368 presigned: true,
4369 dex_preopt: {
4370 enabled: false,
4371 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004372 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004373 }
4374
4375 android_app_import {
4376 name: "AppFooPrivPrebuilt",
4377 apk: "PrebuiltAppFooPriv.apk",
4378 privileged: true,
4379 presigned: true,
4380 dex_preopt: {
4381 enabled: false,
4382 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004383 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004384 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004385 }
4386 `)
4387
Sundong Ahnabb64432019-10-22 13:58:29 +09004388 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004389 apexRule := module.Rule("apexRule")
4390 copyCmds := apexRule.Args["copy_commands"]
4391
4392 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004393 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4394}
4395
4396func TestApexWithAppImportsPrefer(t *testing.T) {
4397 ctx, _ := testApex(t, `
4398 apex {
4399 name: "myapex",
4400 key: "myapex.key",
4401 apps: [
4402 "AppFoo",
4403 ],
4404 }
4405
4406 apex_key {
4407 name: "myapex.key",
4408 public_key: "testkey.avbpubkey",
4409 private_key: "testkey.pem",
4410 }
4411
4412 android_app {
4413 name: "AppFoo",
4414 srcs: ["foo/bar/MyClass.java"],
4415 sdk_version: "none",
4416 system_modules: "none",
4417 apex_available: [ "myapex" ],
4418 }
4419
4420 android_app_import {
4421 name: "AppFoo",
4422 apk: "AppFooPrebuilt.apk",
4423 filename: "AppFooPrebuilt.apk",
4424 presigned: true,
4425 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004426 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004427 }
4428 `, withFiles(map[string][]byte{
4429 "AppFooPrebuilt.apk": nil,
4430 }))
4431
4432 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4433 "app/AppFoo/AppFooPrebuilt.apk",
4434 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004435}
4436
Dario Freni6f3937c2019-12-20 22:58:03 +00004437func TestApexWithTestHelperApp(t *testing.T) {
4438 ctx, _ := testApex(t, `
4439 apex {
4440 name: "myapex",
4441 key: "myapex.key",
4442 apps: [
4443 "TesterHelpAppFoo",
4444 ],
4445 }
4446
4447 apex_key {
4448 name: "myapex.key",
4449 public_key: "testkey.avbpubkey",
4450 private_key: "testkey.pem",
4451 }
4452
4453 android_test_helper_app {
4454 name: "TesterHelpAppFoo",
4455 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004456 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004457 }
4458
4459 `)
4460
4461 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4462 apexRule := module.Rule("apexRule")
4463 copyCmds := apexRule.Args["copy_commands"]
4464
4465 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4466}
4467
Jooyung Han18020ea2019-11-13 10:50:48 +09004468func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4469 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004470 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004471 apex {
4472 name: "myapex",
4473 key: "myapex.key",
4474 native_shared_libs: ["libfoo"],
4475 }
4476
4477 apex_key {
4478 name: "myapex.key",
4479 public_key: "testkey.avbpubkey",
4480 private_key: "testkey.pem",
4481 }
4482
4483 apex {
4484 name: "otherapex",
4485 key: "myapex.key",
4486 native_shared_libs: ["libfoo"],
4487 }
4488
4489 cc_defaults {
4490 name: "libfoo-defaults",
4491 apex_available: ["otherapex"],
4492 }
4493
4494 cc_library {
4495 name: "libfoo",
4496 defaults: ["libfoo-defaults"],
4497 stl: "none",
4498 system_shared_libs: [],
4499 }`)
4500}
4501
Paul Duffine52e66f2020-03-30 17:54:29 +01004502func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004503 // libfoo is not available to myapex, but only to otherapex
4504 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4505 apex {
4506 name: "myapex",
4507 key: "myapex.key",
4508 native_shared_libs: ["libfoo"],
4509 }
4510
4511 apex_key {
4512 name: "myapex.key",
4513 public_key: "testkey.avbpubkey",
4514 private_key: "testkey.pem",
4515 }
4516
4517 apex {
4518 name: "otherapex",
4519 key: "otherapex.key",
4520 native_shared_libs: ["libfoo"],
4521 }
4522
4523 apex_key {
4524 name: "otherapex.key",
4525 public_key: "testkey.avbpubkey",
4526 private_key: "testkey.pem",
4527 }
4528
4529 cc_library {
4530 name: "libfoo",
4531 stl: "none",
4532 system_shared_libs: [],
4533 apex_available: ["otherapex"],
4534 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004535}
Jiyong Park127b40b2019-09-30 16:04:35 +09004536
Paul Duffine52e66f2020-03-30 17:54:29 +01004537func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004538 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004539 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004540.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004541.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004542.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004543.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004544.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004545.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004546 apex {
4547 name: "myapex",
4548 key: "myapex.key",
4549 native_shared_libs: ["libfoo"],
4550 }
4551
4552 apex_key {
4553 name: "myapex.key",
4554 public_key: "testkey.avbpubkey",
4555 private_key: "testkey.pem",
4556 }
4557
Jiyong Park127b40b2019-09-30 16:04:35 +09004558 cc_library {
4559 name: "libfoo",
4560 stl: "none",
4561 shared_libs: ["libbar"],
4562 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004563 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004564 }
4565
4566 cc_library {
4567 name: "libbar",
4568 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004569 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004570 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004571 apex_available: ["myapex"],
4572 }
4573
4574 cc_library {
4575 name: "libbaz",
4576 stl: "none",
4577 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004578 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004579}
Jiyong Park127b40b2019-09-30 16:04:35 +09004580
Paul Duffine52e66f2020-03-30 17:54:29 +01004581func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004582 testApexError(t, "\"otherapex\" is not a valid module name", `
4583 apex {
4584 name: "myapex",
4585 key: "myapex.key",
4586 native_shared_libs: ["libfoo"],
4587 }
4588
4589 apex_key {
4590 name: "myapex.key",
4591 public_key: "testkey.avbpubkey",
4592 private_key: "testkey.pem",
4593 }
4594
4595 cc_library {
4596 name: "libfoo",
4597 stl: "none",
4598 system_shared_libs: [],
4599 apex_available: ["otherapex"],
4600 }`)
4601
Paul Duffine52e66f2020-03-30 17:54:29 +01004602 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004603 apex {
4604 name: "myapex",
4605 key: "myapex.key",
4606 native_shared_libs: ["libfoo", "libbar"],
4607 }
4608
4609 apex_key {
4610 name: "myapex.key",
4611 public_key: "testkey.avbpubkey",
4612 private_key: "testkey.pem",
4613 }
4614
4615 cc_library {
4616 name: "libfoo",
4617 stl: "none",
4618 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004619 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004620 apex_available: ["myapex"],
4621 }
4622
4623 cc_library {
4624 name: "libbar",
4625 stl: "none",
4626 system_shared_libs: [],
4627 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004628 }
4629
4630 cc_library {
4631 name: "libbaz",
4632 stl: "none",
4633 system_shared_libs: [],
4634 stubs: {
4635 versions: ["10", "20", "30"],
4636 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004637 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004638}
Jiyong Park127b40b2019-09-30 16:04:35 +09004639
Jiyong Park89e850a2020-04-07 16:37:39 +09004640func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004641 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004642 apex {
4643 name: "myapex",
4644 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004645 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004646 }
4647
4648 apex_key {
4649 name: "myapex.key",
4650 public_key: "testkey.avbpubkey",
4651 private_key: "testkey.pem",
4652 }
4653
4654 cc_library {
4655 name: "libfoo",
4656 stl: "none",
4657 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004658 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004659 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004660 }
4661
4662 cc_library {
4663 name: "libfoo2",
4664 stl: "none",
4665 system_shared_libs: [],
4666 shared_libs: ["libbaz"],
4667 apex_available: ["//apex_available:platform"],
4668 }
4669
4670 cc_library {
4671 name: "libbar",
4672 stl: "none",
4673 system_shared_libs: [],
4674 apex_available: ["myapex"],
4675 }
4676
4677 cc_library {
4678 name: "libbaz",
4679 stl: "none",
4680 system_shared_libs: [],
4681 apex_available: ["myapex"],
4682 stubs: {
4683 versions: ["1"],
4684 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004685 }`)
4686
Jiyong Park89e850a2020-04-07 16:37:39 +09004687 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4688 // because it depends on libbar which isn't available to platform
4689 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4690 if libfoo.NotAvailableForPlatform() != true {
4691 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4692 }
4693
4694 // libfoo2 however can be available to platform because it depends on libbaz which provides
4695 // stubs
4696 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4697 if libfoo2.NotAvailableForPlatform() == true {
4698 t.Errorf("%q should be available to platform", libfoo2.String())
4699 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004700}
Jiyong Parka90ca002019-10-07 15:47:24 +09004701
Paul Duffine52e66f2020-03-30 17:54:29 +01004702func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004703 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004704 apex {
4705 name: "myapex",
4706 key: "myapex.key",
4707 native_shared_libs: ["libfoo"],
4708 }
4709
4710 apex_key {
4711 name: "myapex.key",
4712 public_key: "testkey.avbpubkey",
4713 private_key: "testkey.pem",
4714 }
4715
4716 cc_library {
4717 name: "libfoo",
4718 stl: "none",
4719 system_shared_libs: [],
4720 apex_available: ["myapex"],
4721 static: {
4722 apex_available: ["//apex_available:platform"],
4723 },
4724 }`)
4725
Jiyong Park89e850a2020-04-07 16:37:39 +09004726 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4727 if libfooShared.NotAvailableForPlatform() != true {
4728 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4729 }
4730 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4731 if libfooStatic.NotAvailableForPlatform() != false {
4732 t.Errorf("%q should be available to platform", libfooStatic.String())
4733 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004734}
4735
Jiyong Park5d790c32019-11-15 18:40:32 +09004736func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004737 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004738 apex {
4739 name: "myapex",
4740 key: "myapex.key",
4741 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004742 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004743 }
4744
4745 override_apex {
4746 name: "override_myapex",
4747 base: "myapex",
4748 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004749 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004750 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004751 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004752 }
4753
4754 apex_key {
4755 name: "myapex.key",
4756 public_key: "testkey.avbpubkey",
4757 private_key: "testkey.pem",
4758 }
4759
4760 android_app {
4761 name: "app",
4762 srcs: ["foo/bar/MyClass.java"],
4763 package_name: "foo",
4764 sdk_version: "none",
4765 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004766 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004767 }
4768
4769 override_android_app {
4770 name: "override_app",
4771 base: "app",
4772 package_name: "bar",
4773 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004774 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004775
Jiyong Park317645e2019-12-05 13:20:58 +09004776 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4777 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4778 if originalVariant.GetOverriddenBy() != "" {
4779 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4780 }
4781 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4782 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4783 }
4784
Jiyong Park5d790c32019-11-15 18:40:32 +09004785 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4786 apexRule := module.Rule("apexRule")
4787 copyCmds := apexRule.Args["copy_commands"]
4788
4789 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004790 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004791
4792 apexBundle := module.Module().(*apexBundle)
4793 name := apexBundle.Name()
4794 if name != "override_myapex" {
4795 t.Errorf("name should be \"override_myapex\", but was %q", name)
4796 }
4797
Baligh Uddin004d7172020-02-19 21:29:28 -08004798 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4799 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4800 }
4801
Jiyong Park20bacab2020-03-03 11:45:41 +09004802 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004803 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004804
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004805 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4806 var builder strings.Builder
4807 data.Custom(&builder, name, "TARGET_", "", data)
4808 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004809 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004810 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4811 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004812 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004813 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004814 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004815 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4816 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004817}
4818
Jooyung Han214bf372019-11-12 13:03:50 +09004819func TestLegacyAndroid10Support(t *testing.T) {
4820 ctx, _ := testApex(t, `
4821 apex {
4822 name: "myapex",
4823 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004824 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004825 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004826 }
4827
4828 apex_key {
4829 name: "myapex.key",
4830 public_key: "testkey.avbpubkey",
4831 private_key: "testkey.pem",
4832 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004833
4834 cc_library {
4835 name: "mylib",
4836 srcs: ["mylib.cpp"],
4837 stl: "libc++",
4838 system_shared_libs: [],
4839 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004840 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004841 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004842 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004843
4844 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4845 args := module.Rule("apexRule").Args
4846 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004847 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004848
4849 // The copies of the libraries in the apex should have one more dependency than
4850 // the ones outside the apex, namely the unwinder. Ideally we should check
4851 // the dependency names directly here but for some reason the names are blank in
4852 // this test.
4853 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004854 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004855 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4856 if len(apexImplicits) != len(nonApexImplicits)+1 {
4857 t.Errorf("%q missing unwinder dep", lib)
4858 }
4859 }
Jooyung Han214bf372019-11-12 13:03:50 +09004860}
4861
Paul Duffin9b879592020-05-26 13:21:35 +01004862var filesForSdkLibrary = map[string][]byte{
4863 "api/current.txt": nil,
4864 "api/removed.txt": nil,
4865 "api/system-current.txt": nil,
4866 "api/system-removed.txt": nil,
4867 "api/test-current.txt": nil,
4868 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004869
4870 // For java_sdk_library_import
4871 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004872}
4873
Jooyung Han58f26ab2019-12-18 15:34:32 +09004874func TestJavaSDKLibrary(t *testing.T) {
4875 ctx, _ := testApex(t, `
4876 apex {
4877 name: "myapex",
4878 key: "myapex.key",
4879 java_libs: ["foo"],
4880 }
4881
4882 apex_key {
4883 name: "myapex.key",
4884 public_key: "testkey.avbpubkey",
4885 private_key: "testkey.pem",
4886 }
4887
4888 java_sdk_library {
4889 name: "foo",
4890 srcs: ["a.java"],
4891 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004892 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004893 }
Paul Duffin9b879592020-05-26 13:21:35 +01004894 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004895
4896 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004897 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004898 "javalib/foo.jar",
4899 "etc/permissions/foo.xml",
4900 })
4901 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004902 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4903 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004904}
4905
Paul Duffin9b879592020-05-26 13:21:35 +01004906func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4907 ctx, _ := testApex(t, `
4908 apex {
4909 name: "myapex",
4910 key: "myapex.key",
4911 java_libs: ["foo", "bar"],
4912 }
4913
4914 apex_key {
4915 name: "myapex.key",
4916 public_key: "testkey.avbpubkey",
4917 private_key: "testkey.pem",
4918 }
4919
4920 java_sdk_library {
4921 name: "foo",
4922 srcs: ["a.java"],
4923 api_packages: ["foo"],
4924 apex_available: ["myapex"],
4925 sdk_version: "none",
4926 system_modules: "none",
4927 }
4928
4929 java_library {
4930 name: "bar",
4931 srcs: ["a.java"],
4932 libs: ["foo"],
4933 apex_available: ["myapex"],
4934 sdk_version: "none",
4935 system_modules: "none",
4936 }
4937 `, withFiles(filesForSdkLibrary))
4938
4939 // java_sdk_library installs both impl jar and permission XML
4940 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4941 "javalib/bar.jar",
4942 "javalib/foo.jar",
4943 "etc/permissions/foo.xml",
4944 })
4945
4946 // The bar library should depend on the implementation jar.
4947 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4948 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4949 t.Errorf("expected %q, found %#q", expected, actual)
4950 }
4951}
4952
4953func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4954 ctx, _ := testApex(t, `
4955 apex {
4956 name: "myapex",
4957 key: "myapex.key",
4958 java_libs: ["foo"],
4959 }
4960
4961 apex_key {
4962 name: "myapex.key",
4963 public_key: "testkey.avbpubkey",
4964 private_key: "testkey.pem",
4965 }
4966
4967 java_sdk_library {
4968 name: "foo",
4969 srcs: ["a.java"],
4970 api_packages: ["foo"],
4971 apex_available: ["myapex"],
4972 sdk_version: "none",
4973 system_modules: "none",
4974 }
4975
4976 java_library {
4977 name: "bar",
4978 srcs: ["a.java"],
4979 libs: ["foo"],
4980 sdk_version: "none",
4981 system_modules: "none",
4982 }
4983 `, withFiles(filesForSdkLibrary))
4984
4985 // java_sdk_library installs both impl jar and permission XML
4986 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4987 "javalib/foo.jar",
4988 "etc/permissions/foo.xml",
4989 })
4990
4991 // The bar library should depend on the stubs jar.
4992 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4993 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4994 t.Errorf("expected %q, found %#q", expected, actual)
4995 }
4996}
4997
Paul Duffineedc5d52020-06-12 17:46:39 +01004998func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4999 ctx, _ := testApex(t, ``,
5000 withFiles(map[string][]byte{
5001 "apex/a.java": nil,
5002 "apex/apex_manifest.json": nil,
5003 "apex/Android.bp": []byte(`
5004 package {
5005 default_visibility: ["//visibility:private"],
5006 }
5007
5008 apex {
5009 name: "myapex",
5010 key: "myapex.key",
5011 java_libs: ["foo", "bar"],
5012 }
5013
5014 apex_key {
5015 name: "myapex.key",
5016 public_key: "testkey.avbpubkey",
5017 private_key: "testkey.pem",
5018 }
5019
5020 java_library {
5021 name: "bar",
5022 srcs: ["a.java"],
5023 libs: ["foo"],
5024 apex_available: ["myapex"],
5025 sdk_version: "none",
5026 system_modules: "none",
5027 }
5028`),
5029 "source/a.java": nil,
5030 "source/api/current.txt": nil,
5031 "source/api/removed.txt": nil,
5032 "source/Android.bp": []byte(`
5033 package {
5034 default_visibility: ["//visibility:private"],
5035 }
5036
5037 java_sdk_library {
5038 name: "foo",
5039 visibility: ["//apex"],
5040 srcs: ["a.java"],
5041 api_packages: ["foo"],
5042 apex_available: ["myapex"],
5043 sdk_version: "none",
5044 system_modules: "none",
5045 public: {
5046 enabled: true,
5047 },
5048 }
5049`),
5050 "prebuilt/a.jar": nil,
5051 "prebuilt/Android.bp": []byte(`
5052 package {
5053 default_visibility: ["//visibility:private"],
5054 }
5055
5056 java_sdk_library_import {
5057 name: "foo",
5058 visibility: ["//apex", "//source"],
5059 apex_available: ["myapex"],
5060 prefer: true,
5061 public: {
5062 jars: ["a.jar"],
5063 },
5064 }
5065`),
5066 }),
5067 )
5068
5069 // java_sdk_library installs both impl jar and permission XML
5070 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5071 "javalib/bar.jar",
5072 "javalib/foo.jar",
5073 "etc/permissions/foo.xml",
5074 })
5075
5076 // The bar library should depend on the implementation jar.
5077 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5078 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5079 t.Errorf("expected %q, found %#q", expected, actual)
5080 }
5081}
5082
5083func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5084 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5085 apex {
5086 name: "myapex",
5087 key: "myapex.key",
5088 java_libs: ["foo"],
5089 }
5090
5091 apex_key {
5092 name: "myapex.key",
5093 public_key: "testkey.avbpubkey",
5094 private_key: "testkey.pem",
5095 }
5096
5097 java_sdk_library_import {
5098 name: "foo",
5099 apex_available: ["myapex"],
5100 prefer: true,
5101 public: {
5102 jars: ["a.jar"],
5103 },
5104 }
5105
5106 `, withFiles(filesForSdkLibrary))
5107}
5108
atrost6e126252020-01-27 17:01:16 +00005109func TestCompatConfig(t *testing.T) {
5110 ctx, _ := testApex(t, `
5111 apex {
5112 name: "myapex",
5113 key: "myapex.key",
5114 prebuilts: ["myjar-platform-compat-config"],
5115 java_libs: ["myjar"],
5116 }
5117
5118 apex_key {
5119 name: "myapex.key",
5120 public_key: "testkey.avbpubkey",
5121 private_key: "testkey.pem",
5122 }
5123
5124 platform_compat_config {
5125 name: "myjar-platform-compat-config",
5126 src: ":myjar",
5127 }
5128
5129 java_library {
5130 name: "myjar",
5131 srcs: ["foo/bar/MyClass.java"],
5132 sdk_version: "none",
5133 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005134 apex_available: [ "myapex" ],
5135 }
5136 `)
5137 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5138 "etc/compatconfig/myjar-platform-compat-config.xml",
5139 "javalib/myjar.jar",
5140 })
5141}
5142
Jiyong Park479321d2019-12-16 11:47:12 +09005143func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5144 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5145 apex {
5146 name: "myapex",
5147 key: "myapex.key",
5148 java_libs: ["myjar"],
5149 }
5150
5151 apex_key {
5152 name: "myapex.key",
5153 public_key: "testkey.avbpubkey",
5154 private_key: "testkey.pem",
5155 }
5156
5157 java_library {
5158 name: "myjar",
5159 srcs: ["foo/bar/MyClass.java"],
5160 sdk_version: "none",
5161 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005162 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005163 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005164 }
5165 `)
5166}
5167
Jiyong Park7afd1072019-12-30 16:56:33 +09005168func TestCarryRequiredModuleNames(t *testing.T) {
5169 ctx, config := testApex(t, `
5170 apex {
5171 name: "myapex",
5172 key: "myapex.key",
5173 native_shared_libs: ["mylib"],
5174 }
5175
5176 apex_key {
5177 name: "myapex.key",
5178 public_key: "testkey.avbpubkey",
5179 private_key: "testkey.pem",
5180 }
5181
5182 cc_library {
5183 name: "mylib",
5184 srcs: ["mylib.cpp"],
5185 system_shared_libs: [],
5186 stl: "none",
5187 required: ["a", "b"],
5188 host_required: ["c", "d"],
5189 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005190 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005191 }
5192 `)
5193
5194 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5195 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5196 name := apexBundle.BaseModuleName()
5197 prefix := "TARGET_"
5198 var builder strings.Builder
5199 data.Custom(&builder, name, prefix, "", data)
5200 androidMk := builder.String()
5201 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5202 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5203 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5204}
5205
Jiyong Park7cd10e32020-01-14 09:22:18 +09005206func TestSymlinksFromApexToSystem(t *testing.T) {
5207 bp := `
5208 apex {
5209 name: "myapex",
5210 key: "myapex.key",
5211 native_shared_libs: ["mylib"],
5212 java_libs: ["myjar"],
5213 }
5214
Jiyong Park9d677202020-02-19 16:29:35 +09005215 apex {
5216 name: "myapex.updatable",
5217 key: "myapex.key",
5218 native_shared_libs: ["mylib"],
5219 java_libs: ["myjar"],
5220 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005221 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005222 }
5223
Jiyong Park7cd10e32020-01-14 09:22:18 +09005224 apex_key {
5225 name: "myapex.key",
5226 public_key: "testkey.avbpubkey",
5227 private_key: "testkey.pem",
5228 }
5229
5230 cc_library {
5231 name: "mylib",
5232 srcs: ["mylib.cpp"],
5233 shared_libs: ["myotherlib"],
5234 system_shared_libs: [],
5235 stl: "none",
5236 apex_available: [
5237 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005238 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005239 "//apex_available:platform",
5240 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005241 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005242 }
5243
5244 cc_library {
5245 name: "myotherlib",
5246 srcs: ["mylib.cpp"],
5247 system_shared_libs: [],
5248 stl: "none",
5249 apex_available: [
5250 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005251 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005252 "//apex_available:platform",
5253 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005254 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005255 }
5256
5257 java_library {
5258 name: "myjar",
5259 srcs: ["foo/bar/MyClass.java"],
5260 sdk_version: "none",
5261 system_modules: "none",
5262 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005263 apex_available: [
5264 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005265 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005266 "//apex_available:platform",
5267 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005268 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005269 }
5270
5271 java_library {
5272 name: "myotherjar",
5273 srcs: ["foo/bar/MyClass.java"],
5274 sdk_version: "none",
5275 system_modules: "none",
5276 apex_available: [
5277 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005278 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005279 "//apex_available:platform",
5280 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005281 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005282 }
5283 `
5284
5285 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5286 for _, f := range files {
5287 if f.path == file {
5288 if f.isLink {
5289 t.Errorf("%q is not a real file", file)
5290 }
5291 return
5292 }
5293 }
5294 t.Errorf("%q is not found", file)
5295 }
5296
5297 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5298 for _, f := range files {
5299 if f.path == file {
5300 if !f.isLink {
5301 t.Errorf("%q is not a symlink", file)
5302 }
5303 return
5304 }
5305 }
5306 t.Errorf("%q is not found", file)
5307 }
5308
Jiyong Park9d677202020-02-19 16:29:35 +09005309 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5310 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005311 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005312 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005313 ensureRealfileExists(t, files, "javalib/myjar.jar")
5314 ensureRealfileExists(t, files, "lib64/mylib.so")
5315 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5316
Jiyong Park9d677202020-02-19 16:29:35 +09005317 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5318 ensureRealfileExists(t, files, "javalib/myjar.jar")
5319 ensureRealfileExists(t, files, "lib64/mylib.so")
5320 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5321
5322 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005323 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005324 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005325 ensureRealfileExists(t, files, "javalib/myjar.jar")
5326 ensureRealfileExists(t, files, "lib64/mylib.so")
5327 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005328
5329 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5330 ensureRealfileExists(t, files, "javalib/myjar.jar")
5331 ensureRealfileExists(t, files, "lib64/mylib.so")
5332 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005333}
5334
Yo Chiange8128052020-07-23 20:09:18 +08005335func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5336 ctx, config := testApex(t, `
5337 apex {
5338 name: "myapex",
5339 key: "myapex.key",
5340 native_shared_libs: ["mylib"],
5341 }
5342
5343 apex_key {
5344 name: "myapex.key",
5345 public_key: "testkey.avbpubkey",
5346 private_key: "testkey.pem",
5347 }
5348
5349 cc_library_shared {
5350 name: "mylib",
5351 srcs: ["mylib.cpp"],
5352 shared_libs: ["myotherlib"],
5353 system_shared_libs: [],
5354 stl: "none",
5355 apex_available: [
5356 "myapex",
5357 "//apex_available:platform",
5358 ],
5359 }
5360
5361 cc_prebuilt_library_shared {
5362 name: "myotherlib",
5363 srcs: ["prebuilt.so"],
5364 system_shared_libs: [],
5365 stl: "none",
5366 apex_available: [
5367 "myapex",
5368 "//apex_available:platform",
5369 ],
5370 }
5371 `)
5372
5373 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5374 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5375 var builder strings.Builder
5376 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5377 androidMk := builder.String()
5378 // `myotherlib` is added to `myapex` as symlink
5379 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5380 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5381 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5382 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5383 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5384}
5385
Jooyung Han643adc42020-02-27 13:50:06 +09005386func TestApexWithJniLibs(t *testing.T) {
5387 ctx, _ := testApex(t, `
5388 apex {
5389 name: "myapex",
5390 key: "myapex.key",
5391 jni_libs: ["mylib"],
5392 }
5393
5394 apex_key {
5395 name: "myapex.key",
5396 public_key: "testkey.avbpubkey",
5397 private_key: "testkey.pem",
5398 }
5399
5400 cc_library {
5401 name: "mylib",
5402 srcs: ["mylib.cpp"],
5403 shared_libs: ["mylib2"],
5404 system_shared_libs: [],
5405 stl: "none",
5406 apex_available: [ "myapex" ],
5407 }
5408
5409 cc_library {
5410 name: "mylib2",
5411 srcs: ["mylib.cpp"],
5412 system_shared_libs: [],
5413 stl: "none",
5414 apex_available: [ "myapex" ],
5415 }
5416 `)
5417
5418 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5419 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5420 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5421 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5422 "lib64/mylib.so",
5423 "lib64/mylib2.so",
5424 })
5425}
5426
Jooyung Han49f67012020-04-17 13:43:10 +09005427func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5428 ctx, _ := testApex(t, `
5429 apex {
5430 name: "myapex",
5431 key: "myapex.key",
5432 }
5433 apex_key {
5434 name: "myapex.key",
5435 public_key: "testkey.avbpubkey",
5436 private_key: "testkey.pem",
5437 }
5438 `, func(fs map[string][]byte, config android.Config) {
5439 delete(config.Targets, android.Android)
5440 config.AndroidCommonTarget = android.Target{}
5441 })
5442
5443 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5444 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5445 }
5446}
5447
Jiyong Parkbd159612020-02-28 15:22:21 +09005448func TestAppBundle(t *testing.T) {
5449 ctx, _ := testApex(t, `
5450 apex {
5451 name: "myapex",
5452 key: "myapex.key",
5453 apps: ["AppFoo"],
5454 }
5455
5456 apex_key {
5457 name: "myapex.key",
5458 public_key: "testkey.avbpubkey",
5459 private_key: "testkey.pem",
5460 }
5461
5462 android_app {
5463 name: "AppFoo",
5464 srcs: ["foo/bar/MyClass.java"],
5465 sdk_version: "none",
5466 system_modules: "none",
5467 apex_available: [ "myapex" ],
5468 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005469 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005470
5471 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5472 content := bundleConfigRule.Args["content"]
5473
5474 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005475 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 +09005476}
5477
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005478func TestAppSetBundle(t *testing.T) {
5479 ctx, _ := testApex(t, `
5480 apex {
5481 name: "myapex",
5482 key: "myapex.key",
5483 apps: ["AppSet"],
5484 }
5485
5486 apex_key {
5487 name: "myapex.key",
5488 public_key: "testkey.avbpubkey",
5489 private_key: "testkey.pem",
5490 }
5491
5492 android_app_set {
5493 name: "AppSet",
5494 set: "AppSet.apks",
5495 }`)
5496 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5497 bundleConfigRule := mod.Description("Bundle Config")
5498 content := bundleConfigRule.Args["content"]
5499 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5500 s := mod.Rule("apexRule").Args["copy_commands"]
5501 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5502 if len(copyCmds) != 3 {
5503 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5504 }
5505 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5506 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5507 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5508}
5509
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005510func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005511 t.Helper()
5512
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005513 bp := `
5514 java_library {
5515 name: "some-updatable-apex-lib",
5516 srcs: ["a.java"],
5517 sdk_version: "current",
5518 apex_available: [
5519 "some-updatable-apex",
5520 ],
5521 }
5522
5523 java_library {
5524 name: "some-non-updatable-apex-lib",
5525 srcs: ["a.java"],
5526 apex_available: [
5527 "some-non-updatable-apex",
5528 ],
5529 }
5530
5531 java_library {
5532 name: "some-platform-lib",
5533 srcs: ["a.java"],
5534 sdk_version: "current",
5535 installable: true,
5536 }
5537
5538 java_library {
5539 name: "some-art-lib",
5540 srcs: ["a.java"],
5541 sdk_version: "current",
5542 apex_available: [
5543 "com.android.art.something",
5544 ],
5545 hostdex: true,
5546 }
5547
5548 apex {
5549 name: "some-updatable-apex",
5550 key: "some-updatable-apex.key",
5551 java_libs: ["some-updatable-apex-lib"],
5552 updatable: true,
5553 min_sdk_version: "current",
5554 }
5555
5556 apex {
5557 name: "some-non-updatable-apex",
5558 key: "some-non-updatable-apex.key",
5559 java_libs: ["some-non-updatable-apex-lib"],
5560 }
5561
5562 apex_key {
5563 name: "some-updatable-apex.key",
5564 }
5565
5566 apex_key {
5567 name: "some-non-updatable-apex.key",
5568 }
5569
5570 apex {
5571 name: "com.android.art.something",
5572 key: "com.android.art.something.key",
5573 java_libs: ["some-art-lib"],
5574 updatable: true,
5575 min_sdk_version: "current",
5576 }
5577
5578 apex_key {
5579 name: "com.android.art.something.key",
5580 }
5581
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005582 filegroup {
5583 name: "some-updatable-apex-file_contexts",
5584 srcs: [
5585 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5586 ],
5587 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005588
5589 filegroup {
5590 name: "some-non-updatable-apex-file_contexts",
5591 srcs: [
5592 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5593 ],
5594 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005595 `
5596 bp += cc.GatherRequiredDepsForTest(android.Android)
5597 bp += java.GatherRequiredDepsForTest()
5598 bp += dexpreopt.BpToolModulesForTest()
5599
5600 fs := map[string][]byte{
5601 "a.java": nil,
5602 "a.jar": nil,
5603 "build/make/target/product/security": nil,
5604 "apex_manifest.json": nil,
5605 "AndroidManifest.xml": nil,
5606 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005607 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005608 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5609 "framework/aidl/a.aidl": nil,
5610 }
5611 cc.GatherRequiredFilesForTest(fs)
5612
5613 ctx := android.NewTestArchContext()
5614 ctx.RegisterModuleType("apex", BundleFactory)
5615 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5616 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005617 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005618 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005619 cc.RegisterRequiredBuildComponentsForTest(ctx)
5620 java.RegisterJavaBuildComponents(ctx)
5621 java.RegisterSystemModulesBuildComponents(ctx)
5622 java.RegisterAppBuildComponents(ctx)
5623 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005624 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5625 ctx.PreDepsMutators(RegisterPreDepsMutators)
5626 ctx.PostDepsMutators(RegisterPostDepsMutators)
5627
5628 config := android.TestArchConfig(buildDir, nil, bp, fs)
5629 ctx.Register(config)
5630
5631 _ = dexpreopt.GlobalSoongConfigForTests(config)
5632 dexpreopt.RegisterToolModulesForTest(ctx)
5633 pathCtx := android.PathContextForTesting(config)
5634 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5635 transformDexpreoptConfig(dexpreoptConfig)
5636 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5637
5638 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5639 android.FailIfErrored(t, errs)
5640
5641 _, errs = ctx.PrepareBuildActions(config)
5642 if errmsg == "" {
5643 android.FailIfErrored(t, errs)
5644 } else if len(errs) > 0 {
5645 android.FailIfNoMatchingErrors(t, errmsg, errs)
5646 return
5647 } else {
5648 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5649 }
5650}
5651
Jooyung Han548640b2020-04-27 12:10:30 +09005652func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5653 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5654 apex {
5655 name: "myapex",
5656 key: "myapex.key",
5657 updatable: true,
5658 }
5659
5660 apex_key {
5661 name: "myapex.key",
5662 public_key: "testkey.avbpubkey",
5663 private_key: "testkey.pem",
5664 }
5665 `)
5666}
5667
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005668func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005669 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005670 var transform func(*dexpreopt.GlobalConfig)
5671
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005672 config := android.TestArchConfig(buildDir, nil, "", nil)
5673 ctx := android.PathContextForTesting(config)
5674
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005675 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5676 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005677 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005678 }
5679 testNoUpdatableJarsInBootImage(t, "", transform)
5680 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005681
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005682 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005683 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 +01005684 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005685 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005686 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005687 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005688 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005689
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005690 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 -07005691 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 +01005692 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005693 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005694 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005695 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005696 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005697
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005698 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 -07005699 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005700 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005701 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005702 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005703 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005704 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005705
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005706 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 -07005707 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 +01005708 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005709 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005710 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005711 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005712 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005713
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005714 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5715 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005716 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005717 }
5718 testNoUpdatableJarsInBootImage(t, "", transform)
5719 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005720
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005721 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005722 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005723 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005724 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005725 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005726 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005727 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005728
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005729 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005730 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005731 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005732 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005733 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005734 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005735 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005736
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005737 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005738 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005739 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005740 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005741 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005742 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005743 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005744
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005745 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5746 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005747 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005748 }
5749 testNoUpdatableJarsInBootImage(t, "", transform)
5750 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005751}
5752
Andrei Onea115e7e72020-06-05 21:14:03 +01005753func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5754 t.Helper()
5755 android.ClearApexDependency()
5756 bp += `
5757 apex_key {
5758 name: "myapex.key",
5759 public_key: "testkey.avbpubkey",
5760 private_key: "testkey.pem",
5761 }`
5762 fs := map[string][]byte{
5763 "lib1/src/A.java": nil,
5764 "lib2/src/B.java": nil,
5765 "system/sepolicy/apex/myapex-file_contexts": nil,
5766 }
5767
5768 ctx := android.NewTestArchContext()
5769 ctx.RegisterModuleType("apex", BundleFactory)
5770 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5771 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5772 cc.RegisterRequiredBuildComponentsForTest(ctx)
5773 java.RegisterJavaBuildComponents(ctx)
5774 java.RegisterSystemModulesBuildComponents(ctx)
5775 java.RegisterDexpreoptBootJarsComponents(ctx)
5776 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5777 ctx.PreDepsMutators(RegisterPreDepsMutators)
5778 ctx.PostDepsMutators(RegisterPostDepsMutators)
5779 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5780
5781 config := android.TestArchConfig(buildDir, nil, bp, fs)
5782 android.SetTestNeverallowRules(config, rules)
5783 updatableBootJars := make([]string, 0, len(apexBootJars))
5784 for _, apexBootJar := range apexBootJars {
5785 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5786 }
5787 config.TestProductVariables.UpdatableBootJars = updatableBootJars
5788
5789 ctx.Register(config)
5790
5791 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5792 android.FailIfErrored(t, errs)
5793
5794 _, errs = ctx.PrepareBuildActions(config)
5795 if errmsg == "" {
5796 android.FailIfErrored(t, errs)
5797 } else if len(errs) > 0 {
5798 android.FailIfNoMatchingErrors(t, errmsg, errs)
5799 return
5800 } else {
5801 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5802 }
5803}
5804
5805func TestApexPermittedPackagesRules(t *testing.T) {
5806 testcases := []struct {
5807 name string
5808 expectedError string
5809 bp string
5810 bootJars []string
5811 modulesPackages map[string][]string
5812 }{
5813
5814 {
5815 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5816 expectedError: "",
5817 bp: `
5818 java_library {
5819 name: "bcp_lib1",
5820 srcs: ["lib1/src/*.java"],
5821 permitted_packages: ["foo.bar"],
5822 apex_available: ["myapex"],
5823 sdk_version: "none",
5824 system_modules: "none",
5825 }
5826 java_library {
5827 name: "nonbcp_lib2",
5828 srcs: ["lib2/src/*.java"],
5829 apex_available: ["myapex"],
5830 permitted_packages: ["a.b"],
5831 sdk_version: "none",
5832 system_modules: "none",
5833 }
5834 apex {
5835 name: "myapex",
5836 key: "myapex.key",
5837 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5838 }`,
5839 bootJars: []string{"bcp_lib1"},
5840 modulesPackages: map[string][]string{
5841 "myapex": []string{
5842 "foo.bar",
5843 },
5844 },
5845 },
5846 {
5847 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5848 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar. Please jarjar or move code around.`,
5849 bp: `
5850 java_library {
5851 name: "bcp_lib1",
5852 srcs: ["lib1/src/*.java"],
5853 apex_available: ["myapex"],
5854 permitted_packages: ["foo.bar"],
5855 sdk_version: "none",
5856 system_modules: "none",
5857 }
5858 java_library {
5859 name: "bcp_lib2",
5860 srcs: ["lib2/src/*.java"],
5861 apex_available: ["myapex"],
5862 permitted_packages: ["foo.bar", "bar.baz"],
5863 sdk_version: "none",
5864 system_modules: "none",
5865 }
5866 apex {
5867 name: "myapex",
5868 key: "myapex.key",
5869 java_libs: ["bcp_lib1", "bcp_lib2"],
5870 }
5871 `,
5872 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5873 modulesPackages: map[string][]string{
5874 "myapex": []string{
5875 "foo.bar",
5876 },
5877 },
5878 },
5879 }
5880 for _, tc := range testcases {
5881 t.Run(tc.name, func(t *testing.T) {
5882 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5883 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5884 })
5885 }
5886}
5887
Jiyong Park62304bb2020-04-13 16:19:48 +09005888func TestTestFor(t *testing.T) {
5889 ctx, _ := testApex(t, `
5890 apex {
5891 name: "myapex",
5892 key: "myapex.key",
5893 native_shared_libs: ["mylib", "myprivlib"],
5894 }
5895
5896 apex_key {
5897 name: "myapex.key",
5898 public_key: "testkey.avbpubkey",
5899 private_key: "testkey.pem",
5900 }
5901
5902 cc_library {
5903 name: "mylib",
5904 srcs: ["mylib.cpp"],
5905 system_shared_libs: [],
5906 stl: "none",
5907 stubs: {
5908 versions: ["1"],
5909 },
5910 apex_available: ["myapex"],
5911 }
5912
5913 cc_library {
5914 name: "myprivlib",
5915 srcs: ["mylib.cpp"],
5916 system_shared_libs: [],
5917 stl: "none",
5918 apex_available: ["myapex"],
5919 }
5920
5921
5922 cc_test {
5923 name: "mytest",
5924 gtest: false,
5925 srcs: ["mylib.cpp"],
5926 system_shared_libs: [],
5927 stl: "none",
5928 shared_libs: ["mylib", "myprivlib"],
5929 test_for: ["myapex"]
5930 }
5931 `)
5932
5933 // the test 'mytest' is a test for the apex, therefore is linked to the
5934 // actual implementation of mylib instead of its stub.
5935 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5936 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5937 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5938}
5939
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005940// TODO(jungjw): Move this to proptools
5941func intPtr(i int) *int {
5942 return &i
5943}
5944
5945func TestApexSet(t *testing.T) {
5946 ctx, config := testApex(t, `
5947 apex_set {
5948 name: "myapex",
5949 set: "myapex.apks",
5950 filename: "foo_v2.apex",
5951 overrides: ["foo"],
5952 }
5953 `, func(fs map[string][]byte, config android.Config) {
5954 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07005955 config.Targets[android.Android] = []android.Target{
5956 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
5957 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
5958 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005959 })
5960
5961 m := ctx.ModuleForTests("myapex", "android_common")
5962
5963 // Check extract_apks tool parameters.
5964 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5965 actual := extractedApex.Args["abis"]
5966 expected := "ARMEABI_V7A,ARM64_V8A"
5967 if actual != expected {
5968 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5969 }
5970 actual = extractedApex.Args["sdk-version"]
5971 expected = "30"
5972 if actual != expected {
5973 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5974 }
5975
5976 a := m.Module().(*ApexSet)
5977 expectedOverrides := []string{"foo"}
5978 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5979 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5980 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5981 }
5982}
5983
Jiyong Park7d95a512020-05-10 15:16:24 +09005984func TestNoStaticLinkingToStubsLib(t *testing.T) {
5985 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5986 apex {
5987 name: "myapex",
5988 key: "myapex.key",
5989 native_shared_libs: ["mylib"],
5990 }
5991
5992 apex_key {
5993 name: "myapex.key",
5994 public_key: "testkey.avbpubkey",
5995 private_key: "testkey.pem",
5996 }
5997
5998 cc_library {
5999 name: "mylib",
6000 srcs: ["mylib.cpp"],
6001 static_libs: ["otherlib"],
6002 system_shared_libs: [],
6003 stl: "none",
6004 apex_available: [ "myapex" ],
6005 }
6006
6007 cc_library {
6008 name: "otherlib",
6009 srcs: ["mylib.cpp"],
6010 system_shared_libs: [],
6011 stl: "none",
6012 stubs: {
6013 versions: ["1", "2", "3"],
6014 },
6015 apex_available: [ "myapex" ],
6016 }
6017 `)
6018}
6019
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006020func TestApexKeysTxt(t *testing.T) {
6021 ctx, _ := testApex(t, `
6022 apex {
6023 name: "myapex",
6024 key: "myapex.key",
6025 }
6026
6027 apex_key {
6028 name: "myapex.key",
6029 public_key: "testkey.avbpubkey",
6030 private_key: "testkey.pem",
6031 }
6032
6033 prebuilt_apex {
6034 name: "myapex",
6035 prefer: true,
6036 arch: {
6037 arm64: {
6038 src: "myapex-arm64.apex",
6039 },
6040 arm: {
6041 src: "myapex-arm.apex",
6042 },
6043 },
6044 }
6045
6046 apex_set {
6047 name: "myapex_set",
6048 set: "myapex.apks",
6049 filename: "myapex_set.apex",
6050 overrides: ["myapex"],
6051 }
6052 `)
6053
6054 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6055 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6056 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 +09006057 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 +09006058}
6059
Jooyung Han938b5932020-06-20 12:47:47 +09006060func TestAllowedFiles(t *testing.T) {
6061 ctx, _ := testApex(t, `
6062 apex {
6063 name: "myapex",
6064 key: "myapex.key",
6065 apps: ["app"],
6066 allowed_files: "allowed.txt",
6067 }
6068
6069 apex_key {
6070 name: "myapex.key",
6071 public_key: "testkey.avbpubkey",
6072 private_key: "testkey.pem",
6073 }
6074
6075 android_app {
6076 name: "app",
6077 srcs: ["foo/bar/MyClass.java"],
6078 package_name: "foo",
6079 sdk_version: "none",
6080 system_modules: "none",
6081 apex_available: [ "myapex" ],
6082 }
6083 `, withFiles(map[string][]byte{
6084 "sub/Android.bp": []byte(`
6085 override_apex {
6086 name: "override_myapex",
6087 base: "myapex",
6088 apps: ["override_app"],
6089 allowed_files: ":allowed",
6090 }
6091 // Overridable "path" property should be referenced indirectly
6092 filegroup {
6093 name: "allowed",
6094 srcs: ["allowed.txt"],
6095 }
6096 override_android_app {
6097 name: "override_app",
6098 base: "app",
6099 package_name: "bar",
6100 }
6101 `),
6102 }))
6103
6104 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6105 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6106 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6107 }
6108
6109 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6110 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6111 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6112 }
6113}
6114
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006115func TestNonPreferredPrebuiltDependency(t *testing.T) {
6116 _, _ = testApex(t, `
6117 apex {
6118 name: "myapex",
6119 key: "myapex.key",
6120 native_shared_libs: ["mylib"],
6121 }
6122
6123 apex_key {
6124 name: "myapex.key",
6125 public_key: "testkey.avbpubkey",
6126 private_key: "testkey.pem",
6127 }
6128
6129 cc_library {
6130 name: "mylib",
6131 srcs: ["mylib.cpp"],
6132 stubs: {
6133 versions: ["10000"],
6134 },
6135 apex_available: ["myapex"],
6136 }
6137
6138 cc_prebuilt_library_shared {
6139 name: "mylib",
6140 prefer: false,
6141 srcs: ["prebuilt.so"],
6142 stubs: {
6143 versions: ["10000"],
6144 },
6145 apex_available: ["myapex"],
6146 }
6147 `)
6148}
6149
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006150func TestMain(m *testing.M) {
6151 run := func() int {
6152 setUp()
6153 defer tearDown()
6154
6155 return m.Run()
6156 }
6157
6158 os.Exit(run())
6159}