blob: 33e50770ad0474344e9d54e1d895dd475c1537a5 [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) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900129 filegroup {
130 name: "myapex-file_contexts",
131 srcs: [
132 "system/sepolicy/apex/myapex-file_contexts",
133 ],
134 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900135 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800136
Colin Crossf9aabd72020-02-15 11:29:50 -0800137 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
138
Dario Frenicde2a032019-10-27 00:29:22 +0100139 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900140
Jooyung Han344d5432019-08-23 11:17:39 +0900141 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900142 "a.java": nil,
143 "PrebuiltAppFoo.apk": nil,
144 "PrebuiltAppFooPriv.apk": nil,
145 "build/make/target/product/security": nil,
146 "apex_manifest.json": nil,
147 "AndroidManifest.xml": nil,
148 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900149 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900150 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900151 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900152 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800153 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800154 "mytest.cpp": nil,
155 "mytest1.cpp": nil,
156 "mytest2.cpp": nil,
157 "mytest3.cpp": nil,
158 "myprebuilt": nil,
159 "my_include": nil,
160 "foo/bar/MyClass.java": nil,
161 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100162 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800163 "vendor/foo/devkeys/test.x509.pem": nil,
164 "vendor/foo/devkeys/test.pk8": nil,
165 "testkey.x509.pem": nil,
166 "testkey.pk8": nil,
167 "testkey.override.x509.pem": nil,
168 "testkey.override.pk8": nil,
169 "vendor/foo/devkeys/testkey.avbpubkey": nil,
170 "vendor/foo/devkeys/testkey.pem": nil,
171 "NOTICE": nil,
172 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900173 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800174 "testkey2.avbpubkey": nil,
175 "testkey2.pem": nil,
176 "myapex-arm64.apex": nil,
177 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700178 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800179 "frameworks/base/api/current.txt": nil,
180 "framework/aidl/a.aidl": nil,
181 "build/make/core/proguard.flags": nil,
182 "build/make/core/proguard_basic_keeps.flags": nil,
183 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700184 "baz": nil,
185 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700186 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700187 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900188 }
189
Colin Crossf9aabd72020-02-15 11:29:50 -0800190 cc.GatherRequiredFilesForTest(fs)
191
Jooyung Han344d5432019-08-23 11:17:39 +0900192 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800193 // The fs now needs to be populated before creating the config, call handlers twice
194 // for now, once to get any fs changes, and later after the config was created to
195 // set product variables or targets.
196 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
197 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900198 }
199
Colin Cross98be1bb2019-12-13 20:41:13 -0800200 config := android.TestArchConfig(buildDir, nil, bp, fs)
201 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
202 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
203 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
204 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
205 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700206 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800207 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
208
209 for _, handler := range handlers {
210 // The fs now needs to be populated before creating the config, call handlers twice
211 // for now, earlier to get any fs changes, and now after the config was created to
212 // set product variables or targets.
213 tempFS := map[string][]byte{}
214 handler(tempFS, config)
215 }
216
Colin Crossae8600b2020-10-29 17:09:13 -0700217 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100218
219 // from android package
220 android.RegisterPackageBuildComponents(ctx)
221 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
222
Colin Cross98be1bb2019-12-13 20:41:13 -0800223 ctx.RegisterModuleType("apex", BundleFactory)
224 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
225 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
226 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
227 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
228 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
229 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700230 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800231
Jooyung Hana57af4a2020-01-23 05:36:59 +0000232 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100233 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000234 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
235
Paul Duffin021f4e52020-07-30 16:04:17 +0100236 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100237
Paul Duffin021f4e52020-07-30 16:04:17 +0100238 // Register these after the prebuilt mutators have been registered to match what
239 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100240 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
241 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
242
Paul Duffin021f4e52020-07-30 16:04:17 +0100243 cc.RegisterRequiredBuildComponentsForTest(ctx)
244
Colin Cross98be1bb2019-12-13 20:41:13 -0800245 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
247 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900248 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000249 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700250 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000252 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000253 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000254 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100255 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900256 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800257 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800258
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800261
Colin Crossae8600b2020-10-29 17:09:13 -0700262 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265}
266
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700267func setUp() {
268 var err error
269 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273}
274
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700276 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jooyung Han643adc42020-02-27 13:50:06 +0900279// ensure that 'result' equals 'expected'
280func ensureEquals(t *testing.T, result string, expected string) {
281 t.Helper()
282 if result != expected {
283 t.Errorf("%q != %q", expected, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287// ensure that 'result' contains 'expected'
288func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if !strings.Contains(result, expected) {
291 t.Errorf("%q is not found in %q", expected, result)
292 }
293}
294
Liz Kammer5bd365f2020-05-27 15:15:11 -0700295// ensure that 'result' contains 'expected' exactly one time
296func ensureContainsOnce(t *testing.T, result string, expected string) {
297 t.Helper()
298 count := strings.Count(result, expected)
299 if count != 1 {
300 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
301 }
302}
303
Jiyong Park25fc6a92018-11-18 18:02:45 +0900304// ensures that 'result' does not contain 'notExpected'
305func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900306 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307 if strings.Contains(result, notExpected) {
308 t.Errorf("%q is found in %q", notExpected, result)
309 }
310}
311
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700312func ensureMatches(t *testing.T, result string, expectedRex string) {
313 ok, err := regexp.MatchString(expectedRex, result)
314 if err != nil {
315 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
316 return
317 }
318 if !ok {
319 t.Errorf("%s does not match regular expession %s", result, expectedRex)
320 }
321}
322
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900324 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 if !android.InList(expected, result) {
326 t.Errorf("%q is not found in %v", expected, result)
327 }
328}
329
330func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900331 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 if android.InList(notExpected, result) {
333 t.Errorf("%q is found in %v", notExpected, result)
334 }
335}
336
Jooyung Hane1633032019-08-01 17:41:43 +0900337func ensureListEmpty(t *testing.T, result []string) {
338 t.Helper()
339 if len(result) > 0 {
340 t.Errorf("%q is expected to be empty", result)
341 }
342}
343
Jiyong Park25fc6a92018-11-18 18:02:45 +0900344// Minimal test
345func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900346 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900347 apex_defaults {
348 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900349 manifest: ":myapex.manifest",
350 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900351 key: "myapex.key",
352 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800353 multilib: {
354 both: {
355 binaries: ["foo",],
356 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900357 },
Jiyong Park77acec62020-06-01 21:39:15 +0900358 java_libs: [
359 "myjar",
360 "myjar_dex",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 }
363
Jiyong Park30ca9372019-02-07 16:27:23 +0900364 apex {
365 name: "myapex",
366 defaults: ["myapex-defaults"],
367 }
368
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 apex_key {
370 name: "myapex.key",
371 public_key: "testkey.avbpubkey",
372 private_key: "testkey.pem",
373 }
374
Jiyong Park809bb722019-02-13 21:33:49 +0900375 filegroup {
376 name: "myapex.manifest",
377 srcs: ["apex_manifest.json"],
378 }
379
380 filegroup {
381 name: "myapex.androidmanifest",
382 srcs: ["AndroidManifest.xml"],
383 }
384
Jiyong Park25fc6a92018-11-18 18:02:45 +0900385 cc_library {
386 name: "mylib",
387 srcs: ["mylib.cpp"],
388 shared_libs: ["mylib2"],
389 system_shared_libs: [],
390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000391 // TODO: remove //apex_available:platform
392 apex_available: [
393 "//apex_available:platform",
394 "myapex",
395 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900396 }
397
Alex Light3d673592019-01-18 14:37:31 -0800398 cc_binary {
399 name: "foo",
400 srcs: ["mylib.cpp"],
401 compile_multilib: "both",
402 multilib: {
403 lib32: {
404 suffix: "32",
405 },
406 lib64: {
407 suffix: "64",
408 },
409 },
410 symlinks: ["foo_link_"],
411 symlink_preferred_arch: true,
412 system_shared_libs: [],
413 static_executable: true,
414 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700415 apex_available: [ "myapex", "com.android.gki.*" ],
416 }
417
418 apex {
419 name: "com.android.gki.fake",
420 binaries: ["foo"],
421 key: "myapex.key",
422 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800423 }
424
Paul Duffindddd5462020-04-07 15:25:44 +0100425 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900426 name: "mylib2",
427 srcs: ["mylib.cpp"],
428 system_shared_libs: [],
429 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900430 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900431 static_libs: ["libstatic"],
432 // TODO: remove //apex_available:platform
433 apex_available: [
434 "//apex_available:platform",
435 "myapex",
436 ],
437 }
438
Paul Duffindddd5462020-04-07 15:25:44 +0100439 cc_prebuilt_library_shared {
440 name: "mylib2",
441 srcs: ["prebuilt.so"],
442 // TODO: remove //apex_available:platform
443 apex_available: [
444 "//apex_available:platform",
445 "myapex",
446 ],
447 }
448
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 cc_library_static {
450 name: "libstatic",
451 srcs: ["mylib.cpp"],
452 system_shared_libs: [],
453 stl: "none",
454 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000455 // TODO: remove //apex_available:platform
456 apex_available: [
457 "//apex_available:platform",
458 "myapex",
459 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900460 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461
462 java_library {
463 name: "myjar",
464 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900465 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 sdk_version: "none",
467 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900469 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475 }
476
Jiyong Park77acec62020-06-01 21:39:15 +0900477 dex_import {
478 name: "myjar_dex",
479 jars: ["prebuilt.jar"],
480 apex_available: [
481 "//apex_available:platform",
482 "myapex",
483 ],
484 }
485
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 java_library {
487 name: "myotherjar",
488 srcs: ["foo/bar/MyClass.java"],
489 sdk_version: "none",
490 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900491 // TODO: remove //apex_available:platform
492 apex_available: [
493 "//apex_available:platform",
494 "myapex",
495 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900496 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900497
498 java_library {
499 name: "mysharedjar",
500 srcs: ["foo/bar/MyClass.java"],
501 sdk_version: "none",
502 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900503 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900504 `)
505
Sundong Ahnabb64432019-10-22 13:58:29 +0900506 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900507
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900508 // Make sure that Android.mk is created
509 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
510 data := android.AndroidMkDataForTest(t, config, "", ab)
511 var builder strings.Builder
512 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
513
514 androidMk := builder.String()
515 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
516 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
517
Jiyong Park42cca6c2019-04-01 11:15:50 +0900518 optFlags := apexRule.Args["opt_flags"]
519 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700520 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900521 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park25fc6a92018-11-18 18:02:45 +0900523 copyCmds := apexRule.Args["copy_commands"]
524
525 // Ensure that main rule creates an output
526 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
527
528 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700529 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
530 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
531 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900532
533 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700534 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800538 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
539 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900540 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900541 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900542 // .. but not for java libs
543 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900544 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800545
Colin Cross7113d202019-11-20 16:39:12 -0800546 // Ensure that the platform variant ends with _shared or _common
547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
548 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
550 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
552
553 // Ensure that dynamic dependency to java libs are not included
554 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800555
556 // Ensure that all symlinks are present.
557 found_foo_link_64 := false
558 found_foo := false
559 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900560 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800561 if strings.HasSuffix(cmd, "bin/foo") {
562 found_foo = true
563 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
564 found_foo_link_64 = true
565 }
566 }
567 }
568 good := found_foo && found_foo_link_64
569 if !good {
570 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
571 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900572
Sundong Ahnabb64432019-10-22 13:58:29 +0900573 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700574 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900575 if len(noticeInputs) != 3 {
576 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900577 }
578 ensureListContains(t, noticeInputs, "NOTICE")
579 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900580 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900581
Artur Satayeva8bd1132020-04-27 18:07:06 +0100582 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100583 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
584 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
585 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
586 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
587 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100588
589 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100590 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
591 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
592 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
593 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
594 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800595}
596
Jooyung Hanf21c7972019-12-16 22:32:06 +0900597func TestDefaults(t *testing.T) {
598 ctx, _ := testApex(t, `
599 apex_defaults {
600 name: "myapex-defaults",
601 key: "myapex.key",
602 prebuilts: ["myetc"],
603 native_shared_libs: ["mylib"],
604 java_libs: ["myjar"],
605 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900606 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800607 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900608 }
609
610 prebuilt_etc {
611 name: "myetc",
612 src: "myprebuilt",
613 }
614
615 apex {
616 name: "myapex",
617 defaults: ["myapex-defaults"],
618 }
619
620 apex_key {
621 name: "myapex.key",
622 public_key: "testkey.avbpubkey",
623 private_key: "testkey.pem",
624 }
625
626 cc_library {
627 name: "mylib",
628 system_shared_libs: [],
629 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000630 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900631 }
632
633 java_library {
634 name: "myjar",
635 srcs: ["foo/bar/MyClass.java"],
636 sdk_version: "none",
637 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000638 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900639 }
640
641 android_app {
642 name: "AppFoo",
643 srcs: ["foo/bar/MyClass.java"],
644 sdk_version: "none",
645 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000646 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900648
649 runtime_resource_overlay {
650 name: "rro",
651 theme: "blue",
652 }
653
markchien2f59ec92020-09-02 16:23:38 +0800654 bpf {
655 name: "bpf",
656 srcs: ["bpf.c", "bpf2.c"],
657 }
658
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000660 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 "etc/myetc",
662 "javalib/myjar.jar",
663 "lib64/mylib.so",
664 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900665 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800666 "etc/bpf/bpf.o",
667 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900668 })
669}
670
Jooyung Han01a3ee22019-11-02 02:52:25 +0900671func TestApexManifest(t *testing.T) {
672 ctx, _ := testApex(t, `
673 apex {
674 name: "myapex",
675 key: "myapex.key",
676 }
677
678 apex_key {
679 name: "myapex.key",
680 public_key: "testkey.avbpubkey",
681 private_key: "testkey.pem",
682 }
683 `)
684
685 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900686 args := module.Rule("apexRule").Args
687 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
688 t.Error("manifest should be apex_manifest.pb, but " + manifest)
689 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900690}
691
Alex Light5098a612018-11-29 17:12:15 -0800692func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700693 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800694 apex {
695 name: "myapex",
696 key: "myapex.key",
697 payload_type: "zip",
698 native_shared_libs: ["mylib"],
699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706
707 cc_library {
708 name: "mylib",
709 srcs: ["mylib.cpp"],
710 shared_libs: ["mylib2"],
711 system_shared_libs: [],
712 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000713 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800714 }
715
716 cc_library {
717 name: "mylib2",
718 srcs: ["mylib.cpp"],
719 system_shared_libs: [],
720 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000721 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800722 }
723 `)
724
Sundong Ahnabb64432019-10-22 13:58:29 +0900725 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800726 copyCmds := zipApexRule.Args["copy_commands"]
727
728 // Ensure that main rule creates an output
729 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
730
731 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700732 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800733
734 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700735 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800736
737 // Ensure that both direct and indirect deps are copied into apex
738 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
739 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900740}
741
742func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700743 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900744 apex {
745 name: "myapex",
746 key: "myapex.key",
747 native_shared_libs: ["mylib", "mylib3"],
748 }
749
750 apex_key {
751 name: "myapex.key",
752 public_key: "testkey.avbpubkey",
753 private_key: "testkey.pem",
754 }
755
756 cc_library {
757 name: "mylib",
758 srcs: ["mylib.cpp"],
759 shared_libs: ["mylib2", "mylib3"],
760 system_shared_libs: [],
761 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000762 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900763 }
764
765 cc_library {
766 name: "mylib2",
767 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900768 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900769 system_shared_libs: [],
770 stl: "none",
771 stubs: {
772 versions: ["1", "2", "3"],
773 },
774 }
775
776 cc_library {
777 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900778 srcs: ["mylib.cpp"],
779 shared_libs: ["mylib4"],
780 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900781 stl: "none",
782 stubs: {
783 versions: ["10", "11", "12"],
784 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000785 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900786 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900787
788 cc_library {
789 name: "mylib4",
790 srcs: ["mylib.cpp"],
791 system_shared_libs: [],
792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000793 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900794 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900795 `)
796
Sundong Ahnabb64432019-10-22 13:58:29 +0900797 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900798 copyCmds := apexRule.Args["copy_commands"]
799
800 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800801 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802
803 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800804 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900805
806 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800807 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900808
Colin Crossaede88c2020-08-11 12:17:01 -0700809 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900810
811 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900812 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900813 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900814 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900815
816 // 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 -0700817 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900818 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700819 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900820
821 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900822 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900823 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900824
825 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700826 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900827
Jooyung Hana57af4a2020-01-23 05:36:59 +0000828 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900829 "lib64/mylib.so",
830 "lib64/mylib3.so",
831 "lib64/mylib4.so",
832 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900833}
834
Colin Cross7812fd32020-09-25 12:35:10 -0700835func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
836 t.Parallel()
837 ctx, _ := testApex(t, `
838 apex {
839 name: "myapex",
840 key: "myapex.key",
841 native_shared_libs: ["mylib", "mylib3"],
842 min_sdk_version: "29",
843 }
844
845 apex_key {
846 name: "myapex.key",
847 public_key: "testkey.avbpubkey",
848 private_key: "testkey.pem",
849 }
850
851 cc_library {
852 name: "mylib",
853 srcs: ["mylib.cpp"],
854 shared_libs: ["mylib2", "mylib3"],
855 system_shared_libs: [],
856 stl: "none",
857 apex_available: [ "myapex" ],
858 min_sdk_version: "28",
859 }
860
861 cc_library {
862 name: "mylib2",
863 srcs: ["mylib.cpp"],
864 cflags: ["-include mylib.h"],
865 system_shared_libs: [],
866 stl: "none",
867 stubs: {
868 versions: ["28", "29", "30", "current"],
869 },
870 min_sdk_version: "28",
871 }
872
873 cc_library {
874 name: "mylib3",
875 srcs: ["mylib.cpp"],
876 shared_libs: ["mylib4"],
877 system_shared_libs: [],
878 stl: "none",
879 stubs: {
880 versions: ["28", "29", "30", "current"],
881 },
882 apex_available: [ "myapex" ],
883 min_sdk_version: "28",
884 }
885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
891 apex_available: [ "myapex" ],
892 min_sdk_version: "28",
893 }
894 `)
895
896 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
897 copyCmds := apexRule.Args["copy_commands"]
898
899 // Ensure that direct non-stubs dep is always included
900 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
901
902 // Ensure that indirect stubs dep is not included
903 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
904
905 // Ensure that direct stubs dep is included
906 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
907
908 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
909
910 // Ensure that mylib is linking with the version 29 stubs for mylib2
911 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
912 // ... and not linking to the non-stub (impl) variant of mylib2
913 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
914
915 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
916 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
917 // .. and not linking to the stubs variant of mylib3
918 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
919
920 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700921 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700922 ensureNotContains(t, mylib2Cflags, "-include ")
923
924 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700925 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700926
927 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
928 "lib64/mylib.so",
929 "lib64/mylib3.so",
930 "lib64/mylib4.so",
931 })
932}
933
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900934func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700935 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900936 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900937 name: "myapex2",
938 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900939 native_shared_libs: ["mylib"],
940 }
941
942 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900943 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900944 public_key: "testkey.avbpubkey",
945 private_key: "testkey.pem",
946 }
947
948 cc_library {
949 name: "mylib",
950 srcs: ["mylib.cpp"],
951 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900952 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900953 system_shared_libs: [],
954 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000955 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900956 }
957
958 cc_library {
959 name: "libfoo",
960 srcs: ["mylib.cpp"],
961 shared_libs: ["libbar"],
962 system_shared_libs: [],
963 stl: "none",
964 stubs: {
965 versions: ["10", "20", "30"],
966 },
967 }
968
969 cc_library {
970 name: "libbar",
971 srcs: ["mylib.cpp"],
972 system_shared_libs: [],
973 stl: "none",
974 }
975
Jiyong Park678c8812020-02-07 17:25:49 +0900976 cc_library_static {
977 name: "libbaz",
978 srcs: ["mylib.cpp"],
979 system_shared_libs: [],
980 stl: "none",
981 apex_available: [ "myapex2" ],
982 }
983
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900984 `)
985
Jiyong Park83dc74b2020-01-14 18:38:44 +0900986 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900987 copyCmds := apexRule.Args["copy_commands"]
988
989 // Ensure that direct non-stubs dep is always included
990 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
991
992 // Ensure that indirect stubs dep is not included
993 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
994
995 // Ensure that dependency of stubs is not included
996 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
997
Colin Crossaede88c2020-08-11 12:17:01 -0700998 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900999
1000 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001001 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001002 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001003 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001004
Jiyong Park3ff16992019-12-27 14:11:47 +09001005 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001006
1007 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1008 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001009
Artur Satayeva8bd1132020-04-27 18:07:06 +01001010 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001011 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1012 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1013 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001014
Artur Satayeva8bd1132020-04-27 18:07:06 +01001015 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001016 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1017 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1018 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001019}
1020
Jooyung Hand3639552019-08-09 12:57:43 +09001021func TestApexWithRuntimeLibsDependency(t *testing.T) {
1022 /*
1023 myapex
1024 |
1025 v (runtime_libs)
1026 mylib ------+------> libfoo [provides stub]
1027 |
1028 `------> libbar
1029 */
1030 ctx, _ := testApex(t, `
1031 apex {
1032 name: "myapex",
1033 key: "myapex.key",
1034 native_shared_libs: ["mylib"],
1035 }
1036
1037 apex_key {
1038 name: "myapex.key",
1039 public_key: "testkey.avbpubkey",
1040 private_key: "testkey.pem",
1041 }
1042
1043 cc_library {
1044 name: "mylib",
1045 srcs: ["mylib.cpp"],
1046 runtime_libs: ["libfoo", "libbar"],
1047 system_shared_libs: [],
1048 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001049 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001050 }
1051
1052 cc_library {
1053 name: "libfoo",
1054 srcs: ["mylib.cpp"],
1055 system_shared_libs: [],
1056 stl: "none",
1057 stubs: {
1058 versions: ["10", "20", "30"],
1059 },
1060 }
1061
1062 cc_library {
1063 name: "libbar",
1064 srcs: ["mylib.cpp"],
1065 system_shared_libs: [],
1066 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001067 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001068 }
1069
1070 `)
1071
Sundong Ahnabb64432019-10-22 13:58:29 +09001072 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001073 copyCmds := apexRule.Args["copy_commands"]
1074
1075 // Ensure that direct non-stubs dep is always included
1076 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1077
1078 // Ensure that indirect stubs dep is not included
1079 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1080
1081 // Ensure that runtime_libs dep in included
1082 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1083
Sundong Ahnabb64432019-10-22 13:58:29 +09001084 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001085 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1086 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001087
1088}
1089
Jooyung Han8ce8db92020-05-15 19:05:05 +09001090func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1091 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1092 bp := `
1093 apex {
1094 name: "com.android.runtime",
1095 key: "com.android.runtime.key",
1096 native_shared_libs: ["libc"],
1097 }
1098
1099 apex_key {
1100 name: "com.android.runtime.key",
1101 public_key: "testkey.avbpubkey",
1102 private_key: "testkey.pem",
1103 }
1104
1105 cc_library {
1106 name: "libc",
1107 no_libcrt: true,
1108 nocrt: true,
1109 stl: "none",
1110 system_shared_libs: [],
1111 stubs: { versions: ["1"] },
1112 apex_available: ["com.android.runtime"],
1113
1114 sanitize: {
1115 hwaddress: true,
1116 }
1117 }
1118
1119 cc_prebuilt_library_shared {
1120 name: "libclang_rt.hwasan-aarch64-android",
1121 no_libcrt: true,
1122 nocrt: true,
1123 stl: "none",
1124 system_shared_libs: [],
1125 srcs: [""],
1126 stubs: { versions: ["1"] },
1127
1128 sanitize: {
1129 never: true,
1130 },
1131 }
1132 `
1133 // override bp to use hard-coded names: com.android.runtime and libc
1134 fs["Android.bp"] = []byte(bp)
1135 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1136 })
1137
1138 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1139 "lib64/bionic/libc.so",
1140 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1141 })
1142
1143 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1144
1145 installed := hwasan.Description("install libclang_rt.hwasan")
1146 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1147
1148 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1149 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1150 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1151}
1152
1153func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1154 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1155 bp := `
1156 apex {
1157 name: "com.android.runtime",
1158 key: "com.android.runtime.key",
1159 native_shared_libs: ["libc"],
1160 }
1161
1162 apex_key {
1163 name: "com.android.runtime.key",
1164 public_key: "testkey.avbpubkey",
1165 private_key: "testkey.pem",
1166 }
1167
1168 cc_library {
1169 name: "libc",
1170 no_libcrt: true,
1171 nocrt: true,
1172 stl: "none",
1173 system_shared_libs: [],
1174 stubs: { versions: ["1"] },
1175 apex_available: ["com.android.runtime"],
1176 }
1177
1178 cc_prebuilt_library_shared {
1179 name: "libclang_rt.hwasan-aarch64-android",
1180 no_libcrt: true,
1181 nocrt: true,
1182 stl: "none",
1183 system_shared_libs: [],
1184 srcs: [""],
1185 stubs: { versions: ["1"] },
1186
1187 sanitize: {
1188 never: true,
1189 },
1190 }
1191 `
1192 // override bp to use hard-coded names: com.android.runtime and libc
1193 fs["Android.bp"] = []byte(bp)
1194 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1195
1196 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1197 })
1198
1199 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1200 "lib64/bionic/libc.so",
1201 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1202 })
1203
1204 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1205
1206 installed := hwasan.Description("install libclang_rt.hwasan")
1207 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1208
1209 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1210 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1211 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1212}
1213
Jooyung Han61b66e92020-03-21 14:21:46 +00001214func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1215 testcases := []struct {
1216 name string
1217 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001218 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001219 shouldLink string
1220 shouldNotLink []string
1221 }{
1222 {
Jooyung Han75568392020-03-20 04:29:24 +09001223 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001224 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001225 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001226 shouldLink: "30",
1227 shouldNotLink: []string{"29"},
1228 },
1229 {
1230 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001231 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001232 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001233 shouldLink: "29",
1234 shouldNotLink: []string{"30"},
1235 },
1236 }
1237 for _, tc := range testcases {
1238 t.Run(tc.name, func(t *testing.T) {
1239 ctx, _ := testApex(t, `
1240 apex {
1241 name: "myapex",
1242 key: "myapex.key",
1243 use_vendor: true,
1244 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001245 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001246 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001247
Jooyung Han61b66e92020-03-21 14:21:46 +00001248 apex_key {
1249 name: "myapex.key",
1250 public_key: "testkey.avbpubkey",
1251 private_key: "testkey.pem",
1252 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001253
Jooyung Han61b66e92020-03-21 14:21:46 +00001254 cc_library {
1255 name: "mylib",
1256 srcs: ["mylib.cpp"],
1257 vendor_available: true,
1258 shared_libs: ["libbar"],
1259 system_shared_libs: [],
1260 stl: "none",
1261 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001262 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001263 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001264
Jooyung Han61b66e92020-03-21 14:21:46 +00001265 cc_library {
1266 name: "libbar",
1267 srcs: ["mylib.cpp"],
1268 system_shared_libs: [],
1269 stl: "none",
1270 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001271 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001272 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001273
Jooyung Han61b66e92020-03-21 14:21:46 +00001274 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001275 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001276 symbol_file: "",
1277 }
1278 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001279 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001280 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001281
Jooyung Han61b66e92020-03-21 14:21:46 +00001282 // Ensure that LLNDK dep is not included
1283 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1284 "lib64/mylib.so",
1285 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001286
Jooyung Han61b66e92020-03-21 14:21:46 +00001287 // Ensure that LLNDK dep is required
1288 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1289 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1290 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001291
Colin Crossaede88c2020-08-11 12:17:01 -07001292 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001293 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1294 for _, ver := range tc.shouldNotLink {
1295 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1296 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001297
Colin Crossaede88c2020-08-11 12:17:01 -07001298 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001299 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1300 })
1301 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001302}
1303
Jiyong Park25fc6a92018-11-18 18:02:45 +09001304func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001305 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001306 apex {
1307 name: "myapex",
1308 key: "myapex.key",
1309 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1310 }
1311
1312 apex_key {
1313 name: "myapex.key",
1314 public_key: "testkey.avbpubkey",
1315 private_key: "testkey.pem",
1316 }
1317
1318 cc_library {
1319 name: "mylib",
1320 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001321 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001322 shared_libs: ["libdl#27"],
1323 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001324 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001325 }
1326
1327 cc_library_shared {
1328 name: "mylib_shared",
1329 srcs: ["mylib.cpp"],
1330 shared_libs: ["libdl#27"],
1331 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001332 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001333 }
1334
1335 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001336 name: "libBootstrap",
1337 srcs: ["mylib.cpp"],
1338 stl: "none",
1339 bootstrap: true,
1340 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001341 `)
1342
Sundong Ahnabb64432019-10-22 13:58:29 +09001343 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001344 copyCmds := apexRule.Args["copy_commands"]
1345
1346 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001347 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001348 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1349 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001350
1351 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001352 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001353
Colin Crossaede88c2020-08-11 12:17:01 -07001354 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1355 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1356 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001357
1358 // For dependency to libc
1359 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001360 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001361 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001362 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001363 // ... Cflags from stub is correctly exported to mylib
1364 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1365 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1366
1367 // For dependency to libm
1368 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001369 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001370 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001371 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001372 // ... and is not compiling with the stub
1373 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1374 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1375
1376 // For dependency to libdl
1377 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001378 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001379 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001380 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1381 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001382 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001383 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001384 // ... Cflags from stub is correctly exported to mylib
1385 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1386 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001387
1388 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001389 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1390 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1391 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1392 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001393}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001394
Jooyung Han749dc692020-04-15 11:03:39 +09001395func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001396 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001397 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1398 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001399 // 3) (platform) -> liba -> libz : this should be non-stub link
1400 ctx, _ := testApex(t, `
1401 apex {
1402 name: "myapex",
1403 key: "myapex.key",
1404 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001405 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001406 }
1407
1408 apex {
1409 name: "otherapex",
1410 key: "myapex.key",
1411 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001412 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001413 }
1414
1415 apex_key {
1416 name: "myapex.key",
1417 public_key: "testkey.avbpubkey",
1418 private_key: "testkey.pem",
1419 }
1420
1421 cc_library {
1422 name: "libx",
1423 shared_libs: ["liba"],
1424 system_shared_libs: [],
1425 stl: "none",
1426 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001427 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001428 }
1429
1430 cc_library {
1431 name: "liby",
1432 shared_libs: ["liba"],
1433 system_shared_libs: [],
1434 stl: "none",
1435 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001436 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001437 }
1438
1439 cc_library {
1440 name: "liba",
1441 shared_libs: ["libz"],
1442 system_shared_libs: [],
1443 stl: "none",
1444 apex_available: [
1445 "//apex_available:anyapex",
1446 "//apex_available:platform",
1447 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001448 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001449 }
1450
1451 cc_library {
1452 name: "libz",
1453 system_shared_libs: [],
1454 stl: "none",
1455 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001456 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001457 },
1458 }
Jooyung Han749dc692020-04-15 11:03:39 +09001459 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001460
1461 expectLink := func(from, from_variant, to, to_variant string) {
1462 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1463 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1464 }
1465 expectNoLink := func(from, from_variant, to, to_variant string) {
1466 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1467 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1468 }
1469 // platform liba is linked to non-stub version
1470 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001471 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001472 expectLink("liba", "shared_apex29", "libz", "shared_28")
1473 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1474 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001475 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001476 expectLink("liba", "shared_apex30", "libz", "shared_30")
1477 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1478 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001479}
1480
Jooyung Hanaed150d2020-04-02 01:41:41 +09001481func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1482 ctx, _ := testApex(t, `
1483 apex {
1484 name: "myapex",
1485 key: "myapex.key",
1486 native_shared_libs: ["libx"],
1487 min_sdk_version: "R",
1488 }
1489
1490 apex_key {
1491 name: "myapex.key",
1492 public_key: "testkey.avbpubkey",
1493 private_key: "testkey.pem",
1494 }
1495
1496 cc_library {
1497 name: "libx",
1498 shared_libs: ["libz"],
1499 system_shared_libs: [],
1500 stl: "none",
1501 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001502 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001503 }
1504
1505 cc_library {
1506 name: "libz",
1507 system_shared_libs: [],
1508 stl: "none",
1509 stubs: {
1510 versions: ["29", "R"],
1511 },
1512 }
1513 `, func(fs map[string][]byte, config android.Config) {
1514 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1515 })
1516
1517 expectLink := func(from, from_variant, to, to_variant string) {
1518 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1519 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1520 }
1521 expectNoLink := func(from, from_variant, to, to_variant string) {
1522 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1523 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1524 }
Dan Albertc8060532020-07-22 22:32:17 -07001525 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001526 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1527 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001528}
1529
Jooyung Han749dc692020-04-15 11:03:39 +09001530func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001531 ctx, _ := testApex(t, `
1532 apex {
1533 name: "myapex",
1534 key: "myapex.key",
1535 native_shared_libs: ["libx"],
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: ["libz"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 apex_available: [ "myapex" ],
1550 }
1551
1552 cc_library {
1553 name: "libz",
1554 system_shared_libs: [],
1555 stl: "none",
1556 stubs: {
1557 versions: ["1", "2"],
1558 },
1559 }
1560 `)
1561
1562 expectLink := func(from, from_variant, to, to_variant string) {
1563 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1564 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1565 }
1566 expectNoLink := func(from, from_variant, to, to_variant string) {
1567 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1568 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1569 }
Colin Crossaede88c2020-08-11 12:17:01 -07001570 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1571 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1572 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001573}
1574
1575func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1576 ctx, _ := testApex(t, `
1577 apex {
1578 name: "myapex",
1579 key: "myapex.key",
1580 native_shared_libs: ["libx"],
1581 }
1582
1583 apex_key {
1584 name: "myapex.key",
1585 public_key: "testkey.avbpubkey",
1586 private_key: "testkey.pem",
1587 }
1588
1589 cc_library {
1590 name: "libx",
1591 system_shared_libs: [],
1592 stl: "none",
1593 apex_available: [ "myapex" ],
1594 stubs: {
1595 versions: ["1", "2"],
1596 },
1597 }
1598
1599 cc_library {
1600 name: "libz",
1601 shared_libs: ["libx"],
1602 system_shared_libs: [],
1603 stl: "none",
1604 }
1605 `)
1606
1607 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001608 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001609 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1610 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1611 }
1612 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001613 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001614 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1615 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1616 }
1617 expectLink("libz", "shared", "libx", "shared_2")
1618 expectNoLink("libz", "shared", "libz", "shared_1")
1619 expectNoLink("libz", "shared", "libz", "shared")
1620}
1621
Jooyung Han75568392020-03-20 04:29:24 +09001622func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001623 ctx, _ := testApex(t, `
1624 apex {
1625 name: "myapex",
1626 key: "myapex.key",
1627 native_shared_libs: ["libx"],
1628 min_sdk_version: "29",
1629 }
1630
1631 apex_key {
1632 name: "myapex.key",
1633 public_key: "testkey.avbpubkey",
1634 private_key: "testkey.pem",
1635 }
1636
1637 cc_library {
1638 name: "libx",
1639 shared_libs: ["libbar"],
1640 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001641 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001642 }
1643
1644 cc_library {
1645 name: "libbar",
1646 stubs: {
1647 versions: ["29", "30"],
1648 },
1649 }
Jooyung Han75568392020-03-20 04:29:24 +09001650 `, func(fs map[string][]byte, config android.Config) {
1651 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1652 })
Jooyung Han03b51852020-02-26 22:45:42 +09001653 expectLink := func(from, from_variant, to, to_variant string) {
1654 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1655 libFlags := ld.Args["libFlags"]
1656 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1657 }
Colin Crossaede88c2020-08-11 12:17:01 -07001658 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001659}
1660
Jooyung Han75568392020-03-20 04:29:24 +09001661func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001662 ctx, _ := testApex(t, `
1663 apex {
1664 name: "myapex",
1665 key: "myapex.key",
1666 native_shared_libs: ["libx"],
1667 min_sdk_version: "29",
1668 }
1669
1670 apex_key {
1671 name: "myapex.key",
1672 public_key: "testkey.avbpubkey",
1673 private_key: "testkey.pem",
1674 }
1675
1676 cc_library {
1677 name: "libx",
1678 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001679 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001680 }
Jooyung Han75568392020-03-20 04:29:24 +09001681 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001682
1683 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001684 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001685 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1686 // note that platform variant is not.
1687 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1688 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001689}
1690
Jooyung Han749dc692020-04-15 11:03:39 +09001691func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001692 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001693 apex {
1694 name: "myapex",
1695 key: "myapex.key",
1696 native_shared_libs: ["libx"],
1697 min_sdk_version: "29",
1698 }
1699
1700 apex_key {
1701 name: "myapex.key",
1702 public_key: "testkey.avbpubkey",
1703 private_key: "testkey.pem",
1704 }
1705
1706 cc_library {
1707 name: "libx",
1708 shared_libs: ["libz"],
1709 system_shared_libs: [],
1710 stl: "none",
1711 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001712 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001713 }
1714
1715 cc_library {
1716 name: "libz",
1717 system_shared_libs: [],
1718 stl: "none",
1719 stubs: {
1720 versions: ["30"],
1721 },
1722 }
Jooyung Han75568392020-03-20 04:29:24 +09001723 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001724}
Jooyung Han03b51852020-02-26 22:45:42 +09001725
Jooyung Han749dc692020-04-15 11:03:39 +09001726func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1727 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001728 apex {
1729 name: "myapex",
1730 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001731 native_shared_libs: ["mylib"],
1732 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001733 }
1734
1735 apex_key {
1736 name: "myapex.key",
1737 public_key: "testkey.avbpubkey",
1738 private_key: "testkey.pem",
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740
1741 cc_library {
1742 name: "mylib",
1743 srcs: ["mylib.cpp"],
1744 system_shared_libs: [],
1745 stl: "none",
1746 apex_available: [
1747 "myapex",
1748 ],
1749 min_sdk_version: "30",
1750 }
1751 `)
1752}
1753
1754func TestApexMinSdkVersion_Okay(t *testing.T) {
1755 testApex(t, `
1756 apex {
1757 name: "myapex",
1758 key: "myapex.key",
1759 native_shared_libs: ["libfoo"],
1760 java_libs: ["libbar"],
1761 min_sdk_version: "29",
1762 }
1763
1764 apex_key {
1765 name: "myapex.key",
1766 public_key: "testkey.avbpubkey",
1767 private_key: "testkey.pem",
1768 }
1769
1770 cc_library {
1771 name: "libfoo",
1772 srcs: ["mylib.cpp"],
1773 shared_libs: ["libfoo_dep"],
1774 apex_available: ["myapex"],
1775 min_sdk_version: "29",
1776 }
1777
1778 cc_library {
1779 name: "libfoo_dep",
1780 srcs: ["mylib.cpp"],
1781 apex_available: ["myapex"],
1782 min_sdk_version: "29",
1783 }
1784
1785 java_library {
1786 name: "libbar",
1787 sdk_version: "current",
1788 srcs: ["a.java"],
1789 static_libs: ["libbar_dep"],
1790 apex_available: ["myapex"],
1791 min_sdk_version: "29",
1792 }
1793
1794 java_library {
1795 name: "libbar_dep",
1796 sdk_version: "current",
1797 srcs: ["a.java"],
1798 apex_available: ["myapex"],
1799 min_sdk_version: "29",
1800 }
Jooyung Han03b51852020-02-26 22:45:42 +09001801 `)
1802}
1803
Artur Satayev8cf899a2020-04-15 17:29:42 +01001804func TestJavaStableSdkVersion(t *testing.T) {
1805 testCases := []struct {
1806 name string
1807 expectedError string
1808 bp string
1809 }{
1810 {
1811 name: "Non-updatable apex with non-stable dep",
1812 bp: `
1813 apex {
1814 name: "myapex",
1815 java_libs: ["myjar"],
1816 key: "myapex.key",
1817 }
1818 apex_key {
1819 name: "myapex.key",
1820 public_key: "testkey.avbpubkey",
1821 private_key: "testkey.pem",
1822 }
1823 java_library {
1824 name: "myjar",
1825 srcs: ["foo/bar/MyClass.java"],
1826 sdk_version: "core_platform",
1827 apex_available: ["myapex"],
1828 }
1829 `,
1830 },
1831 {
1832 name: "Updatable apex with stable dep",
1833 bp: `
1834 apex {
1835 name: "myapex",
1836 java_libs: ["myjar"],
1837 key: "myapex.key",
1838 updatable: true,
1839 min_sdk_version: "29",
1840 }
1841 apex_key {
1842 name: "myapex.key",
1843 public_key: "testkey.avbpubkey",
1844 private_key: "testkey.pem",
1845 }
1846 java_library {
1847 name: "myjar",
1848 srcs: ["foo/bar/MyClass.java"],
1849 sdk_version: "current",
1850 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001851 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001852 }
1853 `,
1854 },
1855 {
1856 name: "Updatable apex with non-stable dep",
1857 expectedError: "cannot depend on \"myjar\"",
1858 bp: `
1859 apex {
1860 name: "myapex",
1861 java_libs: ["myjar"],
1862 key: "myapex.key",
1863 updatable: true,
1864 }
1865 apex_key {
1866 name: "myapex.key",
1867 public_key: "testkey.avbpubkey",
1868 private_key: "testkey.pem",
1869 }
1870 java_library {
1871 name: "myjar",
1872 srcs: ["foo/bar/MyClass.java"],
1873 sdk_version: "core_platform",
1874 apex_available: ["myapex"],
1875 }
1876 `,
1877 },
1878 {
1879 name: "Updatable apex with non-stable transitive dep",
1880 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1881 bp: `
1882 apex {
1883 name: "myapex",
1884 java_libs: ["myjar"],
1885 key: "myapex.key",
1886 updatable: true,
1887 }
1888 apex_key {
1889 name: "myapex.key",
1890 public_key: "testkey.avbpubkey",
1891 private_key: "testkey.pem",
1892 }
1893 java_library {
1894 name: "myjar",
1895 srcs: ["foo/bar/MyClass.java"],
1896 sdk_version: "current",
1897 apex_available: ["myapex"],
1898 static_libs: ["transitive-jar"],
1899 }
1900 java_library {
1901 name: "transitive-jar",
1902 srcs: ["foo/bar/MyClass.java"],
1903 sdk_version: "core_platform",
1904 apex_available: ["myapex"],
1905 }
1906 `,
1907 },
1908 }
1909
1910 for _, test := range testCases {
1911 t.Run(test.name, func(t *testing.T) {
1912 if test.expectedError == "" {
1913 testApex(t, test.bp)
1914 } else {
1915 testApexError(t, test.expectedError, test.bp)
1916 }
1917 })
1918 }
1919}
1920
Jooyung Han749dc692020-04-15 11:03:39 +09001921func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1922 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1923 apex {
1924 name: "myapex",
1925 key: "myapex.key",
1926 native_shared_libs: ["mylib"],
1927 min_sdk_version: "29",
1928 }
1929
1930 apex_key {
1931 name: "myapex.key",
1932 public_key: "testkey.avbpubkey",
1933 private_key: "testkey.pem",
1934 }
1935
1936 cc_library {
1937 name: "mylib",
1938 srcs: ["mylib.cpp"],
1939 shared_libs: ["mylib2"],
1940 system_shared_libs: [],
1941 stl: "none",
1942 apex_available: [
1943 "myapex",
1944 ],
1945 min_sdk_version: "29",
1946 }
1947
1948 // indirect part of the apex
1949 cc_library {
1950 name: "mylib2",
1951 srcs: ["mylib.cpp"],
1952 system_shared_libs: [],
1953 stl: "none",
1954 apex_available: [
1955 "myapex",
1956 ],
1957 min_sdk_version: "30",
1958 }
1959 `)
1960}
1961
1962func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1963 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1964 apex {
1965 name: "myapex",
1966 key: "myapex.key",
1967 apps: ["AppFoo"],
1968 min_sdk_version: "29",
1969 }
1970
1971 apex_key {
1972 name: "myapex.key",
1973 public_key: "testkey.avbpubkey",
1974 private_key: "testkey.pem",
1975 }
1976
1977 android_app {
1978 name: "AppFoo",
1979 srcs: ["foo/bar/MyClass.java"],
1980 sdk_version: "current",
1981 min_sdk_version: "29",
1982 system_modules: "none",
1983 stl: "none",
1984 static_libs: ["bar"],
1985 apex_available: [ "myapex" ],
1986 }
1987
1988 java_library {
1989 name: "bar",
1990 sdk_version: "current",
1991 srcs: ["a.java"],
1992 apex_available: [ "myapex" ],
1993 }
1994 `)
1995}
1996
1997func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1998 ctx, _ := testApex(t, `
1999 apex {
2000 name: "myapex",
2001 key: "myapex.key",
2002 native_shared_libs: ["mylib"],
2003 min_sdk_version: "29",
2004 }
2005
2006 apex_key {
2007 name: "myapex.key",
2008 public_key: "testkey.avbpubkey",
2009 private_key: "testkey.pem",
2010 }
2011
2012 // mylib in myapex will link to mylib2#29
2013 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2014 cc_library {
2015 name: "mylib",
2016 srcs: ["mylib.cpp"],
2017 shared_libs: ["mylib2"],
2018 system_shared_libs: [],
2019 stl: "none",
2020 apex_available: ["myapex", "otherapex"],
2021 min_sdk_version: "29",
2022 }
2023
2024 cc_library {
2025 name: "mylib2",
2026 srcs: ["mylib.cpp"],
2027 system_shared_libs: [],
2028 stl: "none",
2029 apex_available: ["otherapex"],
2030 stubs: { versions: ["29", "30"] },
2031 min_sdk_version: "30",
2032 }
2033
2034 apex {
2035 name: "otherapex",
2036 key: "myapex.key",
2037 native_shared_libs: ["mylib", "mylib2"],
2038 min_sdk_version: "30",
2039 }
2040 `)
2041 expectLink := func(from, from_variant, to, to_variant string) {
2042 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2043 libFlags := ld.Args["libFlags"]
2044 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2045 }
Colin Crossaede88c2020-08-11 12:17:01 -07002046 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2047 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002048}
2049
Jiyong Park7c2ee712018-12-07 00:42:25 +09002050func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002051 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002052 apex {
2053 name: "myapex",
2054 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002055 native_shared_libs: ["mylib"],
2056 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002057 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002058 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002059 }
2060
2061 apex_key {
2062 name: "myapex.key",
2063 public_key: "testkey.avbpubkey",
2064 private_key: "testkey.pem",
2065 }
2066
2067 prebuilt_etc {
2068 name: "myetc",
2069 src: "myprebuilt",
2070 sub_dir: "foo/bar",
2071 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002072
2073 cc_library {
2074 name: "mylib",
2075 srcs: ["mylib.cpp"],
2076 relative_install_path: "foo/bar",
2077 system_shared_libs: [],
2078 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002079 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002080 }
2081
2082 cc_binary {
2083 name: "mybin",
2084 srcs: ["mylib.cpp"],
2085 relative_install_path: "foo/bar",
2086 system_shared_libs: [],
2087 static_executable: true,
2088 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002089 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002090 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002091 `)
2092
Sundong Ahnabb64432019-10-22 13:58:29 +09002093 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002094 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2095
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002096 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002097 ensureListContains(t, dirs, "etc")
2098 ensureListContains(t, dirs, "etc/foo")
2099 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002100 ensureListContains(t, dirs, "lib64")
2101 ensureListContains(t, dirs, "lib64/foo")
2102 ensureListContains(t, dirs, "lib64/foo/bar")
2103 ensureListContains(t, dirs, "lib")
2104 ensureListContains(t, dirs, "lib/foo")
2105 ensureListContains(t, dirs, "lib/foo/bar")
2106
Jiyong Parkbd13e442019-03-15 18:10:35 +09002107 ensureListContains(t, dirs, "bin")
2108 ensureListContains(t, dirs, "bin/foo")
2109 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002110}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002111
Jooyung Han35155c42020-02-06 17:33:20 +09002112func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2113 ctx, _ := testApex(t, `
2114 apex {
2115 name: "myapex",
2116 key: "myapex.key",
2117 multilib: {
2118 both: {
2119 native_shared_libs: ["mylib"],
2120 binaries: ["mybin"],
2121 },
2122 },
2123 compile_multilib: "both",
2124 native_bridge_supported: true,
2125 }
2126
2127 apex_key {
2128 name: "myapex.key",
2129 public_key: "testkey.avbpubkey",
2130 private_key: "testkey.pem",
2131 }
2132
2133 cc_library {
2134 name: "mylib",
2135 relative_install_path: "foo/bar",
2136 system_shared_libs: [],
2137 stl: "none",
2138 apex_available: [ "myapex" ],
2139 native_bridge_supported: true,
2140 }
2141
2142 cc_binary {
2143 name: "mybin",
2144 relative_install_path: "foo/bar",
2145 system_shared_libs: [],
2146 static_executable: true,
2147 stl: "none",
2148 apex_available: [ "myapex" ],
2149 native_bridge_supported: true,
2150 compile_multilib: "both", // default is "first" for binary
2151 multilib: {
2152 lib64: {
2153 suffix: "64",
2154 },
2155 },
2156 }
2157 `, withNativeBridgeEnabled)
2158 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2159 "bin/foo/bar/mybin",
2160 "bin/foo/bar/mybin64",
2161 "bin/arm/foo/bar/mybin",
2162 "bin/arm64/foo/bar/mybin64",
2163 "lib/foo/bar/mylib.so",
2164 "lib/arm/foo/bar/mylib.so",
2165 "lib64/foo/bar/mylib.so",
2166 "lib64/arm64/foo/bar/mylib.so",
2167 })
2168}
2169
Jiyong Parkda6eb592018-12-19 17:12:36 +09002170func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002171 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002172 apex {
2173 name: "myapex",
2174 key: "myapex.key",
2175 native_shared_libs: ["mylib"],
2176 use_vendor: true,
2177 }
2178
2179 apex_key {
2180 name: "myapex.key",
2181 public_key: "testkey.avbpubkey",
2182 private_key: "testkey.pem",
2183 }
2184
2185 cc_library {
2186 name: "mylib",
2187 srcs: ["mylib.cpp"],
2188 shared_libs: ["mylib2"],
2189 system_shared_libs: [],
2190 vendor_available: true,
2191 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002192 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002193 }
2194
2195 cc_library {
2196 name: "mylib2",
2197 srcs: ["mylib.cpp"],
2198 system_shared_libs: [],
2199 vendor_available: true,
2200 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002201 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002202 }
Jooyung Handc782442019-11-01 03:14:38 +09002203 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002204 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002205 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002206
2207 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002208 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002209 for _, implicit := range i.Implicits {
2210 inputsList = append(inputsList, implicit.String())
2211 }
2212 }
2213 inputsString := strings.Join(inputsList, " ")
2214
2215 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002216 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2217 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002218
2219 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002220 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2221 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002222}
Jiyong Park16e91a02018-12-20 18:18:08 +09002223
Jooyung Han85d61762020-06-24 23:50:26 +09002224func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002225 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2226 apex {
2227 name: "myapex",
2228 key: "myapex.key",
2229 use_vendor: true,
2230 }
2231 apex_key {
2232 name: "myapex.key",
2233 public_key: "testkey.avbpubkey",
2234 private_key: "testkey.pem",
2235 }
2236 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002237 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002238 })
Colin Cross440e0d02020-06-11 11:32:11 -07002239 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002240 testApex(t, `
2241 apex {
2242 name: "myapex",
2243 key: "myapex.key",
2244 use_vendor: true,
2245 }
2246 apex_key {
2247 name: "myapex.key",
2248 public_key: "testkey.avbpubkey",
2249 private_key: "testkey.pem",
2250 }
2251 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002252 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002253 })
2254}
2255
Jooyung Han5c998b92019-06-27 11:30:33 +09002256func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2257 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2258 apex {
2259 name: "myapex",
2260 key: "myapex.key",
2261 native_shared_libs: ["mylib"],
2262 use_vendor: true,
2263 }
2264
2265 apex_key {
2266 name: "myapex.key",
2267 public_key: "testkey.avbpubkey",
2268 private_key: "testkey.pem",
2269 }
2270
2271 cc_library {
2272 name: "mylib",
2273 srcs: ["mylib.cpp"],
2274 system_shared_libs: [],
2275 stl: "none",
2276 }
2277 `)
2278}
2279
Jooyung Han85d61762020-06-24 23:50:26 +09002280func TestVendorApex(t *testing.T) {
2281 ctx, config := testApex(t, `
2282 apex {
2283 name: "myapex",
2284 key: "myapex.key",
2285 binaries: ["mybin"],
2286 vendor: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 cc_binary {
2294 name: "mybin",
2295 vendor: true,
2296 shared_libs: ["libfoo"],
2297 }
2298 cc_library {
2299 name: "libfoo",
2300 proprietary: true,
2301 }
2302 `)
2303
2304 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2305 "bin/mybin",
2306 "lib64/libfoo.so",
2307 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2308 "lib64/libc++.so",
2309 })
2310
2311 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2312 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2313 name := apexBundle.BaseModuleName()
2314 prefix := "TARGET_"
2315 var builder strings.Builder
2316 data.Custom(&builder, name, prefix, "", data)
2317 androidMk := builder.String()
2318 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002319
2320 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2321 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2322 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002323}
2324
Jooyung Handf78e212020-07-22 15:54:47 +09002325func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2326 ctx, _ := testApex(t, `
2327 apex {
2328 name: "myapex",
2329 key: "myapex.key",
2330 binaries: ["mybin"],
2331 vendor: true,
2332 use_vndk_as_stable: true,
2333 }
2334 apex_key {
2335 name: "myapex.key",
2336 public_key: "testkey.avbpubkey",
2337 private_key: "testkey.pem",
2338 }
2339 cc_binary {
2340 name: "mybin",
2341 vendor: true,
2342 shared_libs: ["libvndk", "libvendor"],
2343 }
2344 cc_library {
2345 name: "libvndk",
2346 vndk: {
2347 enabled: true,
2348 },
2349 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002350 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002351 }
2352 cc_library {
2353 name: "libvendor",
2354 vendor: true,
2355 }
2356 `)
2357
2358 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2359
Colin Crossaede88c2020-08-11 12:17:01 -07002360 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002361 libs := names(ldRule.Args["libFlags"])
2362 // VNDK libs(libvndk/libc++) as they are
2363 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2364 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2365 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002366 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002367
2368 // VNDK libs are not included when use_vndk_as_stable: true
2369 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2370 "bin/mybin",
2371 "lib64/libvendor.so",
2372 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002373
2374 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2375 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2376 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002377}
2378
Jooyung Han8e5685d2020-09-21 11:02:57 +09002379func TestApex_withPrebuiltFirmware(t *testing.T) {
2380 testCases := []struct {
2381 name string
2382 additionalProp string
2383 }{
2384 {"system apex with prebuilt_firmware", ""},
2385 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2386 }
2387 for _, tc := range testCases {
2388 t.Run(tc.name, func(t *testing.T) {
2389 ctx, _ := testApex(t, `
2390 apex {
2391 name: "myapex",
2392 key: "myapex.key",
2393 prebuilts: ["myfirmware"],
2394 `+tc.additionalProp+`
2395 }
2396 apex_key {
2397 name: "myapex.key",
2398 public_key: "testkey.avbpubkey",
2399 private_key: "testkey.pem",
2400 }
2401 prebuilt_firmware {
2402 name: "myfirmware",
2403 src: "myfirmware.bin",
2404 filename_from_src: true,
2405 `+tc.additionalProp+`
2406 }
2407 `)
2408 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2409 "etc/firmware/myfirmware.bin",
2410 })
2411 })
2412 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002413}
2414
Jooyung Hanefb184e2020-06-25 17:14:25 +09002415func TestAndroidMk_UseVendorRequired(t *testing.T) {
2416 ctx, config := testApex(t, `
2417 apex {
2418 name: "myapex",
2419 key: "myapex.key",
2420 use_vendor: true,
2421 native_shared_libs: ["mylib"],
2422 }
2423
2424 apex_key {
2425 name: "myapex.key",
2426 public_key: "testkey.avbpubkey",
2427 private_key: "testkey.pem",
2428 }
2429
2430 cc_library {
2431 name: "mylib",
2432 vendor_available: true,
2433 apex_available: ["myapex"],
2434 }
2435 `, func(fs map[string][]byte, config android.Config) {
2436 setUseVendorAllowListForTest(config, []string{"myapex"})
2437 })
2438
2439 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2440 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2441 name := apexBundle.BaseModuleName()
2442 prefix := "TARGET_"
2443 var builder strings.Builder
2444 data.Custom(&builder, name, prefix, "", data)
2445 androidMk := builder.String()
2446 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2447}
2448
2449func TestAndroidMk_VendorApexRequired(t *testing.T) {
2450 ctx, config := testApex(t, `
2451 apex {
2452 name: "myapex",
2453 key: "myapex.key",
2454 vendor: true,
2455 native_shared_libs: ["mylib"],
2456 }
2457
2458 apex_key {
2459 name: "myapex.key",
2460 public_key: "testkey.avbpubkey",
2461 private_key: "testkey.pem",
2462 }
2463
2464 cc_library {
2465 name: "mylib",
2466 vendor_available: true,
2467 }
2468 `)
2469
2470 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2471 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2472 name := apexBundle.BaseModuleName()
2473 prefix := "TARGET_"
2474 var builder strings.Builder
2475 data.Custom(&builder, name, prefix, "", data)
2476 androidMk := builder.String()
2477 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2478}
2479
Jooyung Han2ed99d02020-06-24 23:26:26 +09002480func TestAndroidMkWritesCommonProperties(t *testing.T) {
2481 ctx, config := testApex(t, `
2482 apex {
2483 name: "myapex",
2484 key: "myapex.key",
2485 vintf_fragments: ["fragment.xml"],
2486 init_rc: ["init.rc"],
2487 }
2488 apex_key {
2489 name: "myapex.key",
2490 public_key: "testkey.avbpubkey",
2491 private_key: "testkey.pem",
2492 }
2493 cc_binary {
2494 name: "mybin",
2495 }
2496 `)
2497
2498 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2499 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2500 name := apexBundle.BaseModuleName()
2501 prefix := "TARGET_"
2502 var builder strings.Builder
2503 data.Custom(&builder, name, prefix, "", data)
2504 androidMk := builder.String()
2505 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2506 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2507}
2508
Jiyong Park16e91a02018-12-20 18:18:08 +09002509func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002510 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002511 apex {
2512 name: "myapex",
2513 key: "myapex.key",
2514 native_shared_libs: ["mylib"],
2515 }
2516
2517 apex_key {
2518 name: "myapex.key",
2519 public_key: "testkey.avbpubkey",
2520 private_key: "testkey.pem",
2521 }
2522
2523 cc_library {
2524 name: "mylib",
2525 srcs: ["mylib.cpp"],
2526 system_shared_libs: [],
2527 stl: "none",
2528 stubs: {
2529 versions: ["1", "2", "3"],
2530 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002531 apex_available: [
2532 "//apex_available:platform",
2533 "myapex",
2534 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002535 }
2536
2537 cc_binary {
2538 name: "not_in_apex",
2539 srcs: ["mylib.cpp"],
2540 static_libs: ["mylib"],
2541 static_executable: true,
2542 system_shared_libs: [],
2543 stl: "none",
2544 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002545 `)
2546
Colin Cross7113d202019-11-20 16:39:12 -08002547 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002548
2549 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002550 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002551}
Jiyong Park9335a262018-12-24 11:31:58 +09002552
2553func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002554 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002555 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002556 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002557 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002558 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002559 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002560 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002561 }
2562
2563 cc_library {
2564 name: "mylib",
2565 srcs: ["mylib.cpp"],
2566 system_shared_libs: [],
2567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002568 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002569 }
2570
2571 apex_key {
2572 name: "myapex.key",
2573 public_key: "testkey.avbpubkey",
2574 private_key: "testkey.pem",
2575 }
2576
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002577 android_app_certificate {
2578 name: "myapex.certificate",
2579 certificate: "testkey",
2580 }
2581
2582 android_app_certificate {
2583 name: "myapex.certificate.override",
2584 certificate: "testkey.override",
2585 }
2586
Jiyong Park9335a262018-12-24 11:31:58 +09002587 `)
2588
2589 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002590 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002591
2592 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2593 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2594 "vendor/foo/devkeys/testkey.avbpubkey")
2595 }
2596 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2597 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2598 "vendor/foo/devkeys/testkey.pem")
2599 }
2600
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002601 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002602 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002603 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002604 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002605 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002606 }
2607}
Jiyong Park58e364a2019-01-19 19:24:06 +09002608
Jooyung Hanf121a652019-12-17 14:30:11 +09002609func TestCertificate(t *testing.T) {
2610 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2611 ctx, _ := testApex(t, `
2612 apex {
2613 name: "myapex",
2614 key: "myapex.key",
2615 }
2616 apex_key {
2617 name: "myapex.key",
2618 public_key: "testkey.avbpubkey",
2619 private_key: "testkey.pem",
2620 }`)
2621 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2622 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2623 if actual := rule.Args["certificates"]; actual != expected {
2624 t.Errorf("certificates should be %q, not %q", expected, actual)
2625 }
2626 })
2627 t.Run("override when unspecified", func(t *testing.T) {
2628 ctx, _ := testApex(t, `
2629 apex {
2630 name: "myapex_keytest",
2631 key: "myapex.key",
2632 file_contexts: ":myapex-file_contexts",
2633 }
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639 android_app_certificate {
2640 name: "myapex.certificate.override",
2641 certificate: "testkey.override",
2642 }`)
2643 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2644 expected := "testkey.override.x509.pem testkey.override.pk8"
2645 if actual := rule.Args["certificates"]; actual != expected {
2646 t.Errorf("certificates should be %q, not %q", expected, actual)
2647 }
2648 })
2649 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2650 ctx, _ := testApex(t, `
2651 apex {
2652 name: "myapex",
2653 key: "myapex.key",
2654 certificate: ":myapex.certificate",
2655 }
2656 apex_key {
2657 name: "myapex.key",
2658 public_key: "testkey.avbpubkey",
2659 private_key: "testkey.pem",
2660 }
2661 android_app_certificate {
2662 name: "myapex.certificate",
2663 certificate: "testkey",
2664 }`)
2665 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2666 expected := "testkey.x509.pem testkey.pk8"
2667 if actual := rule.Args["certificates"]; actual != expected {
2668 t.Errorf("certificates should be %q, not %q", expected, actual)
2669 }
2670 })
2671 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2672 ctx, _ := testApex(t, `
2673 apex {
2674 name: "myapex_keytest",
2675 key: "myapex.key",
2676 file_contexts: ":myapex-file_contexts",
2677 certificate: ":myapex.certificate",
2678 }
2679 apex_key {
2680 name: "myapex.key",
2681 public_key: "testkey.avbpubkey",
2682 private_key: "testkey.pem",
2683 }
2684 android_app_certificate {
2685 name: "myapex.certificate.override",
2686 certificate: "testkey.override",
2687 }`)
2688 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2689 expected := "testkey.override.x509.pem testkey.override.pk8"
2690 if actual := rule.Args["certificates"]; actual != expected {
2691 t.Errorf("certificates should be %q, not %q", expected, actual)
2692 }
2693 })
2694 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2695 ctx, _ := testApex(t, `
2696 apex {
2697 name: "myapex",
2698 key: "myapex.key",
2699 certificate: "testkey",
2700 }
2701 apex_key {
2702 name: "myapex.key",
2703 public_key: "testkey.avbpubkey",
2704 private_key: "testkey.pem",
2705 }`)
2706 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2707 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2708 if actual := rule.Args["certificates"]; actual != expected {
2709 t.Errorf("certificates should be %q, not %q", expected, actual)
2710 }
2711 })
2712 t.Run("override when specified as <name>", func(t *testing.T) {
2713 ctx, _ := testApex(t, `
2714 apex {
2715 name: "myapex_keytest",
2716 key: "myapex.key",
2717 file_contexts: ":myapex-file_contexts",
2718 certificate: "testkey",
2719 }
2720 apex_key {
2721 name: "myapex.key",
2722 public_key: "testkey.avbpubkey",
2723 private_key: "testkey.pem",
2724 }
2725 android_app_certificate {
2726 name: "myapex.certificate.override",
2727 certificate: "testkey.override",
2728 }`)
2729 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2730 expected := "testkey.override.x509.pem testkey.override.pk8"
2731 if actual := rule.Args["certificates"]; actual != expected {
2732 t.Errorf("certificates should be %q, not %q", expected, actual)
2733 }
2734 })
2735}
2736
Jiyong Park58e364a2019-01-19 19:24:06 +09002737func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002738 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002739 apex {
2740 name: "myapex",
2741 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002742 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002743 }
2744
2745 apex {
2746 name: "otherapex",
2747 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002748 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002749 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002750 }
2751
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757
2758 cc_library {
2759 name: "mylib",
2760 srcs: ["mylib.cpp"],
2761 system_shared_libs: [],
2762 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002763 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002764 "myapex",
2765 "otherapex",
2766 ],
Jooyung Han24282772020-03-21 23:20:55 +09002767 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002768 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002769 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002770 cc_library {
2771 name: "mylib2",
2772 srcs: ["mylib.cpp"],
2773 system_shared_libs: [],
2774 stl: "none",
2775 apex_available: [
2776 "myapex",
2777 "otherapex",
2778 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002779 static_libs: ["mylib3"],
2780 recovery_available: true,
2781 min_sdk_version: "29",
2782 }
2783 cc_library {
2784 name: "mylib3",
2785 srcs: ["mylib.cpp"],
2786 system_shared_libs: [],
2787 stl: "none",
2788 apex_available: [
2789 "myapex",
2790 "otherapex",
2791 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002792 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002793 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002794 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002795 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002796 `)
2797
Jooyung Hanc87a0592020-03-02 17:44:33 +09002798 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002799 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002800 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002801 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002802
Jooyung Hanccce2f22020-03-07 03:45:53 +09002803 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002804 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002805 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002806 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002807 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002808
Jooyung Hanccce2f22020-03-07 03:45:53 +09002809 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002810 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002811 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002812 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002813 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002814
Colin Crossaede88c2020-08-11 12:17:01 -07002815 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2816 // each variant defines additional macros to distinguish which apex variant it is built for
2817
2818 // non-APEX variant does not have __ANDROID_APEX__ defined
2819 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2820 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2821
2822 // APEX variant has __ANDROID_APEX__ defined
2823 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2824 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2825 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2826 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2827
2828 // APEX variant has __ANDROID_APEX__ defined
2829 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2830 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2831 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2832 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2833
2834 // recovery variant does not set __ANDROID_SDK_VERSION__
2835 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2836 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2837 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2838
2839 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2840 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002841
2842 // non-APEX variant does not have __ANDROID_APEX__ defined
2843 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2844 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2845
2846 // APEX variant has __ANDROID_APEX__ defined
2847 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002848 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002849 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002850 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002851
Jooyung Hanc87a0592020-03-02 17:44:33 +09002852 // APEX variant has __ANDROID_APEX__ defined
2853 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002854 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002855 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002856 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002857
2858 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002859 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002860 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2861 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002862}
Jiyong Park7e636d02019-01-28 16:16:54 +09002863
2864func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002865 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002866 apex {
2867 name: "myapex",
2868 key: "myapex.key",
2869 native_shared_libs: ["mylib"],
2870 }
2871
2872 apex_key {
2873 name: "myapex.key",
2874 public_key: "testkey.avbpubkey",
2875 private_key: "testkey.pem",
2876 }
2877
2878 cc_library_headers {
2879 name: "mylib_headers",
2880 export_include_dirs: ["my_include"],
2881 system_shared_libs: [],
2882 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002883 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002884 }
2885
2886 cc_library {
2887 name: "mylib",
2888 srcs: ["mylib.cpp"],
2889 system_shared_libs: [],
2890 stl: "none",
2891 header_libs: ["mylib_headers"],
2892 export_header_lib_headers: ["mylib_headers"],
2893 stubs: {
2894 versions: ["1", "2", "3"],
2895 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002896 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002897 }
2898
2899 cc_library {
2900 name: "otherlib",
2901 srcs: ["mylib.cpp"],
2902 system_shared_libs: [],
2903 stl: "none",
2904 shared_libs: ["mylib"],
2905 }
2906 `)
2907
Colin Cross7113d202019-11-20 16:39:12 -08002908 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002909
2910 // Ensure that the include path of the header lib is exported to 'otherlib'
2911 ensureContains(t, cFlags, "-Imy_include")
2912}
Alex Light9670d332019-01-29 18:07:33 -08002913
Jiyong Park7cd10e32020-01-14 09:22:18 +09002914type fileInApex struct {
2915 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002916 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002917 isLink bool
2918}
2919
Jooyung Hana57af4a2020-01-23 05:36:59 +00002920func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002921 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002922 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002923 copyCmds := apexRule.Args["copy_commands"]
2924 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002925 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002926 for _, cmd := range strings.Split(copyCmds, "&&") {
2927 cmd = strings.TrimSpace(cmd)
2928 if cmd == "" {
2929 continue
2930 }
2931 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002932 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002933 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002934 switch terms[0] {
2935 case "mkdir":
2936 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002937 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002938 t.Fatal("copyCmds contains invalid cp command", cmd)
2939 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002940 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002941 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002942 isLink = false
2943 case "ln":
2944 if len(terms) != 3 && len(terms) != 4 {
2945 // ln LINK TARGET or ln -s LINK TARGET
2946 t.Fatal("copyCmds contains invalid ln command", cmd)
2947 }
2948 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002949 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002950 isLink = true
2951 default:
2952 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2953 }
2954 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002955 index := strings.Index(dst, imageApexDir)
2956 if index == -1 {
2957 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2958 }
2959 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002960 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002961 }
2962 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002963 return ret
2964}
2965
Jooyung Hana57af4a2020-01-23 05:36:59 +00002966func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2967 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002968 var failed bool
2969 var surplus []string
2970 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002971 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002972 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002973 for _, expected := range files {
2974 if matched, _ := path.Match(expected, file.path); matched {
2975 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002976 mactchFound = true
2977 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002978 }
2979 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002980 if !mactchFound {
2981 surplus = append(surplus, file.path)
2982 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002983 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002984
Jooyung Han31c470b2019-10-18 16:26:59 +09002985 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002986 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002987 t.Log("surplus files", surplus)
2988 failed = true
2989 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002990
2991 if len(files) > len(filesMatched) {
2992 var missing []string
2993 for _, expected := range files {
2994 if !filesMatched[expected] {
2995 missing = append(missing, expected)
2996 }
2997 }
2998 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002999 t.Log("missing files", missing)
3000 failed = true
3001 }
3002 if failed {
3003 t.Fail()
3004 }
3005}
3006
Jooyung Han344d5432019-08-23 11:17:39 +09003007func TestVndkApexCurrent(t *testing.T) {
3008 ctx, _ := testApex(t, `
3009 apex_vndk {
3010 name: "myapex",
3011 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003012 }
3013
3014 apex_key {
3015 name: "myapex.key",
3016 public_key: "testkey.avbpubkey",
3017 private_key: "testkey.pem",
3018 }
3019
3020 cc_library {
3021 name: "libvndk",
3022 srcs: ["mylib.cpp"],
3023 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003024 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003025 vndk: {
3026 enabled: true,
3027 },
3028 system_shared_libs: [],
3029 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003030 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003031 }
3032
3033 cc_library {
3034 name: "libvndksp",
3035 srcs: ["mylib.cpp"],
3036 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003037 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003038 vndk: {
3039 enabled: true,
3040 support_system_process: true,
3041 },
3042 system_shared_libs: [],
3043 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003044 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003045 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003046 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003047
Jooyung Hana57af4a2020-01-23 05:36:59 +00003048 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003049 "lib/libvndk.so",
3050 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003051 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003052 "lib64/libvndk.so",
3053 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003054 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003055 "etc/llndk.libraries.VER.txt",
3056 "etc/vndkcore.libraries.VER.txt",
3057 "etc/vndksp.libraries.VER.txt",
3058 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003059 })
Jooyung Han344d5432019-08-23 11:17:39 +09003060}
3061
3062func TestVndkApexWithPrebuilt(t *testing.T) {
3063 ctx, _ := testApex(t, `
3064 apex_vndk {
3065 name: "myapex",
3066 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003067 }
3068
3069 apex_key {
3070 name: "myapex.key",
3071 public_key: "testkey.avbpubkey",
3072 private_key: "testkey.pem",
3073 }
3074
3075 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003076 name: "libvndk",
3077 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003078 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003079 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003080 vndk: {
3081 enabled: true,
3082 },
3083 system_shared_libs: [],
3084 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003085 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003086 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003087
3088 cc_prebuilt_library_shared {
3089 name: "libvndk.arm",
3090 srcs: ["libvndk.arm.so"],
3091 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003092 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003093 vndk: {
3094 enabled: true,
3095 },
3096 enabled: false,
3097 arch: {
3098 arm: {
3099 enabled: true,
3100 },
3101 },
3102 system_shared_libs: [],
3103 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003104 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003105 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003106 `+vndkLibrariesTxtFiles("current"),
3107 withFiles(map[string][]byte{
3108 "libvndk.so": nil,
3109 "libvndk.arm.so": nil,
3110 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003111
Jooyung Hana57af4a2020-01-23 05:36:59 +00003112 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003113 "lib/libvndk.so",
3114 "lib/libvndk.arm.so",
3115 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003116 "lib/libc++.so",
3117 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003118 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003119 })
Jooyung Han344d5432019-08-23 11:17:39 +09003120}
3121
Jooyung Han39edb6c2019-11-06 16:53:07 +09003122func vndkLibrariesTxtFiles(vers ...string) (result string) {
3123 for _, v := range vers {
3124 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003125 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003126 result += `
3127 vndk_libraries_txt {
3128 name: "` + txt + `.libraries.txt",
3129 }
3130 `
3131 }
3132 } else {
3133 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3134 result += `
3135 prebuilt_etc {
3136 name: "` + txt + `.libraries.` + v + `.txt",
3137 src: "dummy.txt",
3138 }
3139 `
3140 }
3141 }
3142 }
3143 return
3144}
3145
Jooyung Han344d5432019-08-23 11:17:39 +09003146func TestVndkApexVersion(t *testing.T) {
3147 ctx, _ := testApex(t, `
3148 apex_vndk {
3149 name: "myapex_v27",
3150 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003151 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003152 vndk_version: "27",
3153 }
3154
3155 apex_key {
3156 name: "myapex.key",
3157 public_key: "testkey.avbpubkey",
3158 private_key: "testkey.pem",
3159 }
3160
Jooyung Han31c470b2019-10-18 16:26:59 +09003161 vndk_prebuilt_shared {
3162 name: "libvndk27",
3163 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003164 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003165 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003166 vndk: {
3167 enabled: true,
3168 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003169 target_arch: "arm64",
3170 arch: {
3171 arm: {
3172 srcs: ["libvndk27_arm.so"],
3173 },
3174 arm64: {
3175 srcs: ["libvndk27_arm64.so"],
3176 },
3177 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003178 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003179 }
3180
3181 vndk_prebuilt_shared {
3182 name: "libvndk27",
3183 version: "27",
3184 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003185 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003186 vndk: {
3187 enabled: true,
3188 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003189 target_arch: "x86_64",
3190 arch: {
3191 x86: {
3192 srcs: ["libvndk27_x86.so"],
3193 },
3194 x86_64: {
3195 srcs: ["libvndk27_x86_64.so"],
3196 },
3197 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003198 }
3199 `+vndkLibrariesTxtFiles("27"),
3200 withFiles(map[string][]byte{
3201 "libvndk27_arm.so": nil,
3202 "libvndk27_arm64.so": nil,
3203 "libvndk27_x86.so": nil,
3204 "libvndk27_x86_64.so": nil,
3205 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003206
Jooyung Hana57af4a2020-01-23 05:36:59 +00003207 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003208 "lib/libvndk27_arm.so",
3209 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003210 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003211 })
Jooyung Han344d5432019-08-23 11:17:39 +09003212}
3213
3214func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3215 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3216 apex_vndk {
3217 name: "myapex_v27",
3218 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003219 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003220 vndk_version: "27",
3221 }
3222 apex_vndk {
3223 name: "myapex_v27_other",
3224 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003225 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003226 vndk_version: "27",
3227 }
3228
3229 apex_key {
3230 name: "myapex.key",
3231 public_key: "testkey.avbpubkey",
3232 private_key: "testkey.pem",
3233 }
3234
3235 cc_library {
3236 name: "libvndk",
3237 srcs: ["mylib.cpp"],
3238 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003239 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003240 vndk: {
3241 enabled: true,
3242 },
3243 system_shared_libs: [],
3244 stl: "none",
3245 }
3246
3247 vndk_prebuilt_shared {
3248 name: "libvndk",
3249 version: "27",
3250 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003251 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003252 vndk: {
3253 enabled: true,
3254 },
3255 srcs: ["libvndk.so"],
3256 }
3257 `, withFiles(map[string][]byte{
3258 "libvndk.so": nil,
3259 }))
3260}
3261
Jooyung Han90eee022019-10-01 20:02:42 +09003262func TestVndkApexNameRule(t *testing.T) {
3263 ctx, _ := testApex(t, `
3264 apex_vndk {
3265 name: "myapex",
3266 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003267 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003268 }
3269 apex_vndk {
3270 name: "myapex_v28",
3271 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003272 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003273 vndk_version: "28",
3274 }
3275 apex_key {
3276 name: "myapex.key",
3277 public_key: "testkey.avbpubkey",
3278 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003279 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003280
3281 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003282 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003283 actual := proptools.String(bundle.properties.Apex_name)
3284 if !reflect.DeepEqual(actual, expected) {
3285 t.Errorf("Got '%v', expected '%v'", actual, expected)
3286 }
3287 }
3288
3289 assertApexName("com.android.vndk.vVER", "myapex")
3290 assertApexName("com.android.vndk.v28", "myapex_v28")
3291}
3292
Jooyung Han344d5432019-08-23 11:17:39 +09003293func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3294 ctx, _ := testApex(t, `
3295 apex_vndk {
3296 name: "myapex",
3297 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003298 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003299 }
3300
3301 apex_key {
3302 name: "myapex.key",
3303 public_key: "testkey.avbpubkey",
3304 private_key: "testkey.pem",
3305 }
3306
3307 cc_library {
3308 name: "libvndk",
3309 srcs: ["mylib.cpp"],
3310 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003311 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003312 native_bridge_supported: true,
3313 host_supported: true,
3314 vndk: {
3315 enabled: true,
3316 },
3317 system_shared_libs: [],
3318 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003319 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003320 }
Jooyung Han35155c42020-02-06 17:33:20 +09003321 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003322
Jooyung Hana57af4a2020-01-23 05:36:59 +00003323 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003324 "lib/libvndk.so",
3325 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003326 "lib/libc++.so",
3327 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003328 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003329 })
Jooyung Han344d5432019-08-23 11:17:39 +09003330}
3331
3332func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3333 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3334 apex_vndk {
3335 name: "myapex",
3336 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003337 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003338 native_bridge_supported: true,
3339 }
3340
3341 apex_key {
3342 name: "myapex.key",
3343 public_key: "testkey.avbpubkey",
3344 private_key: "testkey.pem",
3345 }
3346
3347 cc_library {
3348 name: "libvndk",
3349 srcs: ["mylib.cpp"],
3350 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003351 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003352 native_bridge_supported: true,
3353 host_supported: true,
3354 vndk: {
3355 enabled: true,
3356 },
3357 system_shared_libs: [],
3358 stl: "none",
3359 }
3360 `)
3361}
3362
Jooyung Han31c470b2019-10-18 16:26:59 +09003363func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003364 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003365 apex_vndk {
3366 name: "myapex_v27",
3367 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003368 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003369 vndk_version: "27",
3370 }
3371
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377
3378 vndk_prebuilt_shared {
3379 name: "libvndk27",
3380 version: "27",
3381 target_arch: "arm",
3382 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003383 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003384 vndk: {
3385 enabled: true,
3386 },
3387 arch: {
3388 arm: {
3389 srcs: ["libvndk27.so"],
3390 }
3391 },
3392 }
3393
3394 vndk_prebuilt_shared {
3395 name: "libvndk27",
3396 version: "27",
3397 target_arch: "arm",
3398 binder32bit: true,
3399 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003400 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003401 vndk: {
3402 enabled: true,
3403 },
3404 arch: {
3405 arm: {
3406 srcs: ["libvndk27binder32.so"],
3407 }
3408 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003409 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003410 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003411 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003412 withFiles(map[string][]byte{
3413 "libvndk27.so": nil,
3414 "libvndk27binder32.so": nil,
3415 }),
3416 withBinder32bit,
3417 withTargets(map[android.OsType][]android.Target{
3418 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003419 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3420 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003421 },
3422 }),
3423 )
3424
Jooyung Hana57af4a2020-01-23 05:36:59 +00003425 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003427 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003428 })
3429}
3430
Jooyung Han45a96772020-06-15 14:59:42 +09003431func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3432 ctx, _ := testApex(t, `
3433 apex_vndk {
3434 name: "myapex",
3435 key: "myapex.key",
3436 file_contexts: ":myapex-file_contexts",
3437 }
3438
3439 apex_key {
3440 name: "myapex.key",
3441 public_key: "testkey.avbpubkey",
3442 private_key: "testkey.pem",
3443 }
3444
3445 cc_library {
3446 name: "libz",
3447 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003448 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003449 vndk: {
3450 enabled: true,
3451 },
3452 stubs: {
3453 symbol_file: "libz.map.txt",
3454 versions: ["30"],
3455 }
3456 }
3457 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3458 "libz.map.txt": nil,
3459 }))
3460
3461 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3462 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3463 ensureListEmpty(t, provideNativeLibs)
3464}
3465
Jooyung Hane1633032019-08-01 17:41:43 +09003466func TestDependenciesInApexManifest(t *testing.T) {
3467 ctx, _ := testApex(t, `
3468 apex {
3469 name: "myapex_nodep",
3470 key: "myapex.key",
3471 native_shared_libs: ["lib_nodep"],
3472 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003473 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003474 }
3475
3476 apex {
3477 name: "myapex_dep",
3478 key: "myapex.key",
3479 native_shared_libs: ["lib_dep"],
3480 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003481 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003482 }
3483
3484 apex {
3485 name: "myapex_provider",
3486 key: "myapex.key",
3487 native_shared_libs: ["libfoo"],
3488 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003489 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003490 }
3491
3492 apex {
3493 name: "myapex_selfcontained",
3494 key: "myapex.key",
3495 native_shared_libs: ["lib_dep", "libfoo"],
3496 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003497 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003498 }
3499
3500 apex_key {
3501 name: "myapex.key",
3502 public_key: "testkey.avbpubkey",
3503 private_key: "testkey.pem",
3504 }
3505
3506 cc_library {
3507 name: "lib_nodep",
3508 srcs: ["mylib.cpp"],
3509 system_shared_libs: [],
3510 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003511 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003512 }
3513
3514 cc_library {
3515 name: "lib_dep",
3516 srcs: ["mylib.cpp"],
3517 shared_libs: ["libfoo"],
3518 system_shared_libs: [],
3519 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003520 apex_available: [
3521 "myapex_dep",
3522 "myapex_provider",
3523 "myapex_selfcontained",
3524 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003525 }
3526
3527 cc_library {
3528 name: "libfoo",
3529 srcs: ["mytest.cpp"],
3530 stubs: {
3531 versions: ["1"],
3532 },
3533 system_shared_libs: [],
3534 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003535 apex_available: [
3536 "myapex_provider",
3537 "myapex_selfcontained",
3538 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003539 }
3540 `)
3541
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003542 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003543 var provideNativeLibs, requireNativeLibs []string
3544
Sundong Ahnabb64432019-10-22 13:58:29 +09003545 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003546 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3547 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003548 ensureListEmpty(t, provideNativeLibs)
3549 ensureListEmpty(t, requireNativeLibs)
3550
Sundong Ahnabb64432019-10-22 13:58:29 +09003551 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003552 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3553 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003554 ensureListEmpty(t, provideNativeLibs)
3555 ensureListContains(t, requireNativeLibs, "libfoo.so")
3556
Sundong Ahnabb64432019-10-22 13:58:29 +09003557 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003558 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3559 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003560 ensureListContains(t, provideNativeLibs, "libfoo.so")
3561 ensureListEmpty(t, requireNativeLibs)
3562
Sundong Ahnabb64432019-10-22 13:58:29 +09003563 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003564 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3565 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003566 ensureListContains(t, provideNativeLibs, "libfoo.so")
3567 ensureListEmpty(t, requireNativeLibs)
3568}
3569
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003570func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003571 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003572 apex {
3573 name: "myapex",
3574 key: "myapex.key",
3575 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003576 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003577 }
3578
3579 apex_key {
3580 name: "myapex.key",
3581 public_key: "testkey.avbpubkey",
3582 private_key: "testkey.pem",
3583 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003584
3585 cc_library {
3586 name: "mylib",
3587 srcs: ["mylib.cpp"],
3588 system_shared_libs: [],
3589 stl: "none",
3590 apex_available: [
3591 "//apex_available:platform",
3592 "myapex",
3593 ],
3594 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003595 `)
3596
Sundong Ahnabb64432019-10-22 13:58:29 +09003597 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003598 apexManifestRule := module.Rule("apexManifestRule")
3599 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3600 apexRule := module.Rule("apexRule")
3601 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003602
3603 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3604 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3605 name := apexBundle.BaseModuleName()
3606 prefix := "TARGET_"
3607 var builder strings.Builder
3608 data.Custom(&builder, name, prefix, "", data)
3609 androidMk := builder.String()
3610 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3611 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003612}
3613
Alex Light0851b882019-02-07 13:20:53 -08003614func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003615 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003616 apex {
3617 name: "myapex",
3618 key: "myapex.key",
3619 native_shared_libs: ["mylib_common"],
3620 }
3621
3622 apex_key {
3623 name: "myapex.key",
3624 public_key: "testkey.avbpubkey",
3625 private_key: "testkey.pem",
3626 }
3627
3628 cc_library {
3629 name: "mylib_common",
3630 srcs: ["mylib.cpp"],
3631 system_shared_libs: [],
3632 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003633 apex_available: [
3634 "//apex_available:platform",
3635 "myapex",
3636 ],
Alex Light0851b882019-02-07 13:20:53 -08003637 }
3638 `)
3639
Sundong Ahnabb64432019-10-22 13:58:29 +09003640 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003641 apexRule := module.Rule("apexRule")
3642 copyCmds := apexRule.Args["copy_commands"]
3643
3644 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3645 t.Log("Apex was a test apex!")
3646 t.Fail()
3647 }
3648 // Ensure that main rule creates an output
3649 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3650
3651 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003652 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003653
3654 // Ensure that both direct and indirect deps are copied into apex
3655 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3656
Colin Cross7113d202019-11-20 16:39:12 -08003657 // Ensure that the platform variant ends with _shared
3658 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003659
Colin Cross56a83212020-09-15 18:30:11 -07003660 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003661 t.Log("Found mylib_common not in any apex!")
3662 t.Fail()
3663 }
3664}
3665
3666func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003667 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003668 apex_test {
3669 name: "myapex",
3670 key: "myapex.key",
3671 native_shared_libs: ["mylib_common_test"],
3672 }
3673
3674 apex_key {
3675 name: "myapex.key",
3676 public_key: "testkey.avbpubkey",
3677 private_key: "testkey.pem",
3678 }
3679
3680 cc_library {
3681 name: "mylib_common_test",
3682 srcs: ["mylib.cpp"],
3683 system_shared_libs: [],
3684 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003685 // TODO: remove //apex_available:platform
3686 apex_available: [
3687 "//apex_available:platform",
3688 "myapex",
3689 ],
Alex Light0851b882019-02-07 13:20:53 -08003690 }
3691 `)
3692
Sundong Ahnabb64432019-10-22 13:58:29 +09003693 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003694 apexRule := module.Rule("apexRule")
3695 copyCmds := apexRule.Args["copy_commands"]
3696
3697 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3698 t.Log("Apex was not a test apex!")
3699 t.Fail()
3700 }
3701 // Ensure that main rule creates an output
3702 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3703
3704 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003705 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003706
3707 // Ensure that both direct and indirect deps are copied into apex
3708 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3709
Colin Cross7113d202019-11-20 16:39:12 -08003710 // Ensure that the platform variant ends with _shared
3711 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003712}
3713
Alex Light9670d332019-01-29 18:07:33 -08003714func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003715 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003716 apex {
3717 name: "myapex",
3718 key: "myapex.key",
3719 multilib: {
3720 first: {
3721 native_shared_libs: ["mylib_common"],
3722 }
3723 },
3724 target: {
3725 android: {
3726 multilib: {
3727 first: {
3728 native_shared_libs: ["mylib"],
3729 }
3730 }
3731 },
3732 host: {
3733 multilib: {
3734 first: {
3735 native_shared_libs: ["mylib2"],
3736 }
3737 }
3738 }
3739 }
3740 }
3741
3742 apex_key {
3743 name: "myapex.key",
3744 public_key: "testkey.avbpubkey",
3745 private_key: "testkey.pem",
3746 }
3747
3748 cc_library {
3749 name: "mylib",
3750 srcs: ["mylib.cpp"],
3751 system_shared_libs: [],
3752 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003753 // TODO: remove //apex_available:platform
3754 apex_available: [
3755 "//apex_available:platform",
3756 "myapex",
3757 ],
Alex Light9670d332019-01-29 18:07:33 -08003758 }
3759
3760 cc_library {
3761 name: "mylib_common",
3762 srcs: ["mylib.cpp"],
3763 system_shared_libs: [],
3764 stl: "none",
3765 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003766 // TODO: remove //apex_available:platform
3767 apex_available: [
3768 "//apex_available:platform",
3769 "myapex",
3770 ],
Alex Light9670d332019-01-29 18:07:33 -08003771 }
3772
3773 cc_library {
3774 name: "mylib2",
3775 srcs: ["mylib.cpp"],
3776 system_shared_libs: [],
3777 stl: "none",
3778 compile_multilib: "first",
3779 }
3780 `)
3781
Sundong Ahnabb64432019-10-22 13:58:29 +09003782 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003783 copyCmds := apexRule.Args["copy_commands"]
3784
3785 // Ensure that main rule creates an output
3786 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3787
3788 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003789 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3790 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3791 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003792
3793 // Ensure that both direct and indirect deps are copied into apex
3794 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3795 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3796 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3797
Colin Cross7113d202019-11-20 16:39:12 -08003798 // Ensure that the platform variant ends with _shared
3799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3800 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003802}
Jiyong Park04480cf2019-02-06 00:16:29 +09003803
3804func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003805 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003806 apex {
3807 name: "myapex",
3808 key: "myapex.key",
3809 binaries: ["myscript"],
3810 }
3811
3812 apex_key {
3813 name: "myapex.key",
3814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
3817
3818 sh_binary {
3819 name: "myscript",
3820 src: "mylib.cpp",
3821 filename: "myscript.sh",
3822 sub_dir: "script",
3823 }
3824 `)
3825
Sundong Ahnabb64432019-10-22 13:58:29 +09003826 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003827 copyCmds := apexRule.Args["copy_commands"]
3828
3829 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3830}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003831
Jooyung Han91df2082019-11-20 01:49:42 +09003832func TestApexInVariousPartition(t *testing.T) {
3833 testcases := []struct {
3834 propName, parition, flattenedPartition string
3835 }{
3836 {"", "system", "system_ext"},
3837 {"product_specific: true", "product", "product"},
3838 {"soc_specific: true", "vendor", "vendor"},
3839 {"proprietary: true", "vendor", "vendor"},
3840 {"vendor: true", "vendor", "vendor"},
3841 {"system_ext_specific: true", "system_ext", "system_ext"},
3842 }
3843 for _, tc := range testcases {
3844 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3845 ctx, _ := testApex(t, `
3846 apex {
3847 name: "myapex",
3848 key: "myapex.key",
3849 `+tc.propName+`
3850 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003851
Jooyung Han91df2082019-11-20 01:49:42 +09003852 apex_key {
3853 name: "myapex.key",
3854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003858
Jooyung Han91df2082019-11-20 01:49:42 +09003859 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3860 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3861 actual := apex.installDir.String()
3862 if actual != expected {
3863 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3864 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003865
Jooyung Han91df2082019-11-20 01:49:42 +09003866 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3867 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3868 actual = flattened.installDir.String()
3869 if actual != expected {
3870 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3871 }
3872 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003873 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003874}
Jiyong Park67882562019-03-21 01:11:21 +09003875
Jooyung Han580eb4f2020-06-24 19:33:06 +09003876func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003877 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003878 apex {
3879 name: "myapex",
3880 key: "myapex.key",
3881 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003882
Jooyung Han580eb4f2020-06-24 19:33:06 +09003883 apex_key {
3884 name: "myapex.key",
3885 public_key: "testkey.avbpubkey",
3886 private_key: "testkey.pem",
3887 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003888 `)
3889 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003890 rule := module.Output("file_contexts")
3891 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3892}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003893
Jooyung Han580eb4f2020-06-24 19:33:06 +09003894func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003895 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003896 apex {
3897 name: "myapex",
3898 key: "myapex.key",
3899 file_contexts: "my_own_file_contexts",
3900 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003901
Jooyung Han580eb4f2020-06-24 19:33:06 +09003902 apex_key {
3903 name: "myapex.key",
3904 public_key: "testkey.avbpubkey",
3905 private_key: "testkey.pem",
3906 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003907 `, withFiles(map[string][]byte{
3908 "my_own_file_contexts": nil,
3909 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003910}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003911
Jooyung Han580eb4f2020-06-24 19:33:06 +09003912func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003913 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003914 apex {
3915 name: "myapex",
3916 key: "myapex.key",
3917 product_specific: true,
3918 file_contexts: "product_specific_file_contexts",
3919 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003920
Jooyung Han580eb4f2020-06-24 19:33:06 +09003921 apex_key {
3922 name: "myapex.key",
3923 public_key: "testkey.avbpubkey",
3924 private_key: "testkey.pem",
3925 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003926 `)
3927
Jooyung Han580eb4f2020-06-24 19:33:06 +09003928 ctx, _ := testApex(t, `
3929 apex {
3930 name: "myapex",
3931 key: "myapex.key",
3932 product_specific: true,
3933 file_contexts: "product_specific_file_contexts",
3934 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003935
Jooyung Han580eb4f2020-06-24 19:33:06 +09003936 apex_key {
3937 name: "myapex.key",
3938 public_key: "testkey.avbpubkey",
3939 private_key: "testkey.pem",
3940 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003941 `, withFiles(map[string][]byte{
3942 "product_specific_file_contexts": nil,
3943 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003944 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3945 rule := module.Output("file_contexts")
3946 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3947}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003948
Jooyung Han580eb4f2020-06-24 19:33:06 +09003949func TestFileContexts_SetViaFileGroup(t *testing.T) {
3950 ctx, _ := testApex(t, `
3951 apex {
3952 name: "myapex",
3953 key: "myapex.key",
3954 product_specific: true,
3955 file_contexts: ":my-file-contexts",
3956 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003957
Jooyung Han580eb4f2020-06-24 19:33:06 +09003958 apex_key {
3959 name: "myapex.key",
3960 public_key: "testkey.avbpubkey",
3961 private_key: "testkey.pem",
3962 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003963
Jooyung Han580eb4f2020-06-24 19:33:06 +09003964 filegroup {
3965 name: "my-file-contexts",
3966 srcs: ["product_specific_file_contexts"],
3967 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003968 `, withFiles(map[string][]byte{
3969 "product_specific_file_contexts": nil,
3970 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003971 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3972 rule := module.Output("file_contexts")
3973 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003974}
3975
Jiyong Park67882562019-03-21 01:11:21 +09003976func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003977 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003978 apex_key {
3979 name: "myapex.key",
3980 public_key: ":my.avbpubkey",
3981 private_key: ":my.pem",
3982 product_specific: true,
3983 }
3984
3985 filegroup {
3986 name: "my.avbpubkey",
3987 srcs: ["testkey2.avbpubkey"],
3988 }
3989
3990 filegroup {
3991 name: "my.pem",
3992 srcs: ["testkey2.pem"],
3993 }
3994 `)
3995
3996 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3997 expected_pubkey := "testkey2.avbpubkey"
3998 actual_pubkey := apex_key.public_key_file.String()
3999 if actual_pubkey != expected_pubkey {
4000 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4001 }
4002 expected_privkey := "testkey2.pem"
4003 actual_privkey := apex_key.private_key_file.String()
4004 if actual_privkey != expected_privkey {
4005 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4006 }
4007}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004008
4009func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004010 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004011 prebuilt_apex {
4012 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004013 arch: {
4014 arm64: {
4015 src: "myapex-arm64.apex",
4016 },
4017 arm: {
4018 src: "myapex-arm.apex",
4019 },
4020 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004021 }
4022 `)
4023
4024 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4025
Jiyong Parkc95714e2019-03-29 14:23:10 +09004026 expectedInput := "myapex-arm64.apex"
4027 if prebuilt.inputApex.String() != expectedInput {
4028 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4029 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004030}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004031
4032func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004033 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004034 prebuilt_apex {
4035 name: "myapex",
4036 src: "myapex-arm.apex",
4037 filename: "notmyapex.apex",
4038 }
4039 `)
4040
4041 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4042
4043 expected := "notmyapex.apex"
4044 if p.installFilename != expected {
4045 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4046 }
4047}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004048
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004049func TestPrebuiltOverrides(t *testing.T) {
4050 ctx, config := testApex(t, `
4051 prebuilt_apex {
4052 name: "myapex.prebuilt",
4053 src: "myapex-arm.apex",
4054 overrides: [
4055 "myapex",
4056 ],
4057 }
4058 `)
4059
4060 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4061
4062 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004063 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004064 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004065 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004066 }
4067}
4068
Roland Levillain630846d2019-06-26 12:48:34 +01004069func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004070 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004071 apex_test {
4072 name: "myapex",
4073 key: "myapex.key",
4074 tests: [
4075 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004076 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004077 ],
4078 }
4079
4080 apex_key {
4081 name: "myapex.key",
4082 public_key: "testkey.avbpubkey",
4083 private_key: "testkey.pem",
4084 }
4085
Liz Kammer1c14a212020-05-12 15:26:55 -07004086 filegroup {
4087 name: "fg",
4088 srcs: [
4089 "baz",
4090 "bar/baz"
4091 ],
4092 }
4093
Roland Levillain630846d2019-06-26 12:48:34 +01004094 cc_test {
4095 name: "mytest",
4096 gtest: false,
4097 srcs: ["mytest.cpp"],
4098 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004099 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004100 system_shared_libs: [],
4101 static_executable: true,
4102 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004103 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004104 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004105
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004106 cc_library {
4107 name: "mylib",
4108 srcs: ["mylib.cpp"],
4109 system_shared_libs: [],
4110 stl: "none",
4111 }
4112
Liz Kammer5bd365f2020-05-27 15:15:11 -07004113 filegroup {
4114 name: "fg2",
4115 srcs: [
4116 "testdata/baz"
4117 ],
4118 }
4119
Roland Levillain9b5fde92019-06-28 15:41:19 +01004120 cc_test {
4121 name: "mytests",
4122 gtest: false,
4123 srcs: [
4124 "mytest1.cpp",
4125 "mytest2.cpp",
4126 "mytest3.cpp",
4127 ],
4128 test_per_src: true,
4129 relative_install_path: "test",
4130 system_shared_libs: [],
4131 static_executable: true,
4132 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004133 data: [
4134 ":fg",
4135 ":fg2",
4136 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004137 }
Roland Levillain630846d2019-06-26 12:48:34 +01004138 `)
4139
Sundong Ahnabb64432019-10-22 13:58:29 +09004140 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004141 copyCmds := apexRule.Args["copy_commands"]
4142
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004143 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004144 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004145 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004146
Liz Kammer1c14a212020-05-12 15:26:55 -07004147 //Ensure that test data are copied into apex.
4148 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4149 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4150
Roland Levillain9b5fde92019-06-28 15:41:19 +01004151 // Ensure that test deps built with `test_per_src` are copied into apex.
4152 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4153 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4154 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004155
4156 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004157 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4158 data := android.AndroidMkDataForTest(t, config, "", bundle)
4159 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004160 prefix := "TARGET_"
4161 var builder strings.Builder
4162 data.Custom(&builder, name, prefix, "", data)
4163 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004164 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4165 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4166 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4167 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004168 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004169 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004170 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004171
4172 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4173 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4174 data.Custom(&builder, name, prefix, "", data)
4175 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004176 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4177 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004178}
4179
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004180func TestInstallExtraFlattenedApexes(t *testing.T) {
4181 ctx, config := testApex(t, `
4182 apex {
4183 name: "myapex",
4184 key: "myapex.key",
4185 }
4186 apex_key {
4187 name: "myapex.key",
4188 public_key: "testkey.avbpubkey",
4189 private_key: "testkey.pem",
4190 }
4191 `, func(fs map[string][]byte, config android.Config) {
4192 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4193 })
4194 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004195 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004196 mk := android.AndroidMkDataForTest(t, config, "", ab)
4197 var builder strings.Builder
4198 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4199 androidMk := builder.String()
4200 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4201}
4202
Jooyung Hand48f3c32019-08-23 11:18:57 +09004203func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4204 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
4208 native_shared_libs: ["libfoo"],
4209 }
4210
4211 apex_key {
4212 name: "myapex.key",
4213 public_key: "testkey.avbpubkey",
4214 private_key: "testkey.pem",
4215 }
4216
4217 cc_library {
4218 name: "libfoo",
4219 stl: "none",
4220 system_shared_libs: [],
4221 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004222 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004223 }
4224 `)
4225 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4226 apex {
4227 name: "myapex",
4228 key: "myapex.key",
4229 java_libs: ["myjar"],
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237
4238 java_library {
4239 name: "myjar",
4240 srcs: ["foo/bar/MyClass.java"],
4241 sdk_version: "none",
4242 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004243 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004244 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004245 }
4246 `)
4247}
4248
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004249func TestApexWithApps(t *testing.T) {
4250 ctx, _ := testApex(t, `
4251 apex {
4252 name: "myapex",
4253 key: "myapex.key",
4254 apps: [
4255 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004256 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004257 ],
4258 }
4259
4260 apex_key {
4261 name: "myapex.key",
4262 public_key: "testkey.avbpubkey",
4263 private_key: "testkey.pem",
4264 }
4265
4266 android_app {
4267 name: "AppFoo",
4268 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004269 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004270 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004271 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004272 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004273 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004274 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004275
4276 android_app {
4277 name: "AppFooPriv",
4278 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004279 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004280 system_modules: "none",
4281 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004283 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004284 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004285
4286 cc_library_shared {
4287 name: "libjni",
4288 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004289 shared_libs: ["libfoo"],
4290 stl: "none",
4291 system_shared_libs: [],
4292 apex_available: [ "myapex" ],
4293 sdk_version: "current",
4294 }
4295
4296 cc_library_shared {
4297 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004298 stl: "none",
4299 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004300 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004301 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004302 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004303 `)
4304
Sundong Ahnabb64432019-10-22 13:58:29 +09004305 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004306 apexRule := module.Rule("apexRule")
4307 copyCmds := apexRule.Args["copy_commands"]
4308
4309 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004310 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004311
Colin Crossaede88c2020-08-11 12:17:01 -07004312 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004313 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004314 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004315 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004316 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004317 // JNI libraries including transitive deps are
4318 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004319 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004320 // ... embedded inside APK (jnilibs.zip)
4321 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4322 // ... and not directly inside the APEX
4323 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4324 }
Dario Frenicde2a032019-10-27 00:29:22 +01004325}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004326
Dario Frenicde2a032019-10-27 00:29:22 +01004327func TestApexWithAppImports(t *testing.T) {
4328 ctx, _ := testApex(t, `
4329 apex {
4330 name: "myapex",
4331 key: "myapex.key",
4332 apps: [
4333 "AppFooPrebuilt",
4334 "AppFooPrivPrebuilt",
4335 ],
4336 }
4337
4338 apex_key {
4339 name: "myapex.key",
4340 public_key: "testkey.avbpubkey",
4341 private_key: "testkey.pem",
4342 }
4343
4344 android_app_import {
4345 name: "AppFooPrebuilt",
4346 apk: "PrebuiltAppFoo.apk",
4347 presigned: true,
4348 dex_preopt: {
4349 enabled: false,
4350 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004351 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004352 }
4353
4354 android_app_import {
4355 name: "AppFooPrivPrebuilt",
4356 apk: "PrebuiltAppFooPriv.apk",
4357 privileged: true,
4358 presigned: true,
4359 dex_preopt: {
4360 enabled: false,
4361 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004362 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004363 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004364 }
4365 `)
4366
Sundong Ahnabb64432019-10-22 13:58:29 +09004367 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004368 apexRule := module.Rule("apexRule")
4369 copyCmds := apexRule.Args["copy_commands"]
4370
4371 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004372 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4373}
4374
4375func TestApexWithAppImportsPrefer(t *testing.T) {
4376 ctx, _ := testApex(t, `
4377 apex {
4378 name: "myapex",
4379 key: "myapex.key",
4380 apps: [
4381 "AppFoo",
4382 ],
4383 }
4384
4385 apex_key {
4386 name: "myapex.key",
4387 public_key: "testkey.avbpubkey",
4388 private_key: "testkey.pem",
4389 }
4390
4391 android_app {
4392 name: "AppFoo",
4393 srcs: ["foo/bar/MyClass.java"],
4394 sdk_version: "none",
4395 system_modules: "none",
4396 apex_available: [ "myapex" ],
4397 }
4398
4399 android_app_import {
4400 name: "AppFoo",
4401 apk: "AppFooPrebuilt.apk",
4402 filename: "AppFooPrebuilt.apk",
4403 presigned: true,
4404 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004405 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004406 }
4407 `, withFiles(map[string][]byte{
4408 "AppFooPrebuilt.apk": nil,
4409 }))
4410
4411 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4412 "app/AppFoo/AppFooPrebuilt.apk",
4413 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004414}
4415
Dario Freni6f3937c2019-12-20 22:58:03 +00004416func TestApexWithTestHelperApp(t *testing.T) {
4417 ctx, _ := testApex(t, `
4418 apex {
4419 name: "myapex",
4420 key: "myapex.key",
4421 apps: [
4422 "TesterHelpAppFoo",
4423 ],
4424 }
4425
4426 apex_key {
4427 name: "myapex.key",
4428 public_key: "testkey.avbpubkey",
4429 private_key: "testkey.pem",
4430 }
4431
4432 android_test_helper_app {
4433 name: "TesterHelpAppFoo",
4434 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004435 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004436 }
4437
4438 `)
4439
4440 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4441 apexRule := module.Rule("apexRule")
4442 copyCmds := apexRule.Args["copy_commands"]
4443
4444 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4445}
4446
Jooyung Han18020ea2019-11-13 10:50:48 +09004447func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4448 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004449 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004450 apex {
4451 name: "myapex",
4452 key: "myapex.key",
4453 native_shared_libs: ["libfoo"],
4454 }
4455
4456 apex_key {
4457 name: "myapex.key",
4458 public_key: "testkey.avbpubkey",
4459 private_key: "testkey.pem",
4460 }
4461
4462 apex {
4463 name: "otherapex",
4464 key: "myapex.key",
4465 native_shared_libs: ["libfoo"],
4466 }
4467
4468 cc_defaults {
4469 name: "libfoo-defaults",
4470 apex_available: ["otherapex"],
4471 }
4472
4473 cc_library {
4474 name: "libfoo",
4475 defaults: ["libfoo-defaults"],
4476 stl: "none",
4477 system_shared_libs: [],
4478 }`)
4479}
4480
Paul Duffine52e66f2020-03-30 17:54:29 +01004481func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004482 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004483 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004484 apex {
4485 name: "myapex",
4486 key: "myapex.key",
4487 native_shared_libs: ["libfoo"],
4488 }
4489
4490 apex_key {
4491 name: "myapex.key",
4492 public_key: "testkey.avbpubkey",
4493 private_key: "testkey.pem",
4494 }
4495
4496 apex {
4497 name: "otherapex",
4498 key: "otherapex.key",
4499 native_shared_libs: ["libfoo"],
4500 }
4501
4502 apex_key {
4503 name: "otherapex.key",
4504 public_key: "testkey.avbpubkey",
4505 private_key: "testkey.pem",
4506 }
4507
4508 cc_library {
4509 name: "libfoo",
4510 stl: "none",
4511 system_shared_libs: [],
4512 apex_available: ["otherapex"],
4513 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004514}
Jiyong Park127b40b2019-09-30 16:04:35 +09004515
Paul Duffine52e66f2020-03-30 17:54:29 +01004516func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004517 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004518 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004519.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004520.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004521.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004522.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004523.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004524.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004525 apex {
4526 name: "myapex",
4527 key: "myapex.key",
4528 native_shared_libs: ["libfoo"],
4529 }
4530
4531 apex_key {
4532 name: "myapex.key",
4533 public_key: "testkey.avbpubkey",
4534 private_key: "testkey.pem",
4535 }
4536
Jiyong Park127b40b2019-09-30 16:04:35 +09004537 cc_library {
4538 name: "libfoo",
4539 stl: "none",
4540 shared_libs: ["libbar"],
4541 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004542 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004543 }
4544
4545 cc_library {
4546 name: "libbar",
4547 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004548 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004549 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004550 apex_available: ["myapex"],
4551 }
4552
4553 cc_library {
4554 name: "libbaz",
4555 stl: "none",
4556 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004557 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004558}
Jiyong Park127b40b2019-09-30 16:04:35 +09004559
Paul Duffine52e66f2020-03-30 17:54:29 +01004560func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004561 testApexError(t, "\"otherapex\" is not a valid module name", `
4562 apex {
4563 name: "myapex",
4564 key: "myapex.key",
4565 native_shared_libs: ["libfoo"],
4566 }
4567
4568 apex_key {
4569 name: "myapex.key",
4570 public_key: "testkey.avbpubkey",
4571 private_key: "testkey.pem",
4572 }
4573
4574 cc_library {
4575 name: "libfoo",
4576 stl: "none",
4577 system_shared_libs: [],
4578 apex_available: ["otherapex"],
4579 }`)
4580
Paul Duffine52e66f2020-03-30 17:54:29 +01004581 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004582 apex {
4583 name: "myapex",
4584 key: "myapex.key",
4585 native_shared_libs: ["libfoo", "libbar"],
4586 }
4587
4588 apex_key {
4589 name: "myapex.key",
4590 public_key: "testkey.avbpubkey",
4591 private_key: "testkey.pem",
4592 }
4593
4594 cc_library {
4595 name: "libfoo",
4596 stl: "none",
4597 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004598 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004599 apex_available: ["myapex"],
4600 }
4601
4602 cc_library {
4603 name: "libbar",
4604 stl: "none",
4605 system_shared_libs: [],
4606 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004607 }
4608
4609 cc_library {
4610 name: "libbaz",
4611 stl: "none",
4612 system_shared_libs: [],
4613 stubs: {
4614 versions: ["10", "20", "30"],
4615 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004616 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004617}
Jiyong Park127b40b2019-09-30 16:04:35 +09004618
Jiyong Park89e850a2020-04-07 16:37:39 +09004619func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004620 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004621 apex {
4622 name: "myapex",
4623 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004624 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004625 }
4626
4627 apex_key {
4628 name: "myapex.key",
4629 public_key: "testkey.avbpubkey",
4630 private_key: "testkey.pem",
4631 }
4632
4633 cc_library {
4634 name: "libfoo",
4635 stl: "none",
4636 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004637 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004638 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004639 }
4640
4641 cc_library {
4642 name: "libfoo2",
4643 stl: "none",
4644 system_shared_libs: [],
4645 shared_libs: ["libbaz"],
4646 apex_available: ["//apex_available:platform"],
4647 }
4648
4649 cc_library {
4650 name: "libbar",
4651 stl: "none",
4652 system_shared_libs: [],
4653 apex_available: ["myapex"],
4654 }
4655
4656 cc_library {
4657 name: "libbaz",
4658 stl: "none",
4659 system_shared_libs: [],
4660 apex_available: ["myapex"],
4661 stubs: {
4662 versions: ["1"],
4663 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004664 }`)
4665
Jiyong Park89e850a2020-04-07 16:37:39 +09004666 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4667 // because it depends on libbar which isn't available to platform
4668 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4669 if libfoo.NotAvailableForPlatform() != true {
4670 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4671 }
4672
4673 // libfoo2 however can be available to platform because it depends on libbaz which provides
4674 // stubs
4675 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4676 if libfoo2.NotAvailableForPlatform() == true {
4677 t.Errorf("%q should be available to platform", libfoo2.String())
4678 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004679}
Jiyong Parka90ca002019-10-07 15:47:24 +09004680
Paul Duffine52e66f2020-03-30 17:54:29 +01004681func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004682 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004683 apex {
4684 name: "myapex",
4685 key: "myapex.key",
4686 native_shared_libs: ["libfoo"],
4687 }
4688
4689 apex_key {
4690 name: "myapex.key",
4691 public_key: "testkey.avbpubkey",
4692 private_key: "testkey.pem",
4693 }
4694
4695 cc_library {
4696 name: "libfoo",
4697 stl: "none",
4698 system_shared_libs: [],
4699 apex_available: ["myapex"],
4700 static: {
4701 apex_available: ["//apex_available:platform"],
4702 },
4703 }`)
4704
Jiyong Park89e850a2020-04-07 16:37:39 +09004705 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4706 if libfooShared.NotAvailableForPlatform() != true {
4707 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4708 }
4709 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4710 if libfooStatic.NotAvailableForPlatform() != false {
4711 t.Errorf("%q should be available to platform", libfooStatic.String())
4712 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004713}
4714
Jiyong Park5d790c32019-11-15 18:40:32 +09004715func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004716 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004717 apex {
4718 name: "myapex",
4719 key: "myapex.key",
4720 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004721 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004722 }
4723
4724 override_apex {
4725 name: "override_myapex",
4726 base: "myapex",
4727 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004728 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004729 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004730 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004731 }
4732
4733 apex_key {
4734 name: "myapex.key",
4735 public_key: "testkey.avbpubkey",
4736 private_key: "testkey.pem",
4737 }
4738
4739 android_app {
4740 name: "app",
4741 srcs: ["foo/bar/MyClass.java"],
4742 package_name: "foo",
4743 sdk_version: "none",
4744 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004745 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004746 }
4747
4748 override_android_app {
4749 name: "override_app",
4750 base: "app",
4751 package_name: "bar",
4752 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004753 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004754
Jiyong Park317645e2019-12-05 13:20:58 +09004755 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4756 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4757 if originalVariant.GetOverriddenBy() != "" {
4758 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4759 }
4760 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4761 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4762 }
4763
Jiyong Park5d790c32019-11-15 18:40:32 +09004764 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4765 apexRule := module.Rule("apexRule")
4766 copyCmds := apexRule.Args["copy_commands"]
4767
4768 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004769 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004770
4771 apexBundle := module.Module().(*apexBundle)
4772 name := apexBundle.Name()
4773 if name != "override_myapex" {
4774 t.Errorf("name should be \"override_myapex\", but was %q", name)
4775 }
4776
Baligh Uddin004d7172020-02-19 21:29:28 -08004777 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4778 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4779 }
4780
Jiyong Park20bacab2020-03-03 11:45:41 +09004781 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004782 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004783
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004784 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4785 var builder strings.Builder
4786 data.Custom(&builder, name, "TARGET_", "", data)
4787 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004788 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004789 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4790 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004791 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004792 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004793 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004794 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4795 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004796}
4797
Jooyung Han214bf372019-11-12 13:03:50 +09004798func TestLegacyAndroid10Support(t *testing.T) {
4799 ctx, _ := testApex(t, `
4800 apex {
4801 name: "myapex",
4802 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004803 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004804 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004805 }
4806
4807 apex_key {
4808 name: "myapex.key",
4809 public_key: "testkey.avbpubkey",
4810 private_key: "testkey.pem",
4811 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004812
4813 cc_library {
4814 name: "mylib",
4815 srcs: ["mylib.cpp"],
4816 stl: "libc++",
4817 system_shared_libs: [],
4818 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004819 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004820 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004821 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004822
4823 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4824 args := module.Rule("apexRule").Args
4825 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004826 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004827
4828 // The copies of the libraries in the apex should have one more dependency than
4829 // the ones outside the apex, namely the unwinder. Ideally we should check
4830 // the dependency names directly here but for some reason the names are blank in
4831 // this test.
4832 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004833 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004834 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4835 if len(apexImplicits) != len(nonApexImplicits)+1 {
4836 t.Errorf("%q missing unwinder dep", lib)
4837 }
4838 }
Jooyung Han214bf372019-11-12 13:03:50 +09004839}
4840
Paul Duffin9b879592020-05-26 13:21:35 +01004841var filesForSdkLibrary = map[string][]byte{
4842 "api/current.txt": nil,
4843 "api/removed.txt": nil,
4844 "api/system-current.txt": nil,
4845 "api/system-removed.txt": nil,
4846 "api/test-current.txt": nil,
4847 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004848
4849 // For java_sdk_library_import
4850 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004851}
4852
Jooyung Han58f26ab2019-12-18 15:34:32 +09004853func TestJavaSDKLibrary(t *testing.T) {
4854 ctx, _ := testApex(t, `
4855 apex {
4856 name: "myapex",
4857 key: "myapex.key",
4858 java_libs: ["foo"],
4859 }
4860
4861 apex_key {
4862 name: "myapex.key",
4863 public_key: "testkey.avbpubkey",
4864 private_key: "testkey.pem",
4865 }
4866
4867 java_sdk_library {
4868 name: "foo",
4869 srcs: ["a.java"],
4870 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004871 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004872 }
Paul Duffin9b879592020-05-26 13:21:35 +01004873 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004874
4875 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004876 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004877 "javalib/foo.jar",
4878 "etc/permissions/foo.xml",
4879 })
4880 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004881 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4882 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004883}
4884
Paul Duffin9b879592020-05-26 13:21:35 +01004885func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4886 ctx, _ := testApex(t, `
4887 apex {
4888 name: "myapex",
4889 key: "myapex.key",
4890 java_libs: ["foo", "bar"],
4891 }
4892
4893 apex_key {
4894 name: "myapex.key",
4895 public_key: "testkey.avbpubkey",
4896 private_key: "testkey.pem",
4897 }
4898
4899 java_sdk_library {
4900 name: "foo",
4901 srcs: ["a.java"],
4902 api_packages: ["foo"],
4903 apex_available: ["myapex"],
4904 sdk_version: "none",
4905 system_modules: "none",
4906 }
4907
4908 java_library {
4909 name: "bar",
4910 srcs: ["a.java"],
4911 libs: ["foo"],
4912 apex_available: ["myapex"],
4913 sdk_version: "none",
4914 system_modules: "none",
4915 }
4916 `, withFiles(filesForSdkLibrary))
4917
4918 // java_sdk_library installs both impl jar and permission XML
4919 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4920 "javalib/bar.jar",
4921 "javalib/foo.jar",
4922 "etc/permissions/foo.xml",
4923 })
4924
4925 // The bar library should depend on the implementation jar.
4926 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4927 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4928 t.Errorf("expected %q, found %#q", expected, actual)
4929 }
4930}
4931
4932func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4933 ctx, _ := testApex(t, `
4934 apex {
4935 name: "myapex",
4936 key: "myapex.key",
4937 java_libs: ["foo"],
4938 }
4939
4940 apex_key {
4941 name: "myapex.key",
4942 public_key: "testkey.avbpubkey",
4943 private_key: "testkey.pem",
4944 }
4945
4946 java_sdk_library {
4947 name: "foo",
4948 srcs: ["a.java"],
4949 api_packages: ["foo"],
4950 apex_available: ["myapex"],
4951 sdk_version: "none",
4952 system_modules: "none",
4953 }
4954
4955 java_library {
4956 name: "bar",
4957 srcs: ["a.java"],
4958 libs: ["foo"],
4959 sdk_version: "none",
4960 system_modules: "none",
4961 }
4962 `, withFiles(filesForSdkLibrary))
4963
4964 // java_sdk_library installs both impl jar and permission XML
4965 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4966 "javalib/foo.jar",
4967 "etc/permissions/foo.xml",
4968 })
4969
4970 // The bar library should depend on the stubs jar.
4971 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4972 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4973 t.Errorf("expected %q, found %#q", expected, actual)
4974 }
4975}
4976
Paul Duffineedc5d52020-06-12 17:46:39 +01004977func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4978 ctx, _ := testApex(t, ``,
4979 withFiles(map[string][]byte{
4980 "apex/a.java": nil,
4981 "apex/apex_manifest.json": nil,
4982 "apex/Android.bp": []byte(`
4983 package {
4984 default_visibility: ["//visibility:private"],
4985 }
4986
4987 apex {
4988 name: "myapex",
4989 key: "myapex.key",
4990 java_libs: ["foo", "bar"],
4991 }
4992
4993 apex_key {
4994 name: "myapex.key",
4995 public_key: "testkey.avbpubkey",
4996 private_key: "testkey.pem",
4997 }
4998
4999 java_library {
5000 name: "bar",
5001 srcs: ["a.java"],
5002 libs: ["foo"],
5003 apex_available: ["myapex"],
5004 sdk_version: "none",
5005 system_modules: "none",
5006 }
5007`),
5008 "source/a.java": nil,
5009 "source/api/current.txt": nil,
5010 "source/api/removed.txt": nil,
5011 "source/Android.bp": []byte(`
5012 package {
5013 default_visibility: ["//visibility:private"],
5014 }
5015
5016 java_sdk_library {
5017 name: "foo",
5018 visibility: ["//apex"],
5019 srcs: ["a.java"],
5020 api_packages: ["foo"],
5021 apex_available: ["myapex"],
5022 sdk_version: "none",
5023 system_modules: "none",
5024 public: {
5025 enabled: true,
5026 },
5027 }
5028`),
5029 "prebuilt/a.jar": nil,
5030 "prebuilt/Android.bp": []byte(`
5031 package {
5032 default_visibility: ["//visibility:private"],
5033 }
5034
5035 java_sdk_library_import {
5036 name: "foo",
5037 visibility: ["//apex", "//source"],
5038 apex_available: ["myapex"],
5039 prefer: true,
5040 public: {
5041 jars: ["a.jar"],
5042 },
5043 }
5044`),
5045 }),
5046 )
5047
5048 // java_sdk_library installs both impl jar and permission XML
5049 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5050 "javalib/bar.jar",
5051 "javalib/foo.jar",
5052 "etc/permissions/foo.xml",
5053 })
5054
5055 // The bar library should depend on the implementation jar.
5056 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5057 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5058 t.Errorf("expected %q, found %#q", expected, actual)
5059 }
5060}
5061
5062func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5063 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5064 apex {
5065 name: "myapex",
5066 key: "myapex.key",
5067 java_libs: ["foo"],
5068 }
5069
5070 apex_key {
5071 name: "myapex.key",
5072 public_key: "testkey.avbpubkey",
5073 private_key: "testkey.pem",
5074 }
5075
5076 java_sdk_library_import {
5077 name: "foo",
5078 apex_available: ["myapex"],
5079 prefer: true,
5080 public: {
5081 jars: ["a.jar"],
5082 },
5083 }
5084
5085 `, withFiles(filesForSdkLibrary))
5086}
5087
atrost6e126252020-01-27 17:01:16 +00005088func TestCompatConfig(t *testing.T) {
5089 ctx, _ := testApex(t, `
5090 apex {
5091 name: "myapex",
5092 key: "myapex.key",
5093 prebuilts: ["myjar-platform-compat-config"],
5094 java_libs: ["myjar"],
5095 }
5096
5097 apex_key {
5098 name: "myapex.key",
5099 public_key: "testkey.avbpubkey",
5100 private_key: "testkey.pem",
5101 }
5102
5103 platform_compat_config {
5104 name: "myjar-platform-compat-config",
5105 src: ":myjar",
5106 }
5107
5108 java_library {
5109 name: "myjar",
5110 srcs: ["foo/bar/MyClass.java"],
5111 sdk_version: "none",
5112 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005113 apex_available: [ "myapex" ],
5114 }
5115 `)
5116 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5117 "etc/compatconfig/myjar-platform-compat-config.xml",
5118 "javalib/myjar.jar",
5119 })
5120}
5121
Jiyong Park479321d2019-12-16 11:47:12 +09005122func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5123 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5124 apex {
5125 name: "myapex",
5126 key: "myapex.key",
5127 java_libs: ["myjar"],
5128 }
5129
5130 apex_key {
5131 name: "myapex.key",
5132 public_key: "testkey.avbpubkey",
5133 private_key: "testkey.pem",
5134 }
5135
5136 java_library {
5137 name: "myjar",
5138 srcs: ["foo/bar/MyClass.java"],
5139 sdk_version: "none",
5140 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005141 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005142 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005143 }
5144 `)
5145}
5146
Jiyong Park7afd1072019-12-30 16:56:33 +09005147func TestCarryRequiredModuleNames(t *testing.T) {
5148 ctx, config := testApex(t, `
5149 apex {
5150 name: "myapex",
5151 key: "myapex.key",
5152 native_shared_libs: ["mylib"],
5153 }
5154
5155 apex_key {
5156 name: "myapex.key",
5157 public_key: "testkey.avbpubkey",
5158 private_key: "testkey.pem",
5159 }
5160
5161 cc_library {
5162 name: "mylib",
5163 srcs: ["mylib.cpp"],
5164 system_shared_libs: [],
5165 stl: "none",
5166 required: ["a", "b"],
5167 host_required: ["c", "d"],
5168 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005169 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005170 }
5171 `)
5172
5173 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5174 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5175 name := apexBundle.BaseModuleName()
5176 prefix := "TARGET_"
5177 var builder strings.Builder
5178 data.Custom(&builder, name, prefix, "", data)
5179 androidMk := builder.String()
5180 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5181 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5182 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5183}
5184
Jiyong Park7cd10e32020-01-14 09:22:18 +09005185func TestSymlinksFromApexToSystem(t *testing.T) {
5186 bp := `
5187 apex {
5188 name: "myapex",
5189 key: "myapex.key",
5190 native_shared_libs: ["mylib"],
5191 java_libs: ["myjar"],
5192 }
5193
Jiyong Park9d677202020-02-19 16:29:35 +09005194 apex {
5195 name: "myapex.updatable",
5196 key: "myapex.key",
5197 native_shared_libs: ["mylib"],
5198 java_libs: ["myjar"],
5199 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005200 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005201 }
5202
Jiyong Park7cd10e32020-01-14 09:22:18 +09005203 apex_key {
5204 name: "myapex.key",
5205 public_key: "testkey.avbpubkey",
5206 private_key: "testkey.pem",
5207 }
5208
5209 cc_library {
5210 name: "mylib",
5211 srcs: ["mylib.cpp"],
5212 shared_libs: ["myotherlib"],
5213 system_shared_libs: [],
5214 stl: "none",
5215 apex_available: [
5216 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005217 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005218 "//apex_available:platform",
5219 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005220 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005221 }
5222
5223 cc_library {
5224 name: "myotherlib",
5225 srcs: ["mylib.cpp"],
5226 system_shared_libs: [],
5227 stl: "none",
5228 apex_available: [
5229 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005230 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005231 "//apex_available:platform",
5232 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005233 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005234 }
5235
5236 java_library {
5237 name: "myjar",
5238 srcs: ["foo/bar/MyClass.java"],
5239 sdk_version: "none",
5240 system_modules: "none",
5241 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005242 apex_available: [
5243 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005244 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005245 "//apex_available:platform",
5246 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005247 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005248 }
5249
5250 java_library {
5251 name: "myotherjar",
5252 srcs: ["foo/bar/MyClass.java"],
5253 sdk_version: "none",
5254 system_modules: "none",
5255 apex_available: [
5256 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005257 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005258 "//apex_available:platform",
5259 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005260 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005261 }
5262 `
5263
5264 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5265 for _, f := range files {
5266 if f.path == file {
5267 if f.isLink {
5268 t.Errorf("%q is not a real file", file)
5269 }
5270 return
5271 }
5272 }
5273 t.Errorf("%q is not found", file)
5274 }
5275
5276 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5277 for _, f := range files {
5278 if f.path == file {
5279 if !f.isLink {
5280 t.Errorf("%q is not a symlink", file)
5281 }
5282 return
5283 }
5284 }
5285 t.Errorf("%q is not found", file)
5286 }
5287
Jiyong Park9d677202020-02-19 16:29:35 +09005288 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5289 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005290 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005291 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005292 ensureRealfileExists(t, files, "javalib/myjar.jar")
5293 ensureRealfileExists(t, files, "lib64/mylib.so")
5294 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5295
Jiyong Park9d677202020-02-19 16:29:35 +09005296 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5297 ensureRealfileExists(t, files, "javalib/myjar.jar")
5298 ensureRealfileExists(t, files, "lib64/mylib.so")
5299 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5300
5301 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005302 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005303 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005304 ensureRealfileExists(t, files, "javalib/myjar.jar")
5305 ensureRealfileExists(t, files, "lib64/mylib.so")
5306 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005307
5308 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5309 ensureRealfileExists(t, files, "javalib/myjar.jar")
5310 ensureRealfileExists(t, files, "lib64/mylib.so")
5311 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005312}
5313
Yo Chiange8128052020-07-23 20:09:18 +08005314func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5315 ctx, config := testApex(t, `
5316 apex {
5317 name: "myapex",
5318 key: "myapex.key",
5319 native_shared_libs: ["mylib"],
5320 }
5321
5322 apex_key {
5323 name: "myapex.key",
5324 public_key: "testkey.avbpubkey",
5325 private_key: "testkey.pem",
5326 }
5327
5328 cc_library_shared {
5329 name: "mylib",
5330 srcs: ["mylib.cpp"],
5331 shared_libs: ["myotherlib"],
5332 system_shared_libs: [],
5333 stl: "none",
5334 apex_available: [
5335 "myapex",
5336 "//apex_available:platform",
5337 ],
5338 }
5339
5340 cc_prebuilt_library_shared {
5341 name: "myotherlib",
5342 srcs: ["prebuilt.so"],
5343 system_shared_libs: [],
5344 stl: "none",
5345 apex_available: [
5346 "myapex",
5347 "//apex_available:platform",
5348 ],
5349 }
5350 `)
5351
5352 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5353 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5354 var builder strings.Builder
5355 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5356 androidMk := builder.String()
5357 // `myotherlib` is added to `myapex` as symlink
5358 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5359 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5360 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5361 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5362 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5363}
5364
Jooyung Han643adc42020-02-27 13:50:06 +09005365func TestApexWithJniLibs(t *testing.T) {
5366 ctx, _ := testApex(t, `
5367 apex {
5368 name: "myapex",
5369 key: "myapex.key",
5370 jni_libs: ["mylib"],
5371 }
5372
5373 apex_key {
5374 name: "myapex.key",
5375 public_key: "testkey.avbpubkey",
5376 private_key: "testkey.pem",
5377 }
5378
5379 cc_library {
5380 name: "mylib",
5381 srcs: ["mylib.cpp"],
5382 shared_libs: ["mylib2"],
5383 system_shared_libs: [],
5384 stl: "none",
5385 apex_available: [ "myapex" ],
5386 }
5387
5388 cc_library {
5389 name: "mylib2",
5390 srcs: ["mylib.cpp"],
5391 system_shared_libs: [],
5392 stl: "none",
5393 apex_available: [ "myapex" ],
5394 }
5395 `)
5396
5397 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5398 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5399 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5400 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5401 "lib64/mylib.so",
5402 "lib64/mylib2.so",
5403 })
5404}
5405
Jooyung Han49f67012020-04-17 13:43:10 +09005406func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5407 ctx, _ := testApex(t, `
5408 apex {
5409 name: "myapex",
5410 key: "myapex.key",
5411 }
5412 apex_key {
5413 name: "myapex.key",
5414 public_key: "testkey.avbpubkey",
5415 private_key: "testkey.pem",
5416 }
5417 `, func(fs map[string][]byte, config android.Config) {
5418 delete(config.Targets, android.Android)
5419 config.AndroidCommonTarget = android.Target{}
5420 })
5421
5422 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5423 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5424 }
5425}
5426
Jiyong Parkbd159612020-02-28 15:22:21 +09005427func TestAppBundle(t *testing.T) {
5428 ctx, _ := testApex(t, `
5429 apex {
5430 name: "myapex",
5431 key: "myapex.key",
5432 apps: ["AppFoo"],
5433 }
5434
5435 apex_key {
5436 name: "myapex.key",
5437 public_key: "testkey.avbpubkey",
5438 private_key: "testkey.pem",
5439 }
5440
5441 android_app {
5442 name: "AppFoo",
5443 srcs: ["foo/bar/MyClass.java"],
5444 sdk_version: "none",
5445 system_modules: "none",
5446 apex_available: [ "myapex" ],
5447 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005448 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005449
Colin Crosscf371cc2020-11-13 11:48:42 -08005450 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005451 content := bundleConfigRule.Args["content"]
5452
5453 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005454 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 +09005455}
5456
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005457func TestAppSetBundle(t *testing.T) {
5458 ctx, _ := testApex(t, `
5459 apex {
5460 name: "myapex",
5461 key: "myapex.key",
5462 apps: ["AppSet"],
5463 }
5464
5465 apex_key {
5466 name: "myapex.key",
5467 public_key: "testkey.avbpubkey",
5468 private_key: "testkey.pem",
5469 }
5470
5471 android_app_set {
5472 name: "AppSet",
5473 set: "AppSet.apks",
5474 }`)
5475 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005476 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005477 content := bundleConfigRule.Args["content"]
5478 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5479 s := mod.Rule("apexRule").Args["copy_commands"]
5480 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5481 if len(copyCmds) != 3 {
5482 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5483 }
5484 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5485 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5486 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5487}
5488
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005489func TestAppSetBundlePrebuilt(t *testing.T) {
5490 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5491 bp := `
5492 apex_set {
5493 name: "myapex",
5494 filename: "foo_v2.apex",
5495 sanitized: {
5496 none: { set: "myapex.apks", },
5497 hwaddress: { set: "myapex.hwasan.apks", },
5498 },
5499 }`
5500 fs["Android.bp"] = []byte(bp)
5501
5502 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5503 })
5504
5505 m := ctx.ModuleForTests("myapex", "android_common")
5506 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5507
5508 actual := extractedApex.Inputs
5509 if len(actual) != 1 {
5510 t.Errorf("expected a single input")
5511 }
5512
5513 expected := "myapex.hwasan.apks"
5514 if actual[0].String() != expected {
5515 t.Errorf("expected %s, got %s", expected, actual[0].String())
5516 }
5517}
5518
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005519func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005520 t.Helper()
5521
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005522 bp := `
5523 java_library {
5524 name: "some-updatable-apex-lib",
5525 srcs: ["a.java"],
5526 sdk_version: "current",
5527 apex_available: [
5528 "some-updatable-apex",
5529 ],
5530 }
5531
5532 java_library {
5533 name: "some-non-updatable-apex-lib",
5534 srcs: ["a.java"],
5535 apex_available: [
5536 "some-non-updatable-apex",
5537 ],
5538 }
5539
5540 java_library {
5541 name: "some-platform-lib",
5542 srcs: ["a.java"],
5543 sdk_version: "current",
5544 installable: true,
5545 }
5546
5547 java_library {
5548 name: "some-art-lib",
5549 srcs: ["a.java"],
5550 sdk_version: "current",
5551 apex_available: [
5552 "com.android.art.something",
5553 ],
5554 hostdex: true,
5555 }
5556
5557 apex {
5558 name: "some-updatable-apex",
5559 key: "some-updatable-apex.key",
5560 java_libs: ["some-updatable-apex-lib"],
5561 updatable: true,
5562 min_sdk_version: "current",
5563 }
5564
5565 apex {
5566 name: "some-non-updatable-apex",
5567 key: "some-non-updatable-apex.key",
5568 java_libs: ["some-non-updatable-apex-lib"],
5569 }
5570
5571 apex_key {
5572 name: "some-updatable-apex.key",
5573 }
5574
5575 apex_key {
5576 name: "some-non-updatable-apex.key",
5577 }
5578
5579 apex {
5580 name: "com.android.art.something",
5581 key: "com.android.art.something.key",
5582 java_libs: ["some-art-lib"],
5583 updatable: true,
5584 min_sdk_version: "current",
5585 }
5586
5587 apex_key {
5588 name: "com.android.art.something.key",
5589 }
5590
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005591 filegroup {
5592 name: "some-updatable-apex-file_contexts",
5593 srcs: [
5594 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5595 ],
5596 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005597
5598 filegroup {
5599 name: "some-non-updatable-apex-file_contexts",
5600 srcs: [
5601 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5602 ],
5603 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005604 `
5605 bp += cc.GatherRequiredDepsForTest(android.Android)
5606 bp += java.GatherRequiredDepsForTest()
5607 bp += dexpreopt.BpToolModulesForTest()
5608
5609 fs := map[string][]byte{
5610 "a.java": nil,
5611 "a.jar": nil,
5612 "build/make/target/product/security": nil,
5613 "apex_manifest.json": nil,
5614 "AndroidManifest.xml": nil,
5615 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005616 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005617 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5618 "framework/aidl/a.aidl": nil,
5619 }
5620 cc.GatherRequiredFilesForTest(fs)
5621
Colin Crossae8600b2020-10-29 17:09:13 -07005622 config := android.TestArchConfig(buildDir, nil, bp, fs)
5623
5624 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005625 ctx.RegisterModuleType("apex", BundleFactory)
5626 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5627 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005628 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005629 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005630 cc.RegisterRequiredBuildComponentsForTest(ctx)
5631 java.RegisterJavaBuildComponents(ctx)
5632 java.RegisterSystemModulesBuildComponents(ctx)
5633 java.RegisterAppBuildComponents(ctx)
5634 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005635 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5636 ctx.PreDepsMutators(RegisterPreDepsMutators)
5637 ctx.PostDepsMutators(RegisterPostDepsMutators)
5638
Colin Crossae8600b2020-10-29 17:09:13 -07005639 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005640
5641 _ = dexpreopt.GlobalSoongConfigForTests(config)
5642 dexpreopt.RegisterToolModulesForTest(ctx)
5643 pathCtx := android.PathContextForTesting(config)
5644 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5645 transformDexpreoptConfig(dexpreoptConfig)
5646 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5647
5648 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5649 android.FailIfErrored(t, errs)
5650
5651 _, errs = ctx.PrepareBuildActions(config)
5652 if errmsg == "" {
5653 android.FailIfErrored(t, errs)
5654 } else if len(errs) > 0 {
5655 android.FailIfNoMatchingErrors(t, errmsg, errs)
5656 return
5657 } else {
5658 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5659 }
5660}
5661
Jooyung Han548640b2020-04-27 12:10:30 +09005662func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5663 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5664 apex {
5665 name: "myapex",
5666 key: "myapex.key",
5667 updatable: true,
5668 }
5669
5670 apex_key {
5671 name: "myapex.key",
5672 public_key: "testkey.avbpubkey",
5673 private_key: "testkey.pem",
5674 }
5675 `)
5676}
5677
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005678func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005679 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005680 var transform func(*dexpreopt.GlobalConfig)
5681
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005682 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5683 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005684 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005685 }
5686 testNoUpdatableJarsInBootImage(t, "", transform)
5687 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005688
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005689 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005690 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 +01005691 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005692 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005693 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005694 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005695 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005696
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005697 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 -07005698 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 +01005699 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005700 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005701 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005702 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005703 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005704
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005705 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 -07005706 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005707 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005708 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005709 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005710 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005711 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005712
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005713 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 -07005714 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 +01005715 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005716 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005717 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005718 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005719 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005720
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005721 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5722 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005723 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005724 }
5725 testNoUpdatableJarsInBootImage(t, "", transform)
5726 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005727
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005728 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005729 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005730 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005731 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005732 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005733 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005734 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005735
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005736 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005737 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005738 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005739 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005740 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005741 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005742 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005743
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005744 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005745 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005746 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005747 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005748 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005749 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005750 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005751
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005752 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5753 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005754 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005755 }
5756 testNoUpdatableJarsInBootImage(t, "", transform)
5757 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005758}
5759
Andrei Onea115e7e72020-06-05 21:14:03 +01005760func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5761 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005762 bp += `
5763 apex_key {
5764 name: "myapex.key",
5765 public_key: "testkey.avbpubkey",
5766 private_key: "testkey.pem",
5767 }`
5768 fs := map[string][]byte{
5769 "lib1/src/A.java": nil,
5770 "lib2/src/B.java": nil,
5771 "system/sepolicy/apex/myapex-file_contexts": nil,
5772 }
5773
Colin Crossae8600b2020-10-29 17:09:13 -07005774 config := android.TestArchConfig(buildDir, nil, bp, fs)
5775 android.SetTestNeverallowRules(config, rules)
5776 updatableBootJars := make([]string, 0, len(apexBootJars))
5777 for _, apexBootJar := range apexBootJars {
5778 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5779 }
5780 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5781
5782 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005783 ctx.RegisterModuleType("apex", BundleFactory)
5784 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5785 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5786 cc.RegisterRequiredBuildComponentsForTest(ctx)
5787 java.RegisterJavaBuildComponents(ctx)
5788 java.RegisterSystemModulesBuildComponents(ctx)
5789 java.RegisterDexpreoptBootJarsComponents(ctx)
5790 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5791 ctx.PreDepsMutators(RegisterPreDepsMutators)
5792 ctx.PostDepsMutators(RegisterPostDepsMutators)
5793 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5794
Colin Crossae8600b2020-10-29 17:09:13 -07005795 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005796
5797 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5798 android.FailIfErrored(t, errs)
5799
5800 _, errs = ctx.PrepareBuildActions(config)
5801 if errmsg == "" {
5802 android.FailIfErrored(t, errs)
5803 } else if len(errs) > 0 {
5804 android.FailIfNoMatchingErrors(t, errmsg, errs)
5805 return
5806 } else {
5807 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5808 }
5809}
5810
5811func TestApexPermittedPackagesRules(t *testing.T) {
5812 testcases := []struct {
5813 name string
5814 expectedError string
5815 bp string
5816 bootJars []string
5817 modulesPackages map[string][]string
5818 }{
5819
5820 {
5821 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5822 expectedError: "",
5823 bp: `
5824 java_library {
5825 name: "bcp_lib1",
5826 srcs: ["lib1/src/*.java"],
5827 permitted_packages: ["foo.bar"],
5828 apex_available: ["myapex"],
5829 sdk_version: "none",
5830 system_modules: "none",
5831 }
5832 java_library {
5833 name: "nonbcp_lib2",
5834 srcs: ["lib2/src/*.java"],
5835 apex_available: ["myapex"],
5836 permitted_packages: ["a.b"],
5837 sdk_version: "none",
5838 system_modules: "none",
5839 }
5840 apex {
5841 name: "myapex",
5842 key: "myapex.key",
5843 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5844 }`,
5845 bootJars: []string{"bcp_lib1"},
5846 modulesPackages: map[string][]string{
5847 "myapex": []string{
5848 "foo.bar",
5849 },
5850 },
5851 },
5852 {
5853 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5854 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.`,
5855 bp: `
5856 java_library {
5857 name: "bcp_lib1",
5858 srcs: ["lib1/src/*.java"],
5859 apex_available: ["myapex"],
5860 permitted_packages: ["foo.bar"],
5861 sdk_version: "none",
5862 system_modules: "none",
5863 }
5864 java_library {
5865 name: "bcp_lib2",
5866 srcs: ["lib2/src/*.java"],
5867 apex_available: ["myapex"],
5868 permitted_packages: ["foo.bar", "bar.baz"],
5869 sdk_version: "none",
5870 system_modules: "none",
5871 }
5872 apex {
5873 name: "myapex",
5874 key: "myapex.key",
5875 java_libs: ["bcp_lib1", "bcp_lib2"],
5876 }
5877 `,
5878 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5879 modulesPackages: map[string][]string{
5880 "myapex": []string{
5881 "foo.bar",
5882 },
5883 },
5884 },
5885 }
5886 for _, tc := range testcases {
5887 t.Run(tc.name, func(t *testing.T) {
5888 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5889 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5890 })
5891 }
5892}
5893
Jiyong Park62304bb2020-04-13 16:19:48 +09005894func TestTestFor(t *testing.T) {
5895 ctx, _ := testApex(t, `
5896 apex {
5897 name: "myapex",
5898 key: "myapex.key",
5899 native_shared_libs: ["mylib", "myprivlib"],
5900 }
5901
5902 apex_key {
5903 name: "myapex.key",
5904 public_key: "testkey.avbpubkey",
5905 private_key: "testkey.pem",
5906 }
5907
5908 cc_library {
5909 name: "mylib",
5910 srcs: ["mylib.cpp"],
5911 system_shared_libs: [],
5912 stl: "none",
5913 stubs: {
5914 versions: ["1"],
5915 },
5916 apex_available: ["myapex"],
5917 }
5918
5919 cc_library {
5920 name: "myprivlib",
5921 srcs: ["mylib.cpp"],
5922 system_shared_libs: [],
5923 stl: "none",
5924 apex_available: ["myapex"],
5925 }
5926
5927
5928 cc_test {
5929 name: "mytest",
5930 gtest: false,
5931 srcs: ["mylib.cpp"],
5932 system_shared_libs: [],
5933 stl: "none",
5934 shared_libs: ["mylib", "myprivlib"],
5935 test_for: ["myapex"]
5936 }
5937 `)
5938
5939 // the test 'mytest' is a test for the apex, therefore is linked to the
5940 // actual implementation of mylib instead of its stub.
5941 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5942 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5943 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5944}
5945
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005946// TODO(jungjw): Move this to proptools
5947func intPtr(i int) *int {
5948 return &i
5949}
5950
5951func TestApexSet(t *testing.T) {
5952 ctx, config := testApex(t, `
5953 apex_set {
5954 name: "myapex",
5955 set: "myapex.apks",
5956 filename: "foo_v2.apex",
5957 overrides: ["foo"],
5958 }
5959 `, func(fs map[string][]byte, config android.Config) {
5960 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07005961 config.Targets[android.Android] = []android.Target{
5962 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
5963 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
5964 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005965 })
5966
5967 m := ctx.ModuleForTests("myapex", "android_common")
5968
5969 // Check extract_apks tool parameters.
5970 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5971 actual := extractedApex.Args["abis"]
5972 expected := "ARMEABI_V7A,ARM64_V8A"
5973 if actual != expected {
5974 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5975 }
5976 actual = extractedApex.Args["sdk-version"]
5977 expected = "30"
5978 if actual != expected {
5979 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5980 }
5981
5982 a := m.Module().(*ApexSet)
5983 expectedOverrides := []string{"foo"}
5984 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5985 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5986 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5987 }
5988}
5989
Jiyong Park7d95a512020-05-10 15:16:24 +09005990func TestNoStaticLinkingToStubsLib(t *testing.T) {
5991 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5992 apex {
5993 name: "myapex",
5994 key: "myapex.key",
5995 native_shared_libs: ["mylib"],
5996 }
5997
5998 apex_key {
5999 name: "myapex.key",
6000 public_key: "testkey.avbpubkey",
6001 private_key: "testkey.pem",
6002 }
6003
6004 cc_library {
6005 name: "mylib",
6006 srcs: ["mylib.cpp"],
6007 static_libs: ["otherlib"],
6008 system_shared_libs: [],
6009 stl: "none",
6010 apex_available: [ "myapex" ],
6011 }
6012
6013 cc_library {
6014 name: "otherlib",
6015 srcs: ["mylib.cpp"],
6016 system_shared_libs: [],
6017 stl: "none",
6018 stubs: {
6019 versions: ["1", "2", "3"],
6020 },
6021 apex_available: [ "myapex" ],
6022 }
6023 `)
6024}
6025
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006026func TestApexKeysTxt(t *testing.T) {
6027 ctx, _ := testApex(t, `
6028 apex {
6029 name: "myapex",
6030 key: "myapex.key",
6031 }
6032
6033 apex_key {
6034 name: "myapex.key",
6035 public_key: "testkey.avbpubkey",
6036 private_key: "testkey.pem",
6037 }
6038
6039 prebuilt_apex {
6040 name: "myapex",
6041 prefer: true,
6042 arch: {
6043 arm64: {
6044 src: "myapex-arm64.apex",
6045 },
6046 arm: {
6047 src: "myapex-arm.apex",
6048 },
6049 },
6050 }
6051
6052 apex_set {
6053 name: "myapex_set",
6054 set: "myapex.apks",
6055 filename: "myapex_set.apex",
6056 overrides: ["myapex"],
6057 }
6058 `)
6059
6060 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6061 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6062 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 +09006063 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 +09006064}
6065
Jooyung Han938b5932020-06-20 12:47:47 +09006066func TestAllowedFiles(t *testing.T) {
6067 ctx, _ := testApex(t, `
6068 apex {
6069 name: "myapex",
6070 key: "myapex.key",
6071 apps: ["app"],
6072 allowed_files: "allowed.txt",
6073 }
6074
6075 apex_key {
6076 name: "myapex.key",
6077 public_key: "testkey.avbpubkey",
6078 private_key: "testkey.pem",
6079 }
6080
6081 android_app {
6082 name: "app",
6083 srcs: ["foo/bar/MyClass.java"],
6084 package_name: "foo",
6085 sdk_version: "none",
6086 system_modules: "none",
6087 apex_available: [ "myapex" ],
6088 }
6089 `, withFiles(map[string][]byte{
6090 "sub/Android.bp": []byte(`
6091 override_apex {
6092 name: "override_myapex",
6093 base: "myapex",
6094 apps: ["override_app"],
6095 allowed_files: ":allowed",
6096 }
6097 // Overridable "path" property should be referenced indirectly
6098 filegroup {
6099 name: "allowed",
6100 srcs: ["allowed.txt"],
6101 }
6102 override_android_app {
6103 name: "override_app",
6104 base: "app",
6105 package_name: "bar",
6106 }
6107 `),
6108 }))
6109
6110 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6111 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6112 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6113 }
6114
6115 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6116 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6117 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6118 }
6119}
6120
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006121func TestNonPreferredPrebuiltDependency(t *testing.T) {
6122 _, _ = testApex(t, `
6123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 native_shared_libs: ["mylib"],
6127 }
6128
6129 apex_key {
6130 name: "myapex.key",
6131 public_key: "testkey.avbpubkey",
6132 private_key: "testkey.pem",
6133 }
6134
6135 cc_library {
6136 name: "mylib",
6137 srcs: ["mylib.cpp"],
6138 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006139 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006140 },
6141 apex_available: ["myapex"],
6142 }
6143
6144 cc_prebuilt_library_shared {
6145 name: "mylib",
6146 prefer: false,
6147 srcs: ["prebuilt.so"],
6148 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006149 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006150 },
6151 apex_available: ["myapex"],
6152 }
6153 `)
6154}
6155
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006156func TestMain(m *testing.M) {
6157 run := func() int {
6158 setUp()
6159 defer tearDown()
6160
6161 return m.Run()
6162 }
6163
6164 os.Exit(run())
6165}