blob: 9d43348c8a2848d74727a633de943ce9b4f0fbca [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 Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "io/ioutil"
20 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090021 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
28 "github.com/google/blueprint/proptools"
29
30 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080031 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090032 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000033 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090035 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090036 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090038)
39
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070040var buildDir string
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Jooyung Han344d5432019-08-23 11:17:39 +090052func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
53 t.Helper()
54 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090055 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
56 if len(errs) > 0 {
57 android.FailIfNoMatchingErrors(t, pattern, errs)
58 return
59 }
60 _, errs = ctx.PrepareBuildActions(config)
61 if len(errs) > 0 {
62 android.FailIfNoMatchingErrors(t, pattern, errs)
63 return
64 }
65
66 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
67}
68
Jooyung Han344d5432019-08-23 11:17:39 +090069func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
70 t.Helper()
71 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010072 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090073 android.FailIfErrored(t, errs)
74 _, errs = ctx.PrepareBuildActions(config)
75 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070076 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Jooyung Han344d5432019-08-23 11:17:39 +090079type testCustomizer func(fs map[string][]byte, config android.Config)
80
81func withFiles(files map[string][]byte) testCustomizer {
82 return func(fs map[string][]byte, config android.Config) {
83 for k, v := range files {
84 fs[k] = v
85 }
86 }
87}
88
89func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
90 return func(fs map[string][]byte, config android.Config) {
91 for k, v := range targets {
92 config.Targets[k] = v
93 }
94 }
95}
96
Jooyung Han35155c42020-02-06 17:33:20 +090097// withNativeBridgeTargets sets configuration with targets including:
98// - X86_64 (primary)
99// - X86 (secondary)
100// - Arm64 on X86_64 (native bridge)
101// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700102func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900103 config.Targets[android.Android] = []android.Target{
104 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
105 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
107 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
108 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
109 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
110 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
111 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
112 }
113}
114
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900115func withManifestPackageNameOverrides(specs []string) testCustomizer {
116 return func(fs map[string][]byte, config android.Config) {
117 config.TestProductVariables.ManifestPackageNameOverrides = specs
118 }
119}
120
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700121func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900122 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
123}
124
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700125func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900126 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
127}
128
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700129func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900130 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900131 filegroup {
132 name: "myapex-file_contexts",
133 srcs: [
134 "system/sepolicy/apex/myapex-file_contexts",
135 ],
136 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900137 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800138
Colin Crossf9aabd72020-02-15 11:29:50 -0800139 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
140
Jiyong Park99644e92020-11-17 22:21:02 +0900141 bp = bp + rust.GatherRequiredDepsForTest()
142
Dario Frenicde2a032019-10-27 00:29:22 +0100143 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900144
Jooyung Han344d5432019-08-23 11:17:39 +0900145 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900146 "a.java": nil,
147 "PrebuiltAppFoo.apk": nil,
148 "PrebuiltAppFooPriv.apk": nil,
149 "build/make/target/product/security": nil,
150 "apex_manifest.json": nil,
151 "AndroidManifest.xml": nil,
152 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900153 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900154 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900155 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900156 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800158 "mytest.cpp": nil,
159 "mytest1.cpp": nil,
160 "mytest2.cpp": nil,
161 "mytest3.cpp": nil,
162 "myprebuilt": nil,
163 "my_include": nil,
164 "foo/bar/MyClass.java": nil,
165 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100166 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800167 "vendor/foo/devkeys/test.x509.pem": nil,
168 "vendor/foo/devkeys/test.pk8": nil,
169 "testkey.x509.pem": nil,
170 "testkey.pk8": nil,
171 "testkey.override.x509.pem": nil,
172 "testkey.override.pk8": nil,
173 "vendor/foo/devkeys/testkey.avbpubkey": nil,
174 "vendor/foo/devkeys/testkey.pem": nil,
175 "NOTICE": nil,
176 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900177 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800178 "testkey2.avbpubkey": nil,
179 "testkey2.pem": nil,
180 "myapex-arm64.apex": nil,
181 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700182 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800183 "frameworks/base/api/current.txt": nil,
184 "framework/aidl/a.aidl": nil,
185 "build/make/core/proguard.flags": nil,
186 "build/make/core/proguard_basic_keeps.flags": nil,
187 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700188 "baz": nil,
189 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700190 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700191 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900192 "foo.rs": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900193 }
194
Colin Crossf9aabd72020-02-15 11:29:50 -0800195 cc.GatherRequiredFilesForTest(fs)
196
Jooyung Han344d5432019-08-23 11:17:39 +0900197 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800198 // The fs now needs to be populated before creating the config, call handlers twice
199 // for now, once to get any fs changes, and later after the config was created to
200 // set product variables or targets.
201 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
202 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900203 }
204
Colin Cross98be1bb2019-12-13 20:41:13 -0800205 config := android.TestArchConfig(buildDir, nil, bp, fs)
206 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
207 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
208 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
209 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
210 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700211 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800212 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
213
214 for _, handler := range handlers {
215 // The fs now needs to be populated before creating the config, call handlers twice
216 // for now, earlier to get any fs changes, and now after the config was created to
217 // set product variables or targets.
218 tempFS := map[string][]byte{}
219 handler(tempFS, config)
220 }
221
Colin Crossae8600b2020-10-29 17:09:13 -0700222 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100223
224 // from android package
225 android.RegisterPackageBuildComponents(ctx)
226 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
227
Colin Cross98be1bb2019-12-13 20:41:13 -0800228 ctx.RegisterModuleType("apex", BundleFactory)
229 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
230 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
231 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
232 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
233 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
234 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700235 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800236
Jooyung Hana57af4a2020-01-23 05:36:59 +0000237 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100238 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000239 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
240
Paul Duffin021f4e52020-07-30 16:04:17 +0100241 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100242
Paul Duffin021f4e52020-07-30 16:04:17 +0100243 // Register these after the prebuilt mutators have been registered to match what
244 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100245 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
246 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
247
Paul Duffin021f4e52020-07-30 16:04:17 +0100248 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900249 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100250
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800252 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
253 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900254 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000255 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700256 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800257 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000258 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000259 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000260 java.RegisterAppBuildComponents(ctx)
Jaewoong Jungf9b44652020-12-21 12:29:12 -0800261 java.RegisterAppImportBuildComponents(ctx)
262 java.RegisterAppSetBuildComponents(ctx)
263 java.RegisterRuntimeResourceOverlayBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100264 java.RegisterSdkLibraryBuildComponents(ctx)
Anton Hanssondff2c782020-12-21 17:10:01 +0000265 java.RegisterPrebuiltApisBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900266 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800267 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800268
Colin Cross98be1bb2019-12-13 20:41:13 -0800269 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800270 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800271
Colin Crossae8600b2020-10-29 17:09:13 -0700272 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273
Jooyung Han5c998b92019-06-27 11:30:33 +0900274 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275}
276
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277func setUp() {
278 var err error
279 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700281 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283}
284
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700285func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700286 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287}
288
Jooyung Han643adc42020-02-27 13:50:06 +0900289// ensure that 'result' equals 'expected'
290func ensureEquals(t *testing.T, result string, expected string) {
291 t.Helper()
292 if result != expected {
293 t.Errorf("%q != %q", expected, result)
294 }
295}
296
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297// ensure that 'result' contains 'expected'
298func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900299 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900300 if !strings.Contains(result, expected) {
301 t.Errorf("%q is not found in %q", expected, result)
302 }
303}
304
Liz Kammer5bd365f2020-05-27 15:15:11 -0700305// ensure that 'result' contains 'expected' exactly one time
306func ensureContainsOnce(t *testing.T, result string, expected string) {
307 t.Helper()
308 count := strings.Count(result, expected)
309 if count != 1 {
310 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
311 }
312}
313
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314// ensures that 'result' does not contain 'notExpected'
315func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900316 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 if strings.Contains(result, notExpected) {
318 t.Errorf("%q is found in %q", notExpected, result)
319 }
320}
321
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700322func ensureMatches(t *testing.T, result string, expectedRex string) {
323 ok, err := regexp.MatchString(expectedRex, result)
324 if err != nil {
325 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
326 return
327 }
328 if !ok {
329 t.Errorf("%s does not match regular expession %s", result, expectedRex)
330 }
331}
332
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900334 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900335 if !android.InList(expected, result) {
336 t.Errorf("%q is not found in %v", expected, result)
337 }
338}
339
340func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900341 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900342 if android.InList(notExpected, result) {
343 t.Errorf("%q is found in %v", notExpected, result)
344 }
345}
346
Jooyung Hane1633032019-08-01 17:41:43 +0900347func ensureListEmpty(t *testing.T, result []string) {
348 t.Helper()
349 if len(result) > 0 {
350 t.Errorf("%q is expected to be empty", result)
351 }
352}
353
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000354func ensureListNotEmpty(t *testing.T, result []string) {
355 t.Helper()
356 if len(result) == 0 {
357 t.Errorf("%q is expected to be not empty", result)
358 }
359}
360
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361// Minimal test
362func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900363 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900364 apex_defaults {
365 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900366 manifest: ":myapex.manifest",
367 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900369 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900370 native_shared_libs: [
371 "mylib",
372 "libfoo.ffi",
373 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900374 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800375 multilib: {
376 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900377 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800378 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900379 },
Jiyong Park77acec62020-06-01 21:39:15 +0900380 java_libs: [
381 "myjar",
382 "myjar_dex",
383 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900384 }
385
Jiyong Park30ca9372019-02-07 16:27:23 +0900386 apex {
387 name: "myapex",
388 defaults: ["myapex-defaults"],
389 }
390
Jiyong Park25fc6a92018-11-18 18:02:45 +0900391 apex_key {
392 name: "myapex.key",
393 public_key: "testkey.avbpubkey",
394 private_key: "testkey.pem",
395 }
396
Jiyong Park809bb722019-02-13 21:33:49 +0900397 filegroup {
398 name: "myapex.manifest",
399 srcs: ["apex_manifest.json"],
400 }
401
402 filegroup {
403 name: "myapex.androidmanifest",
404 srcs: ["AndroidManifest.xml"],
405 }
406
Jiyong Park25fc6a92018-11-18 18:02:45 +0900407 cc_library {
408 name: "mylib",
409 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900410 shared_libs: [
411 "mylib2",
412 "libbar.ffi",
413 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900414 system_shared_libs: [],
415 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000416 // TODO: remove //apex_available:platform
417 apex_available: [
418 "//apex_available:platform",
419 "myapex",
420 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900421 }
422
Alex Light3d673592019-01-18 14:37:31 -0800423 cc_binary {
424 name: "foo",
425 srcs: ["mylib.cpp"],
426 compile_multilib: "both",
427 multilib: {
428 lib32: {
429 suffix: "32",
430 },
431 lib64: {
432 suffix: "64",
433 },
434 },
435 symlinks: ["foo_link_"],
436 symlink_preferred_arch: true,
437 system_shared_libs: [],
438 static_executable: true,
439 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700440 apex_available: [ "myapex", "com.android.gki.*" ],
441 }
442
Jiyong Park99644e92020-11-17 22:21:02 +0900443 rust_binary {
444 name: "foo.rust",
445 srcs: ["foo.rs"],
446 rlibs: ["libfoo.rlib.rust"],
447 dylibs: ["libfoo.dylib.rust"],
448 apex_available: ["myapex"],
449 }
450
451 rust_library_rlib {
452 name: "libfoo.rlib.rust",
453 srcs: ["foo.rs"],
454 crate_name: "foo",
455 apex_available: ["myapex"],
456 }
457
458 rust_library_dylib {
459 name: "libfoo.dylib.rust",
460 srcs: ["foo.rs"],
461 crate_name: "foo",
462 apex_available: ["myapex"],
463 }
464
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900465 rust_ffi_shared {
466 name: "libfoo.ffi",
467 srcs: ["foo.rs"],
468 crate_name: "foo",
469 apex_available: ["myapex"],
470 }
471
472 rust_ffi_shared {
473 name: "libbar.ffi",
474 srcs: ["foo.rs"],
475 crate_name: "bar",
476 apex_available: ["myapex"],
477 }
478
Yifan Hongd22a84a2020-07-28 17:37:46 -0700479 apex {
480 name: "com.android.gki.fake",
481 binaries: ["foo"],
482 key: "myapex.key",
483 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800484 }
485
Paul Duffindddd5462020-04-07 15:25:44 +0100486 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900487 name: "mylib2",
488 srcs: ["mylib.cpp"],
489 system_shared_libs: [],
490 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900491 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900492 static_libs: ["libstatic"],
493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Paul Duffindddd5462020-04-07 15:25:44 +0100500 cc_prebuilt_library_shared {
501 name: "mylib2",
502 srcs: ["prebuilt.so"],
503 // TODO: remove //apex_available:platform
504 apex_available: [
505 "//apex_available:platform",
506 "myapex",
507 ],
508 }
509
Jiyong Park9918e1a2020-03-17 19:16:40 +0900510 cc_library_static {
511 name: "libstatic",
512 srcs: ["mylib.cpp"],
513 system_shared_libs: [],
514 stl: "none",
515 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000516 // TODO: remove //apex_available:platform
517 apex_available: [
518 "//apex_available:platform",
519 "myapex",
520 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522
523 java_library {
524 name: "myjar",
525 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900526 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900527 sdk_version: "none",
528 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900529 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900530 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000531 // TODO: remove //apex_available:platform
532 apex_available: [
533 "//apex_available:platform",
534 "myapex",
535 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900536 }
537
Jiyong Park77acec62020-06-01 21:39:15 +0900538 dex_import {
539 name: "myjar_dex",
540 jars: ["prebuilt.jar"],
541 apex_available: [
542 "//apex_available:platform",
543 "myapex",
544 ],
545 }
546
Jiyong Park7f7766d2019-07-25 22:02:35 +0900547 java_library {
548 name: "myotherjar",
549 srcs: ["foo/bar/MyClass.java"],
550 sdk_version: "none",
551 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900552 // TODO: remove //apex_available:platform
553 apex_available: [
554 "//apex_available:platform",
555 "myapex",
556 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900557 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900558
559 java_library {
560 name: "mysharedjar",
561 srcs: ["foo/bar/MyClass.java"],
562 sdk_version: "none",
563 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900564 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900565 `)
566
Sundong Ahnabb64432019-10-22 13:58:29 +0900567 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900568
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900569 // Make sure that Android.mk is created
570 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
571 data := android.AndroidMkDataForTest(t, config, "", ab)
572 var builder strings.Builder
573 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
574
575 androidMk := builder.String()
576 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
577 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
578
Jiyong Park42cca6c2019-04-01 11:15:50 +0900579 optFlags := apexRule.Args["opt_flags"]
580 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700581 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900582 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900583
Jiyong Park25fc6a92018-11-18 18:02:45 +0900584 copyCmds := apexRule.Args["copy_commands"]
585
586 // Ensure that main rule creates an output
587 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
588
589 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700590 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
591 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
592 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900593 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900594 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900595
596 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700597 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
598 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900599 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
600 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900601 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900602
603 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800604 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
605 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900606 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900607 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900608 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900609 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
610 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900611 // .. but not for java libs
612 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900613 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800614
Colin Cross7113d202019-11-20 16:39:12 -0800615 // Ensure that the platform variant ends with _shared or _common
616 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
617 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900618 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
619 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900620 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
621
622 // Ensure that dynamic dependency to java libs are not included
623 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800624
625 // Ensure that all symlinks are present.
626 found_foo_link_64 := false
627 found_foo := false
628 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900629 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800630 if strings.HasSuffix(cmd, "bin/foo") {
631 found_foo = true
632 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
633 found_foo_link_64 = true
634 }
635 }
636 }
637 good := found_foo && found_foo_link_64
638 if !good {
639 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
640 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900641
Sundong Ahnabb64432019-10-22 13:58:29 +0900642 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700643 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900644 if len(noticeInputs) != 3 {
645 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900646 }
647 ensureListContains(t, noticeInputs, "NOTICE")
648 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900649 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900650
Artur Satayeva8bd1132020-04-27 18:07:06 +0100651 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100652 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
653 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
654 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
655 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
656 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100657
658 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100659 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
660 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
661 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
662 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
663 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800664}
665
Jooyung Hanf21c7972019-12-16 22:32:06 +0900666func TestDefaults(t *testing.T) {
667 ctx, _ := testApex(t, `
668 apex_defaults {
669 name: "myapex-defaults",
670 key: "myapex.key",
671 prebuilts: ["myetc"],
672 native_shared_libs: ["mylib"],
673 java_libs: ["myjar"],
674 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900675 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800676 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 }
678
679 prebuilt_etc {
680 name: "myetc",
681 src: "myprebuilt",
682 }
683
684 apex {
685 name: "myapex",
686 defaults: ["myapex-defaults"],
687 }
688
689 apex_key {
690 name: "myapex.key",
691 public_key: "testkey.avbpubkey",
692 private_key: "testkey.pem",
693 }
694
695 cc_library {
696 name: "mylib",
697 system_shared_libs: [],
698 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000699 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900700 }
701
702 java_library {
703 name: "myjar",
704 srcs: ["foo/bar/MyClass.java"],
705 sdk_version: "none",
706 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000707 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900708 }
709
710 android_app {
711 name: "AppFoo",
712 srcs: ["foo/bar/MyClass.java"],
713 sdk_version: "none",
714 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000715 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900716 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900717
718 runtime_resource_overlay {
719 name: "rro",
720 theme: "blue",
721 }
722
markchien2f59ec92020-09-02 16:23:38 +0800723 bpf {
724 name: "bpf",
725 srcs: ["bpf.c", "bpf2.c"],
726 }
727
Jooyung Hanf21c7972019-12-16 22:32:06 +0900728 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000729 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900730 "etc/myetc",
731 "javalib/myjar.jar",
732 "lib64/mylib.so",
733 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900734 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800735 "etc/bpf/bpf.o",
736 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900737 })
738}
739
Jooyung Han01a3ee22019-11-02 02:52:25 +0900740func TestApexManifest(t *testing.T) {
741 ctx, _ := testApex(t, `
742 apex {
743 name: "myapex",
744 key: "myapex.key",
745 }
746
747 apex_key {
748 name: "myapex.key",
749 public_key: "testkey.avbpubkey",
750 private_key: "testkey.pem",
751 }
752 `)
753
754 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900755 args := module.Rule("apexRule").Args
756 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
757 t.Error("manifest should be apex_manifest.pb, but " + manifest)
758 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900759}
760
Alex Light5098a612018-11-29 17:12:15 -0800761func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700762 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800763 apex {
764 name: "myapex",
765 key: "myapex.key",
766 payload_type: "zip",
767 native_shared_libs: ["mylib"],
768 }
769
770 apex_key {
771 name: "myapex.key",
772 public_key: "testkey.avbpubkey",
773 private_key: "testkey.pem",
774 }
775
776 cc_library {
777 name: "mylib",
778 srcs: ["mylib.cpp"],
779 shared_libs: ["mylib2"],
780 system_shared_libs: [],
781 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000782 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800783 }
784
785 cc_library {
786 name: "mylib2",
787 srcs: ["mylib.cpp"],
788 system_shared_libs: [],
789 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000790 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800791 }
792 `)
793
Sundong Ahnabb64432019-10-22 13:58:29 +0900794 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800795 copyCmds := zipApexRule.Args["copy_commands"]
796
797 // Ensure that main rule creates an output
798 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
799
800 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800802
803 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700804 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800805
806 // Ensure that both direct and indirect deps are copied into apex
807 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
808 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809}
810
811func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700812 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900813 apex {
814 name: "myapex",
815 key: "myapex.key",
816 native_shared_libs: ["mylib", "mylib3"],
817 }
818
819 apex_key {
820 name: "myapex.key",
821 public_key: "testkey.avbpubkey",
822 private_key: "testkey.pem",
823 }
824
825 cc_library {
826 name: "mylib",
827 srcs: ["mylib.cpp"],
828 shared_libs: ["mylib2", "mylib3"],
829 system_shared_libs: [],
830 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000831 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900832 }
833
834 cc_library {
835 name: "mylib2",
836 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900837 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838 system_shared_libs: [],
839 stl: "none",
840 stubs: {
841 versions: ["1", "2", "3"],
842 },
843 }
844
845 cc_library {
846 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900847 srcs: ["mylib.cpp"],
848 shared_libs: ["mylib4"],
849 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 stl: "none",
851 stubs: {
852 versions: ["10", "11", "12"],
853 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000854 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900855 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900856
857 cc_library {
858 name: "mylib4",
859 srcs: ["mylib.cpp"],
860 system_shared_libs: [],
861 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000862 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900863 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900864 `)
865
Sundong Ahnabb64432019-10-22 13:58:29 +0900866 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 copyCmds := apexRule.Args["copy_commands"]
868
869 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800870 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871
872 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800873 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874
875 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800876 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877
Colin Crossaede88c2020-08-11 12:17:01 -0700878 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879
880 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900881 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900882 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900883 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884
885 // 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 -0700886 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900887 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700888 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900889
890 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900891 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900892 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900893
894 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700895 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900896
Jooyung Hana57af4a2020-01-23 05:36:59 +0000897 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900898 "lib64/mylib.so",
899 "lib64/mylib3.so",
900 "lib64/mylib4.so",
901 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900902}
903
Colin Cross7812fd32020-09-25 12:35:10 -0700904func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
905 t.Parallel()
906 ctx, _ := testApex(t, `
907 apex {
908 name: "myapex",
909 key: "myapex.key",
910 native_shared_libs: ["mylib", "mylib3"],
911 min_sdk_version: "29",
912 }
913
914 apex_key {
915 name: "myapex.key",
916 public_key: "testkey.avbpubkey",
917 private_key: "testkey.pem",
918 }
919
920 cc_library {
921 name: "mylib",
922 srcs: ["mylib.cpp"],
923 shared_libs: ["mylib2", "mylib3"],
924 system_shared_libs: [],
925 stl: "none",
926 apex_available: [ "myapex" ],
927 min_sdk_version: "28",
928 }
929
930 cc_library {
931 name: "mylib2",
932 srcs: ["mylib.cpp"],
933 cflags: ["-include mylib.h"],
934 system_shared_libs: [],
935 stl: "none",
936 stubs: {
937 versions: ["28", "29", "30", "current"],
938 },
939 min_sdk_version: "28",
940 }
941
942 cc_library {
943 name: "mylib3",
944 srcs: ["mylib.cpp"],
945 shared_libs: ["mylib4"],
946 system_shared_libs: [],
947 stl: "none",
948 stubs: {
949 versions: ["28", "29", "30", "current"],
950 },
951 apex_available: [ "myapex" ],
952 min_sdk_version: "28",
953 }
954
955 cc_library {
956 name: "mylib4",
957 srcs: ["mylib.cpp"],
958 system_shared_libs: [],
959 stl: "none",
960 apex_available: [ "myapex" ],
961 min_sdk_version: "28",
962 }
963 `)
964
965 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
966 copyCmds := apexRule.Args["copy_commands"]
967
968 // Ensure that direct non-stubs dep is always included
969 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
970
971 // Ensure that indirect stubs dep is not included
972 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
973
974 // Ensure that direct stubs dep is included
975 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
976
977 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
978
979 // Ensure that mylib is linking with the version 29 stubs for mylib2
980 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
981 // ... and not linking to the non-stub (impl) variant of mylib2
982 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
983
984 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
985 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
986 // .. and not linking to the stubs variant of mylib3
987 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
988
989 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700990 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700991 ensureNotContains(t, mylib2Cflags, "-include ")
992
993 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700994 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700995
996 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
997 "lib64/mylib.so",
998 "lib64/mylib3.so",
999 "lib64/mylib4.so",
1000 })
1001}
1002
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001003func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001004 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001005 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001006 name: "myapex2",
1007 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001008 native_shared_libs: ["mylib"],
1009 }
1010
1011 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001012 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001013 public_key: "testkey.avbpubkey",
1014 private_key: "testkey.pem",
1015 }
1016
1017 cc_library {
1018 name: "mylib",
1019 srcs: ["mylib.cpp"],
1020 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001021 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001022 system_shared_libs: [],
1023 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001024 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001025 }
1026
1027 cc_library {
1028 name: "libfoo",
1029 srcs: ["mylib.cpp"],
1030 shared_libs: ["libbar"],
1031 system_shared_libs: [],
1032 stl: "none",
1033 stubs: {
1034 versions: ["10", "20", "30"],
1035 },
1036 }
1037
1038 cc_library {
1039 name: "libbar",
1040 srcs: ["mylib.cpp"],
1041 system_shared_libs: [],
1042 stl: "none",
1043 }
1044
Jiyong Park678c8812020-02-07 17:25:49 +09001045 cc_library_static {
1046 name: "libbaz",
1047 srcs: ["mylib.cpp"],
1048 system_shared_libs: [],
1049 stl: "none",
1050 apex_available: [ "myapex2" ],
1051 }
1052
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001053 `)
1054
Jiyong Park83dc74b2020-01-14 18:38:44 +09001055 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001056 copyCmds := apexRule.Args["copy_commands"]
1057
1058 // Ensure that direct non-stubs dep is always included
1059 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1060
1061 // Ensure that indirect stubs dep is not included
1062 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1063
1064 // Ensure that dependency of stubs is not included
1065 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1066
Colin Crossaede88c2020-08-11 12:17:01 -07001067 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001068
1069 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001070 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001071 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001072 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001073
Jiyong Park3ff16992019-12-27 14:11:47 +09001074 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001075
1076 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1077 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001078
Artur Satayeva8bd1132020-04-27 18:07:06 +01001079 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001080 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1081 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1082 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001083
Artur Satayeva8bd1132020-04-27 18:07:06 +01001084 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001085 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1086 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1087 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001088}
1089
Jooyung Hand3639552019-08-09 12:57:43 +09001090func TestApexWithRuntimeLibsDependency(t *testing.T) {
1091 /*
1092 myapex
1093 |
1094 v (runtime_libs)
1095 mylib ------+------> libfoo [provides stub]
1096 |
1097 `------> libbar
1098 */
1099 ctx, _ := testApex(t, `
1100 apex {
1101 name: "myapex",
1102 key: "myapex.key",
1103 native_shared_libs: ["mylib"],
1104 }
1105
1106 apex_key {
1107 name: "myapex.key",
1108 public_key: "testkey.avbpubkey",
1109 private_key: "testkey.pem",
1110 }
1111
1112 cc_library {
1113 name: "mylib",
1114 srcs: ["mylib.cpp"],
1115 runtime_libs: ["libfoo", "libbar"],
1116 system_shared_libs: [],
1117 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001118 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001119 }
1120
1121 cc_library {
1122 name: "libfoo",
1123 srcs: ["mylib.cpp"],
1124 system_shared_libs: [],
1125 stl: "none",
1126 stubs: {
1127 versions: ["10", "20", "30"],
1128 },
1129 }
1130
1131 cc_library {
1132 name: "libbar",
1133 srcs: ["mylib.cpp"],
1134 system_shared_libs: [],
1135 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001136 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001137 }
1138
1139 `)
1140
Sundong Ahnabb64432019-10-22 13:58:29 +09001141 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001142 copyCmds := apexRule.Args["copy_commands"]
1143
1144 // Ensure that direct non-stubs dep is always included
1145 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1146
1147 // Ensure that indirect stubs dep is not included
1148 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1149
1150 // Ensure that runtime_libs dep in included
1151 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1152
Sundong Ahnabb64432019-10-22 13:58:29 +09001153 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001154 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1155 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001156
1157}
1158
Jooyung Han8ce8db92020-05-15 19:05:05 +09001159func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1160 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1161 bp := `
1162 apex {
1163 name: "com.android.runtime",
1164 key: "com.android.runtime.key",
1165 native_shared_libs: ["libc"],
1166 }
1167
1168 apex_key {
1169 name: "com.android.runtime.key",
1170 public_key: "testkey.avbpubkey",
1171 private_key: "testkey.pem",
1172 }
1173
1174 cc_library {
1175 name: "libc",
1176 no_libcrt: true,
1177 nocrt: true,
1178 stl: "none",
1179 system_shared_libs: [],
1180 stubs: { versions: ["1"] },
1181 apex_available: ["com.android.runtime"],
1182
1183 sanitize: {
1184 hwaddress: true,
1185 }
1186 }
1187
1188 cc_prebuilt_library_shared {
1189 name: "libclang_rt.hwasan-aarch64-android",
1190 no_libcrt: true,
1191 nocrt: true,
1192 stl: "none",
1193 system_shared_libs: [],
1194 srcs: [""],
1195 stubs: { versions: ["1"] },
1196
1197 sanitize: {
1198 never: true,
1199 },
1200 }
1201 `
1202 // override bp to use hard-coded names: com.android.runtime and libc
1203 fs["Android.bp"] = []byte(bp)
1204 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1205 })
1206
1207 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1208 "lib64/bionic/libc.so",
1209 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1210 })
1211
1212 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1213
1214 installed := hwasan.Description("install libclang_rt.hwasan")
1215 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1216
1217 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1218 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1219 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1220}
1221
1222func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1223 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1224 bp := `
1225 apex {
1226 name: "com.android.runtime",
1227 key: "com.android.runtime.key",
1228 native_shared_libs: ["libc"],
1229 }
1230
1231 apex_key {
1232 name: "com.android.runtime.key",
1233 public_key: "testkey.avbpubkey",
1234 private_key: "testkey.pem",
1235 }
1236
1237 cc_library {
1238 name: "libc",
1239 no_libcrt: true,
1240 nocrt: true,
1241 stl: "none",
1242 system_shared_libs: [],
1243 stubs: { versions: ["1"] },
1244 apex_available: ["com.android.runtime"],
1245 }
1246
1247 cc_prebuilt_library_shared {
1248 name: "libclang_rt.hwasan-aarch64-android",
1249 no_libcrt: true,
1250 nocrt: true,
1251 stl: "none",
1252 system_shared_libs: [],
1253 srcs: [""],
1254 stubs: { versions: ["1"] },
1255
1256 sanitize: {
1257 never: true,
1258 },
1259 }
1260 `
1261 // override bp to use hard-coded names: com.android.runtime and libc
1262 fs["Android.bp"] = []byte(bp)
1263 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1264
1265 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1266 })
1267
1268 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1269 "lib64/bionic/libc.so",
1270 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1271 })
1272
1273 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1274
1275 installed := hwasan.Description("install libclang_rt.hwasan")
1276 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1277
1278 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1279 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1280 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1281}
1282
Jooyung Han61b66e92020-03-21 14:21:46 +00001283func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1284 testcases := []struct {
1285 name string
1286 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001287 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001288 shouldLink string
1289 shouldNotLink []string
1290 }{
1291 {
Jooyung Han75568392020-03-20 04:29:24 +09001292 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001293 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001294 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001295 shouldLink: "30",
1296 shouldNotLink: []string{"29"},
1297 },
1298 {
1299 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001300 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001301 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001302 shouldLink: "29",
1303 shouldNotLink: []string{"30"},
1304 },
1305 }
1306 for _, tc := range testcases {
1307 t.Run(tc.name, func(t *testing.T) {
1308 ctx, _ := testApex(t, `
1309 apex {
1310 name: "myapex",
1311 key: "myapex.key",
1312 use_vendor: true,
1313 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001314 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001315 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001316
Jooyung Han61b66e92020-03-21 14:21:46 +00001317 apex_key {
1318 name: "myapex.key",
1319 public_key: "testkey.avbpubkey",
1320 private_key: "testkey.pem",
1321 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001322
Jooyung Han61b66e92020-03-21 14:21:46 +00001323 cc_library {
1324 name: "mylib",
1325 srcs: ["mylib.cpp"],
1326 vendor_available: true,
1327 shared_libs: ["libbar"],
1328 system_shared_libs: [],
1329 stl: "none",
1330 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001331 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001332 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001333
Jooyung Han61b66e92020-03-21 14:21:46 +00001334 cc_library {
1335 name: "libbar",
1336 srcs: ["mylib.cpp"],
1337 system_shared_libs: [],
1338 stl: "none",
1339 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001340 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001341 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001342
Jooyung Han61b66e92020-03-21 14:21:46 +00001343 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001344 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001345 symbol_file: "",
1346 }
1347 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001348 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001349 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001350
Jooyung Han61b66e92020-03-21 14:21:46 +00001351 // Ensure that LLNDK dep is not included
1352 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1353 "lib64/mylib.so",
1354 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001355
Jooyung Han61b66e92020-03-21 14:21:46 +00001356 // Ensure that LLNDK dep is required
1357 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1358 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1359 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001360
Colin Crossaede88c2020-08-11 12:17:01 -07001361 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001362 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001363 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001364 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001365 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001366
Colin Crossaede88c2020-08-11 12:17:01 -07001367 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001368 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1369 })
1370 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001371}
1372
Jiyong Park25fc6a92018-11-18 18:02:45 +09001373func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001374 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001375 apex {
1376 name: "myapex",
1377 key: "myapex.key",
1378 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1379 }
1380
1381 apex_key {
1382 name: "myapex.key",
1383 public_key: "testkey.avbpubkey",
1384 private_key: "testkey.pem",
1385 }
1386
1387 cc_library {
1388 name: "mylib",
1389 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001390 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001391 shared_libs: ["libdl#27"],
1392 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001393 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001394 }
1395
1396 cc_library_shared {
1397 name: "mylib_shared",
1398 srcs: ["mylib.cpp"],
1399 shared_libs: ["libdl#27"],
1400 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001401 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001402 }
1403
1404 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001405 name: "libBootstrap",
1406 srcs: ["mylib.cpp"],
1407 stl: "none",
1408 bootstrap: true,
1409 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001410 `)
1411
Sundong Ahnabb64432019-10-22 13:58:29 +09001412 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001413 copyCmds := apexRule.Args["copy_commands"]
1414
1415 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001416 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001417 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1418 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001419
1420 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001421 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001422
Colin Crossaede88c2020-08-11 12:17:01 -07001423 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1424 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1425 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001426
1427 // For dependency to libc
1428 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001429 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001430 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001431 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001432 // ... Cflags from stub is correctly exported to mylib
1433 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1434 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1435
1436 // For dependency to libm
1437 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001438 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001439 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001440 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001441 // ... and is not compiling with the stub
1442 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1443 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1444
1445 // For dependency to libdl
1446 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001447 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001449 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1450 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001451 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001452 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001453 // ... Cflags from stub is correctly exported to mylib
1454 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1455 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001456
1457 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001458 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1459 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1460 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1461 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001462}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001463
Jooyung Han749dc692020-04-15 11:03:39 +09001464func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001465 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001466 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1467 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001468 // 3) (platform) -> liba -> libz : this should be non-stub link
1469 ctx, _ := testApex(t, `
1470 apex {
1471 name: "myapex",
1472 key: "myapex.key",
1473 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001474 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001475 }
1476
1477 apex {
1478 name: "otherapex",
1479 key: "myapex.key",
1480 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001481 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001482 }
1483
1484 apex_key {
1485 name: "myapex.key",
1486 public_key: "testkey.avbpubkey",
1487 private_key: "testkey.pem",
1488 }
1489
1490 cc_library {
1491 name: "libx",
1492 shared_libs: ["liba"],
1493 system_shared_libs: [],
1494 stl: "none",
1495 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001496 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001497 }
1498
1499 cc_library {
1500 name: "liby",
1501 shared_libs: ["liba"],
1502 system_shared_libs: [],
1503 stl: "none",
1504 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001505 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001506 }
1507
1508 cc_library {
1509 name: "liba",
1510 shared_libs: ["libz"],
1511 system_shared_libs: [],
1512 stl: "none",
1513 apex_available: [
1514 "//apex_available:anyapex",
1515 "//apex_available:platform",
1516 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001517 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001518 }
1519
1520 cc_library {
1521 name: "libz",
1522 system_shared_libs: [],
1523 stl: "none",
1524 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001525 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001526 },
1527 }
Jooyung Han749dc692020-04-15 11:03:39 +09001528 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001529
1530 expectLink := func(from, from_variant, to, to_variant string) {
1531 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1532 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1533 }
1534 expectNoLink := func(from, from_variant, to, to_variant string) {
1535 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1536 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1537 }
1538 // platform liba is linked to non-stub version
1539 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001540 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001541 expectLink("liba", "shared_apex29", "libz", "shared_28")
1542 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1543 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001544 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001545 expectLink("liba", "shared_apex30", "libz", "shared_30")
1546 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1547 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001548}
1549
Jooyung Hanaed150d2020-04-02 01:41:41 +09001550func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1551 ctx, _ := testApex(t, `
1552 apex {
1553 name: "myapex",
1554 key: "myapex.key",
1555 native_shared_libs: ["libx"],
1556 min_sdk_version: "R",
1557 }
1558
1559 apex_key {
1560 name: "myapex.key",
1561 public_key: "testkey.avbpubkey",
1562 private_key: "testkey.pem",
1563 }
1564
1565 cc_library {
1566 name: "libx",
1567 shared_libs: ["libz"],
1568 system_shared_libs: [],
1569 stl: "none",
1570 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001571 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001572 }
1573
1574 cc_library {
1575 name: "libz",
1576 system_shared_libs: [],
1577 stl: "none",
1578 stubs: {
1579 versions: ["29", "R"],
1580 },
1581 }
1582 `, func(fs map[string][]byte, config android.Config) {
1583 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1584 })
1585
1586 expectLink := func(from, from_variant, to, to_variant string) {
1587 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1588 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1589 }
1590 expectNoLink := func(from, from_variant, to, to_variant string) {
1591 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1592 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1593 }
Dan Albertc8060532020-07-22 22:32:17 -07001594 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001595 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1596 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001597}
1598
Jooyung Han749dc692020-04-15 11:03:39 +09001599func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001600 ctx, _ := testApex(t, `
1601 apex {
1602 name: "myapex",
1603 key: "myapex.key",
1604 native_shared_libs: ["libx"],
1605 }
1606
1607 apex_key {
1608 name: "myapex.key",
1609 public_key: "testkey.avbpubkey",
1610 private_key: "testkey.pem",
1611 }
1612
1613 cc_library {
1614 name: "libx",
1615 shared_libs: ["libz"],
1616 system_shared_libs: [],
1617 stl: "none",
1618 apex_available: [ "myapex" ],
1619 }
1620
1621 cc_library {
1622 name: "libz",
1623 system_shared_libs: [],
1624 stl: "none",
1625 stubs: {
1626 versions: ["1", "2"],
1627 },
1628 }
1629 `)
1630
1631 expectLink := func(from, from_variant, to, to_variant string) {
1632 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1633 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1634 }
1635 expectNoLink := func(from, from_variant, to, to_variant string) {
1636 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1637 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1638 }
Colin Crossaede88c2020-08-11 12:17:01 -07001639 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1640 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1641 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001642}
1643
1644func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1645 ctx, _ := testApex(t, `
1646 apex {
1647 name: "myapex",
1648 key: "myapex.key",
1649 native_shared_libs: ["libx"],
1650 }
1651
1652 apex_key {
1653 name: "myapex.key",
1654 public_key: "testkey.avbpubkey",
1655 private_key: "testkey.pem",
1656 }
1657
1658 cc_library {
1659 name: "libx",
1660 system_shared_libs: [],
1661 stl: "none",
1662 apex_available: [ "myapex" ],
1663 stubs: {
1664 versions: ["1", "2"],
1665 },
1666 }
1667
1668 cc_library {
1669 name: "libz",
1670 shared_libs: ["libx"],
1671 system_shared_libs: [],
1672 stl: "none",
1673 }
1674 `)
1675
1676 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001677 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001678 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1679 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1680 }
1681 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001682 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001683 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1684 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1685 }
1686 expectLink("libz", "shared", "libx", "shared_2")
1687 expectNoLink("libz", "shared", "libz", "shared_1")
1688 expectNoLink("libz", "shared", "libz", "shared")
1689}
1690
Jooyung Han75568392020-03-20 04:29:24 +09001691func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001692 ctx, _ := testApex(t, `
1693 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: ["libbar"],
1709 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001710 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001711 }
1712
1713 cc_library {
1714 name: "libbar",
1715 stubs: {
1716 versions: ["29", "30"],
1717 },
1718 }
Jooyung Han75568392020-03-20 04:29:24 +09001719 `, func(fs map[string][]byte, config android.Config) {
1720 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1721 })
Jooyung Han03b51852020-02-26 22:45:42 +09001722 expectLink := func(from, from_variant, to, to_variant string) {
1723 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1724 libFlags := ld.Args["libFlags"]
1725 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1726 }
Colin Crossaede88c2020-08-11 12:17:01 -07001727 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001728}
1729
Jooyung Han75568392020-03-20 04:29:24 +09001730func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001731 ctx, _ := testApex(t, `
1732 apex {
1733 name: "myapex",
1734 key: "myapex.key",
1735 native_shared_libs: ["libx"],
1736 min_sdk_version: "29",
1737 }
1738
1739 apex_key {
1740 name: "myapex.key",
1741 public_key: "testkey.avbpubkey",
1742 private_key: "testkey.pem",
1743 }
1744
1745 cc_library {
1746 name: "libx",
1747 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001748 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001749 }
Jooyung Han75568392020-03-20 04:29:24 +09001750 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001751
1752 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001753 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001754 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1755 // note that platform variant is not.
1756 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1757 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001758}
1759
Jooyung Han749dc692020-04-15 11:03:39 +09001760func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001761 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001762 apex {
1763 name: "myapex",
1764 key: "myapex.key",
1765 native_shared_libs: ["libx"],
1766 min_sdk_version: "29",
1767 }
1768
1769 apex_key {
1770 name: "myapex.key",
1771 public_key: "testkey.avbpubkey",
1772 private_key: "testkey.pem",
1773 }
1774
1775 cc_library {
1776 name: "libx",
1777 shared_libs: ["libz"],
1778 system_shared_libs: [],
1779 stl: "none",
1780 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001781 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001782 }
1783
1784 cc_library {
1785 name: "libz",
1786 system_shared_libs: [],
1787 stl: "none",
1788 stubs: {
1789 versions: ["30"],
1790 },
1791 }
Jooyung Han75568392020-03-20 04:29:24 +09001792 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001793}
Jooyung Han03b51852020-02-26 22:45:42 +09001794
Jooyung Han749dc692020-04-15 11:03:39 +09001795func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1796 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001797 apex {
1798 name: "myapex",
1799 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001800 native_shared_libs: ["mylib"],
1801 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001802 }
1803
1804 apex_key {
1805 name: "myapex.key",
1806 public_key: "testkey.avbpubkey",
1807 private_key: "testkey.pem",
1808 }
Jooyung Han749dc692020-04-15 11:03:39 +09001809
1810 cc_library {
1811 name: "mylib",
1812 srcs: ["mylib.cpp"],
1813 system_shared_libs: [],
1814 stl: "none",
1815 apex_available: [
1816 "myapex",
1817 ],
1818 min_sdk_version: "30",
1819 }
1820 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001821
1822 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1823 apex {
1824 name: "myapex",
1825 key: "myapex.key",
1826 native_shared_libs: ["libfoo.ffi"],
1827 min_sdk_version: "29",
1828 }
1829
1830 apex_key {
1831 name: "myapex.key",
1832 public_key: "testkey.avbpubkey",
1833 private_key: "testkey.pem",
1834 }
1835
1836 rust_ffi_shared {
1837 name: "libfoo.ffi",
1838 srcs: ["foo.rs"],
1839 crate_name: "foo",
1840 apex_available: [
1841 "myapex",
1842 ],
1843 min_sdk_version: "30",
1844 }
1845 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001846}
1847
1848func TestApexMinSdkVersion_Okay(t *testing.T) {
1849 testApex(t, `
1850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 native_shared_libs: ["libfoo"],
1854 java_libs: ["libbar"],
1855 min_sdk_version: "29",
1856 }
1857
1858 apex_key {
1859 name: "myapex.key",
1860 public_key: "testkey.avbpubkey",
1861 private_key: "testkey.pem",
1862 }
1863
1864 cc_library {
1865 name: "libfoo",
1866 srcs: ["mylib.cpp"],
1867 shared_libs: ["libfoo_dep"],
1868 apex_available: ["myapex"],
1869 min_sdk_version: "29",
1870 }
1871
1872 cc_library {
1873 name: "libfoo_dep",
1874 srcs: ["mylib.cpp"],
1875 apex_available: ["myapex"],
1876 min_sdk_version: "29",
1877 }
1878
1879 java_library {
1880 name: "libbar",
1881 sdk_version: "current",
1882 srcs: ["a.java"],
1883 static_libs: ["libbar_dep"],
1884 apex_available: ["myapex"],
1885 min_sdk_version: "29",
1886 }
1887
1888 java_library {
1889 name: "libbar_dep",
1890 sdk_version: "current",
1891 srcs: ["a.java"],
1892 apex_available: ["myapex"],
1893 min_sdk_version: "29",
1894 }
Jooyung Han03b51852020-02-26 22:45:42 +09001895 `)
1896}
1897
Artur Satayev8cf899a2020-04-15 17:29:42 +01001898func TestJavaStableSdkVersion(t *testing.T) {
1899 testCases := []struct {
1900 name string
1901 expectedError string
1902 bp string
1903 }{
1904 {
1905 name: "Non-updatable apex with non-stable dep",
1906 bp: `
1907 apex {
1908 name: "myapex",
1909 java_libs: ["myjar"],
1910 key: "myapex.key",
1911 }
1912 apex_key {
1913 name: "myapex.key",
1914 public_key: "testkey.avbpubkey",
1915 private_key: "testkey.pem",
1916 }
1917 java_library {
1918 name: "myjar",
1919 srcs: ["foo/bar/MyClass.java"],
1920 sdk_version: "core_platform",
1921 apex_available: ["myapex"],
1922 }
1923 `,
1924 },
1925 {
1926 name: "Updatable apex with stable dep",
1927 bp: `
1928 apex {
1929 name: "myapex",
1930 java_libs: ["myjar"],
1931 key: "myapex.key",
1932 updatable: true,
1933 min_sdk_version: "29",
1934 }
1935 apex_key {
1936 name: "myapex.key",
1937 public_key: "testkey.avbpubkey",
1938 private_key: "testkey.pem",
1939 }
1940 java_library {
1941 name: "myjar",
1942 srcs: ["foo/bar/MyClass.java"],
1943 sdk_version: "current",
1944 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001945 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001946 }
1947 `,
1948 },
1949 {
1950 name: "Updatable apex with non-stable dep",
1951 expectedError: "cannot depend on \"myjar\"",
1952 bp: `
1953 apex {
1954 name: "myapex",
1955 java_libs: ["myjar"],
1956 key: "myapex.key",
1957 updatable: true,
1958 }
1959 apex_key {
1960 name: "myapex.key",
1961 public_key: "testkey.avbpubkey",
1962 private_key: "testkey.pem",
1963 }
1964 java_library {
1965 name: "myjar",
1966 srcs: ["foo/bar/MyClass.java"],
1967 sdk_version: "core_platform",
1968 apex_available: ["myapex"],
1969 }
1970 `,
1971 },
1972 {
1973 name: "Updatable apex with non-stable transitive dep",
1974 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1975 bp: `
1976 apex {
1977 name: "myapex",
1978 java_libs: ["myjar"],
1979 key: "myapex.key",
1980 updatable: true,
1981 }
1982 apex_key {
1983 name: "myapex.key",
1984 public_key: "testkey.avbpubkey",
1985 private_key: "testkey.pem",
1986 }
1987 java_library {
1988 name: "myjar",
1989 srcs: ["foo/bar/MyClass.java"],
1990 sdk_version: "current",
1991 apex_available: ["myapex"],
1992 static_libs: ["transitive-jar"],
1993 }
1994 java_library {
1995 name: "transitive-jar",
1996 srcs: ["foo/bar/MyClass.java"],
1997 sdk_version: "core_platform",
1998 apex_available: ["myapex"],
1999 }
2000 `,
2001 },
2002 }
2003
2004 for _, test := range testCases {
2005 t.Run(test.name, func(t *testing.T) {
2006 if test.expectedError == "" {
2007 testApex(t, test.bp)
2008 } else {
2009 testApexError(t, test.expectedError, test.bp)
2010 }
2011 })
2012 }
2013}
2014
Jooyung Han749dc692020-04-15 11:03:39 +09002015func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2016 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2017 apex {
2018 name: "myapex",
2019 key: "myapex.key",
2020 native_shared_libs: ["mylib"],
2021 min_sdk_version: "29",
2022 }
2023
2024 apex_key {
2025 name: "myapex.key",
2026 public_key: "testkey.avbpubkey",
2027 private_key: "testkey.pem",
2028 }
2029
2030 cc_library {
2031 name: "mylib",
2032 srcs: ["mylib.cpp"],
2033 shared_libs: ["mylib2"],
2034 system_shared_libs: [],
2035 stl: "none",
2036 apex_available: [
2037 "myapex",
2038 ],
2039 min_sdk_version: "29",
2040 }
2041
2042 // indirect part of the apex
2043 cc_library {
2044 name: "mylib2",
2045 srcs: ["mylib.cpp"],
2046 system_shared_libs: [],
2047 stl: "none",
2048 apex_available: [
2049 "myapex",
2050 ],
2051 min_sdk_version: "30",
2052 }
2053 `)
2054}
2055
2056func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2057 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
2061 apps: ["AppFoo"],
2062 min_sdk_version: "29",
2063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
2070
2071 android_app {
2072 name: "AppFoo",
2073 srcs: ["foo/bar/MyClass.java"],
2074 sdk_version: "current",
2075 min_sdk_version: "29",
2076 system_modules: "none",
2077 stl: "none",
2078 static_libs: ["bar"],
2079 apex_available: [ "myapex" ],
2080 }
2081
2082 java_library {
2083 name: "bar",
2084 sdk_version: "current",
2085 srcs: ["a.java"],
2086 apex_available: [ "myapex" ],
2087 }
2088 `)
2089}
2090
2091func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2092 ctx, _ := testApex(t, `
2093 apex {
2094 name: "myapex",
2095 key: "myapex.key",
2096 native_shared_libs: ["mylib"],
2097 min_sdk_version: "29",
2098 }
2099
2100 apex_key {
2101 name: "myapex.key",
2102 public_key: "testkey.avbpubkey",
2103 private_key: "testkey.pem",
2104 }
2105
2106 // mylib in myapex will link to mylib2#29
2107 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2108 cc_library {
2109 name: "mylib",
2110 srcs: ["mylib.cpp"],
2111 shared_libs: ["mylib2"],
2112 system_shared_libs: [],
2113 stl: "none",
2114 apex_available: ["myapex", "otherapex"],
2115 min_sdk_version: "29",
2116 }
2117
2118 cc_library {
2119 name: "mylib2",
2120 srcs: ["mylib.cpp"],
2121 system_shared_libs: [],
2122 stl: "none",
2123 apex_available: ["otherapex"],
2124 stubs: { versions: ["29", "30"] },
2125 min_sdk_version: "30",
2126 }
2127
2128 apex {
2129 name: "otherapex",
2130 key: "myapex.key",
2131 native_shared_libs: ["mylib", "mylib2"],
2132 min_sdk_version: "30",
2133 }
2134 `)
2135 expectLink := func(from, from_variant, to, to_variant string) {
2136 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2137 libFlags := ld.Args["libFlags"]
2138 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2139 }
Colin Crossaede88c2020-08-11 12:17:01 -07002140 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2141 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002142}
2143
Jiyong Park7c2ee712018-12-07 00:42:25 +09002144func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002145 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002146 apex {
2147 name: "myapex",
2148 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002149 native_shared_libs: ["mylib"],
2150 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002151 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002152 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002153 }
2154
2155 apex_key {
2156 name: "myapex.key",
2157 public_key: "testkey.avbpubkey",
2158 private_key: "testkey.pem",
2159 }
2160
2161 prebuilt_etc {
2162 name: "myetc",
2163 src: "myprebuilt",
2164 sub_dir: "foo/bar",
2165 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002166
2167 cc_library {
2168 name: "mylib",
2169 srcs: ["mylib.cpp"],
2170 relative_install_path: "foo/bar",
2171 system_shared_libs: [],
2172 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002173 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002174 }
2175
2176 cc_binary {
2177 name: "mybin",
2178 srcs: ["mylib.cpp"],
2179 relative_install_path: "foo/bar",
2180 system_shared_libs: [],
2181 static_executable: true,
2182 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002183 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002184 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002185 `)
2186
Sundong Ahnabb64432019-10-22 13:58:29 +09002187 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002188 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2189
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002190 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002191 ensureListContains(t, dirs, "etc")
2192 ensureListContains(t, dirs, "etc/foo")
2193 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002194 ensureListContains(t, dirs, "lib64")
2195 ensureListContains(t, dirs, "lib64/foo")
2196 ensureListContains(t, dirs, "lib64/foo/bar")
2197 ensureListContains(t, dirs, "lib")
2198 ensureListContains(t, dirs, "lib/foo")
2199 ensureListContains(t, dirs, "lib/foo/bar")
2200
Jiyong Parkbd13e442019-03-15 18:10:35 +09002201 ensureListContains(t, dirs, "bin")
2202 ensureListContains(t, dirs, "bin/foo")
2203 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002204}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002205
Jooyung Han35155c42020-02-06 17:33:20 +09002206func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2207 ctx, _ := testApex(t, `
2208 apex {
2209 name: "myapex",
2210 key: "myapex.key",
2211 multilib: {
2212 both: {
2213 native_shared_libs: ["mylib"],
2214 binaries: ["mybin"],
2215 },
2216 },
2217 compile_multilib: "both",
2218 native_bridge_supported: true,
2219 }
2220
2221 apex_key {
2222 name: "myapex.key",
2223 public_key: "testkey.avbpubkey",
2224 private_key: "testkey.pem",
2225 }
2226
2227 cc_library {
2228 name: "mylib",
2229 relative_install_path: "foo/bar",
2230 system_shared_libs: [],
2231 stl: "none",
2232 apex_available: [ "myapex" ],
2233 native_bridge_supported: true,
2234 }
2235
2236 cc_binary {
2237 name: "mybin",
2238 relative_install_path: "foo/bar",
2239 system_shared_libs: [],
2240 static_executable: true,
2241 stl: "none",
2242 apex_available: [ "myapex" ],
2243 native_bridge_supported: true,
2244 compile_multilib: "both", // default is "first" for binary
2245 multilib: {
2246 lib64: {
2247 suffix: "64",
2248 },
2249 },
2250 }
2251 `, withNativeBridgeEnabled)
2252 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2253 "bin/foo/bar/mybin",
2254 "bin/foo/bar/mybin64",
2255 "bin/arm/foo/bar/mybin",
2256 "bin/arm64/foo/bar/mybin64",
2257 "lib/foo/bar/mylib.so",
2258 "lib/arm/foo/bar/mylib.so",
2259 "lib64/foo/bar/mylib.so",
2260 "lib64/arm64/foo/bar/mylib.so",
2261 })
2262}
2263
Jiyong Parkda6eb592018-12-19 17:12:36 +09002264func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002265 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["mylib"],
2270 use_vendor: true,
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 cc_library {
2280 name: "mylib",
2281 srcs: ["mylib.cpp"],
2282 shared_libs: ["mylib2"],
2283 system_shared_libs: [],
2284 vendor_available: true,
2285 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002286 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002287 }
2288
2289 cc_library {
2290 name: "mylib2",
2291 srcs: ["mylib.cpp"],
2292 system_shared_libs: [],
2293 vendor_available: true,
2294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002295 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002296 }
Jooyung Handc782442019-11-01 03:14:38 +09002297 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002298 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002299 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002300
2301 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002302 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002303 for _, implicit := range i.Implicits {
2304 inputsList = append(inputsList, implicit.String())
2305 }
2306 }
2307 inputsString := strings.Join(inputsList, " ")
2308
2309 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002310 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2311 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002312
2313 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002314 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2315 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002316}
Jiyong Park16e91a02018-12-20 18:18:08 +09002317
Jooyung Han85d61762020-06-24 23:50:26 +09002318func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002319 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2320 apex {
2321 name: "myapex",
2322 key: "myapex.key",
2323 use_vendor: true,
2324 }
2325 apex_key {
2326 name: "myapex.key",
2327 public_key: "testkey.avbpubkey",
2328 private_key: "testkey.pem",
2329 }
2330 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002331 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002332 })
Colin Cross440e0d02020-06-11 11:32:11 -07002333 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002334 testApex(t, `
2335 apex {
2336 name: "myapex",
2337 key: "myapex.key",
2338 use_vendor: true,
2339 }
2340 apex_key {
2341 name: "myapex.key",
2342 public_key: "testkey.avbpubkey",
2343 private_key: "testkey.pem",
2344 }
2345 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002346 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002347 })
2348}
2349
Jooyung Han5c998b92019-06-27 11:30:33 +09002350func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2351 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
2355 native_shared_libs: ["mylib"],
2356 use_vendor: true,
2357 }
2358
2359 apex_key {
2360 name: "myapex.key",
2361 public_key: "testkey.avbpubkey",
2362 private_key: "testkey.pem",
2363 }
2364
2365 cc_library {
2366 name: "mylib",
2367 srcs: ["mylib.cpp"],
2368 system_shared_libs: [],
2369 stl: "none",
2370 }
2371 `)
2372}
2373
Jooyung Han85d61762020-06-24 23:50:26 +09002374func TestVendorApex(t *testing.T) {
2375 ctx, config := testApex(t, `
2376 apex {
2377 name: "myapex",
2378 key: "myapex.key",
2379 binaries: ["mybin"],
2380 vendor: true,
2381 }
2382 apex_key {
2383 name: "myapex.key",
2384 public_key: "testkey.avbpubkey",
2385 private_key: "testkey.pem",
2386 }
2387 cc_binary {
2388 name: "mybin",
2389 vendor: true,
2390 shared_libs: ["libfoo"],
2391 }
2392 cc_library {
2393 name: "libfoo",
2394 proprietary: true,
2395 }
2396 `)
2397
2398 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2399 "bin/mybin",
2400 "lib64/libfoo.so",
2401 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2402 "lib64/libc++.so",
2403 })
2404
2405 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2406 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2407 name := apexBundle.BaseModuleName()
2408 prefix := "TARGET_"
2409 var builder strings.Builder
2410 data.Custom(&builder, name, prefix, "", data)
2411 androidMk := builder.String()
2412 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002413
2414 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2415 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2416 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002417}
2418
Jooyung Handf78e212020-07-22 15:54:47 +09002419func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2420 ctx, _ := testApex(t, `
2421 apex {
2422 name: "myapex",
2423 key: "myapex.key",
2424 binaries: ["mybin"],
2425 vendor: true,
2426 use_vndk_as_stable: true,
2427 }
2428 apex_key {
2429 name: "myapex.key",
2430 public_key: "testkey.avbpubkey",
2431 private_key: "testkey.pem",
2432 }
2433 cc_binary {
2434 name: "mybin",
2435 vendor: true,
2436 shared_libs: ["libvndk", "libvendor"],
2437 }
2438 cc_library {
2439 name: "libvndk",
2440 vndk: {
2441 enabled: true,
2442 },
2443 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002444 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002445 }
2446 cc_library {
2447 name: "libvendor",
2448 vendor: true,
2449 }
2450 `)
2451
2452 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2453
Colin Crossaede88c2020-08-11 12:17:01 -07002454 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002455 libs := names(ldRule.Args["libFlags"])
2456 // VNDK libs(libvndk/libc++) as they are
2457 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2458 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2459 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002460 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002461
2462 // VNDK libs are not included when use_vndk_as_stable: true
2463 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2464 "bin/mybin",
2465 "lib64/libvendor.so",
2466 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002467
2468 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2469 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2470 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002471}
2472
Jooyung Han8e5685d2020-09-21 11:02:57 +09002473func TestApex_withPrebuiltFirmware(t *testing.T) {
2474 testCases := []struct {
2475 name string
2476 additionalProp string
2477 }{
2478 {"system apex with prebuilt_firmware", ""},
2479 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2480 }
2481 for _, tc := range testCases {
2482 t.Run(tc.name, func(t *testing.T) {
2483 ctx, _ := testApex(t, `
2484 apex {
2485 name: "myapex",
2486 key: "myapex.key",
2487 prebuilts: ["myfirmware"],
2488 `+tc.additionalProp+`
2489 }
2490 apex_key {
2491 name: "myapex.key",
2492 public_key: "testkey.avbpubkey",
2493 private_key: "testkey.pem",
2494 }
2495 prebuilt_firmware {
2496 name: "myfirmware",
2497 src: "myfirmware.bin",
2498 filename_from_src: true,
2499 `+tc.additionalProp+`
2500 }
2501 `)
2502 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2503 "etc/firmware/myfirmware.bin",
2504 })
2505 })
2506 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002507}
2508
Jooyung Hanefb184e2020-06-25 17:14:25 +09002509func TestAndroidMk_UseVendorRequired(t *testing.T) {
2510 ctx, config := testApex(t, `
2511 apex {
2512 name: "myapex",
2513 key: "myapex.key",
2514 use_vendor: true,
2515 native_shared_libs: ["mylib"],
2516 }
2517
2518 apex_key {
2519 name: "myapex.key",
2520 public_key: "testkey.avbpubkey",
2521 private_key: "testkey.pem",
2522 }
2523
2524 cc_library {
2525 name: "mylib",
2526 vendor_available: true,
2527 apex_available: ["myapex"],
2528 }
2529 `, func(fs map[string][]byte, config android.Config) {
2530 setUseVendorAllowListForTest(config, []string{"myapex"})
2531 })
2532
2533 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2534 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2535 name := apexBundle.BaseModuleName()
2536 prefix := "TARGET_"
2537 var builder strings.Builder
2538 data.Custom(&builder, name, prefix, "", data)
2539 androidMk := builder.String()
2540 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2541}
2542
2543func TestAndroidMk_VendorApexRequired(t *testing.T) {
2544 ctx, config := testApex(t, `
2545 apex {
2546 name: "myapex",
2547 key: "myapex.key",
2548 vendor: true,
2549 native_shared_libs: ["mylib"],
2550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
2558 cc_library {
2559 name: "mylib",
2560 vendor_available: true,
2561 }
2562 `)
2563
2564 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2565 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2566 name := apexBundle.BaseModuleName()
2567 prefix := "TARGET_"
2568 var builder strings.Builder
2569 data.Custom(&builder, name, prefix, "", data)
2570 androidMk := builder.String()
2571 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2572}
2573
Jooyung Han2ed99d02020-06-24 23:26:26 +09002574func TestAndroidMkWritesCommonProperties(t *testing.T) {
2575 ctx, config := testApex(t, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 vintf_fragments: ["fragment.xml"],
2580 init_rc: ["init.rc"],
2581 }
2582 apex_key {
2583 name: "myapex.key",
2584 public_key: "testkey.avbpubkey",
2585 private_key: "testkey.pem",
2586 }
2587 cc_binary {
2588 name: "mybin",
2589 }
2590 `)
2591
2592 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2593 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2594 name := apexBundle.BaseModuleName()
2595 prefix := "TARGET_"
2596 var builder strings.Builder
2597 data.Custom(&builder, name, prefix, "", data)
2598 androidMk := builder.String()
2599 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2600 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2601}
2602
Jiyong Park16e91a02018-12-20 18:18:08 +09002603func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002604 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002605 apex {
2606 name: "myapex",
2607 key: "myapex.key",
2608 native_shared_libs: ["mylib"],
2609 }
2610
2611 apex_key {
2612 name: "myapex.key",
2613 public_key: "testkey.avbpubkey",
2614 private_key: "testkey.pem",
2615 }
2616
2617 cc_library {
2618 name: "mylib",
2619 srcs: ["mylib.cpp"],
2620 system_shared_libs: [],
2621 stl: "none",
2622 stubs: {
2623 versions: ["1", "2", "3"],
2624 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002625 apex_available: [
2626 "//apex_available:platform",
2627 "myapex",
2628 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002629 }
2630
2631 cc_binary {
2632 name: "not_in_apex",
2633 srcs: ["mylib.cpp"],
2634 static_libs: ["mylib"],
2635 static_executable: true,
2636 system_shared_libs: [],
2637 stl: "none",
2638 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002639 `)
2640
Colin Cross7113d202019-11-20 16:39:12 -08002641 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002642
2643 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002644 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002645}
Jiyong Park9335a262018-12-24 11:31:58 +09002646
2647func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002648 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002649 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002650 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002651 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002652 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002653 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002654 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002655 }
2656
2657 cc_library {
2658 name: "mylib",
2659 srcs: ["mylib.cpp"],
2660 system_shared_libs: [],
2661 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002662 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002663 }
2664
2665 apex_key {
2666 name: "myapex.key",
2667 public_key: "testkey.avbpubkey",
2668 private_key: "testkey.pem",
2669 }
2670
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002671 android_app_certificate {
2672 name: "myapex.certificate",
2673 certificate: "testkey",
2674 }
2675
2676 android_app_certificate {
2677 name: "myapex.certificate.override",
2678 certificate: "testkey.override",
2679 }
2680
Jiyong Park9335a262018-12-24 11:31:58 +09002681 `)
2682
2683 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002684 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002685
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002686 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2687 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002688 "vendor/foo/devkeys/testkey.avbpubkey")
2689 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002690 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2691 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002692 "vendor/foo/devkeys/testkey.pem")
2693 }
2694
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002695 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002696 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002697 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002698 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002699 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002700 }
2701}
Jiyong Park58e364a2019-01-19 19:24:06 +09002702
Jooyung Hanf121a652019-12-17 14:30:11 +09002703func TestCertificate(t *testing.T) {
2704 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2705 ctx, _ := testApex(t, `
2706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 }
2710 apex_key {
2711 name: "myapex.key",
2712 public_key: "testkey.avbpubkey",
2713 private_key: "testkey.pem",
2714 }`)
2715 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2716 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2717 if actual := rule.Args["certificates"]; actual != expected {
2718 t.Errorf("certificates should be %q, not %q", expected, actual)
2719 }
2720 })
2721 t.Run("override when unspecified", func(t *testing.T) {
2722 ctx, _ := testApex(t, `
2723 apex {
2724 name: "myapex_keytest",
2725 key: "myapex.key",
2726 file_contexts: ":myapex-file_contexts",
2727 }
2728 apex_key {
2729 name: "myapex.key",
2730 public_key: "testkey.avbpubkey",
2731 private_key: "testkey.pem",
2732 }
2733 android_app_certificate {
2734 name: "myapex.certificate.override",
2735 certificate: "testkey.override",
2736 }`)
2737 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2738 expected := "testkey.override.x509.pem testkey.override.pk8"
2739 if actual := rule.Args["certificates"]; actual != expected {
2740 t.Errorf("certificates should be %q, not %q", expected, actual)
2741 }
2742 })
2743 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2744 ctx, _ := testApex(t, `
2745 apex {
2746 name: "myapex",
2747 key: "myapex.key",
2748 certificate: ":myapex.certificate",
2749 }
2750 apex_key {
2751 name: "myapex.key",
2752 public_key: "testkey.avbpubkey",
2753 private_key: "testkey.pem",
2754 }
2755 android_app_certificate {
2756 name: "myapex.certificate",
2757 certificate: "testkey",
2758 }`)
2759 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2760 expected := "testkey.x509.pem testkey.pk8"
2761 if actual := rule.Args["certificates"]; actual != expected {
2762 t.Errorf("certificates should be %q, not %q", expected, actual)
2763 }
2764 })
2765 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2766 ctx, _ := testApex(t, `
2767 apex {
2768 name: "myapex_keytest",
2769 key: "myapex.key",
2770 file_contexts: ":myapex-file_contexts",
2771 certificate: ":myapex.certificate",
2772 }
2773 apex_key {
2774 name: "myapex.key",
2775 public_key: "testkey.avbpubkey",
2776 private_key: "testkey.pem",
2777 }
2778 android_app_certificate {
2779 name: "myapex.certificate.override",
2780 certificate: "testkey.override",
2781 }`)
2782 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2783 expected := "testkey.override.x509.pem testkey.override.pk8"
2784 if actual := rule.Args["certificates"]; actual != expected {
2785 t.Errorf("certificates should be %q, not %q", expected, actual)
2786 }
2787 })
2788 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2789 ctx, _ := testApex(t, `
2790 apex {
2791 name: "myapex",
2792 key: "myapex.key",
2793 certificate: "testkey",
2794 }
2795 apex_key {
2796 name: "myapex.key",
2797 public_key: "testkey.avbpubkey",
2798 private_key: "testkey.pem",
2799 }`)
2800 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2801 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2802 if actual := rule.Args["certificates"]; actual != expected {
2803 t.Errorf("certificates should be %q, not %q", expected, actual)
2804 }
2805 })
2806 t.Run("override when specified as <name>", func(t *testing.T) {
2807 ctx, _ := testApex(t, `
2808 apex {
2809 name: "myapex_keytest",
2810 key: "myapex.key",
2811 file_contexts: ":myapex-file_contexts",
2812 certificate: "testkey",
2813 }
2814 apex_key {
2815 name: "myapex.key",
2816 public_key: "testkey.avbpubkey",
2817 private_key: "testkey.pem",
2818 }
2819 android_app_certificate {
2820 name: "myapex.certificate.override",
2821 certificate: "testkey.override",
2822 }`)
2823 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2824 expected := "testkey.override.x509.pem testkey.override.pk8"
2825 if actual := rule.Args["certificates"]; actual != expected {
2826 t.Errorf("certificates should be %q, not %q", expected, actual)
2827 }
2828 })
2829}
2830
Jiyong Park58e364a2019-01-19 19:24:06 +09002831func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002832 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002833 apex {
2834 name: "myapex",
2835 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002836 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002837 }
2838
2839 apex {
2840 name: "otherapex",
2841 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002842 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002843 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002844 }
2845
2846 apex_key {
2847 name: "myapex.key",
2848 public_key: "testkey.avbpubkey",
2849 private_key: "testkey.pem",
2850 }
2851
2852 cc_library {
2853 name: "mylib",
2854 srcs: ["mylib.cpp"],
2855 system_shared_libs: [],
2856 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002857 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002858 "myapex",
2859 "otherapex",
2860 ],
Jooyung Han24282772020-03-21 23:20:55 +09002861 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002862 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002863 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002864 cc_library {
2865 name: "mylib2",
2866 srcs: ["mylib.cpp"],
2867 system_shared_libs: [],
2868 stl: "none",
2869 apex_available: [
2870 "myapex",
2871 "otherapex",
2872 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002873 static_libs: ["mylib3"],
2874 recovery_available: true,
2875 min_sdk_version: "29",
2876 }
2877 cc_library {
2878 name: "mylib3",
2879 srcs: ["mylib.cpp"],
2880 system_shared_libs: [],
2881 stl: "none",
2882 apex_available: [
2883 "myapex",
2884 "otherapex",
2885 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002886 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002887 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002888 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002889 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002890 `)
2891
Jooyung Hanc87a0592020-03-02 17:44:33 +09002892 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002893 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002894 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002895 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002896
Jooyung Hanccce2f22020-03-07 03:45:53 +09002897 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002898 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002899 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002900 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002901 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002902
Jooyung Hanccce2f22020-03-07 03:45:53 +09002903 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002904 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002905 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002906 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002907 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002908
Colin Crossaede88c2020-08-11 12:17:01 -07002909 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2910 // each variant defines additional macros to distinguish which apex variant it is built for
2911
2912 // non-APEX variant does not have __ANDROID_APEX__ defined
2913 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2914 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2915
2916 // APEX variant has __ANDROID_APEX__ defined
2917 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2918 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2919 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2920 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2921
2922 // APEX variant has __ANDROID_APEX__ defined
2923 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2924 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2925 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2926 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2927
Dan Albertb19953d2020-11-17 15:29:36 -08002928 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002929 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2930 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002931 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002932
2933 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2934 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002935
2936 // non-APEX variant does not have __ANDROID_APEX__ defined
2937 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2938 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2939
2940 // APEX variant has __ANDROID_APEX__ defined
2941 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002942 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002943 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002944 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002945
Jooyung Hanc87a0592020-03-02 17:44:33 +09002946 // APEX variant has __ANDROID_APEX__ defined
2947 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002948 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002949 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002950 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002951
Dan Albertb19953d2020-11-17 15:29:36 -08002952 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002953 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002954 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002955 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002956}
Jiyong Park7e636d02019-01-28 16:16:54 +09002957
2958func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002959 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002960 apex {
2961 name: "myapex",
2962 key: "myapex.key",
2963 native_shared_libs: ["mylib"],
2964 }
2965
2966 apex_key {
2967 name: "myapex.key",
2968 public_key: "testkey.avbpubkey",
2969 private_key: "testkey.pem",
2970 }
2971
2972 cc_library_headers {
2973 name: "mylib_headers",
2974 export_include_dirs: ["my_include"],
2975 system_shared_libs: [],
2976 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002977 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002978 }
2979
2980 cc_library {
2981 name: "mylib",
2982 srcs: ["mylib.cpp"],
2983 system_shared_libs: [],
2984 stl: "none",
2985 header_libs: ["mylib_headers"],
2986 export_header_lib_headers: ["mylib_headers"],
2987 stubs: {
2988 versions: ["1", "2", "3"],
2989 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002990 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002991 }
2992
2993 cc_library {
2994 name: "otherlib",
2995 srcs: ["mylib.cpp"],
2996 system_shared_libs: [],
2997 stl: "none",
2998 shared_libs: ["mylib"],
2999 }
3000 `)
3001
Colin Cross7113d202019-11-20 16:39:12 -08003002 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003003
3004 // Ensure that the include path of the header lib is exported to 'otherlib'
3005 ensureContains(t, cFlags, "-Imy_include")
3006}
Alex Light9670d332019-01-29 18:07:33 -08003007
Jiyong Park7cd10e32020-01-14 09:22:18 +09003008type fileInApex struct {
3009 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003010 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003011 isLink bool
3012}
3013
Jooyung Hana57af4a2020-01-23 05:36:59 +00003014func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003015 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003016 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003017 copyCmds := apexRule.Args["copy_commands"]
3018 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003019 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003020 for _, cmd := range strings.Split(copyCmds, "&&") {
3021 cmd = strings.TrimSpace(cmd)
3022 if cmd == "" {
3023 continue
3024 }
3025 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003026 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003027 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003028 switch terms[0] {
3029 case "mkdir":
3030 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003031 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003032 t.Fatal("copyCmds contains invalid cp command", cmd)
3033 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003034 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003035 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003036 isLink = false
3037 case "ln":
3038 if len(terms) != 3 && len(terms) != 4 {
3039 // ln LINK TARGET or ln -s LINK TARGET
3040 t.Fatal("copyCmds contains invalid ln command", cmd)
3041 }
3042 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003043 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003044 isLink = true
3045 default:
3046 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3047 }
3048 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003049 index := strings.Index(dst, imageApexDir)
3050 if index == -1 {
3051 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3052 }
3053 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003054 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003055 }
3056 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003057 return ret
3058}
3059
Jooyung Hana57af4a2020-01-23 05:36:59 +00003060func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3061 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003062 var failed bool
3063 var surplus []string
3064 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003065 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003066 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003067 for _, expected := range files {
3068 if matched, _ := path.Match(expected, file.path); matched {
3069 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003070 mactchFound = true
3071 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003072 }
3073 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003074 if !mactchFound {
3075 surplus = append(surplus, file.path)
3076 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003077 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003078
Jooyung Han31c470b2019-10-18 16:26:59 +09003079 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003080 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003081 t.Log("surplus files", surplus)
3082 failed = true
3083 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003084
3085 if len(files) > len(filesMatched) {
3086 var missing []string
3087 for _, expected := range files {
3088 if !filesMatched[expected] {
3089 missing = append(missing, expected)
3090 }
3091 }
3092 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003093 t.Log("missing files", missing)
3094 failed = true
3095 }
3096 if failed {
3097 t.Fail()
3098 }
3099}
3100
Jooyung Han344d5432019-08-23 11:17:39 +09003101func TestVndkApexCurrent(t *testing.T) {
3102 ctx, _ := testApex(t, `
3103 apex_vndk {
3104 name: "myapex",
3105 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003106 }
3107
3108 apex_key {
3109 name: "myapex.key",
3110 public_key: "testkey.avbpubkey",
3111 private_key: "testkey.pem",
3112 }
3113
3114 cc_library {
3115 name: "libvndk",
3116 srcs: ["mylib.cpp"],
3117 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003118 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003119 vndk: {
3120 enabled: true,
3121 },
3122 system_shared_libs: [],
3123 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003124 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003125 }
3126
3127 cc_library {
3128 name: "libvndksp",
3129 srcs: ["mylib.cpp"],
3130 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003131 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003132 vndk: {
3133 enabled: true,
3134 support_system_process: true,
3135 },
3136 system_shared_libs: [],
3137 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003138 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003139 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003140 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003141
Jooyung Hana57af4a2020-01-23 05:36:59 +00003142 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003143 "lib/libvndk.so",
3144 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003145 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003146 "lib64/libvndk.so",
3147 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003148 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003149 "etc/llndk.libraries.VER.txt",
3150 "etc/vndkcore.libraries.VER.txt",
3151 "etc/vndksp.libraries.VER.txt",
3152 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003153 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003154 })
Jooyung Han344d5432019-08-23 11:17:39 +09003155}
3156
3157func TestVndkApexWithPrebuilt(t *testing.T) {
3158 ctx, _ := testApex(t, `
3159 apex_vndk {
3160 name: "myapex",
3161 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003162 }
3163
3164 apex_key {
3165 name: "myapex.key",
3166 public_key: "testkey.avbpubkey",
3167 private_key: "testkey.pem",
3168 }
3169
3170 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003171 name: "libvndk",
3172 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003173 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003174 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003175 vndk: {
3176 enabled: true,
3177 },
3178 system_shared_libs: [],
3179 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003180 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003181 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003182
3183 cc_prebuilt_library_shared {
3184 name: "libvndk.arm",
3185 srcs: ["libvndk.arm.so"],
3186 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003187 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003188 vndk: {
3189 enabled: true,
3190 },
3191 enabled: false,
3192 arch: {
3193 arm: {
3194 enabled: true,
3195 },
3196 },
3197 system_shared_libs: [],
3198 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003199 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003200 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003201 `+vndkLibrariesTxtFiles("current"),
3202 withFiles(map[string][]byte{
3203 "libvndk.so": nil,
3204 "libvndk.arm.so": nil,
3205 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003206
Jooyung Hana57af4a2020-01-23 05:36:59 +00003207 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003208 "lib/libvndk.so",
3209 "lib/libvndk.arm.so",
3210 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003211 "lib/libc++.so",
3212 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003213 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003214 })
Jooyung Han344d5432019-08-23 11:17:39 +09003215}
3216
Jooyung Han39edb6c2019-11-06 16:53:07 +09003217func vndkLibrariesTxtFiles(vers ...string) (result string) {
3218 for _, v := range vers {
3219 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003220 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003221 result += `
3222 vndk_libraries_txt {
3223 name: "` + txt + `.libraries.txt",
3224 }
3225 `
3226 }
3227 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003228 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003229 result += `
3230 prebuilt_etc {
3231 name: "` + txt + `.libraries.` + v + `.txt",
3232 src: "dummy.txt",
3233 }
3234 `
3235 }
3236 }
3237 }
3238 return
3239}
3240
Jooyung Han344d5432019-08-23 11:17:39 +09003241func TestVndkApexVersion(t *testing.T) {
3242 ctx, _ := testApex(t, `
3243 apex_vndk {
3244 name: "myapex_v27",
3245 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003246 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003247 vndk_version: "27",
3248 }
3249
3250 apex_key {
3251 name: "myapex.key",
3252 public_key: "testkey.avbpubkey",
3253 private_key: "testkey.pem",
3254 }
3255
Jooyung Han31c470b2019-10-18 16:26:59 +09003256 vndk_prebuilt_shared {
3257 name: "libvndk27",
3258 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003259 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003260 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003261 vndk: {
3262 enabled: true,
3263 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003264 target_arch: "arm64",
3265 arch: {
3266 arm: {
3267 srcs: ["libvndk27_arm.so"],
3268 },
3269 arm64: {
3270 srcs: ["libvndk27_arm64.so"],
3271 },
3272 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003273 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003274 }
3275
3276 vndk_prebuilt_shared {
3277 name: "libvndk27",
3278 version: "27",
3279 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003280 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003281 vndk: {
3282 enabled: true,
3283 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003284 target_arch: "x86_64",
3285 arch: {
3286 x86: {
3287 srcs: ["libvndk27_x86.so"],
3288 },
3289 x86_64: {
3290 srcs: ["libvndk27_x86_64.so"],
3291 },
3292 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003293 }
3294 `+vndkLibrariesTxtFiles("27"),
3295 withFiles(map[string][]byte{
3296 "libvndk27_arm.so": nil,
3297 "libvndk27_arm64.so": nil,
3298 "libvndk27_x86.so": nil,
3299 "libvndk27_x86_64.so": nil,
3300 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003301
Jooyung Hana57af4a2020-01-23 05:36:59 +00003302 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003303 "lib/libvndk27_arm.so",
3304 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003305 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003306 })
Jooyung Han344d5432019-08-23 11:17:39 +09003307}
3308
3309func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3310 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3311 apex_vndk {
3312 name: "myapex_v27",
3313 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003314 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003315 vndk_version: "27",
3316 }
3317 apex_vndk {
3318 name: "myapex_v27_other",
3319 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003320 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003321 vndk_version: "27",
3322 }
3323
3324 apex_key {
3325 name: "myapex.key",
3326 public_key: "testkey.avbpubkey",
3327 private_key: "testkey.pem",
3328 }
3329
3330 cc_library {
3331 name: "libvndk",
3332 srcs: ["mylib.cpp"],
3333 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003334 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003335 vndk: {
3336 enabled: true,
3337 },
3338 system_shared_libs: [],
3339 stl: "none",
3340 }
3341
3342 vndk_prebuilt_shared {
3343 name: "libvndk",
3344 version: "27",
3345 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003346 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003347 vndk: {
3348 enabled: true,
3349 },
3350 srcs: ["libvndk.so"],
3351 }
3352 `, withFiles(map[string][]byte{
3353 "libvndk.so": nil,
3354 }))
3355}
3356
Jooyung Han90eee022019-10-01 20:02:42 +09003357func TestVndkApexNameRule(t *testing.T) {
3358 ctx, _ := testApex(t, `
3359 apex_vndk {
3360 name: "myapex",
3361 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003362 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003363 }
3364 apex_vndk {
3365 name: "myapex_v28",
3366 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003367 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003368 vndk_version: "28",
3369 }
3370 apex_key {
3371 name: "myapex.key",
3372 public_key: "testkey.avbpubkey",
3373 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003374 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003375
3376 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003377 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003378 actual := proptools.String(bundle.properties.Apex_name)
3379 if !reflect.DeepEqual(actual, expected) {
3380 t.Errorf("Got '%v', expected '%v'", actual, expected)
3381 }
3382 }
3383
3384 assertApexName("com.android.vndk.vVER", "myapex")
3385 assertApexName("com.android.vndk.v28", "myapex_v28")
3386}
3387
Jooyung Han344d5432019-08-23 11:17:39 +09003388func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3389 ctx, _ := testApex(t, `
3390 apex_vndk {
3391 name: "myapex",
3392 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003393 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003394 }
3395
3396 apex_key {
3397 name: "myapex.key",
3398 public_key: "testkey.avbpubkey",
3399 private_key: "testkey.pem",
3400 }
3401
3402 cc_library {
3403 name: "libvndk",
3404 srcs: ["mylib.cpp"],
3405 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003406 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003407 native_bridge_supported: true,
3408 host_supported: true,
3409 vndk: {
3410 enabled: true,
3411 },
3412 system_shared_libs: [],
3413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003414 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003415 }
Jooyung Han35155c42020-02-06 17:33:20 +09003416 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003417
Jooyung Hana57af4a2020-01-23 05:36:59 +00003418 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003419 "lib/libvndk.so",
3420 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003421 "lib/libc++.so",
3422 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003423 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 })
Jooyung Han344d5432019-08-23 11:17:39 +09003425}
3426
3427func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3428 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3429 apex_vndk {
3430 name: "myapex",
3431 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003432 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003433 native_bridge_supported: true,
3434 }
3435
3436 apex_key {
3437 name: "myapex.key",
3438 public_key: "testkey.avbpubkey",
3439 private_key: "testkey.pem",
3440 }
3441
3442 cc_library {
3443 name: "libvndk",
3444 srcs: ["mylib.cpp"],
3445 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003446 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003447 native_bridge_supported: true,
3448 host_supported: true,
3449 vndk: {
3450 enabled: true,
3451 },
3452 system_shared_libs: [],
3453 stl: "none",
3454 }
3455 `)
3456}
3457
Jooyung Han31c470b2019-10-18 16:26:59 +09003458func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003459 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003460 apex_vndk {
3461 name: "myapex_v27",
3462 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003463 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 vndk_version: "27",
3465 }
3466
3467 apex_key {
3468 name: "myapex.key",
3469 public_key: "testkey.avbpubkey",
3470 private_key: "testkey.pem",
3471 }
3472
3473 vndk_prebuilt_shared {
3474 name: "libvndk27",
3475 version: "27",
3476 target_arch: "arm",
3477 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003478 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003479 vndk: {
3480 enabled: true,
3481 },
3482 arch: {
3483 arm: {
3484 srcs: ["libvndk27.so"],
3485 }
3486 },
3487 }
3488
3489 vndk_prebuilt_shared {
3490 name: "libvndk27",
3491 version: "27",
3492 target_arch: "arm",
3493 binder32bit: true,
3494 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003495 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003496 vndk: {
3497 enabled: true,
3498 },
3499 arch: {
3500 arm: {
3501 srcs: ["libvndk27binder32.so"],
3502 }
3503 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003504 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003505 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003506 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003507 withFiles(map[string][]byte{
3508 "libvndk27.so": nil,
3509 "libvndk27binder32.so": nil,
3510 }),
3511 withBinder32bit,
3512 withTargets(map[android.OsType][]android.Target{
3513 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003514 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3515 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003516 },
3517 }),
3518 )
3519
Jooyung Hana57af4a2020-01-23 05:36:59 +00003520 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003521 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003522 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003523 })
3524}
3525
Jooyung Han45a96772020-06-15 14:59:42 +09003526func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3527 ctx, _ := testApex(t, `
3528 apex_vndk {
3529 name: "myapex",
3530 key: "myapex.key",
3531 file_contexts: ":myapex-file_contexts",
3532 }
3533
3534 apex_key {
3535 name: "myapex.key",
3536 public_key: "testkey.avbpubkey",
3537 private_key: "testkey.pem",
3538 }
3539
3540 cc_library {
3541 name: "libz",
3542 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003543 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003544 vndk: {
3545 enabled: true,
3546 },
3547 stubs: {
3548 symbol_file: "libz.map.txt",
3549 versions: ["30"],
3550 }
3551 }
3552 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3553 "libz.map.txt": nil,
3554 }))
3555
3556 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3557 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3558 ensureListEmpty(t, provideNativeLibs)
3559}
3560
Jooyung Hane1633032019-08-01 17:41:43 +09003561func TestDependenciesInApexManifest(t *testing.T) {
3562 ctx, _ := testApex(t, `
3563 apex {
3564 name: "myapex_nodep",
3565 key: "myapex.key",
3566 native_shared_libs: ["lib_nodep"],
3567 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003568 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003569 }
3570
3571 apex {
3572 name: "myapex_dep",
3573 key: "myapex.key",
3574 native_shared_libs: ["lib_dep"],
3575 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003576 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003577 }
3578
3579 apex {
3580 name: "myapex_provider",
3581 key: "myapex.key",
3582 native_shared_libs: ["libfoo"],
3583 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003584 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003585 }
3586
3587 apex {
3588 name: "myapex_selfcontained",
3589 key: "myapex.key",
3590 native_shared_libs: ["lib_dep", "libfoo"],
3591 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003592 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003593 }
3594
3595 apex_key {
3596 name: "myapex.key",
3597 public_key: "testkey.avbpubkey",
3598 private_key: "testkey.pem",
3599 }
3600
3601 cc_library {
3602 name: "lib_nodep",
3603 srcs: ["mylib.cpp"],
3604 system_shared_libs: [],
3605 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003606 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003607 }
3608
3609 cc_library {
3610 name: "lib_dep",
3611 srcs: ["mylib.cpp"],
3612 shared_libs: ["libfoo"],
3613 system_shared_libs: [],
3614 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003615 apex_available: [
3616 "myapex_dep",
3617 "myapex_provider",
3618 "myapex_selfcontained",
3619 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003620 }
3621
3622 cc_library {
3623 name: "libfoo",
3624 srcs: ["mytest.cpp"],
3625 stubs: {
3626 versions: ["1"],
3627 },
3628 system_shared_libs: [],
3629 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003630 apex_available: [
3631 "myapex_provider",
3632 "myapex_selfcontained",
3633 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003634 }
3635 `)
3636
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003637 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003638 var provideNativeLibs, requireNativeLibs []string
3639
Sundong Ahnabb64432019-10-22 13:58:29 +09003640 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003641 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3642 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003643 ensureListEmpty(t, provideNativeLibs)
3644 ensureListEmpty(t, requireNativeLibs)
3645
Sundong Ahnabb64432019-10-22 13:58:29 +09003646 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003647 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3648 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003649 ensureListEmpty(t, provideNativeLibs)
3650 ensureListContains(t, requireNativeLibs, "libfoo.so")
3651
Sundong Ahnabb64432019-10-22 13:58:29 +09003652 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003653 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3654 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003655 ensureListContains(t, provideNativeLibs, "libfoo.so")
3656 ensureListEmpty(t, requireNativeLibs)
3657
Sundong Ahnabb64432019-10-22 13:58:29 +09003658 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003659 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3660 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003661 ensureListContains(t, provideNativeLibs, "libfoo.so")
3662 ensureListEmpty(t, requireNativeLibs)
3663}
3664
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003665func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003666 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003667 apex {
3668 name: "myapex",
3669 key: "myapex.key",
3670 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003671 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003672 }
3673
3674 apex_key {
3675 name: "myapex.key",
3676 public_key: "testkey.avbpubkey",
3677 private_key: "testkey.pem",
3678 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003679
3680 cc_library {
3681 name: "mylib",
3682 srcs: ["mylib.cpp"],
3683 system_shared_libs: [],
3684 stl: "none",
3685 apex_available: [
3686 "//apex_available:platform",
3687 "myapex",
3688 ],
3689 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003690 `)
3691
Sundong Ahnabb64432019-10-22 13:58:29 +09003692 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003693 apexManifestRule := module.Rule("apexManifestRule")
3694 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3695 apexRule := module.Rule("apexRule")
3696 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003697
3698 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3699 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3700 name := apexBundle.BaseModuleName()
3701 prefix := "TARGET_"
3702 var builder strings.Builder
3703 data.Custom(&builder, name, prefix, "", data)
3704 androidMk := builder.String()
3705 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3706 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003707}
3708
Alex Light0851b882019-02-07 13:20:53 -08003709func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003710 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003711 apex {
3712 name: "myapex",
3713 key: "myapex.key",
3714 native_shared_libs: ["mylib_common"],
3715 }
3716
3717 apex_key {
3718 name: "myapex.key",
3719 public_key: "testkey.avbpubkey",
3720 private_key: "testkey.pem",
3721 }
3722
3723 cc_library {
3724 name: "mylib_common",
3725 srcs: ["mylib.cpp"],
3726 system_shared_libs: [],
3727 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003728 apex_available: [
3729 "//apex_available:platform",
3730 "myapex",
3731 ],
Alex Light0851b882019-02-07 13:20:53 -08003732 }
3733 `)
3734
Sundong Ahnabb64432019-10-22 13:58:29 +09003735 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003736 apexRule := module.Rule("apexRule")
3737 copyCmds := apexRule.Args["copy_commands"]
3738
3739 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3740 t.Log("Apex was a test apex!")
3741 t.Fail()
3742 }
3743 // Ensure that main rule creates an output
3744 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3745
3746 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003747 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003748
3749 // Ensure that both direct and indirect deps are copied into apex
3750 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3751
Colin Cross7113d202019-11-20 16:39:12 -08003752 // Ensure that the platform variant ends with _shared
3753 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003754
Colin Cross56a83212020-09-15 18:30:11 -07003755 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003756 t.Log("Found mylib_common not in any apex!")
3757 t.Fail()
3758 }
3759}
3760
3761func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003762 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003763 apex_test {
3764 name: "myapex",
3765 key: "myapex.key",
3766 native_shared_libs: ["mylib_common_test"],
3767 }
3768
3769 apex_key {
3770 name: "myapex.key",
3771 public_key: "testkey.avbpubkey",
3772 private_key: "testkey.pem",
3773 }
3774
3775 cc_library {
3776 name: "mylib_common_test",
3777 srcs: ["mylib.cpp"],
3778 system_shared_libs: [],
3779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003780 // TODO: remove //apex_available:platform
3781 apex_available: [
3782 "//apex_available:platform",
3783 "myapex",
3784 ],
Alex Light0851b882019-02-07 13:20:53 -08003785 }
3786 `)
3787
Sundong Ahnabb64432019-10-22 13:58:29 +09003788 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003789 apexRule := module.Rule("apexRule")
3790 copyCmds := apexRule.Args["copy_commands"]
3791
3792 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3793 t.Log("Apex was not a test apex!")
3794 t.Fail()
3795 }
3796 // Ensure that main rule creates an output
3797 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3798
3799 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003800 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003801
3802 // Ensure that both direct and indirect deps are copied into apex
3803 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3804
Colin Cross7113d202019-11-20 16:39:12 -08003805 // Ensure that the platform variant ends with _shared
3806 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003807}
3808
Alex Light9670d332019-01-29 18:07:33 -08003809func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003810 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003811 apex {
3812 name: "myapex",
3813 key: "myapex.key",
3814 multilib: {
3815 first: {
3816 native_shared_libs: ["mylib_common"],
3817 }
3818 },
3819 target: {
3820 android: {
3821 multilib: {
3822 first: {
3823 native_shared_libs: ["mylib"],
3824 }
3825 }
3826 },
3827 host: {
3828 multilib: {
3829 first: {
3830 native_shared_libs: ["mylib2"],
3831 }
3832 }
3833 }
3834 }
3835 }
3836
3837 apex_key {
3838 name: "myapex.key",
3839 public_key: "testkey.avbpubkey",
3840 private_key: "testkey.pem",
3841 }
3842
3843 cc_library {
3844 name: "mylib",
3845 srcs: ["mylib.cpp"],
3846 system_shared_libs: [],
3847 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003848 // TODO: remove //apex_available:platform
3849 apex_available: [
3850 "//apex_available:platform",
3851 "myapex",
3852 ],
Alex Light9670d332019-01-29 18:07:33 -08003853 }
3854
3855 cc_library {
3856 name: "mylib_common",
3857 srcs: ["mylib.cpp"],
3858 system_shared_libs: [],
3859 stl: "none",
3860 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003861 // TODO: remove //apex_available:platform
3862 apex_available: [
3863 "//apex_available:platform",
3864 "myapex",
3865 ],
Alex Light9670d332019-01-29 18:07:33 -08003866 }
3867
3868 cc_library {
3869 name: "mylib2",
3870 srcs: ["mylib.cpp"],
3871 system_shared_libs: [],
3872 stl: "none",
3873 compile_multilib: "first",
3874 }
3875 `)
3876
Sundong Ahnabb64432019-10-22 13:58:29 +09003877 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003878 copyCmds := apexRule.Args["copy_commands"]
3879
3880 // Ensure that main rule creates an output
3881 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3882
3883 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3885 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3886 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003887
3888 // Ensure that both direct and indirect deps are copied into apex
3889 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3890 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3891 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3892
Colin Cross7113d202019-11-20 16:39:12 -08003893 // Ensure that the platform variant ends with _shared
3894 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3895 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3896 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003897}
Jiyong Park04480cf2019-02-06 00:16:29 +09003898
Jiyong Park59140302020-12-14 18:44:04 +09003899func TestApexWithArch(t *testing.T) {
3900 ctx, _ := testApex(t, `
3901 apex {
3902 name: "myapex",
3903 key: "myapex.key",
3904 arch: {
3905 arm64: {
3906 native_shared_libs: ["mylib.arm64"],
3907 },
3908 x86_64: {
3909 native_shared_libs: ["mylib.x64"],
3910 },
3911 }
3912 }
3913
3914 apex_key {
3915 name: "myapex.key",
3916 public_key: "testkey.avbpubkey",
3917 private_key: "testkey.pem",
3918 }
3919
3920 cc_library {
3921 name: "mylib.arm64",
3922 srcs: ["mylib.cpp"],
3923 system_shared_libs: [],
3924 stl: "none",
3925 // TODO: remove //apex_available:platform
3926 apex_available: [
3927 "//apex_available:platform",
3928 "myapex",
3929 ],
3930 }
3931
3932 cc_library {
3933 name: "mylib.x64",
3934 srcs: ["mylib.cpp"],
3935 system_shared_libs: [],
3936 stl: "none",
3937 // TODO: remove //apex_available:platform
3938 apex_available: [
3939 "//apex_available:platform",
3940 "myapex",
3941 ],
3942 }
3943 `)
3944
3945 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
3946 copyCmds := apexRule.Args["copy_commands"]
3947
3948 // Ensure that apex variant is created for the direct dep
3949 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
3950 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
3951
3952 // Ensure that both direct and indirect deps are copied into apex
3953 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
3954 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
3955}
3956
Jiyong Park04480cf2019-02-06 00:16:29 +09003957func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003958 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003959 apex {
3960 name: "myapex",
3961 key: "myapex.key",
3962 binaries: ["myscript"],
3963 }
3964
3965 apex_key {
3966 name: "myapex.key",
3967 public_key: "testkey.avbpubkey",
3968 private_key: "testkey.pem",
3969 }
3970
3971 sh_binary {
3972 name: "myscript",
3973 src: "mylib.cpp",
3974 filename: "myscript.sh",
3975 sub_dir: "script",
3976 }
3977 `)
3978
Sundong Ahnabb64432019-10-22 13:58:29 +09003979 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003980 copyCmds := apexRule.Args["copy_commands"]
3981
3982 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3983}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003984
Jooyung Han91df2082019-11-20 01:49:42 +09003985func TestApexInVariousPartition(t *testing.T) {
3986 testcases := []struct {
3987 propName, parition, flattenedPartition string
3988 }{
3989 {"", "system", "system_ext"},
3990 {"product_specific: true", "product", "product"},
3991 {"soc_specific: true", "vendor", "vendor"},
3992 {"proprietary: true", "vendor", "vendor"},
3993 {"vendor: true", "vendor", "vendor"},
3994 {"system_ext_specific: true", "system_ext", "system_ext"},
3995 }
3996 for _, tc := range testcases {
3997 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3998 ctx, _ := testApex(t, `
3999 apex {
4000 name: "myapex",
4001 key: "myapex.key",
4002 `+tc.propName+`
4003 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004004
Jooyung Han91df2082019-11-20 01:49:42 +09004005 apex_key {
4006 name: "myapex.key",
4007 public_key: "testkey.avbpubkey",
4008 private_key: "testkey.pem",
4009 }
4010 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004011
Jooyung Han91df2082019-11-20 01:49:42 +09004012 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4013 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4014 actual := apex.installDir.String()
4015 if actual != expected {
4016 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4017 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004018
Jooyung Han91df2082019-11-20 01:49:42 +09004019 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4020 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4021 actual = flattened.installDir.String()
4022 if actual != expected {
4023 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4024 }
4025 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004026 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004027}
Jiyong Park67882562019-03-21 01:11:21 +09004028
Jooyung Han580eb4f2020-06-24 19:33:06 +09004029func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004030 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004031 apex {
4032 name: "myapex",
4033 key: "myapex.key",
4034 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004035
Jooyung Han580eb4f2020-06-24 19:33:06 +09004036 apex_key {
4037 name: "myapex.key",
4038 public_key: "testkey.avbpubkey",
4039 private_key: "testkey.pem",
4040 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004041 `)
4042 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004043 rule := module.Output("file_contexts")
4044 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4045}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004046
Jooyung Han580eb4f2020-06-24 19:33:06 +09004047func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004048 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004049 apex {
4050 name: "myapex",
4051 key: "myapex.key",
4052 file_contexts: "my_own_file_contexts",
4053 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004054
Jooyung Han580eb4f2020-06-24 19:33:06 +09004055 apex_key {
4056 name: "myapex.key",
4057 public_key: "testkey.avbpubkey",
4058 private_key: "testkey.pem",
4059 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 `, withFiles(map[string][]byte{
4061 "my_own_file_contexts": nil,
4062 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004063}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004064
Jooyung Han580eb4f2020-06-24 19:33:06 +09004065func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004066 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004067 apex {
4068 name: "myapex",
4069 key: "myapex.key",
4070 product_specific: true,
4071 file_contexts: "product_specific_file_contexts",
4072 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004073
Jooyung Han580eb4f2020-06-24 19:33:06 +09004074 apex_key {
4075 name: "myapex.key",
4076 public_key: "testkey.avbpubkey",
4077 private_key: "testkey.pem",
4078 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004079 `)
4080
Jooyung Han580eb4f2020-06-24 19:33:06 +09004081 ctx, _ := testApex(t, `
4082 apex {
4083 name: "myapex",
4084 key: "myapex.key",
4085 product_specific: true,
4086 file_contexts: "product_specific_file_contexts",
4087 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004088
Jooyung Han580eb4f2020-06-24 19:33:06 +09004089 apex_key {
4090 name: "myapex.key",
4091 public_key: "testkey.avbpubkey",
4092 private_key: "testkey.pem",
4093 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004094 `, withFiles(map[string][]byte{
4095 "product_specific_file_contexts": nil,
4096 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004097 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4098 rule := module.Output("file_contexts")
4099 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4100}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101
Jooyung Han580eb4f2020-06-24 19:33:06 +09004102func TestFileContexts_SetViaFileGroup(t *testing.T) {
4103 ctx, _ := testApex(t, `
4104 apex {
4105 name: "myapex",
4106 key: "myapex.key",
4107 product_specific: true,
4108 file_contexts: ":my-file-contexts",
4109 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110
Jooyung Han580eb4f2020-06-24 19:33:06 +09004111 apex_key {
4112 name: "myapex.key",
4113 public_key: "testkey.avbpubkey",
4114 private_key: "testkey.pem",
4115 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004116
Jooyung Han580eb4f2020-06-24 19:33:06 +09004117 filegroup {
4118 name: "my-file-contexts",
4119 srcs: ["product_specific_file_contexts"],
4120 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004121 `, withFiles(map[string][]byte{
4122 "product_specific_file_contexts": nil,
4123 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004124 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4125 rule := module.Output("file_contexts")
4126 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004127}
4128
Jiyong Park67882562019-03-21 01:11:21 +09004129func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004130 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004131 apex_key {
4132 name: "myapex.key",
4133 public_key: ":my.avbpubkey",
4134 private_key: ":my.pem",
4135 product_specific: true,
4136 }
4137
4138 filegroup {
4139 name: "my.avbpubkey",
4140 srcs: ["testkey2.avbpubkey"],
4141 }
4142
4143 filegroup {
4144 name: "my.pem",
4145 srcs: ["testkey2.pem"],
4146 }
4147 `)
4148
4149 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4150 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004151 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004152 if actual_pubkey != expected_pubkey {
4153 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4154 }
4155 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004156 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004157 if actual_privkey != expected_privkey {
4158 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4159 }
4160}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004161
4162func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004163 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004164 prebuilt_apex {
4165 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004166 arch: {
4167 arm64: {
4168 src: "myapex-arm64.apex",
4169 },
4170 arm: {
4171 src: "myapex-arm.apex",
4172 },
4173 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004174 }
4175 `)
4176
4177 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4178
Jiyong Parkc95714e2019-03-29 14:23:10 +09004179 expectedInput := "myapex-arm64.apex"
4180 if prebuilt.inputApex.String() != expectedInput {
4181 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4182 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004183}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004184
4185func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004186 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004187 prebuilt_apex {
4188 name: "myapex",
4189 src: "myapex-arm.apex",
4190 filename: "notmyapex.apex",
4191 }
4192 `)
4193
4194 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4195
4196 expected := "notmyapex.apex"
4197 if p.installFilename != expected {
4198 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4199 }
4200}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004201
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004202func TestPrebuiltOverrides(t *testing.T) {
4203 ctx, config := testApex(t, `
4204 prebuilt_apex {
4205 name: "myapex.prebuilt",
4206 src: "myapex-arm.apex",
4207 overrides: [
4208 "myapex",
4209 ],
4210 }
4211 `)
4212
4213 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4214
4215 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004216 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004217 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004218 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004219 }
4220}
4221
Roland Levillain630846d2019-06-26 12:48:34 +01004222func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004223 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004224 apex_test {
4225 name: "myapex",
4226 key: "myapex.key",
4227 tests: [
4228 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004229 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004230 ],
4231 }
4232
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238
Liz Kammer1c14a212020-05-12 15:26:55 -07004239 filegroup {
4240 name: "fg",
4241 srcs: [
4242 "baz",
4243 "bar/baz"
4244 ],
4245 }
4246
Roland Levillain630846d2019-06-26 12:48:34 +01004247 cc_test {
4248 name: "mytest",
4249 gtest: false,
4250 srcs: ["mytest.cpp"],
4251 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004252 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004253 system_shared_libs: [],
4254 static_executable: true,
4255 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004256 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004257 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004258
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004259 cc_library {
4260 name: "mylib",
4261 srcs: ["mylib.cpp"],
4262 system_shared_libs: [],
4263 stl: "none",
4264 }
4265
Liz Kammer5bd365f2020-05-27 15:15:11 -07004266 filegroup {
4267 name: "fg2",
4268 srcs: [
4269 "testdata/baz"
4270 ],
4271 }
4272
Roland Levillain9b5fde92019-06-28 15:41:19 +01004273 cc_test {
4274 name: "mytests",
4275 gtest: false,
4276 srcs: [
4277 "mytest1.cpp",
4278 "mytest2.cpp",
4279 "mytest3.cpp",
4280 ],
4281 test_per_src: true,
4282 relative_install_path: "test",
4283 system_shared_libs: [],
4284 static_executable: true,
4285 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004286 data: [
4287 ":fg",
4288 ":fg2",
4289 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004290 }
Roland Levillain630846d2019-06-26 12:48:34 +01004291 `)
4292
Sundong Ahnabb64432019-10-22 13:58:29 +09004293 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004294 copyCmds := apexRule.Args["copy_commands"]
4295
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004296 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004297 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004298 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004299
Liz Kammer1c14a212020-05-12 15:26:55 -07004300 //Ensure that test data are copied into apex.
4301 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4302 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4303
Roland Levillain9b5fde92019-06-28 15:41:19 +01004304 // Ensure that test deps built with `test_per_src` are copied into apex.
4305 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4306 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4307 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004308
4309 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004310 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4311 data := android.AndroidMkDataForTest(t, config, "", bundle)
4312 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004313 prefix := "TARGET_"
4314 var builder strings.Builder
4315 data.Custom(&builder, name, prefix, "", data)
4316 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004317 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4318 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4319 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4320 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004321 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004322 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004323 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004324
4325 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4326 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4327 data.Custom(&builder, name, prefix, "", data)
4328 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004329 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4330 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004331}
4332
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004333func TestInstallExtraFlattenedApexes(t *testing.T) {
4334 ctx, config := testApex(t, `
4335 apex {
4336 name: "myapex",
4337 key: "myapex.key",
4338 }
4339 apex_key {
4340 name: "myapex.key",
4341 public_key: "testkey.avbpubkey",
4342 private_key: "testkey.pem",
4343 }
4344 `, func(fs map[string][]byte, config android.Config) {
4345 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4346 })
4347 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004348 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004349 mk := android.AndroidMkDataForTest(t, config, "", ab)
4350 var builder strings.Builder
4351 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4352 androidMk := builder.String()
4353 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4354}
4355
Jooyung Hand48f3c32019-08-23 11:18:57 +09004356func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4357 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4358 apex {
4359 name: "myapex",
4360 key: "myapex.key",
4361 native_shared_libs: ["libfoo"],
4362 }
4363
4364 apex_key {
4365 name: "myapex.key",
4366 public_key: "testkey.avbpubkey",
4367 private_key: "testkey.pem",
4368 }
4369
4370 cc_library {
4371 name: "libfoo",
4372 stl: "none",
4373 system_shared_libs: [],
4374 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004375 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004376 }
4377 `)
4378 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4379 apex {
4380 name: "myapex",
4381 key: "myapex.key",
4382 java_libs: ["myjar"],
4383 }
4384
4385 apex_key {
4386 name: "myapex.key",
4387 public_key: "testkey.avbpubkey",
4388 private_key: "testkey.pem",
4389 }
4390
4391 java_library {
4392 name: "myjar",
4393 srcs: ["foo/bar/MyClass.java"],
4394 sdk_version: "none",
4395 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004396 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004397 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004398 }
4399 `)
4400}
4401
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004402func TestApexWithApps(t *testing.T) {
4403 ctx, _ := testApex(t, `
4404 apex {
4405 name: "myapex",
4406 key: "myapex.key",
4407 apps: [
4408 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004409 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004410 ],
4411 }
4412
4413 apex_key {
4414 name: "myapex.key",
4415 public_key: "testkey.avbpubkey",
4416 private_key: "testkey.pem",
4417 }
4418
4419 android_app {
4420 name: "AppFoo",
4421 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004422 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004423 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004424 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004425 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004426 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004427 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004428
4429 android_app {
4430 name: "AppFooPriv",
4431 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004432 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004433 system_modules: "none",
4434 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004435 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004436 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004437 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004438
4439 cc_library_shared {
4440 name: "libjni",
4441 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004442 shared_libs: ["libfoo"],
4443 stl: "none",
4444 system_shared_libs: [],
4445 apex_available: [ "myapex" ],
4446 sdk_version: "current",
4447 }
4448
4449 cc_library_shared {
4450 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004451 stl: "none",
4452 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004453 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004454 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004455 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004456 `)
4457
Sundong Ahnabb64432019-10-22 13:58:29 +09004458 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004459 apexRule := module.Rule("apexRule")
4460 copyCmds := apexRule.Args["copy_commands"]
4461
4462 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004463 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004464
Colin Crossaede88c2020-08-11 12:17:01 -07004465 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004466 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004467 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004468 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004469 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004470 // JNI libraries including transitive deps are
4471 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004472 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004473 // ... embedded inside APK (jnilibs.zip)
4474 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4475 // ... and not directly inside the APEX
4476 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4477 }
Dario Frenicde2a032019-10-27 00:29:22 +01004478}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004479
Dario Frenicde2a032019-10-27 00:29:22 +01004480func TestApexWithAppImports(t *testing.T) {
4481 ctx, _ := testApex(t, `
4482 apex {
4483 name: "myapex",
4484 key: "myapex.key",
4485 apps: [
4486 "AppFooPrebuilt",
4487 "AppFooPrivPrebuilt",
4488 ],
4489 }
4490
4491 apex_key {
4492 name: "myapex.key",
4493 public_key: "testkey.avbpubkey",
4494 private_key: "testkey.pem",
4495 }
4496
4497 android_app_import {
4498 name: "AppFooPrebuilt",
4499 apk: "PrebuiltAppFoo.apk",
4500 presigned: true,
4501 dex_preopt: {
4502 enabled: false,
4503 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004504 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004505 }
4506
4507 android_app_import {
4508 name: "AppFooPrivPrebuilt",
4509 apk: "PrebuiltAppFooPriv.apk",
4510 privileged: true,
4511 presigned: true,
4512 dex_preopt: {
4513 enabled: false,
4514 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004515 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004516 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004517 }
4518 `)
4519
Sundong Ahnabb64432019-10-22 13:58:29 +09004520 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004521 apexRule := module.Rule("apexRule")
4522 copyCmds := apexRule.Args["copy_commands"]
4523
4524 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004525 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4526}
4527
4528func TestApexWithAppImportsPrefer(t *testing.T) {
4529 ctx, _ := testApex(t, `
4530 apex {
4531 name: "myapex",
4532 key: "myapex.key",
4533 apps: [
4534 "AppFoo",
4535 ],
4536 }
4537
4538 apex_key {
4539 name: "myapex.key",
4540 public_key: "testkey.avbpubkey",
4541 private_key: "testkey.pem",
4542 }
4543
4544 android_app {
4545 name: "AppFoo",
4546 srcs: ["foo/bar/MyClass.java"],
4547 sdk_version: "none",
4548 system_modules: "none",
4549 apex_available: [ "myapex" ],
4550 }
4551
4552 android_app_import {
4553 name: "AppFoo",
4554 apk: "AppFooPrebuilt.apk",
4555 filename: "AppFooPrebuilt.apk",
4556 presigned: true,
4557 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004558 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004559 }
4560 `, withFiles(map[string][]byte{
4561 "AppFooPrebuilt.apk": nil,
4562 }))
4563
4564 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4565 "app/AppFoo/AppFooPrebuilt.apk",
4566 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004567}
4568
Dario Freni6f3937c2019-12-20 22:58:03 +00004569func TestApexWithTestHelperApp(t *testing.T) {
4570 ctx, _ := testApex(t, `
4571 apex {
4572 name: "myapex",
4573 key: "myapex.key",
4574 apps: [
4575 "TesterHelpAppFoo",
4576 ],
4577 }
4578
4579 apex_key {
4580 name: "myapex.key",
4581 public_key: "testkey.avbpubkey",
4582 private_key: "testkey.pem",
4583 }
4584
4585 android_test_helper_app {
4586 name: "TesterHelpAppFoo",
4587 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004588 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004589 }
4590
4591 `)
4592
4593 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4594 apexRule := module.Rule("apexRule")
4595 copyCmds := apexRule.Args["copy_commands"]
4596
4597 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4598}
4599
Jooyung Han18020ea2019-11-13 10:50:48 +09004600func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4601 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004602 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004603 apex {
4604 name: "myapex",
4605 key: "myapex.key",
4606 native_shared_libs: ["libfoo"],
4607 }
4608
4609 apex_key {
4610 name: "myapex.key",
4611 public_key: "testkey.avbpubkey",
4612 private_key: "testkey.pem",
4613 }
4614
4615 apex {
4616 name: "otherapex",
4617 key: "myapex.key",
4618 native_shared_libs: ["libfoo"],
4619 }
4620
4621 cc_defaults {
4622 name: "libfoo-defaults",
4623 apex_available: ["otherapex"],
4624 }
4625
4626 cc_library {
4627 name: "libfoo",
4628 defaults: ["libfoo-defaults"],
4629 stl: "none",
4630 system_shared_libs: [],
4631 }`)
4632}
4633
Paul Duffine52e66f2020-03-30 17:54:29 +01004634func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004635 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004636 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004637 apex {
4638 name: "myapex",
4639 key: "myapex.key",
4640 native_shared_libs: ["libfoo"],
4641 }
4642
4643 apex_key {
4644 name: "myapex.key",
4645 public_key: "testkey.avbpubkey",
4646 private_key: "testkey.pem",
4647 }
4648
4649 apex {
4650 name: "otherapex",
4651 key: "otherapex.key",
4652 native_shared_libs: ["libfoo"],
4653 }
4654
4655 apex_key {
4656 name: "otherapex.key",
4657 public_key: "testkey.avbpubkey",
4658 private_key: "testkey.pem",
4659 }
4660
4661 cc_library {
4662 name: "libfoo",
4663 stl: "none",
4664 system_shared_libs: [],
4665 apex_available: ["otherapex"],
4666 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004667}
Jiyong Park127b40b2019-09-30 16:04:35 +09004668
Paul Duffine52e66f2020-03-30 17:54:29 +01004669func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004670 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004671 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004672.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004673.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004674.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004675.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004676.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004677.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004678 apex {
4679 name: "myapex",
4680 key: "myapex.key",
4681 native_shared_libs: ["libfoo"],
4682 }
4683
4684 apex_key {
4685 name: "myapex.key",
4686 public_key: "testkey.avbpubkey",
4687 private_key: "testkey.pem",
4688 }
4689
Jiyong Park127b40b2019-09-30 16:04:35 +09004690 cc_library {
4691 name: "libfoo",
4692 stl: "none",
4693 shared_libs: ["libbar"],
4694 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004695 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004696 }
4697
4698 cc_library {
4699 name: "libbar",
4700 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004701 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004702 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004703 apex_available: ["myapex"],
4704 }
4705
4706 cc_library {
4707 name: "libbaz",
4708 stl: "none",
4709 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004710 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004711}
Jiyong Park127b40b2019-09-30 16:04:35 +09004712
Paul Duffine52e66f2020-03-30 17:54:29 +01004713func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004714 testApexError(t, "\"otherapex\" is not a valid module name", `
4715 apex {
4716 name: "myapex",
4717 key: "myapex.key",
4718 native_shared_libs: ["libfoo"],
4719 }
4720
4721 apex_key {
4722 name: "myapex.key",
4723 public_key: "testkey.avbpubkey",
4724 private_key: "testkey.pem",
4725 }
4726
4727 cc_library {
4728 name: "libfoo",
4729 stl: "none",
4730 system_shared_libs: [],
4731 apex_available: ["otherapex"],
4732 }`)
4733
Paul Duffine52e66f2020-03-30 17:54:29 +01004734 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004735 apex {
4736 name: "myapex",
4737 key: "myapex.key",
4738 native_shared_libs: ["libfoo", "libbar"],
4739 }
4740
4741 apex_key {
4742 name: "myapex.key",
4743 public_key: "testkey.avbpubkey",
4744 private_key: "testkey.pem",
4745 }
4746
4747 cc_library {
4748 name: "libfoo",
4749 stl: "none",
4750 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004751 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004752 apex_available: ["myapex"],
4753 }
4754
4755 cc_library {
4756 name: "libbar",
4757 stl: "none",
4758 system_shared_libs: [],
4759 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004760 }
4761
4762 cc_library {
4763 name: "libbaz",
4764 stl: "none",
4765 system_shared_libs: [],
4766 stubs: {
4767 versions: ["10", "20", "30"],
4768 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004769 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004770}
Jiyong Park127b40b2019-09-30 16:04:35 +09004771
Jiyong Park89e850a2020-04-07 16:37:39 +09004772func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004773 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004774 apex {
4775 name: "myapex",
4776 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004777 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004778 }
4779
4780 apex_key {
4781 name: "myapex.key",
4782 public_key: "testkey.avbpubkey",
4783 private_key: "testkey.pem",
4784 }
4785
4786 cc_library {
4787 name: "libfoo",
4788 stl: "none",
4789 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004790 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004791 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004792 }
4793
4794 cc_library {
4795 name: "libfoo2",
4796 stl: "none",
4797 system_shared_libs: [],
4798 shared_libs: ["libbaz"],
4799 apex_available: ["//apex_available:platform"],
4800 }
4801
4802 cc_library {
4803 name: "libbar",
4804 stl: "none",
4805 system_shared_libs: [],
4806 apex_available: ["myapex"],
4807 }
4808
4809 cc_library {
4810 name: "libbaz",
4811 stl: "none",
4812 system_shared_libs: [],
4813 apex_available: ["myapex"],
4814 stubs: {
4815 versions: ["1"],
4816 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004817 }`)
4818
Jiyong Park89e850a2020-04-07 16:37:39 +09004819 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4820 // because it depends on libbar which isn't available to platform
4821 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4822 if libfoo.NotAvailableForPlatform() != true {
4823 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4824 }
4825
4826 // libfoo2 however can be available to platform because it depends on libbaz which provides
4827 // stubs
4828 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4829 if libfoo2.NotAvailableForPlatform() == true {
4830 t.Errorf("%q should be available to platform", libfoo2.String())
4831 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004832}
Jiyong Parka90ca002019-10-07 15:47:24 +09004833
Paul Duffine52e66f2020-03-30 17:54:29 +01004834func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004835 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004836 apex {
4837 name: "myapex",
4838 key: "myapex.key",
4839 native_shared_libs: ["libfoo"],
4840 }
4841
4842 apex_key {
4843 name: "myapex.key",
4844 public_key: "testkey.avbpubkey",
4845 private_key: "testkey.pem",
4846 }
4847
4848 cc_library {
4849 name: "libfoo",
4850 stl: "none",
4851 system_shared_libs: [],
4852 apex_available: ["myapex"],
4853 static: {
4854 apex_available: ["//apex_available:platform"],
4855 },
4856 }`)
4857
Jiyong Park89e850a2020-04-07 16:37:39 +09004858 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4859 if libfooShared.NotAvailableForPlatform() != true {
4860 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4861 }
4862 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4863 if libfooStatic.NotAvailableForPlatform() != false {
4864 t.Errorf("%q should be available to platform", libfooStatic.String())
4865 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004866}
4867
Jiyong Park5d790c32019-11-15 18:40:32 +09004868func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004869 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004870 apex {
4871 name: "myapex",
4872 key: "myapex.key",
4873 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004874 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004875 }
4876
4877 override_apex {
4878 name: "override_myapex",
4879 base: "myapex",
4880 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004881 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004882 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004883 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004884 }
4885
4886 apex_key {
4887 name: "myapex.key",
4888 public_key: "testkey.avbpubkey",
4889 private_key: "testkey.pem",
4890 }
4891
4892 android_app {
4893 name: "app",
4894 srcs: ["foo/bar/MyClass.java"],
4895 package_name: "foo",
4896 sdk_version: "none",
4897 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004898 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004899 }
4900
4901 override_android_app {
4902 name: "override_app",
4903 base: "app",
4904 package_name: "bar",
4905 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004906 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004907
Jiyong Park317645e2019-12-05 13:20:58 +09004908 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4909 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4910 if originalVariant.GetOverriddenBy() != "" {
4911 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4912 }
4913 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4914 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4915 }
4916
Jiyong Park5d790c32019-11-15 18:40:32 +09004917 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4918 apexRule := module.Rule("apexRule")
4919 copyCmds := apexRule.Args["copy_commands"]
4920
4921 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004922 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004923
4924 apexBundle := module.Module().(*apexBundle)
4925 name := apexBundle.Name()
4926 if name != "override_myapex" {
4927 t.Errorf("name should be \"override_myapex\", but was %q", name)
4928 }
4929
Baligh Uddin004d7172020-02-19 21:29:28 -08004930 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4931 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4932 }
4933
Jiyong Park20bacab2020-03-03 11:45:41 +09004934 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004935 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004936
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004937 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4938 var builder strings.Builder
4939 data.Custom(&builder, name, "TARGET_", "", data)
4940 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004941 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004942 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4943 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004944 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004945 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004946 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004947 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4948 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004949}
4950
Jooyung Han214bf372019-11-12 13:03:50 +09004951func TestLegacyAndroid10Support(t *testing.T) {
4952 ctx, _ := testApex(t, `
4953 apex {
4954 name: "myapex",
4955 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004956 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004957 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004958 }
4959
4960 apex_key {
4961 name: "myapex.key",
4962 public_key: "testkey.avbpubkey",
4963 private_key: "testkey.pem",
4964 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004965
4966 cc_library {
4967 name: "mylib",
4968 srcs: ["mylib.cpp"],
4969 stl: "libc++",
4970 system_shared_libs: [],
4971 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004972 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004973 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004974 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004975
4976 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4977 args := module.Rule("apexRule").Args
4978 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004979 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004980
4981 // The copies of the libraries in the apex should have one more dependency than
4982 // the ones outside the apex, namely the unwinder. Ideally we should check
4983 // the dependency names directly here but for some reason the names are blank in
4984 // this test.
4985 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004986 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004987 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4988 if len(apexImplicits) != len(nonApexImplicits)+1 {
4989 t.Errorf("%q missing unwinder dep", lib)
4990 }
4991 }
Jooyung Han214bf372019-11-12 13:03:50 +09004992}
4993
Paul Duffin9b879592020-05-26 13:21:35 +01004994var filesForSdkLibrary = map[string][]byte{
4995 "api/current.txt": nil,
4996 "api/removed.txt": nil,
4997 "api/system-current.txt": nil,
4998 "api/system-removed.txt": nil,
4999 "api/test-current.txt": nil,
5000 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005001
Anton Hanssondff2c782020-12-21 17:10:01 +00005002 "100/public/api/foo.txt": nil,
5003 "100/public/api/foo-removed.txt": nil,
5004 "100/system/api/foo.txt": nil,
5005 "100/system/api/foo-removed.txt": nil,
5006
Paul Duffineedc5d52020-06-12 17:46:39 +01005007 // For java_sdk_library_import
5008 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005009}
5010
Jooyung Han58f26ab2019-12-18 15:34:32 +09005011func TestJavaSDKLibrary(t *testing.T) {
5012 ctx, _ := testApex(t, `
5013 apex {
5014 name: "myapex",
5015 key: "myapex.key",
5016 java_libs: ["foo"],
5017 }
5018
5019 apex_key {
5020 name: "myapex.key",
5021 public_key: "testkey.avbpubkey",
5022 private_key: "testkey.pem",
5023 }
5024
5025 java_sdk_library {
5026 name: "foo",
5027 srcs: ["a.java"],
5028 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005029 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005030 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005031
5032 prebuilt_apis {
5033 name: "sdk",
5034 api_dirs: ["100"],
5035 }
Paul Duffin9b879592020-05-26 13:21:35 +01005036 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005037
5038 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005039 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005040 "javalib/foo.jar",
5041 "etc/permissions/foo.xml",
5042 })
5043 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005044 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5045 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005046}
5047
Paul Duffin9b879592020-05-26 13:21:35 +01005048func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5049 ctx, _ := testApex(t, `
5050 apex {
5051 name: "myapex",
5052 key: "myapex.key",
5053 java_libs: ["foo", "bar"],
5054 }
5055
5056 apex_key {
5057 name: "myapex.key",
5058 public_key: "testkey.avbpubkey",
5059 private_key: "testkey.pem",
5060 }
5061
5062 java_sdk_library {
5063 name: "foo",
5064 srcs: ["a.java"],
5065 api_packages: ["foo"],
5066 apex_available: ["myapex"],
5067 sdk_version: "none",
5068 system_modules: "none",
5069 }
5070
5071 java_library {
5072 name: "bar",
5073 srcs: ["a.java"],
5074 libs: ["foo"],
5075 apex_available: ["myapex"],
5076 sdk_version: "none",
5077 system_modules: "none",
5078 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005079
5080 prebuilt_apis {
5081 name: "sdk",
5082 api_dirs: ["100"],
5083 }
Paul Duffin9b879592020-05-26 13:21:35 +01005084 `, withFiles(filesForSdkLibrary))
5085
5086 // java_sdk_library installs both impl jar and permission XML
5087 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5088 "javalib/bar.jar",
5089 "javalib/foo.jar",
5090 "etc/permissions/foo.xml",
5091 })
5092
5093 // The bar library should depend on the implementation jar.
5094 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5095 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5096 t.Errorf("expected %q, found %#q", expected, actual)
5097 }
5098}
5099
5100func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5101 ctx, _ := testApex(t, `
5102 apex {
5103 name: "myapex",
5104 key: "myapex.key",
5105 java_libs: ["foo"],
5106 }
5107
5108 apex_key {
5109 name: "myapex.key",
5110 public_key: "testkey.avbpubkey",
5111 private_key: "testkey.pem",
5112 }
5113
5114 java_sdk_library {
5115 name: "foo",
5116 srcs: ["a.java"],
5117 api_packages: ["foo"],
5118 apex_available: ["myapex"],
5119 sdk_version: "none",
5120 system_modules: "none",
5121 }
5122
5123 java_library {
5124 name: "bar",
5125 srcs: ["a.java"],
5126 libs: ["foo"],
5127 sdk_version: "none",
5128 system_modules: "none",
5129 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005130
5131 prebuilt_apis {
5132 name: "sdk",
5133 api_dirs: ["100"],
5134 }
Paul Duffin9b879592020-05-26 13:21:35 +01005135 `, withFiles(filesForSdkLibrary))
5136
5137 // java_sdk_library installs both impl jar and permission XML
5138 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5139 "javalib/foo.jar",
5140 "etc/permissions/foo.xml",
5141 })
5142
5143 // The bar library should depend on the stubs jar.
5144 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5145 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5146 t.Errorf("expected %q, found %#q", expected, actual)
5147 }
5148}
5149
Paul Duffineedc5d52020-06-12 17:46:39 +01005150func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005151 ctx, _ := testApex(t, `
5152 prebuilt_apis {
5153 name: "sdk",
5154 api_dirs: ["100"],
5155 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005156 withFiles(map[string][]byte{
5157 "apex/a.java": nil,
5158 "apex/apex_manifest.json": nil,
5159 "apex/Android.bp": []byte(`
5160 package {
5161 default_visibility: ["//visibility:private"],
5162 }
5163
5164 apex {
5165 name: "myapex",
5166 key: "myapex.key",
5167 java_libs: ["foo", "bar"],
5168 }
5169
5170 apex_key {
5171 name: "myapex.key",
5172 public_key: "testkey.avbpubkey",
5173 private_key: "testkey.pem",
5174 }
5175
5176 java_library {
5177 name: "bar",
5178 srcs: ["a.java"],
5179 libs: ["foo"],
5180 apex_available: ["myapex"],
5181 sdk_version: "none",
5182 system_modules: "none",
5183 }
5184`),
5185 "source/a.java": nil,
5186 "source/api/current.txt": nil,
5187 "source/api/removed.txt": nil,
5188 "source/Android.bp": []byte(`
5189 package {
5190 default_visibility: ["//visibility:private"],
5191 }
5192
5193 java_sdk_library {
5194 name: "foo",
5195 visibility: ["//apex"],
5196 srcs: ["a.java"],
5197 api_packages: ["foo"],
5198 apex_available: ["myapex"],
5199 sdk_version: "none",
5200 system_modules: "none",
5201 public: {
5202 enabled: true,
5203 },
5204 }
5205`),
5206 "prebuilt/a.jar": nil,
5207 "prebuilt/Android.bp": []byte(`
5208 package {
5209 default_visibility: ["//visibility:private"],
5210 }
5211
5212 java_sdk_library_import {
5213 name: "foo",
5214 visibility: ["//apex", "//source"],
5215 apex_available: ["myapex"],
5216 prefer: true,
5217 public: {
5218 jars: ["a.jar"],
5219 },
5220 }
5221`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005222 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005223 )
5224
5225 // java_sdk_library installs both impl jar and permission XML
5226 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5227 "javalib/bar.jar",
5228 "javalib/foo.jar",
5229 "etc/permissions/foo.xml",
5230 })
5231
5232 // The bar library should depend on the implementation jar.
5233 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5234 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5235 t.Errorf("expected %q, found %#q", expected, actual)
5236 }
5237}
5238
5239func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5240 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5241 apex {
5242 name: "myapex",
5243 key: "myapex.key",
5244 java_libs: ["foo"],
5245 }
5246
5247 apex_key {
5248 name: "myapex.key",
5249 public_key: "testkey.avbpubkey",
5250 private_key: "testkey.pem",
5251 }
5252
5253 java_sdk_library_import {
5254 name: "foo",
5255 apex_available: ["myapex"],
5256 prefer: true,
5257 public: {
5258 jars: ["a.jar"],
5259 },
5260 }
5261
5262 `, withFiles(filesForSdkLibrary))
5263}
5264
atrost6e126252020-01-27 17:01:16 +00005265func TestCompatConfig(t *testing.T) {
5266 ctx, _ := testApex(t, `
5267 apex {
5268 name: "myapex",
5269 key: "myapex.key",
5270 prebuilts: ["myjar-platform-compat-config"],
5271 java_libs: ["myjar"],
5272 }
5273
5274 apex_key {
5275 name: "myapex.key",
5276 public_key: "testkey.avbpubkey",
5277 private_key: "testkey.pem",
5278 }
5279
5280 platform_compat_config {
5281 name: "myjar-platform-compat-config",
5282 src: ":myjar",
5283 }
5284
5285 java_library {
5286 name: "myjar",
5287 srcs: ["foo/bar/MyClass.java"],
5288 sdk_version: "none",
5289 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005290 apex_available: [ "myapex" ],
5291 }
5292 `)
5293 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5294 "etc/compatconfig/myjar-platform-compat-config.xml",
5295 "javalib/myjar.jar",
5296 })
5297}
5298
Jiyong Park479321d2019-12-16 11:47:12 +09005299func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5300 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5301 apex {
5302 name: "myapex",
5303 key: "myapex.key",
5304 java_libs: ["myjar"],
5305 }
5306
5307 apex_key {
5308 name: "myapex.key",
5309 public_key: "testkey.avbpubkey",
5310 private_key: "testkey.pem",
5311 }
5312
5313 java_library {
5314 name: "myjar",
5315 srcs: ["foo/bar/MyClass.java"],
5316 sdk_version: "none",
5317 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005318 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005319 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005320 }
5321 `)
5322}
5323
Jiyong Park7afd1072019-12-30 16:56:33 +09005324func TestCarryRequiredModuleNames(t *testing.T) {
5325 ctx, config := testApex(t, `
5326 apex {
5327 name: "myapex",
5328 key: "myapex.key",
5329 native_shared_libs: ["mylib"],
5330 }
5331
5332 apex_key {
5333 name: "myapex.key",
5334 public_key: "testkey.avbpubkey",
5335 private_key: "testkey.pem",
5336 }
5337
5338 cc_library {
5339 name: "mylib",
5340 srcs: ["mylib.cpp"],
5341 system_shared_libs: [],
5342 stl: "none",
5343 required: ["a", "b"],
5344 host_required: ["c", "d"],
5345 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005346 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005347 }
5348 `)
5349
5350 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5351 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5352 name := apexBundle.BaseModuleName()
5353 prefix := "TARGET_"
5354 var builder strings.Builder
5355 data.Custom(&builder, name, prefix, "", data)
5356 androidMk := builder.String()
5357 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5358 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5359 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5360}
5361
Jiyong Park7cd10e32020-01-14 09:22:18 +09005362func TestSymlinksFromApexToSystem(t *testing.T) {
5363 bp := `
5364 apex {
5365 name: "myapex",
5366 key: "myapex.key",
5367 native_shared_libs: ["mylib"],
5368 java_libs: ["myjar"],
5369 }
5370
Jiyong Park9d677202020-02-19 16:29:35 +09005371 apex {
5372 name: "myapex.updatable",
5373 key: "myapex.key",
5374 native_shared_libs: ["mylib"],
5375 java_libs: ["myjar"],
5376 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005377 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005378 }
5379
Jiyong Park7cd10e32020-01-14 09:22:18 +09005380 apex_key {
5381 name: "myapex.key",
5382 public_key: "testkey.avbpubkey",
5383 private_key: "testkey.pem",
5384 }
5385
5386 cc_library {
5387 name: "mylib",
5388 srcs: ["mylib.cpp"],
5389 shared_libs: ["myotherlib"],
5390 system_shared_libs: [],
5391 stl: "none",
5392 apex_available: [
5393 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005394 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005395 "//apex_available:platform",
5396 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005397 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005398 }
5399
5400 cc_library {
5401 name: "myotherlib",
5402 srcs: ["mylib.cpp"],
5403 system_shared_libs: [],
5404 stl: "none",
5405 apex_available: [
5406 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005407 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005408 "//apex_available:platform",
5409 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005410 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005411 }
5412
5413 java_library {
5414 name: "myjar",
5415 srcs: ["foo/bar/MyClass.java"],
5416 sdk_version: "none",
5417 system_modules: "none",
5418 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005419 apex_available: [
5420 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005421 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005422 "//apex_available:platform",
5423 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005424 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005425 }
5426
5427 java_library {
5428 name: "myotherjar",
5429 srcs: ["foo/bar/MyClass.java"],
5430 sdk_version: "none",
5431 system_modules: "none",
5432 apex_available: [
5433 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005434 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005435 "//apex_available:platform",
5436 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005437 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005438 }
5439 `
5440
5441 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5442 for _, f := range files {
5443 if f.path == file {
5444 if f.isLink {
5445 t.Errorf("%q is not a real file", file)
5446 }
5447 return
5448 }
5449 }
5450 t.Errorf("%q is not found", file)
5451 }
5452
5453 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5454 for _, f := range files {
5455 if f.path == file {
5456 if !f.isLink {
5457 t.Errorf("%q is not a symlink", file)
5458 }
5459 return
5460 }
5461 }
5462 t.Errorf("%q is not found", file)
5463 }
5464
Jiyong Park9d677202020-02-19 16:29:35 +09005465 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5466 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005467 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005468 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005469 ensureRealfileExists(t, files, "javalib/myjar.jar")
5470 ensureRealfileExists(t, files, "lib64/mylib.so")
5471 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5472
Jiyong Park9d677202020-02-19 16:29:35 +09005473 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5474 ensureRealfileExists(t, files, "javalib/myjar.jar")
5475 ensureRealfileExists(t, files, "lib64/mylib.so")
5476 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5477
5478 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005479 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005480 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005481 ensureRealfileExists(t, files, "javalib/myjar.jar")
5482 ensureRealfileExists(t, files, "lib64/mylib.so")
5483 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005484
5485 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5486 ensureRealfileExists(t, files, "javalib/myjar.jar")
5487 ensureRealfileExists(t, files, "lib64/mylib.so")
5488 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005489}
5490
Yo Chiange8128052020-07-23 20:09:18 +08005491func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5492 ctx, config := testApex(t, `
5493 apex {
5494 name: "myapex",
5495 key: "myapex.key",
5496 native_shared_libs: ["mylib"],
5497 }
5498
5499 apex_key {
5500 name: "myapex.key",
5501 public_key: "testkey.avbpubkey",
5502 private_key: "testkey.pem",
5503 }
5504
5505 cc_library_shared {
5506 name: "mylib",
5507 srcs: ["mylib.cpp"],
5508 shared_libs: ["myotherlib"],
5509 system_shared_libs: [],
5510 stl: "none",
5511 apex_available: [
5512 "myapex",
5513 "//apex_available:platform",
5514 ],
5515 }
5516
5517 cc_prebuilt_library_shared {
5518 name: "myotherlib",
5519 srcs: ["prebuilt.so"],
5520 system_shared_libs: [],
5521 stl: "none",
5522 apex_available: [
5523 "myapex",
5524 "//apex_available:platform",
5525 ],
5526 }
5527 `)
5528
5529 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5530 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5531 var builder strings.Builder
5532 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5533 androidMk := builder.String()
5534 // `myotherlib` is added to `myapex` as symlink
5535 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5536 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5537 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5538 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5539 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5540}
5541
Jooyung Han643adc42020-02-27 13:50:06 +09005542func TestApexWithJniLibs(t *testing.T) {
5543 ctx, _ := testApex(t, `
5544 apex {
5545 name: "myapex",
5546 key: "myapex.key",
5547 jni_libs: ["mylib"],
5548 }
5549
5550 apex_key {
5551 name: "myapex.key",
5552 public_key: "testkey.avbpubkey",
5553 private_key: "testkey.pem",
5554 }
5555
5556 cc_library {
5557 name: "mylib",
5558 srcs: ["mylib.cpp"],
5559 shared_libs: ["mylib2"],
5560 system_shared_libs: [],
5561 stl: "none",
5562 apex_available: [ "myapex" ],
5563 }
5564
5565 cc_library {
5566 name: "mylib2",
5567 srcs: ["mylib.cpp"],
5568 system_shared_libs: [],
5569 stl: "none",
5570 apex_available: [ "myapex" ],
5571 }
5572 `)
5573
5574 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5575 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5576 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5577 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5578 "lib64/mylib.so",
5579 "lib64/mylib2.so",
5580 })
5581}
5582
Jooyung Han49f67012020-04-17 13:43:10 +09005583func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5584 ctx, _ := testApex(t, `
5585 apex {
5586 name: "myapex",
5587 key: "myapex.key",
5588 }
5589 apex_key {
5590 name: "myapex.key",
5591 public_key: "testkey.avbpubkey",
5592 private_key: "testkey.pem",
5593 }
5594 `, func(fs map[string][]byte, config android.Config) {
5595 delete(config.Targets, android.Android)
5596 config.AndroidCommonTarget = android.Target{}
5597 })
5598
5599 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5600 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5601 }
5602}
5603
Jiyong Parkbd159612020-02-28 15:22:21 +09005604func TestAppBundle(t *testing.T) {
5605 ctx, _ := testApex(t, `
5606 apex {
5607 name: "myapex",
5608 key: "myapex.key",
5609 apps: ["AppFoo"],
5610 }
5611
5612 apex_key {
5613 name: "myapex.key",
5614 public_key: "testkey.avbpubkey",
5615 private_key: "testkey.pem",
5616 }
5617
5618 android_app {
5619 name: "AppFoo",
5620 srcs: ["foo/bar/MyClass.java"],
5621 sdk_version: "none",
5622 system_modules: "none",
5623 apex_available: [ "myapex" ],
5624 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005625 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005626
Colin Crosscf371cc2020-11-13 11:48:42 -08005627 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005628 content := bundleConfigRule.Args["content"]
5629
5630 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005631 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 +09005632}
5633
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005634func TestAppSetBundle(t *testing.T) {
5635 ctx, _ := testApex(t, `
5636 apex {
5637 name: "myapex",
5638 key: "myapex.key",
5639 apps: ["AppSet"],
5640 }
5641
5642 apex_key {
5643 name: "myapex.key",
5644 public_key: "testkey.avbpubkey",
5645 private_key: "testkey.pem",
5646 }
5647
5648 android_app_set {
5649 name: "AppSet",
5650 set: "AppSet.apks",
5651 }`)
5652 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005653 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005654 content := bundleConfigRule.Args["content"]
5655 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5656 s := mod.Rule("apexRule").Args["copy_commands"]
5657 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5658 if len(copyCmds) != 3 {
5659 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5660 }
5661 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5662 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5663 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5664}
5665
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005666func TestAppSetBundlePrebuilt(t *testing.T) {
5667 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5668 bp := `
5669 apex_set {
5670 name: "myapex",
5671 filename: "foo_v2.apex",
5672 sanitized: {
5673 none: { set: "myapex.apks", },
5674 hwaddress: { set: "myapex.hwasan.apks", },
5675 },
5676 }`
5677 fs["Android.bp"] = []byte(bp)
5678
5679 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5680 })
5681
5682 m := ctx.ModuleForTests("myapex", "android_common")
5683 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5684
5685 actual := extractedApex.Inputs
5686 if len(actual) != 1 {
5687 t.Errorf("expected a single input")
5688 }
5689
5690 expected := "myapex.hwasan.apks"
5691 if actual[0].String() != expected {
5692 t.Errorf("expected %s, got %s", expected, actual[0].String())
5693 }
5694}
5695
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005696func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005697 t.Helper()
5698
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005699 bp := `
5700 java_library {
5701 name: "some-updatable-apex-lib",
5702 srcs: ["a.java"],
5703 sdk_version: "current",
5704 apex_available: [
5705 "some-updatable-apex",
5706 ],
5707 }
5708
5709 java_library {
5710 name: "some-non-updatable-apex-lib",
5711 srcs: ["a.java"],
5712 apex_available: [
5713 "some-non-updatable-apex",
5714 ],
5715 }
5716
5717 java_library {
5718 name: "some-platform-lib",
5719 srcs: ["a.java"],
5720 sdk_version: "current",
5721 installable: true,
5722 }
5723
5724 java_library {
5725 name: "some-art-lib",
5726 srcs: ["a.java"],
5727 sdk_version: "current",
5728 apex_available: [
5729 "com.android.art.something",
5730 ],
5731 hostdex: true,
5732 }
5733
5734 apex {
5735 name: "some-updatable-apex",
5736 key: "some-updatable-apex.key",
5737 java_libs: ["some-updatable-apex-lib"],
5738 updatable: true,
5739 min_sdk_version: "current",
5740 }
5741
5742 apex {
5743 name: "some-non-updatable-apex",
5744 key: "some-non-updatable-apex.key",
5745 java_libs: ["some-non-updatable-apex-lib"],
5746 }
5747
5748 apex_key {
5749 name: "some-updatable-apex.key",
5750 }
5751
5752 apex_key {
5753 name: "some-non-updatable-apex.key",
5754 }
5755
5756 apex {
5757 name: "com.android.art.something",
5758 key: "com.android.art.something.key",
5759 java_libs: ["some-art-lib"],
5760 updatable: true,
5761 min_sdk_version: "current",
5762 }
5763
5764 apex_key {
5765 name: "com.android.art.something.key",
5766 }
5767
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005768 filegroup {
5769 name: "some-updatable-apex-file_contexts",
5770 srcs: [
5771 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5772 ],
5773 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005774
5775 filegroup {
5776 name: "some-non-updatable-apex-file_contexts",
5777 srcs: [
5778 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5779 ],
5780 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005781 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005782
5783 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5784}
5785
5786func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5787 t.Helper()
5788
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005789 bp += cc.GatherRequiredDepsForTest(android.Android)
5790 bp += java.GatherRequiredDepsForTest()
5791 bp += dexpreopt.BpToolModulesForTest()
5792
5793 fs := map[string][]byte{
5794 "a.java": nil,
5795 "a.jar": nil,
5796 "build/make/target/product/security": nil,
5797 "apex_manifest.json": nil,
5798 "AndroidManifest.xml": nil,
5799 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005800 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005801 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5802 "framework/aidl/a.aidl": nil,
5803 }
5804 cc.GatherRequiredFilesForTest(fs)
5805
Colin Crossae8600b2020-10-29 17:09:13 -07005806 config := android.TestArchConfig(buildDir, nil, bp, fs)
5807
5808 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005809 ctx.RegisterModuleType("apex", BundleFactory)
5810 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5811 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005812 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005813 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005814 cc.RegisterRequiredBuildComponentsForTest(ctx)
5815 java.RegisterJavaBuildComponents(ctx)
5816 java.RegisterSystemModulesBuildComponents(ctx)
5817 java.RegisterAppBuildComponents(ctx)
5818 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005819 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5820 ctx.PreDepsMutators(RegisterPreDepsMutators)
5821 ctx.PostDepsMutators(RegisterPostDepsMutators)
5822
Colin Crossae8600b2020-10-29 17:09:13 -07005823 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005824
5825 _ = dexpreopt.GlobalSoongConfigForTests(config)
5826 dexpreopt.RegisterToolModulesForTest(ctx)
5827 pathCtx := android.PathContextForTesting(config)
5828 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5829 transformDexpreoptConfig(dexpreoptConfig)
5830 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5831
5832 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5833 android.FailIfErrored(t, errs)
5834
5835 _, errs = ctx.PrepareBuildActions(config)
5836 if errmsg == "" {
5837 android.FailIfErrored(t, errs)
5838 } else if len(errs) > 0 {
5839 android.FailIfNoMatchingErrors(t, errmsg, errs)
5840 return
5841 } else {
5842 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5843 }
5844}
5845
Jooyung Han548640b2020-04-27 12:10:30 +09005846func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5847 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5848 apex {
5849 name: "myapex",
5850 key: "myapex.key",
5851 updatable: true,
5852 }
5853
5854 apex_key {
5855 name: "myapex.key",
5856 public_key: "testkey.avbpubkey",
5857 private_key: "testkey.pem",
5858 }
5859 `)
5860}
5861
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005862func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005863 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005864 var transform func(*dexpreopt.GlobalConfig)
5865
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005866 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5867 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005868 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005869 }
5870 testNoUpdatableJarsInBootImage(t, "", transform)
5871 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005872
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005873 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005874 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 +01005875 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005876 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005877 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005878 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005879 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005880
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005881 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 -07005882 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 +01005883 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005884 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005885 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005886 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005887 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005888
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005889 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 -07005890 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005891 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005892 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005893 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005894 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005895 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005896
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005897 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 -07005898 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 +01005899 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005900 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005901 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005902 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005903 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005904
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005905 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5906 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005907 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005908 }
5909 testNoUpdatableJarsInBootImage(t, "", transform)
5910 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005911
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005912 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005913 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005914 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005915 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005916 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005917 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005918 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005919
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005920 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005921 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005922 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005923 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005924 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005925 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005926 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005927
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005928 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005929 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005930 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005931 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005932 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005933 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005934 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005935
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005936 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5937 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005938 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005939 }
5940 testNoUpdatableJarsInBootImage(t, "", transform)
5941 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005942}
5943
Andrei Onea115e7e72020-06-05 21:14:03 +01005944func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5945 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005946 bp += `
5947 apex_key {
5948 name: "myapex.key",
5949 public_key: "testkey.avbpubkey",
5950 private_key: "testkey.pem",
5951 }`
5952 fs := map[string][]byte{
5953 "lib1/src/A.java": nil,
5954 "lib2/src/B.java": nil,
5955 "system/sepolicy/apex/myapex-file_contexts": nil,
5956 }
5957
Colin Crossae8600b2020-10-29 17:09:13 -07005958 config := android.TestArchConfig(buildDir, nil, bp, fs)
5959 android.SetTestNeverallowRules(config, rules)
5960 updatableBootJars := make([]string, 0, len(apexBootJars))
5961 for _, apexBootJar := range apexBootJars {
5962 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5963 }
5964 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5965
5966 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005967 ctx.RegisterModuleType("apex", BundleFactory)
5968 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5969 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5970 cc.RegisterRequiredBuildComponentsForTest(ctx)
5971 java.RegisterJavaBuildComponents(ctx)
5972 java.RegisterSystemModulesBuildComponents(ctx)
5973 java.RegisterDexpreoptBootJarsComponents(ctx)
5974 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5975 ctx.PreDepsMutators(RegisterPreDepsMutators)
5976 ctx.PostDepsMutators(RegisterPostDepsMutators)
5977 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5978
Colin Crossae8600b2020-10-29 17:09:13 -07005979 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005980
5981 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5982 android.FailIfErrored(t, errs)
5983
5984 _, errs = ctx.PrepareBuildActions(config)
5985 if errmsg == "" {
5986 android.FailIfErrored(t, errs)
5987 } else if len(errs) > 0 {
5988 android.FailIfNoMatchingErrors(t, errmsg, errs)
5989 return
5990 } else {
5991 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5992 }
5993}
5994
5995func TestApexPermittedPackagesRules(t *testing.T) {
5996 testcases := []struct {
5997 name string
5998 expectedError string
5999 bp string
6000 bootJars []string
6001 modulesPackages map[string][]string
6002 }{
6003
6004 {
6005 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6006 expectedError: "",
6007 bp: `
6008 java_library {
6009 name: "bcp_lib1",
6010 srcs: ["lib1/src/*.java"],
6011 permitted_packages: ["foo.bar"],
6012 apex_available: ["myapex"],
6013 sdk_version: "none",
6014 system_modules: "none",
6015 }
6016 java_library {
6017 name: "nonbcp_lib2",
6018 srcs: ["lib2/src/*.java"],
6019 apex_available: ["myapex"],
6020 permitted_packages: ["a.b"],
6021 sdk_version: "none",
6022 system_modules: "none",
6023 }
6024 apex {
6025 name: "myapex",
6026 key: "myapex.key",
6027 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6028 }`,
6029 bootJars: []string{"bcp_lib1"},
6030 modulesPackages: map[string][]string{
6031 "myapex": []string{
6032 "foo.bar",
6033 },
6034 },
6035 },
6036 {
6037 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6038 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.`,
6039 bp: `
6040 java_library {
6041 name: "bcp_lib1",
6042 srcs: ["lib1/src/*.java"],
6043 apex_available: ["myapex"],
6044 permitted_packages: ["foo.bar"],
6045 sdk_version: "none",
6046 system_modules: "none",
6047 }
6048 java_library {
6049 name: "bcp_lib2",
6050 srcs: ["lib2/src/*.java"],
6051 apex_available: ["myapex"],
6052 permitted_packages: ["foo.bar", "bar.baz"],
6053 sdk_version: "none",
6054 system_modules: "none",
6055 }
6056 apex {
6057 name: "myapex",
6058 key: "myapex.key",
6059 java_libs: ["bcp_lib1", "bcp_lib2"],
6060 }
6061 `,
6062 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6063 modulesPackages: map[string][]string{
6064 "myapex": []string{
6065 "foo.bar",
6066 },
6067 },
6068 },
6069 }
6070 for _, tc := range testcases {
6071 t.Run(tc.name, func(t *testing.T) {
6072 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6073 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6074 })
6075 }
6076}
6077
Jiyong Park62304bb2020-04-13 16:19:48 +09006078func TestTestFor(t *testing.T) {
6079 ctx, _ := testApex(t, `
6080 apex {
6081 name: "myapex",
6082 key: "myapex.key",
6083 native_shared_libs: ["mylib", "myprivlib"],
6084 }
6085
6086 apex_key {
6087 name: "myapex.key",
6088 public_key: "testkey.avbpubkey",
6089 private_key: "testkey.pem",
6090 }
6091
6092 cc_library {
6093 name: "mylib",
6094 srcs: ["mylib.cpp"],
6095 system_shared_libs: [],
6096 stl: "none",
6097 stubs: {
6098 versions: ["1"],
6099 },
6100 apex_available: ["myapex"],
6101 }
6102
6103 cc_library {
6104 name: "myprivlib",
6105 srcs: ["mylib.cpp"],
6106 system_shared_libs: [],
6107 stl: "none",
6108 apex_available: ["myapex"],
6109 }
6110
6111
6112 cc_test {
6113 name: "mytest",
6114 gtest: false,
6115 srcs: ["mylib.cpp"],
6116 system_shared_libs: [],
6117 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006118 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006119 test_for: ["myapex"]
6120 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006121
6122 cc_library {
6123 name: "mytestlib",
6124 srcs: ["mylib.cpp"],
6125 system_shared_libs: [],
6126 shared_libs: ["mylib", "myprivlib"],
6127 stl: "none",
6128 test_for: ["myapex"],
6129 }
6130
6131 cc_benchmark {
6132 name: "mybench",
6133 srcs: ["mylib.cpp"],
6134 system_shared_libs: [],
6135 shared_libs: ["mylib", "myprivlib"],
6136 stl: "none",
6137 test_for: ["myapex"],
6138 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006139 `)
6140
6141 // the test 'mytest' is a test for the apex, therefore is linked to the
6142 // actual implementation of mylib instead of its stub.
6143 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6144 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6145 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006146
6147 // The same should be true for cc_library
6148 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6149 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6150 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6151
6152 // ... and for cc_benchmark
6153 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6154 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6155 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006156}
6157
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006158// TODO(jungjw): Move this to proptools
6159func intPtr(i int) *int {
6160 return &i
6161}
6162
6163func TestApexSet(t *testing.T) {
6164 ctx, config := testApex(t, `
6165 apex_set {
6166 name: "myapex",
6167 set: "myapex.apks",
6168 filename: "foo_v2.apex",
6169 overrides: ["foo"],
6170 }
6171 `, func(fs map[string][]byte, config android.Config) {
6172 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006173 config.Targets[android.Android] = []android.Target{
6174 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6175 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6176 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006177 })
6178
6179 m := ctx.ModuleForTests("myapex", "android_common")
6180
6181 // Check extract_apks tool parameters.
6182 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6183 actual := extractedApex.Args["abis"]
6184 expected := "ARMEABI_V7A,ARM64_V8A"
6185 if actual != expected {
6186 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6187 }
6188 actual = extractedApex.Args["sdk-version"]
6189 expected = "30"
6190 if actual != expected {
6191 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6192 }
6193
6194 a := m.Module().(*ApexSet)
6195 expectedOverrides := []string{"foo"}
6196 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6197 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6198 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6199 }
6200}
6201
Jiyong Park7d95a512020-05-10 15:16:24 +09006202func TestNoStaticLinkingToStubsLib(t *testing.T) {
6203 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6204 apex {
6205 name: "myapex",
6206 key: "myapex.key",
6207 native_shared_libs: ["mylib"],
6208 }
6209
6210 apex_key {
6211 name: "myapex.key",
6212 public_key: "testkey.avbpubkey",
6213 private_key: "testkey.pem",
6214 }
6215
6216 cc_library {
6217 name: "mylib",
6218 srcs: ["mylib.cpp"],
6219 static_libs: ["otherlib"],
6220 system_shared_libs: [],
6221 stl: "none",
6222 apex_available: [ "myapex" ],
6223 }
6224
6225 cc_library {
6226 name: "otherlib",
6227 srcs: ["mylib.cpp"],
6228 system_shared_libs: [],
6229 stl: "none",
6230 stubs: {
6231 versions: ["1", "2", "3"],
6232 },
6233 apex_available: [ "myapex" ],
6234 }
6235 `)
6236}
6237
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006238func TestApexKeysTxt(t *testing.T) {
6239 ctx, _ := testApex(t, `
6240 apex {
6241 name: "myapex",
6242 key: "myapex.key",
6243 }
6244
6245 apex_key {
6246 name: "myapex.key",
6247 public_key: "testkey.avbpubkey",
6248 private_key: "testkey.pem",
6249 }
6250
6251 prebuilt_apex {
6252 name: "myapex",
6253 prefer: true,
6254 arch: {
6255 arm64: {
6256 src: "myapex-arm64.apex",
6257 },
6258 arm: {
6259 src: "myapex-arm.apex",
6260 },
6261 },
6262 }
6263
6264 apex_set {
6265 name: "myapex_set",
6266 set: "myapex.apks",
6267 filename: "myapex_set.apex",
6268 overrides: ["myapex"],
6269 }
6270 `)
6271
6272 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6273 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6274 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 +09006275 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 +09006276}
6277
Jooyung Han938b5932020-06-20 12:47:47 +09006278func TestAllowedFiles(t *testing.T) {
6279 ctx, _ := testApex(t, `
6280 apex {
6281 name: "myapex",
6282 key: "myapex.key",
6283 apps: ["app"],
6284 allowed_files: "allowed.txt",
6285 }
6286
6287 apex_key {
6288 name: "myapex.key",
6289 public_key: "testkey.avbpubkey",
6290 private_key: "testkey.pem",
6291 }
6292
6293 android_app {
6294 name: "app",
6295 srcs: ["foo/bar/MyClass.java"],
6296 package_name: "foo",
6297 sdk_version: "none",
6298 system_modules: "none",
6299 apex_available: [ "myapex" ],
6300 }
6301 `, withFiles(map[string][]byte{
6302 "sub/Android.bp": []byte(`
6303 override_apex {
6304 name: "override_myapex",
6305 base: "myapex",
6306 apps: ["override_app"],
6307 allowed_files: ":allowed",
6308 }
6309 // Overridable "path" property should be referenced indirectly
6310 filegroup {
6311 name: "allowed",
6312 srcs: ["allowed.txt"],
6313 }
6314 override_android_app {
6315 name: "override_app",
6316 base: "app",
6317 package_name: "bar",
6318 }
6319 `),
6320 }))
6321
6322 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6323 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6324 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6325 }
6326
6327 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6328 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6329 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6330 }
6331}
6332
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006333func TestNonPreferredPrebuiltDependency(t *testing.T) {
6334 _, _ = testApex(t, `
6335 apex {
6336 name: "myapex",
6337 key: "myapex.key",
6338 native_shared_libs: ["mylib"],
6339 }
6340
6341 apex_key {
6342 name: "myapex.key",
6343 public_key: "testkey.avbpubkey",
6344 private_key: "testkey.pem",
6345 }
6346
6347 cc_library {
6348 name: "mylib",
6349 srcs: ["mylib.cpp"],
6350 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006351 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006352 },
6353 apex_available: ["myapex"],
6354 }
6355
6356 cc_prebuilt_library_shared {
6357 name: "mylib",
6358 prefer: false,
6359 srcs: ["prebuilt.so"],
6360 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006361 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006362 },
6363 apex_available: ["myapex"],
6364 }
6365 `)
6366}
6367
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006368func TestCompressedApex(t *testing.T) {
6369 ctx, config := testApex(t, `
6370 apex {
6371 name: "myapex",
6372 key: "myapex.key",
6373 compressible: true,
6374 }
6375 apex_key {
6376 name: "myapex.key",
6377 public_key: "testkey.avbpubkey",
6378 private_key: "testkey.pem",
6379 }
6380 `, func(fs map[string][]byte, config android.Config) {
6381 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6382 })
6383
6384 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6385 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6386
6387 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6388 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6389
6390 // Make sure output of bundle is .capex
6391 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6392 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6393
6394 // Verify android.mk rules
6395 data := android.AndroidMkDataForTest(t, config, "", ab)
6396 var builder strings.Builder
6397 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6398 androidMk := builder.String()
6399 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6400}
6401
Martin Stjernholm2856c662020-12-02 15:03:42 +00006402func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6403 ctx, config := testApex(t, `
6404 apex {
6405 name: "myapex",
6406 key: "myapex.key",
6407 native_shared_libs: ["mylib"],
6408 }
6409
6410 apex_key {
6411 name: "myapex.key",
6412 public_key: "testkey.avbpubkey",
6413 private_key: "testkey.pem",
6414 }
6415
6416 cc_library {
6417 name: "mylib",
6418 srcs: ["mylib.cpp"],
6419 apex_available: ["myapex"],
6420 shared_libs: ["otherlib"],
6421 system_shared_libs: [],
6422 }
6423
6424 cc_library {
6425 name: "otherlib",
6426 srcs: ["mylib.cpp"],
6427 stubs: {
6428 versions: ["current"],
6429 },
6430 }
6431
6432 cc_prebuilt_library_shared {
6433 name: "otherlib",
6434 prefer: true,
6435 srcs: ["prebuilt.so"],
6436 stubs: {
6437 versions: ["current"],
6438 },
6439 }
6440 `)
6441
6442 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6443 data := android.AndroidMkDataForTest(t, config, "", ab)
6444 var builder strings.Builder
6445 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6446 androidMk := builder.String()
6447
6448 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6449 // a thing there.
6450 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6451}
6452
Jiyong Parke3867542020-12-03 17:28:25 +09006453func TestExcludeDependency(t *testing.T) {
6454 ctx, _ := testApex(t, `
6455 apex {
6456 name: "myapex",
6457 key: "myapex.key",
6458 native_shared_libs: ["mylib"],
6459 }
6460
6461 apex_key {
6462 name: "myapex.key",
6463 public_key: "testkey.avbpubkey",
6464 private_key: "testkey.pem",
6465 }
6466
6467 cc_library {
6468 name: "mylib",
6469 srcs: ["mylib.cpp"],
6470 system_shared_libs: [],
6471 stl: "none",
6472 apex_available: ["myapex"],
6473 shared_libs: ["mylib2"],
6474 target: {
6475 apex: {
6476 exclude_shared_libs: ["mylib2"],
6477 },
6478 },
6479 }
6480
6481 cc_library {
6482 name: "mylib2",
6483 srcs: ["mylib.cpp"],
6484 system_shared_libs: [],
6485 stl: "none",
6486 }
6487 `)
6488
6489 // Check if mylib is linked to mylib2 for the non-apex target
6490 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6491 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6492
6493 // Make sure that the link doesn't occur for the apex target
6494 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6495 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6496
6497 // It shouldn't appear in the copy cmd as well.
6498 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6499 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6500}
6501
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006502func TestPrebuiltStubLibDep(t *testing.T) {
6503 bpBase := `
6504 apex {
6505 name: "myapex",
6506 key: "myapex.key",
6507 native_shared_libs: ["mylib"],
6508 }
6509 apex_key {
6510 name: "myapex.key",
6511 public_key: "testkey.avbpubkey",
6512 private_key: "testkey.pem",
6513 }
6514 cc_library {
6515 name: "mylib",
6516 srcs: ["mylib.cpp"],
6517 apex_available: ["myapex"],
6518 shared_libs: ["stublib"],
6519 system_shared_libs: [],
6520 }
6521 apex {
6522 name: "otherapex",
6523 enabled: %s,
6524 key: "myapex.key",
6525 native_shared_libs: ["stublib"],
6526 }
6527 `
6528
6529 stublibSourceBp := `
6530 cc_library {
6531 name: "stublib",
6532 srcs: ["mylib.cpp"],
6533 apex_available: ["otherapex"],
6534 system_shared_libs: [],
6535 stl: "none",
6536 stubs: {
6537 versions: ["1"],
6538 },
6539 }
6540 `
6541
6542 stublibPrebuiltBp := `
6543 cc_prebuilt_library_shared {
6544 name: "stublib",
6545 srcs: ["prebuilt.so"],
6546 apex_available: ["otherapex"],
6547 stubs: {
6548 versions: ["1"],
6549 },
6550 %s
6551 }
6552 `
6553
6554 tests := []struct {
6555 name string
6556 stublibBp string
6557 usePrebuilt bool
6558 modNames []string // Modules to collect AndroidMkEntries for
6559 otherApexEnabled []string
6560 }{
6561 {
6562 name: "only_source",
6563 stublibBp: stublibSourceBp,
6564 usePrebuilt: false,
6565 modNames: []string{"stublib"},
6566 otherApexEnabled: []string{"true", "false"},
6567 },
6568 {
6569 name: "source_preferred",
6570 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
6571 usePrebuilt: false,
6572 modNames: []string{"stublib", "prebuilt_stublib"},
6573 otherApexEnabled: []string{"true", "false"},
6574 },
6575 {
6576 name: "prebuilt_preferred",
6577 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
6578 usePrebuilt: true,
6579 modNames: []string{"stublib", "prebuilt_stublib"},
6580 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6581 },
6582 {
6583 name: "only_prebuilt",
6584 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
6585 usePrebuilt: true,
6586 modNames: []string{"stublib"},
6587 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6588 },
6589 }
6590
6591 for _, test := range tests {
6592 t.Run(test.name, func(t *testing.T) {
6593 for _, otherApexEnabled := range test.otherApexEnabled {
6594 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
6595 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
6596
6597 type modAndMkEntries struct {
6598 mod *cc.Module
6599 mkEntries android.AndroidMkEntries
6600 }
6601 entries := []*modAndMkEntries{}
6602
6603 // Gather shared lib modules that are installable
6604 for _, modName := range test.modNames {
6605 for _, variant := range ctx.ModuleVariantsForTests(modName) {
6606 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
6607 continue
6608 }
6609 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08006610 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006611 continue
6612 }
6613 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
6614 if ent.Disabled {
6615 continue
6616 }
6617 entries = append(entries, &modAndMkEntries{
6618 mod: mod,
6619 mkEntries: ent,
6620 })
6621 }
6622 }
6623 }
6624
6625 var entry *modAndMkEntries = nil
6626 for _, ent := range entries {
6627 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
6628 if entry != nil {
6629 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
6630 } else {
6631 entry = ent
6632 }
6633 }
6634 }
6635
6636 if entry == nil {
6637 t.Errorf("AndroidMk entry for \"stublib\" missing")
6638 } else {
6639 isPrebuilt := entry.mod.Prebuilt() != nil
6640 if isPrebuilt != test.usePrebuilt {
6641 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
6642 }
6643 if !entry.mod.IsStubs() {
6644 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
6645 }
6646 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
6647 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
6648 }
Jiyong Park892a98f2020-12-14 09:20:00 +09006649 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
6650 expected := "-D__STUBLIB_API__=1"
6651 if !android.InList(expected, cflags) {
6652 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
6653 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006654 }
6655 })
6656 }
6657 })
6658 }
6659}
6660
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006661func TestMain(m *testing.M) {
6662 run := func() int {
6663 setUp()
6664 defer tearDown()
6665
6666 return m.Run()
6667 }
6668
6669 os.Exit(run())
6670}