blob: 84a835639b1b7d67f2db47eee118eee67dd944cb [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",
Jooyung Han31c470b2019-10-18 16:26:59 +09003153 })
Jooyung Han344d5432019-08-23 11:17:39 +09003154}
3155
3156func TestVndkApexWithPrebuilt(t *testing.T) {
3157 ctx, _ := testApex(t, `
3158 apex_vndk {
3159 name: "myapex",
3160 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003161 }
3162
3163 apex_key {
3164 name: "myapex.key",
3165 public_key: "testkey.avbpubkey",
3166 private_key: "testkey.pem",
3167 }
3168
3169 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003170 name: "libvndk",
3171 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003172 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003173 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003174 vndk: {
3175 enabled: true,
3176 },
3177 system_shared_libs: [],
3178 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003179 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003180 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003181
3182 cc_prebuilt_library_shared {
3183 name: "libvndk.arm",
3184 srcs: ["libvndk.arm.so"],
3185 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003186 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003187 vndk: {
3188 enabled: true,
3189 },
3190 enabled: false,
3191 arch: {
3192 arm: {
3193 enabled: true,
3194 },
3195 },
3196 system_shared_libs: [],
3197 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003198 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003199 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003200 `+vndkLibrariesTxtFiles("current"),
3201 withFiles(map[string][]byte{
3202 "libvndk.so": nil,
3203 "libvndk.arm.so": nil,
3204 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003205
Jooyung Hana57af4a2020-01-23 05:36:59 +00003206 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003207 "lib/libvndk.so",
3208 "lib/libvndk.arm.so",
3209 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003210 "lib/libc++.so",
3211 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003212 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003213 })
Jooyung Han344d5432019-08-23 11:17:39 +09003214}
3215
Jooyung Han39edb6c2019-11-06 16:53:07 +09003216func vndkLibrariesTxtFiles(vers ...string) (result string) {
3217 for _, v := range vers {
3218 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003219 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003220 result += `
3221 vndk_libraries_txt {
3222 name: "` + txt + `.libraries.txt",
3223 }
3224 `
3225 }
3226 } else {
3227 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3228 result += `
3229 prebuilt_etc {
3230 name: "` + txt + `.libraries.` + v + `.txt",
3231 src: "dummy.txt",
3232 }
3233 `
3234 }
3235 }
3236 }
3237 return
3238}
3239
Jooyung Han344d5432019-08-23 11:17:39 +09003240func TestVndkApexVersion(t *testing.T) {
3241 ctx, _ := testApex(t, `
3242 apex_vndk {
3243 name: "myapex_v27",
3244 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003245 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003246 vndk_version: "27",
3247 }
3248
3249 apex_key {
3250 name: "myapex.key",
3251 public_key: "testkey.avbpubkey",
3252 private_key: "testkey.pem",
3253 }
3254
Jooyung Han31c470b2019-10-18 16:26:59 +09003255 vndk_prebuilt_shared {
3256 name: "libvndk27",
3257 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003258 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003259 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003260 vndk: {
3261 enabled: true,
3262 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003263 target_arch: "arm64",
3264 arch: {
3265 arm: {
3266 srcs: ["libvndk27_arm.so"],
3267 },
3268 arm64: {
3269 srcs: ["libvndk27_arm64.so"],
3270 },
3271 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003272 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003273 }
3274
3275 vndk_prebuilt_shared {
3276 name: "libvndk27",
3277 version: "27",
3278 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003279 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003280 vndk: {
3281 enabled: true,
3282 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003283 target_arch: "x86_64",
3284 arch: {
3285 x86: {
3286 srcs: ["libvndk27_x86.so"],
3287 },
3288 x86_64: {
3289 srcs: ["libvndk27_x86_64.so"],
3290 },
3291 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003292 }
3293 `+vndkLibrariesTxtFiles("27"),
3294 withFiles(map[string][]byte{
3295 "libvndk27_arm.so": nil,
3296 "libvndk27_arm64.so": nil,
3297 "libvndk27_x86.so": nil,
3298 "libvndk27_x86_64.so": nil,
3299 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003300
Jooyung Hana57af4a2020-01-23 05:36:59 +00003301 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003302 "lib/libvndk27_arm.so",
3303 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003304 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003305 })
Jooyung Han344d5432019-08-23 11:17:39 +09003306}
3307
3308func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3309 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3310 apex_vndk {
3311 name: "myapex_v27",
3312 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003313 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003314 vndk_version: "27",
3315 }
3316 apex_vndk {
3317 name: "myapex_v27_other",
3318 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003319 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003320 vndk_version: "27",
3321 }
3322
3323 apex_key {
3324 name: "myapex.key",
3325 public_key: "testkey.avbpubkey",
3326 private_key: "testkey.pem",
3327 }
3328
3329 cc_library {
3330 name: "libvndk",
3331 srcs: ["mylib.cpp"],
3332 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003333 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003334 vndk: {
3335 enabled: true,
3336 },
3337 system_shared_libs: [],
3338 stl: "none",
3339 }
3340
3341 vndk_prebuilt_shared {
3342 name: "libvndk",
3343 version: "27",
3344 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003345 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003346 vndk: {
3347 enabled: true,
3348 },
3349 srcs: ["libvndk.so"],
3350 }
3351 `, withFiles(map[string][]byte{
3352 "libvndk.so": nil,
3353 }))
3354}
3355
Jooyung Han90eee022019-10-01 20:02:42 +09003356func TestVndkApexNameRule(t *testing.T) {
3357 ctx, _ := testApex(t, `
3358 apex_vndk {
3359 name: "myapex",
3360 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003361 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003362 }
3363 apex_vndk {
3364 name: "myapex_v28",
3365 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003366 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003367 vndk_version: "28",
3368 }
3369 apex_key {
3370 name: "myapex.key",
3371 public_key: "testkey.avbpubkey",
3372 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003373 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003374
3375 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003376 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003377 actual := proptools.String(bundle.properties.Apex_name)
3378 if !reflect.DeepEqual(actual, expected) {
3379 t.Errorf("Got '%v', expected '%v'", actual, expected)
3380 }
3381 }
3382
3383 assertApexName("com.android.vndk.vVER", "myapex")
3384 assertApexName("com.android.vndk.v28", "myapex_v28")
3385}
3386
Jooyung Han344d5432019-08-23 11:17:39 +09003387func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3388 ctx, _ := testApex(t, `
3389 apex_vndk {
3390 name: "myapex",
3391 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003392 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003393 }
3394
3395 apex_key {
3396 name: "myapex.key",
3397 public_key: "testkey.avbpubkey",
3398 private_key: "testkey.pem",
3399 }
3400
3401 cc_library {
3402 name: "libvndk",
3403 srcs: ["mylib.cpp"],
3404 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003405 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003406 native_bridge_supported: true,
3407 host_supported: true,
3408 vndk: {
3409 enabled: true,
3410 },
3411 system_shared_libs: [],
3412 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003413 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003414 }
Jooyung Han35155c42020-02-06 17:33:20 +09003415 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003416
Jooyung Hana57af4a2020-01-23 05:36:59 +00003417 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003418 "lib/libvndk.so",
3419 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003420 "lib/libc++.so",
3421 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003422 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003423 })
Jooyung Han344d5432019-08-23 11:17:39 +09003424}
3425
3426func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3427 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3428 apex_vndk {
3429 name: "myapex",
3430 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003431 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003432 native_bridge_supported: true,
3433 }
3434
3435 apex_key {
3436 name: "myapex.key",
3437 public_key: "testkey.avbpubkey",
3438 private_key: "testkey.pem",
3439 }
3440
3441 cc_library {
3442 name: "libvndk",
3443 srcs: ["mylib.cpp"],
3444 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003445 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003446 native_bridge_supported: true,
3447 host_supported: true,
3448 vndk: {
3449 enabled: true,
3450 },
3451 system_shared_libs: [],
3452 stl: "none",
3453 }
3454 `)
3455}
3456
Jooyung Han31c470b2019-10-18 16:26:59 +09003457func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003458 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 apex_vndk {
3460 name: "myapex_v27",
3461 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003462 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003463 vndk_version: "27",
3464 }
3465
3466 apex_key {
3467 name: "myapex.key",
3468 public_key: "testkey.avbpubkey",
3469 private_key: "testkey.pem",
3470 }
3471
3472 vndk_prebuilt_shared {
3473 name: "libvndk27",
3474 version: "27",
3475 target_arch: "arm",
3476 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003477 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003478 vndk: {
3479 enabled: true,
3480 },
3481 arch: {
3482 arm: {
3483 srcs: ["libvndk27.so"],
3484 }
3485 },
3486 }
3487
3488 vndk_prebuilt_shared {
3489 name: "libvndk27",
3490 version: "27",
3491 target_arch: "arm",
3492 binder32bit: true,
3493 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003494 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003495 vndk: {
3496 enabled: true,
3497 },
3498 arch: {
3499 arm: {
3500 srcs: ["libvndk27binder32.so"],
3501 }
3502 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003503 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003504 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003505 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003506 withFiles(map[string][]byte{
3507 "libvndk27.so": nil,
3508 "libvndk27binder32.so": nil,
3509 }),
3510 withBinder32bit,
3511 withTargets(map[android.OsType][]android.Target{
3512 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003513 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3514 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003515 },
3516 }),
3517 )
3518
Jooyung Hana57af4a2020-01-23 05:36:59 +00003519 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003521 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003522 })
3523}
3524
Jooyung Han45a96772020-06-15 14:59:42 +09003525func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3526 ctx, _ := testApex(t, `
3527 apex_vndk {
3528 name: "myapex",
3529 key: "myapex.key",
3530 file_contexts: ":myapex-file_contexts",
3531 }
3532
3533 apex_key {
3534 name: "myapex.key",
3535 public_key: "testkey.avbpubkey",
3536 private_key: "testkey.pem",
3537 }
3538
3539 cc_library {
3540 name: "libz",
3541 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003542 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003543 vndk: {
3544 enabled: true,
3545 },
3546 stubs: {
3547 symbol_file: "libz.map.txt",
3548 versions: ["30"],
3549 }
3550 }
3551 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3552 "libz.map.txt": nil,
3553 }))
3554
3555 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3556 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3557 ensureListEmpty(t, provideNativeLibs)
3558}
3559
Jooyung Hane1633032019-08-01 17:41:43 +09003560func TestDependenciesInApexManifest(t *testing.T) {
3561 ctx, _ := testApex(t, `
3562 apex {
3563 name: "myapex_nodep",
3564 key: "myapex.key",
3565 native_shared_libs: ["lib_nodep"],
3566 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003567 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003568 }
3569
3570 apex {
3571 name: "myapex_dep",
3572 key: "myapex.key",
3573 native_shared_libs: ["lib_dep"],
3574 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003575 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003576 }
3577
3578 apex {
3579 name: "myapex_provider",
3580 key: "myapex.key",
3581 native_shared_libs: ["libfoo"],
3582 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003583 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003584 }
3585
3586 apex {
3587 name: "myapex_selfcontained",
3588 key: "myapex.key",
3589 native_shared_libs: ["lib_dep", "libfoo"],
3590 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003591 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003592 }
3593
3594 apex_key {
3595 name: "myapex.key",
3596 public_key: "testkey.avbpubkey",
3597 private_key: "testkey.pem",
3598 }
3599
3600 cc_library {
3601 name: "lib_nodep",
3602 srcs: ["mylib.cpp"],
3603 system_shared_libs: [],
3604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003605 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003606 }
3607
3608 cc_library {
3609 name: "lib_dep",
3610 srcs: ["mylib.cpp"],
3611 shared_libs: ["libfoo"],
3612 system_shared_libs: [],
3613 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003614 apex_available: [
3615 "myapex_dep",
3616 "myapex_provider",
3617 "myapex_selfcontained",
3618 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003619 }
3620
3621 cc_library {
3622 name: "libfoo",
3623 srcs: ["mytest.cpp"],
3624 stubs: {
3625 versions: ["1"],
3626 },
3627 system_shared_libs: [],
3628 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003629 apex_available: [
3630 "myapex_provider",
3631 "myapex_selfcontained",
3632 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003633 }
3634 `)
3635
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003636 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003637 var provideNativeLibs, requireNativeLibs []string
3638
Sundong Ahnabb64432019-10-22 13:58:29 +09003639 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003640 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3641 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003642 ensureListEmpty(t, provideNativeLibs)
3643 ensureListEmpty(t, requireNativeLibs)
3644
Sundong Ahnabb64432019-10-22 13:58:29 +09003645 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003646 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3647 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003648 ensureListEmpty(t, provideNativeLibs)
3649 ensureListContains(t, requireNativeLibs, "libfoo.so")
3650
Sundong Ahnabb64432019-10-22 13:58:29 +09003651 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003652 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3653 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003654 ensureListContains(t, provideNativeLibs, "libfoo.so")
3655 ensureListEmpty(t, requireNativeLibs)
3656
Sundong Ahnabb64432019-10-22 13:58:29 +09003657 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003658 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3659 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003660 ensureListContains(t, provideNativeLibs, "libfoo.so")
3661 ensureListEmpty(t, requireNativeLibs)
3662}
3663
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003664func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003665 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003666 apex {
3667 name: "myapex",
3668 key: "myapex.key",
3669 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003670 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003671 }
3672
3673 apex_key {
3674 name: "myapex.key",
3675 public_key: "testkey.avbpubkey",
3676 private_key: "testkey.pem",
3677 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003678
3679 cc_library {
3680 name: "mylib",
3681 srcs: ["mylib.cpp"],
3682 system_shared_libs: [],
3683 stl: "none",
3684 apex_available: [
3685 "//apex_available:platform",
3686 "myapex",
3687 ],
3688 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003689 `)
3690
Sundong Ahnabb64432019-10-22 13:58:29 +09003691 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003692 apexManifestRule := module.Rule("apexManifestRule")
3693 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3694 apexRule := module.Rule("apexRule")
3695 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003696
3697 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3698 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3699 name := apexBundle.BaseModuleName()
3700 prefix := "TARGET_"
3701 var builder strings.Builder
3702 data.Custom(&builder, name, prefix, "", data)
3703 androidMk := builder.String()
3704 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3705 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003706}
3707
Alex Light0851b882019-02-07 13:20:53 -08003708func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003709 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003710 apex {
3711 name: "myapex",
3712 key: "myapex.key",
3713 native_shared_libs: ["mylib_common"],
3714 }
3715
3716 apex_key {
3717 name: "myapex.key",
3718 public_key: "testkey.avbpubkey",
3719 private_key: "testkey.pem",
3720 }
3721
3722 cc_library {
3723 name: "mylib_common",
3724 srcs: ["mylib.cpp"],
3725 system_shared_libs: [],
3726 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003727 apex_available: [
3728 "//apex_available:platform",
3729 "myapex",
3730 ],
Alex Light0851b882019-02-07 13:20:53 -08003731 }
3732 `)
3733
Sundong Ahnabb64432019-10-22 13:58:29 +09003734 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003735 apexRule := module.Rule("apexRule")
3736 copyCmds := apexRule.Args["copy_commands"]
3737
3738 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3739 t.Log("Apex was a test apex!")
3740 t.Fail()
3741 }
3742 // Ensure that main rule creates an output
3743 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3744
3745 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003746 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003747
3748 // Ensure that both direct and indirect deps are copied into apex
3749 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3750
Colin Cross7113d202019-11-20 16:39:12 -08003751 // Ensure that the platform variant ends with _shared
3752 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003753
Colin Cross56a83212020-09-15 18:30:11 -07003754 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003755 t.Log("Found mylib_common not in any apex!")
3756 t.Fail()
3757 }
3758}
3759
3760func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003761 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003762 apex_test {
3763 name: "myapex",
3764 key: "myapex.key",
3765 native_shared_libs: ["mylib_common_test"],
3766 }
3767
3768 apex_key {
3769 name: "myapex.key",
3770 public_key: "testkey.avbpubkey",
3771 private_key: "testkey.pem",
3772 }
3773
3774 cc_library {
3775 name: "mylib_common_test",
3776 srcs: ["mylib.cpp"],
3777 system_shared_libs: [],
3778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003779 // TODO: remove //apex_available:platform
3780 apex_available: [
3781 "//apex_available:platform",
3782 "myapex",
3783 ],
Alex Light0851b882019-02-07 13:20:53 -08003784 }
3785 `)
3786
Sundong Ahnabb64432019-10-22 13:58:29 +09003787 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003788 apexRule := module.Rule("apexRule")
3789 copyCmds := apexRule.Args["copy_commands"]
3790
3791 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3792 t.Log("Apex was not a test apex!")
3793 t.Fail()
3794 }
3795 // Ensure that main rule creates an output
3796 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3797
3798 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003800
3801 // Ensure that both direct and indirect deps are copied into apex
3802 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3803
Colin Cross7113d202019-11-20 16:39:12 -08003804 // Ensure that the platform variant ends with _shared
3805 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003806}
3807
Alex Light9670d332019-01-29 18:07:33 -08003808func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003809 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003810 apex {
3811 name: "myapex",
3812 key: "myapex.key",
3813 multilib: {
3814 first: {
3815 native_shared_libs: ["mylib_common"],
3816 }
3817 },
3818 target: {
3819 android: {
3820 multilib: {
3821 first: {
3822 native_shared_libs: ["mylib"],
3823 }
3824 }
3825 },
3826 host: {
3827 multilib: {
3828 first: {
3829 native_shared_libs: ["mylib2"],
3830 }
3831 }
3832 }
3833 }
3834 }
3835
3836 apex_key {
3837 name: "myapex.key",
3838 public_key: "testkey.avbpubkey",
3839 private_key: "testkey.pem",
3840 }
3841
3842 cc_library {
3843 name: "mylib",
3844 srcs: ["mylib.cpp"],
3845 system_shared_libs: [],
3846 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003847 // TODO: remove //apex_available:platform
3848 apex_available: [
3849 "//apex_available:platform",
3850 "myapex",
3851 ],
Alex Light9670d332019-01-29 18:07:33 -08003852 }
3853
3854 cc_library {
3855 name: "mylib_common",
3856 srcs: ["mylib.cpp"],
3857 system_shared_libs: [],
3858 stl: "none",
3859 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003860 // TODO: remove //apex_available:platform
3861 apex_available: [
3862 "//apex_available:platform",
3863 "myapex",
3864 ],
Alex Light9670d332019-01-29 18:07:33 -08003865 }
3866
3867 cc_library {
3868 name: "mylib2",
3869 srcs: ["mylib.cpp"],
3870 system_shared_libs: [],
3871 stl: "none",
3872 compile_multilib: "first",
3873 }
3874 `)
3875
Sundong Ahnabb64432019-10-22 13:58:29 +09003876 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003877 copyCmds := apexRule.Args["copy_commands"]
3878
3879 // Ensure that main rule creates an output
3880 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3881
3882 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003883 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3885 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003886
3887 // Ensure that both direct and indirect deps are copied into apex
3888 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3889 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3890 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3891
Colin Cross7113d202019-11-20 16:39:12 -08003892 // Ensure that the platform variant ends with _shared
3893 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3894 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3895 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003896}
Jiyong Park04480cf2019-02-06 00:16:29 +09003897
Jiyong Park59140302020-12-14 18:44:04 +09003898func TestApexWithArch(t *testing.T) {
3899 ctx, _ := testApex(t, `
3900 apex {
3901 name: "myapex",
3902 key: "myapex.key",
3903 arch: {
3904 arm64: {
3905 native_shared_libs: ["mylib.arm64"],
3906 },
3907 x86_64: {
3908 native_shared_libs: ["mylib.x64"],
3909 },
3910 }
3911 }
3912
3913 apex_key {
3914 name: "myapex.key",
3915 public_key: "testkey.avbpubkey",
3916 private_key: "testkey.pem",
3917 }
3918
3919 cc_library {
3920 name: "mylib.arm64",
3921 srcs: ["mylib.cpp"],
3922 system_shared_libs: [],
3923 stl: "none",
3924 // TODO: remove //apex_available:platform
3925 apex_available: [
3926 "//apex_available:platform",
3927 "myapex",
3928 ],
3929 }
3930
3931 cc_library {
3932 name: "mylib.x64",
3933 srcs: ["mylib.cpp"],
3934 system_shared_libs: [],
3935 stl: "none",
3936 // TODO: remove //apex_available:platform
3937 apex_available: [
3938 "//apex_available:platform",
3939 "myapex",
3940 ],
3941 }
3942 `)
3943
3944 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
3945 copyCmds := apexRule.Args["copy_commands"]
3946
3947 // Ensure that apex variant is created for the direct dep
3948 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
3949 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
3950
3951 // Ensure that both direct and indirect deps are copied into apex
3952 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
3953 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
3954}
3955
Jiyong Park04480cf2019-02-06 00:16:29 +09003956func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003957 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003958 apex {
3959 name: "myapex",
3960 key: "myapex.key",
3961 binaries: ["myscript"],
3962 }
3963
3964 apex_key {
3965 name: "myapex.key",
3966 public_key: "testkey.avbpubkey",
3967 private_key: "testkey.pem",
3968 }
3969
3970 sh_binary {
3971 name: "myscript",
3972 src: "mylib.cpp",
3973 filename: "myscript.sh",
3974 sub_dir: "script",
3975 }
3976 `)
3977
Sundong Ahnabb64432019-10-22 13:58:29 +09003978 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003979 copyCmds := apexRule.Args["copy_commands"]
3980
3981 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3982}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003983
Jooyung Han91df2082019-11-20 01:49:42 +09003984func TestApexInVariousPartition(t *testing.T) {
3985 testcases := []struct {
3986 propName, parition, flattenedPartition string
3987 }{
3988 {"", "system", "system_ext"},
3989 {"product_specific: true", "product", "product"},
3990 {"soc_specific: true", "vendor", "vendor"},
3991 {"proprietary: true", "vendor", "vendor"},
3992 {"vendor: true", "vendor", "vendor"},
3993 {"system_ext_specific: true", "system_ext", "system_ext"},
3994 }
3995 for _, tc := range testcases {
3996 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3997 ctx, _ := testApex(t, `
3998 apex {
3999 name: "myapex",
4000 key: "myapex.key",
4001 `+tc.propName+`
4002 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004003
Jooyung Han91df2082019-11-20 01:49:42 +09004004 apex_key {
4005 name: "myapex.key",
4006 public_key: "testkey.avbpubkey",
4007 private_key: "testkey.pem",
4008 }
4009 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004010
Jooyung Han91df2082019-11-20 01:49:42 +09004011 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4012 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4013 actual := apex.installDir.String()
4014 if actual != expected {
4015 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4016 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004017
Jooyung Han91df2082019-11-20 01:49:42 +09004018 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4019 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4020 actual = flattened.installDir.String()
4021 if actual != expected {
4022 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4023 }
4024 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004025 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004026}
Jiyong Park67882562019-03-21 01:11:21 +09004027
Jooyung Han580eb4f2020-06-24 19:33:06 +09004028func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004030 apex {
4031 name: "myapex",
4032 key: "myapex.key",
4033 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004034
Jooyung Han580eb4f2020-06-24 19:33:06 +09004035 apex_key {
4036 name: "myapex.key",
4037 public_key: "testkey.avbpubkey",
4038 private_key: "testkey.pem",
4039 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004040 `)
4041 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004042 rule := module.Output("file_contexts")
4043 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4044}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004045
Jooyung Han580eb4f2020-06-24 19:33:06 +09004046func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004047 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004048 apex {
4049 name: "myapex",
4050 key: "myapex.key",
4051 file_contexts: "my_own_file_contexts",
4052 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004053
Jooyung Han580eb4f2020-06-24 19:33:06 +09004054 apex_key {
4055 name: "myapex.key",
4056 public_key: "testkey.avbpubkey",
4057 private_key: "testkey.pem",
4058 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004059 `, withFiles(map[string][]byte{
4060 "my_own_file_contexts": nil,
4061 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004062}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004063
Jooyung Han580eb4f2020-06-24 19:33:06 +09004064func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004065 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004066 apex {
4067 name: "myapex",
4068 key: "myapex.key",
4069 product_specific: true,
4070 file_contexts: "product_specific_file_contexts",
4071 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004072
Jooyung Han580eb4f2020-06-24 19:33:06 +09004073 apex_key {
4074 name: "myapex.key",
4075 public_key: "testkey.avbpubkey",
4076 private_key: "testkey.pem",
4077 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004078 `)
4079
Jooyung Han580eb4f2020-06-24 19:33:06 +09004080 ctx, _ := testApex(t, `
4081 apex {
4082 name: "myapex",
4083 key: "myapex.key",
4084 product_specific: true,
4085 file_contexts: "product_specific_file_contexts",
4086 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004087
Jooyung Han580eb4f2020-06-24 19:33:06 +09004088 apex_key {
4089 name: "myapex.key",
4090 public_key: "testkey.avbpubkey",
4091 private_key: "testkey.pem",
4092 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004093 `, withFiles(map[string][]byte{
4094 "product_specific_file_contexts": nil,
4095 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004096 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4097 rule := module.Output("file_contexts")
4098 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4099}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004100
Jooyung Han580eb4f2020-06-24 19:33:06 +09004101func TestFileContexts_SetViaFileGroup(t *testing.T) {
4102 ctx, _ := testApex(t, `
4103 apex {
4104 name: "myapex",
4105 key: "myapex.key",
4106 product_specific: true,
4107 file_contexts: ":my-file-contexts",
4108 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004109
Jooyung Han580eb4f2020-06-24 19:33:06 +09004110 apex_key {
4111 name: "myapex.key",
4112 public_key: "testkey.avbpubkey",
4113 private_key: "testkey.pem",
4114 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004115
Jooyung Han580eb4f2020-06-24 19:33:06 +09004116 filegroup {
4117 name: "my-file-contexts",
4118 srcs: ["product_specific_file_contexts"],
4119 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004120 `, withFiles(map[string][]byte{
4121 "product_specific_file_contexts": nil,
4122 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004123 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4124 rule := module.Output("file_contexts")
4125 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004126}
4127
Jiyong Park67882562019-03-21 01:11:21 +09004128func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004129 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004130 apex_key {
4131 name: "myapex.key",
4132 public_key: ":my.avbpubkey",
4133 private_key: ":my.pem",
4134 product_specific: true,
4135 }
4136
4137 filegroup {
4138 name: "my.avbpubkey",
4139 srcs: ["testkey2.avbpubkey"],
4140 }
4141
4142 filegroup {
4143 name: "my.pem",
4144 srcs: ["testkey2.pem"],
4145 }
4146 `)
4147
4148 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4149 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004150 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004151 if actual_pubkey != expected_pubkey {
4152 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4153 }
4154 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004155 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004156 if actual_privkey != expected_privkey {
4157 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4158 }
4159}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004160
4161func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004162 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004163 prebuilt_apex {
4164 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004165 arch: {
4166 arm64: {
4167 src: "myapex-arm64.apex",
4168 },
4169 arm: {
4170 src: "myapex-arm.apex",
4171 },
4172 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004173 }
4174 `)
4175
4176 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4177
Jiyong Parkc95714e2019-03-29 14:23:10 +09004178 expectedInput := "myapex-arm64.apex"
4179 if prebuilt.inputApex.String() != expectedInput {
4180 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4181 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004182}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004183
4184func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004185 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004186 prebuilt_apex {
4187 name: "myapex",
4188 src: "myapex-arm.apex",
4189 filename: "notmyapex.apex",
4190 }
4191 `)
4192
4193 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4194
4195 expected := "notmyapex.apex"
4196 if p.installFilename != expected {
4197 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4198 }
4199}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004200
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004201func TestPrebuiltOverrides(t *testing.T) {
4202 ctx, config := testApex(t, `
4203 prebuilt_apex {
4204 name: "myapex.prebuilt",
4205 src: "myapex-arm.apex",
4206 overrides: [
4207 "myapex",
4208 ],
4209 }
4210 `)
4211
4212 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4213
4214 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004215 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004216 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004217 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004218 }
4219}
4220
Roland Levillain630846d2019-06-26 12:48:34 +01004221func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004222 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004223 apex_test {
4224 name: "myapex",
4225 key: "myapex.key",
4226 tests: [
4227 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004228 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004229 ],
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237
Liz Kammer1c14a212020-05-12 15:26:55 -07004238 filegroup {
4239 name: "fg",
4240 srcs: [
4241 "baz",
4242 "bar/baz"
4243 ],
4244 }
4245
Roland Levillain630846d2019-06-26 12:48:34 +01004246 cc_test {
4247 name: "mytest",
4248 gtest: false,
4249 srcs: ["mytest.cpp"],
4250 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004251 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004252 system_shared_libs: [],
4253 static_executable: true,
4254 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004255 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004256 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004257
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004258 cc_library {
4259 name: "mylib",
4260 srcs: ["mylib.cpp"],
4261 system_shared_libs: [],
4262 stl: "none",
4263 }
4264
Liz Kammer5bd365f2020-05-27 15:15:11 -07004265 filegroup {
4266 name: "fg2",
4267 srcs: [
4268 "testdata/baz"
4269 ],
4270 }
4271
Roland Levillain9b5fde92019-06-28 15:41:19 +01004272 cc_test {
4273 name: "mytests",
4274 gtest: false,
4275 srcs: [
4276 "mytest1.cpp",
4277 "mytest2.cpp",
4278 "mytest3.cpp",
4279 ],
4280 test_per_src: true,
4281 relative_install_path: "test",
4282 system_shared_libs: [],
4283 static_executable: true,
4284 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004285 data: [
4286 ":fg",
4287 ":fg2",
4288 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004289 }
Roland Levillain630846d2019-06-26 12:48:34 +01004290 `)
4291
Sundong Ahnabb64432019-10-22 13:58:29 +09004292 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004293 copyCmds := apexRule.Args["copy_commands"]
4294
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004295 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004296 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004297 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004298
Liz Kammer1c14a212020-05-12 15:26:55 -07004299 //Ensure that test data are copied into apex.
4300 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4301 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4302
Roland Levillain9b5fde92019-06-28 15:41:19 +01004303 // Ensure that test deps built with `test_per_src` are copied into apex.
4304 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4305 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4306 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004307
4308 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004309 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4310 data := android.AndroidMkDataForTest(t, config, "", bundle)
4311 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004312 prefix := "TARGET_"
4313 var builder strings.Builder
4314 data.Custom(&builder, name, prefix, "", data)
4315 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004316 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4317 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4318 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4319 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004320 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004321 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004322 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004323
4324 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4325 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4326 data.Custom(&builder, name, prefix, "", data)
4327 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004328 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4329 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004330}
4331
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004332func TestInstallExtraFlattenedApexes(t *testing.T) {
4333 ctx, config := testApex(t, `
4334 apex {
4335 name: "myapex",
4336 key: "myapex.key",
4337 }
4338 apex_key {
4339 name: "myapex.key",
4340 public_key: "testkey.avbpubkey",
4341 private_key: "testkey.pem",
4342 }
4343 `, func(fs map[string][]byte, config android.Config) {
4344 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4345 })
4346 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004347 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004348 mk := android.AndroidMkDataForTest(t, config, "", ab)
4349 var builder strings.Builder
4350 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4351 androidMk := builder.String()
4352 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4353}
4354
Jooyung Hand48f3c32019-08-23 11:18:57 +09004355func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4356 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4357 apex {
4358 name: "myapex",
4359 key: "myapex.key",
4360 native_shared_libs: ["libfoo"],
4361 }
4362
4363 apex_key {
4364 name: "myapex.key",
4365 public_key: "testkey.avbpubkey",
4366 private_key: "testkey.pem",
4367 }
4368
4369 cc_library {
4370 name: "libfoo",
4371 stl: "none",
4372 system_shared_libs: [],
4373 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004374 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004375 }
4376 `)
4377 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4378 apex {
4379 name: "myapex",
4380 key: "myapex.key",
4381 java_libs: ["myjar"],
4382 }
4383
4384 apex_key {
4385 name: "myapex.key",
4386 public_key: "testkey.avbpubkey",
4387 private_key: "testkey.pem",
4388 }
4389
4390 java_library {
4391 name: "myjar",
4392 srcs: ["foo/bar/MyClass.java"],
4393 sdk_version: "none",
4394 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004395 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004396 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004397 }
4398 `)
4399}
4400
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004401func TestApexWithApps(t *testing.T) {
4402 ctx, _ := testApex(t, `
4403 apex {
4404 name: "myapex",
4405 key: "myapex.key",
4406 apps: [
4407 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004408 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004409 ],
4410 }
4411
4412 apex_key {
4413 name: "myapex.key",
4414 public_key: "testkey.avbpubkey",
4415 private_key: "testkey.pem",
4416 }
4417
4418 android_app {
4419 name: "AppFoo",
4420 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004421 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004422 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004423 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004424 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004425 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004426 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004427
4428 android_app {
4429 name: "AppFooPriv",
4430 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004431 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004432 system_modules: "none",
4433 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004434 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004435 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004436 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004437
4438 cc_library_shared {
4439 name: "libjni",
4440 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004441 shared_libs: ["libfoo"],
4442 stl: "none",
4443 system_shared_libs: [],
4444 apex_available: [ "myapex" ],
4445 sdk_version: "current",
4446 }
4447
4448 cc_library_shared {
4449 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004450 stl: "none",
4451 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004452 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004453 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004454 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004455 `)
4456
Sundong Ahnabb64432019-10-22 13:58:29 +09004457 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004458 apexRule := module.Rule("apexRule")
4459 copyCmds := apexRule.Args["copy_commands"]
4460
4461 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004462 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004463
Colin Crossaede88c2020-08-11 12:17:01 -07004464 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004465 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004466 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004467 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004468 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004469 // JNI libraries including transitive deps are
4470 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004471 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004472 // ... embedded inside APK (jnilibs.zip)
4473 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4474 // ... and not directly inside the APEX
4475 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4476 }
Dario Frenicde2a032019-10-27 00:29:22 +01004477}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004478
Dario Frenicde2a032019-10-27 00:29:22 +01004479func TestApexWithAppImports(t *testing.T) {
4480 ctx, _ := testApex(t, `
4481 apex {
4482 name: "myapex",
4483 key: "myapex.key",
4484 apps: [
4485 "AppFooPrebuilt",
4486 "AppFooPrivPrebuilt",
4487 ],
4488 }
4489
4490 apex_key {
4491 name: "myapex.key",
4492 public_key: "testkey.avbpubkey",
4493 private_key: "testkey.pem",
4494 }
4495
4496 android_app_import {
4497 name: "AppFooPrebuilt",
4498 apk: "PrebuiltAppFoo.apk",
4499 presigned: true,
4500 dex_preopt: {
4501 enabled: false,
4502 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004503 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004504 }
4505
4506 android_app_import {
4507 name: "AppFooPrivPrebuilt",
4508 apk: "PrebuiltAppFooPriv.apk",
4509 privileged: true,
4510 presigned: true,
4511 dex_preopt: {
4512 enabled: false,
4513 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004514 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004515 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004516 }
4517 `)
4518
Sundong Ahnabb64432019-10-22 13:58:29 +09004519 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004520 apexRule := module.Rule("apexRule")
4521 copyCmds := apexRule.Args["copy_commands"]
4522
4523 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004524 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4525}
4526
4527func TestApexWithAppImportsPrefer(t *testing.T) {
4528 ctx, _ := testApex(t, `
4529 apex {
4530 name: "myapex",
4531 key: "myapex.key",
4532 apps: [
4533 "AppFoo",
4534 ],
4535 }
4536
4537 apex_key {
4538 name: "myapex.key",
4539 public_key: "testkey.avbpubkey",
4540 private_key: "testkey.pem",
4541 }
4542
4543 android_app {
4544 name: "AppFoo",
4545 srcs: ["foo/bar/MyClass.java"],
4546 sdk_version: "none",
4547 system_modules: "none",
4548 apex_available: [ "myapex" ],
4549 }
4550
4551 android_app_import {
4552 name: "AppFoo",
4553 apk: "AppFooPrebuilt.apk",
4554 filename: "AppFooPrebuilt.apk",
4555 presigned: true,
4556 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004557 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004558 }
4559 `, withFiles(map[string][]byte{
4560 "AppFooPrebuilt.apk": nil,
4561 }))
4562
4563 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4564 "app/AppFoo/AppFooPrebuilt.apk",
4565 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004566}
4567
Dario Freni6f3937c2019-12-20 22:58:03 +00004568func TestApexWithTestHelperApp(t *testing.T) {
4569 ctx, _ := testApex(t, `
4570 apex {
4571 name: "myapex",
4572 key: "myapex.key",
4573 apps: [
4574 "TesterHelpAppFoo",
4575 ],
4576 }
4577
4578 apex_key {
4579 name: "myapex.key",
4580 public_key: "testkey.avbpubkey",
4581 private_key: "testkey.pem",
4582 }
4583
4584 android_test_helper_app {
4585 name: "TesterHelpAppFoo",
4586 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004587 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004588 }
4589
4590 `)
4591
4592 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4593 apexRule := module.Rule("apexRule")
4594 copyCmds := apexRule.Args["copy_commands"]
4595
4596 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4597}
4598
Jooyung Han18020ea2019-11-13 10:50:48 +09004599func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4600 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004601 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004602 apex {
4603 name: "myapex",
4604 key: "myapex.key",
4605 native_shared_libs: ["libfoo"],
4606 }
4607
4608 apex_key {
4609 name: "myapex.key",
4610 public_key: "testkey.avbpubkey",
4611 private_key: "testkey.pem",
4612 }
4613
4614 apex {
4615 name: "otherapex",
4616 key: "myapex.key",
4617 native_shared_libs: ["libfoo"],
4618 }
4619
4620 cc_defaults {
4621 name: "libfoo-defaults",
4622 apex_available: ["otherapex"],
4623 }
4624
4625 cc_library {
4626 name: "libfoo",
4627 defaults: ["libfoo-defaults"],
4628 stl: "none",
4629 system_shared_libs: [],
4630 }`)
4631}
4632
Paul Duffine52e66f2020-03-30 17:54:29 +01004633func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004634 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004635 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004636 apex {
4637 name: "myapex",
4638 key: "myapex.key",
4639 native_shared_libs: ["libfoo"],
4640 }
4641
4642 apex_key {
4643 name: "myapex.key",
4644 public_key: "testkey.avbpubkey",
4645 private_key: "testkey.pem",
4646 }
4647
4648 apex {
4649 name: "otherapex",
4650 key: "otherapex.key",
4651 native_shared_libs: ["libfoo"],
4652 }
4653
4654 apex_key {
4655 name: "otherapex.key",
4656 public_key: "testkey.avbpubkey",
4657 private_key: "testkey.pem",
4658 }
4659
4660 cc_library {
4661 name: "libfoo",
4662 stl: "none",
4663 system_shared_libs: [],
4664 apex_available: ["otherapex"],
4665 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004666}
Jiyong Park127b40b2019-09-30 16:04:35 +09004667
Paul Duffine52e66f2020-03-30 17:54:29 +01004668func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004669 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004670 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004671.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004672.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004673.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004674.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004675.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004676.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004677 apex {
4678 name: "myapex",
4679 key: "myapex.key",
4680 native_shared_libs: ["libfoo"],
4681 }
4682
4683 apex_key {
4684 name: "myapex.key",
4685 public_key: "testkey.avbpubkey",
4686 private_key: "testkey.pem",
4687 }
4688
Jiyong Park127b40b2019-09-30 16:04:35 +09004689 cc_library {
4690 name: "libfoo",
4691 stl: "none",
4692 shared_libs: ["libbar"],
4693 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004694 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004695 }
4696
4697 cc_library {
4698 name: "libbar",
4699 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004700 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004701 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004702 apex_available: ["myapex"],
4703 }
4704
4705 cc_library {
4706 name: "libbaz",
4707 stl: "none",
4708 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004709 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004710}
Jiyong Park127b40b2019-09-30 16:04:35 +09004711
Paul Duffine52e66f2020-03-30 17:54:29 +01004712func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004713 testApexError(t, "\"otherapex\" is not a valid module name", `
4714 apex {
4715 name: "myapex",
4716 key: "myapex.key",
4717 native_shared_libs: ["libfoo"],
4718 }
4719
4720 apex_key {
4721 name: "myapex.key",
4722 public_key: "testkey.avbpubkey",
4723 private_key: "testkey.pem",
4724 }
4725
4726 cc_library {
4727 name: "libfoo",
4728 stl: "none",
4729 system_shared_libs: [],
4730 apex_available: ["otherapex"],
4731 }`)
4732
Paul Duffine52e66f2020-03-30 17:54:29 +01004733 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004734 apex {
4735 name: "myapex",
4736 key: "myapex.key",
4737 native_shared_libs: ["libfoo", "libbar"],
4738 }
4739
4740 apex_key {
4741 name: "myapex.key",
4742 public_key: "testkey.avbpubkey",
4743 private_key: "testkey.pem",
4744 }
4745
4746 cc_library {
4747 name: "libfoo",
4748 stl: "none",
4749 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004750 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004751 apex_available: ["myapex"],
4752 }
4753
4754 cc_library {
4755 name: "libbar",
4756 stl: "none",
4757 system_shared_libs: [],
4758 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004759 }
4760
4761 cc_library {
4762 name: "libbaz",
4763 stl: "none",
4764 system_shared_libs: [],
4765 stubs: {
4766 versions: ["10", "20", "30"],
4767 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004768 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004769}
Jiyong Park127b40b2019-09-30 16:04:35 +09004770
Jiyong Park89e850a2020-04-07 16:37:39 +09004771func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004772 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004773 apex {
4774 name: "myapex",
4775 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004776 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004777 }
4778
4779 apex_key {
4780 name: "myapex.key",
4781 public_key: "testkey.avbpubkey",
4782 private_key: "testkey.pem",
4783 }
4784
4785 cc_library {
4786 name: "libfoo",
4787 stl: "none",
4788 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004789 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004790 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004791 }
4792
4793 cc_library {
4794 name: "libfoo2",
4795 stl: "none",
4796 system_shared_libs: [],
4797 shared_libs: ["libbaz"],
4798 apex_available: ["//apex_available:platform"],
4799 }
4800
4801 cc_library {
4802 name: "libbar",
4803 stl: "none",
4804 system_shared_libs: [],
4805 apex_available: ["myapex"],
4806 }
4807
4808 cc_library {
4809 name: "libbaz",
4810 stl: "none",
4811 system_shared_libs: [],
4812 apex_available: ["myapex"],
4813 stubs: {
4814 versions: ["1"],
4815 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004816 }`)
4817
Jiyong Park89e850a2020-04-07 16:37:39 +09004818 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4819 // because it depends on libbar which isn't available to platform
4820 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4821 if libfoo.NotAvailableForPlatform() != true {
4822 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4823 }
4824
4825 // libfoo2 however can be available to platform because it depends on libbaz which provides
4826 // stubs
4827 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4828 if libfoo2.NotAvailableForPlatform() == true {
4829 t.Errorf("%q should be available to platform", libfoo2.String())
4830 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004831}
Jiyong Parka90ca002019-10-07 15:47:24 +09004832
Paul Duffine52e66f2020-03-30 17:54:29 +01004833func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004834 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004835 apex {
4836 name: "myapex",
4837 key: "myapex.key",
4838 native_shared_libs: ["libfoo"],
4839 }
4840
4841 apex_key {
4842 name: "myapex.key",
4843 public_key: "testkey.avbpubkey",
4844 private_key: "testkey.pem",
4845 }
4846
4847 cc_library {
4848 name: "libfoo",
4849 stl: "none",
4850 system_shared_libs: [],
4851 apex_available: ["myapex"],
4852 static: {
4853 apex_available: ["//apex_available:platform"],
4854 },
4855 }`)
4856
Jiyong Park89e850a2020-04-07 16:37:39 +09004857 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4858 if libfooShared.NotAvailableForPlatform() != true {
4859 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4860 }
4861 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4862 if libfooStatic.NotAvailableForPlatform() != false {
4863 t.Errorf("%q should be available to platform", libfooStatic.String())
4864 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004865}
4866
Jiyong Park5d790c32019-11-15 18:40:32 +09004867func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004868 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004869 apex {
4870 name: "myapex",
4871 key: "myapex.key",
4872 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004873 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004874 }
4875
4876 override_apex {
4877 name: "override_myapex",
4878 base: "myapex",
4879 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004880 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004881 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004882 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004883 }
4884
4885 apex_key {
4886 name: "myapex.key",
4887 public_key: "testkey.avbpubkey",
4888 private_key: "testkey.pem",
4889 }
4890
4891 android_app {
4892 name: "app",
4893 srcs: ["foo/bar/MyClass.java"],
4894 package_name: "foo",
4895 sdk_version: "none",
4896 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004897 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004898 }
4899
4900 override_android_app {
4901 name: "override_app",
4902 base: "app",
4903 package_name: "bar",
4904 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004905 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004906
Jiyong Park317645e2019-12-05 13:20:58 +09004907 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4908 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4909 if originalVariant.GetOverriddenBy() != "" {
4910 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4911 }
4912 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4913 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4914 }
4915
Jiyong Park5d790c32019-11-15 18:40:32 +09004916 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4917 apexRule := module.Rule("apexRule")
4918 copyCmds := apexRule.Args["copy_commands"]
4919
4920 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004921 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004922
4923 apexBundle := module.Module().(*apexBundle)
4924 name := apexBundle.Name()
4925 if name != "override_myapex" {
4926 t.Errorf("name should be \"override_myapex\", but was %q", name)
4927 }
4928
Baligh Uddin004d7172020-02-19 21:29:28 -08004929 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4930 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4931 }
4932
Jiyong Park20bacab2020-03-03 11:45:41 +09004933 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004934 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004935
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004936 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4937 var builder strings.Builder
4938 data.Custom(&builder, name, "TARGET_", "", data)
4939 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004940 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004941 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4942 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004943 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004944 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004945 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004946 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4947 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004948}
4949
Jooyung Han214bf372019-11-12 13:03:50 +09004950func TestLegacyAndroid10Support(t *testing.T) {
4951 ctx, _ := testApex(t, `
4952 apex {
4953 name: "myapex",
4954 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004955 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004956 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004957 }
4958
4959 apex_key {
4960 name: "myapex.key",
4961 public_key: "testkey.avbpubkey",
4962 private_key: "testkey.pem",
4963 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004964
4965 cc_library {
4966 name: "mylib",
4967 srcs: ["mylib.cpp"],
4968 stl: "libc++",
4969 system_shared_libs: [],
4970 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004971 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004972 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004973 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004974
4975 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4976 args := module.Rule("apexRule").Args
4977 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004978 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004979
4980 // The copies of the libraries in the apex should have one more dependency than
4981 // the ones outside the apex, namely the unwinder. Ideally we should check
4982 // the dependency names directly here but for some reason the names are blank in
4983 // this test.
4984 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004985 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004986 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4987 if len(apexImplicits) != len(nonApexImplicits)+1 {
4988 t.Errorf("%q missing unwinder dep", lib)
4989 }
4990 }
Jooyung Han214bf372019-11-12 13:03:50 +09004991}
4992
Paul Duffin9b879592020-05-26 13:21:35 +01004993var filesForSdkLibrary = map[string][]byte{
4994 "api/current.txt": nil,
4995 "api/removed.txt": nil,
4996 "api/system-current.txt": nil,
4997 "api/system-removed.txt": nil,
4998 "api/test-current.txt": nil,
4999 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005000
Anton Hanssondff2c782020-12-21 17:10:01 +00005001 "100/public/api/foo.txt": nil,
5002 "100/public/api/foo-removed.txt": nil,
5003 "100/system/api/foo.txt": nil,
5004 "100/system/api/foo-removed.txt": nil,
5005
Paul Duffineedc5d52020-06-12 17:46:39 +01005006 // For java_sdk_library_import
5007 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005008}
5009
Jooyung Han58f26ab2019-12-18 15:34:32 +09005010func TestJavaSDKLibrary(t *testing.T) {
5011 ctx, _ := testApex(t, `
5012 apex {
5013 name: "myapex",
5014 key: "myapex.key",
5015 java_libs: ["foo"],
5016 }
5017
5018 apex_key {
5019 name: "myapex.key",
5020 public_key: "testkey.avbpubkey",
5021 private_key: "testkey.pem",
5022 }
5023
5024 java_sdk_library {
5025 name: "foo",
5026 srcs: ["a.java"],
5027 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005028 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005029 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005030
5031 prebuilt_apis {
5032 name: "sdk",
5033 api_dirs: ["100"],
5034 }
Paul Duffin9b879592020-05-26 13:21:35 +01005035 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005036
5037 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005038 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005039 "javalib/foo.jar",
5040 "etc/permissions/foo.xml",
5041 })
5042 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005043 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5044 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005045}
5046
Paul Duffin9b879592020-05-26 13:21:35 +01005047func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5048 ctx, _ := testApex(t, `
5049 apex {
5050 name: "myapex",
5051 key: "myapex.key",
5052 java_libs: ["foo", "bar"],
5053 }
5054
5055 apex_key {
5056 name: "myapex.key",
5057 public_key: "testkey.avbpubkey",
5058 private_key: "testkey.pem",
5059 }
5060
5061 java_sdk_library {
5062 name: "foo",
5063 srcs: ["a.java"],
5064 api_packages: ["foo"],
5065 apex_available: ["myapex"],
5066 sdk_version: "none",
5067 system_modules: "none",
5068 }
5069
5070 java_library {
5071 name: "bar",
5072 srcs: ["a.java"],
5073 libs: ["foo"],
5074 apex_available: ["myapex"],
5075 sdk_version: "none",
5076 system_modules: "none",
5077 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005078
5079 prebuilt_apis {
5080 name: "sdk",
5081 api_dirs: ["100"],
5082 }
Paul Duffin9b879592020-05-26 13:21:35 +01005083 `, withFiles(filesForSdkLibrary))
5084
5085 // java_sdk_library installs both impl jar and permission XML
5086 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5087 "javalib/bar.jar",
5088 "javalib/foo.jar",
5089 "etc/permissions/foo.xml",
5090 })
5091
5092 // The bar library should depend on the implementation jar.
5093 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5094 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5095 t.Errorf("expected %q, found %#q", expected, actual)
5096 }
5097}
5098
5099func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5100 ctx, _ := testApex(t, `
5101 apex {
5102 name: "myapex",
5103 key: "myapex.key",
5104 java_libs: ["foo"],
5105 }
5106
5107 apex_key {
5108 name: "myapex.key",
5109 public_key: "testkey.avbpubkey",
5110 private_key: "testkey.pem",
5111 }
5112
5113 java_sdk_library {
5114 name: "foo",
5115 srcs: ["a.java"],
5116 api_packages: ["foo"],
5117 apex_available: ["myapex"],
5118 sdk_version: "none",
5119 system_modules: "none",
5120 }
5121
5122 java_library {
5123 name: "bar",
5124 srcs: ["a.java"],
5125 libs: ["foo"],
5126 sdk_version: "none",
5127 system_modules: "none",
5128 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005129
5130 prebuilt_apis {
5131 name: "sdk",
5132 api_dirs: ["100"],
5133 }
Paul Duffin9b879592020-05-26 13:21:35 +01005134 `, withFiles(filesForSdkLibrary))
5135
5136 // java_sdk_library installs both impl jar and permission XML
5137 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5138 "javalib/foo.jar",
5139 "etc/permissions/foo.xml",
5140 })
5141
5142 // The bar library should depend on the stubs jar.
5143 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5144 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5145 t.Errorf("expected %q, found %#q", expected, actual)
5146 }
5147}
5148
Paul Duffineedc5d52020-06-12 17:46:39 +01005149func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005150 ctx, _ := testApex(t, `
5151 prebuilt_apis {
5152 name: "sdk",
5153 api_dirs: ["100"],
5154 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005155 withFiles(map[string][]byte{
5156 "apex/a.java": nil,
5157 "apex/apex_manifest.json": nil,
5158 "apex/Android.bp": []byte(`
5159 package {
5160 default_visibility: ["//visibility:private"],
5161 }
5162
5163 apex {
5164 name: "myapex",
5165 key: "myapex.key",
5166 java_libs: ["foo", "bar"],
5167 }
5168
5169 apex_key {
5170 name: "myapex.key",
5171 public_key: "testkey.avbpubkey",
5172 private_key: "testkey.pem",
5173 }
5174
5175 java_library {
5176 name: "bar",
5177 srcs: ["a.java"],
5178 libs: ["foo"],
5179 apex_available: ["myapex"],
5180 sdk_version: "none",
5181 system_modules: "none",
5182 }
5183`),
5184 "source/a.java": nil,
5185 "source/api/current.txt": nil,
5186 "source/api/removed.txt": nil,
5187 "source/Android.bp": []byte(`
5188 package {
5189 default_visibility: ["//visibility:private"],
5190 }
5191
5192 java_sdk_library {
5193 name: "foo",
5194 visibility: ["//apex"],
5195 srcs: ["a.java"],
5196 api_packages: ["foo"],
5197 apex_available: ["myapex"],
5198 sdk_version: "none",
5199 system_modules: "none",
5200 public: {
5201 enabled: true,
5202 },
5203 }
5204`),
5205 "prebuilt/a.jar": nil,
5206 "prebuilt/Android.bp": []byte(`
5207 package {
5208 default_visibility: ["//visibility:private"],
5209 }
5210
5211 java_sdk_library_import {
5212 name: "foo",
5213 visibility: ["//apex", "//source"],
5214 apex_available: ["myapex"],
5215 prefer: true,
5216 public: {
5217 jars: ["a.jar"],
5218 },
5219 }
5220`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005221 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005222 )
5223
5224 // java_sdk_library installs both impl jar and permission XML
5225 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5226 "javalib/bar.jar",
5227 "javalib/foo.jar",
5228 "etc/permissions/foo.xml",
5229 })
5230
5231 // The bar library should depend on the implementation jar.
5232 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5233 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5234 t.Errorf("expected %q, found %#q", expected, actual)
5235 }
5236}
5237
5238func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5239 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5240 apex {
5241 name: "myapex",
5242 key: "myapex.key",
5243 java_libs: ["foo"],
5244 }
5245
5246 apex_key {
5247 name: "myapex.key",
5248 public_key: "testkey.avbpubkey",
5249 private_key: "testkey.pem",
5250 }
5251
5252 java_sdk_library_import {
5253 name: "foo",
5254 apex_available: ["myapex"],
5255 prefer: true,
5256 public: {
5257 jars: ["a.jar"],
5258 },
5259 }
5260
5261 `, withFiles(filesForSdkLibrary))
5262}
5263
atrost6e126252020-01-27 17:01:16 +00005264func TestCompatConfig(t *testing.T) {
5265 ctx, _ := testApex(t, `
5266 apex {
5267 name: "myapex",
5268 key: "myapex.key",
5269 prebuilts: ["myjar-platform-compat-config"],
5270 java_libs: ["myjar"],
5271 }
5272
5273 apex_key {
5274 name: "myapex.key",
5275 public_key: "testkey.avbpubkey",
5276 private_key: "testkey.pem",
5277 }
5278
5279 platform_compat_config {
5280 name: "myjar-platform-compat-config",
5281 src: ":myjar",
5282 }
5283
5284 java_library {
5285 name: "myjar",
5286 srcs: ["foo/bar/MyClass.java"],
5287 sdk_version: "none",
5288 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005289 apex_available: [ "myapex" ],
5290 }
5291 `)
5292 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5293 "etc/compatconfig/myjar-platform-compat-config.xml",
5294 "javalib/myjar.jar",
5295 })
5296}
5297
Jiyong Park479321d2019-12-16 11:47:12 +09005298func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5299 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5300 apex {
5301 name: "myapex",
5302 key: "myapex.key",
5303 java_libs: ["myjar"],
5304 }
5305
5306 apex_key {
5307 name: "myapex.key",
5308 public_key: "testkey.avbpubkey",
5309 private_key: "testkey.pem",
5310 }
5311
5312 java_library {
5313 name: "myjar",
5314 srcs: ["foo/bar/MyClass.java"],
5315 sdk_version: "none",
5316 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005317 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005318 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005319 }
5320 `)
5321}
5322
Jiyong Park7afd1072019-12-30 16:56:33 +09005323func TestCarryRequiredModuleNames(t *testing.T) {
5324 ctx, config := testApex(t, `
5325 apex {
5326 name: "myapex",
5327 key: "myapex.key",
5328 native_shared_libs: ["mylib"],
5329 }
5330
5331 apex_key {
5332 name: "myapex.key",
5333 public_key: "testkey.avbpubkey",
5334 private_key: "testkey.pem",
5335 }
5336
5337 cc_library {
5338 name: "mylib",
5339 srcs: ["mylib.cpp"],
5340 system_shared_libs: [],
5341 stl: "none",
5342 required: ["a", "b"],
5343 host_required: ["c", "d"],
5344 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005345 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005346 }
5347 `)
5348
5349 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5350 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5351 name := apexBundle.BaseModuleName()
5352 prefix := "TARGET_"
5353 var builder strings.Builder
5354 data.Custom(&builder, name, prefix, "", data)
5355 androidMk := builder.String()
5356 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5357 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5358 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5359}
5360
Jiyong Park7cd10e32020-01-14 09:22:18 +09005361func TestSymlinksFromApexToSystem(t *testing.T) {
5362 bp := `
5363 apex {
5364 name: "myapex",
5365 key: "myapex.key",
5366 native_shared_libs: ["mylib"],
5367 java_libs: ["myjar"],
5368 }
5369
Jiyong Park9d677202020-02-19 16:29:35 +09005370 apex {
5371 name: "myapex.updatable",
5372 key: "myapex.key",
5373 native_shared_libs: ["mylib"],
5374 java_libs: ["myjar"],
5375 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005376 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005377 }
5378
Jiyong Park7cd10e32020-01-14 09:22:18 +09005379 apex_key {
5380 name: "myapex.key",
5381 public_key: "testkey.avbpubkey",
5382 private_key: "testkey.pem",
5383 }
5384
5385 cc_library {
5386 name: "mylib",
5387 srcs: ["mylib.cpp"],
5388 shared_libs: ["myotherlib"],
5389 system_shared_libs: [],
5390 stl: "none",
5391 apex_available: [
5392 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005393 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005394 "//apex_available:platform",
5395 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005396 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005397 }
5398
5399 cc_library {
5400 name: "myotherlib",
5401 srcs: ["mylib.cpp"],
5402 system_shared_libs: [],
5403 stl: "none",
5404 apex_available: [
5405 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005406 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005407 "//apex_available:platform",
5408 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005409 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005410 }
5411
5412 java_library {
5413 name: "myjar",
5414 srcs: ["foo/bar/MyClass.java"],
5415 sdk_version: "none",
5416 system_modules: "none",
5417 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005418 apex_available: [
5419 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005420 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005421 "//apex_available:platform",
5422 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005423 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005424 }
5425
5426 java_library {
5427 name: "myotherjar",
5428 srcs: ["foo/bar/MyClass.java"],
5429 sdk_version: "none",
5430 system_modules: "none",
5431 apex_available: [
5432 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005433 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005434 "//apex_available:platform",
5435 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005436 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005437 }
5438 `
5439
5440 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5441 for _, f := range files {
5442 if f.path == file {
5443 if f.isLink {
5444 t.Errorf("%q is not a real file", file)
5445 }
5446 return
5447 }
5448 }
5449 t.Errorf("%q is not found", file)
5450 }
5451
5452 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5453 for _, f := range files {
5454 if f.path == file {
5455 if !f.isLink {
5456 t.Errorf("%q is not a symlink", file)
5457 }
5458 return
5459 }
5460 }
5461 t.Errorf("%q is not found", file)
5462 }
5463
Jiyong Park9d677202020-02-19 16:29:35 +09005464 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5465 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005466 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005467 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005468 ensureRealfileExists(t, files, "javalib/myjar.jar")
5469 ensureRealfileExists(t, files, "lib64/mylib.so")
5470 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5471
Jiyong Park9d677202020-02-19 16:29:35 +09005472 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5473 ensureRealfileExists(t, files, "javalib/myjar.jar")
5474 ensureRealfileExists(t, files, "lib64/mylib.so")
5475 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5476
5477 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005478 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005479 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005480 ensureRealfileExists(t, files, "javalib/myjar.jar")
5481 ensureRealfileExists(t, files, "lib64/mylib.so")
5482 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005483
5484 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5485 ensureRealfileExists(t, files, "javalib/myjar.jar")
5486 ensureRealfileExists(t, files, "lib64/mylib.so")
5487 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005488}
5489
Yo Chiange8128052020-07-23 20:09:18 +08005490func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5491 ctx, config := testApex(t, `
5492 apex {
5493 name: "myapex",
5494 key: "myapex.key",
5495 native_shared_libs: ["mylib"],
5496 }
5497
5498 apex_key {
5499 name: "myapex.key",
5500 public_key: "testkey.avbpubkey",
5501 private_key: "testkey.pem",
5502 }
5503
5504 cc_library_shared {
5505 name: "mylib",
5506 srcs: ["mylib.cpp"],
5507 shared_libs: ["myotherlib"],
5508 system_shared_libs: [],
5509 stl: "none",
5510 apex_available: [
5511 "myapex",
5512 "//apex_available:platform",
5513 ],
5514 }
5515
5516 cc_prebuilt_library_shared {
5517 name: "myotherlib",
5518 srcs: ["prebuilt.so"],
5519 system_shared_libs: [],
5520 stl: "none",
5521 apex_available: [
5522 "myapex",
5523 "//apex_available:platform",
5524 ],
5525 }
5526 `)
5527
5528 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5529 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5530 var builder strings.Builder
5531 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5532 androidMk := builder.String()
5533 // `myotherlib` is added to `myapex` as symlink
5534 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5535 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5536 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5537 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5538 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5539}
5540
Jooyung Han643adc42020-02-27 13:50:06 +09005541func TestApexWithJniLibs(t *testing.T) {
5542 ctx, _ := testApex(t, `
5543 apex {
5544 name: "myapex",
5545 key: "myapex.key",
5546 jni_libs: ["mylib"],
5547 }
5548
5549 apex_key {
5550 name: "myapex.key",
5551 public_key: "testkey.avbpubkey",
5552 private_key: "testkey.pem",
5553 }
5554
5555 cc_library {
5556 name: "mylib",
5557 srcs: ["mylib.cpp"],
5558 shared_libs: ["mylib2"],
5559 system_shared_libs: [],
5560 stl: "none",
5561 apex_available: [ "myapex" ],
5562 }
5563
5564 cc_library {
5565 name: "mylib2",
5566 srcs: ["mylib.cpp"],
5567 system_shared_libs: [],
5568 stl: "none",
5569 apex_available: [ "myapex" ],
5570 }
5571 `)
5572
5573 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5574 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5575 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5576 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5577 "lib64/mylib.so",
5578 "lib64/mylib2.so",
5579 })
5580}
5581
Jooyung Han49f67012020-04-17 13:43:10 +09005582func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5583 ctx, _ := testApex(t, `
5584 apex {
5585 name: "myapex",
5586 key: "myapex.key",
5587 }
5588 apex_key {
5589 name: "myapex.key",
5590 public_key: "testkey.avbpubkey",
5591 private_key: "testkey.pem",
5592 }
5593 `, func(fs map[string][]byte, config android.Config) {
5594 delete(config.Targets, android.Android)
5595 config.AndroidCommonTarget = android.Target{}
5596 })
5597
5598 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5599 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5600 }
5601}
5602
Jiyong Parkbd159612020-02-28 15:22:21 +09005603func TestAppBundle(t *testing.T) {
5604 ctx, _ := testApex(t, `
5605 apex {
5606 name: "myapex",
5607 key: "myapex.key",
5608 apps: ["AppFoo"],
5609 }
5610
5611 apex_key {
5612 name: "myapex.key",
5613 public_key: "testkey.avbpubkey",
5614 private_key: "testkey.pem",
5615 }
5616
5617 android_app {
5618 name: "AppFoo",
5619 srcs: ["foo/bar/MyClass.java"],
5620 sdk_version: "none",
5621 system_modules: "none",
5622 apex_available: [ "myapex" ],
5623 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005624 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005625
Colin Crosscf371cc2020-11-13 11:48:42 -08005626 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005627 content := bundleConfigRule.Args["content"]
5628
5629 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005630 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 +09005631}
5632
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005633func TestAppSetBundle(t *testing.T) {
5634 ctx, _ := testApex(t, `
5635 apex {
5636 name: "myapex",
5637 key: "myapex.key",
5638 apps: ["AppSet"],
5639 }
5640
5641 apex_key {
5642 name: "myapex.key",
5643 public_key: "testkey.avbpubkey",
5644 private_key: "testkey.pem",
5645 }
5646
5647 android_app_set {
5648 name: "AppSet",
5649 set: "AppSet.apks",
5650 }`)
5651 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005652 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005653 content := bundleConfigRule.Args["content"]
5654 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5655 s := mod.Rule("apexRule").Args["copy_commands"]
5656 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5657 if len(copyCmds) != 3 {
5658 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5659 }
5660 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5661 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5662 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5663}
5664
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005665func TestAppSetBundlePrebuilt(t *testing.T) {
5666 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5667 bp := `
5668 apex_set {
5669 name: "myapex",
5670 filename: "foo_v2.apex",
5671 sanitized: {
5672 none: { set: "myapex.apks", },
5673 hwaddress: { set: "myapex.hwasan.apks", },
5674 },
5675 }`
5676 fs["Android.bp"] = []byte(bp)
5677
5678 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5679 })
5680
5681 m := ctx.ModuleForTests("myapex", "android_common")
5682 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5683
5684 actual := extractedApex.Inputs
5685 if len(actual) != 1 {
5686 t.Errorf("expected a single input")
5687 }
5688
5689 expected := "myapex.hwasan.apks"
5690 if actual[0].String() != expected {
5691 t.Errorf("expected %s, got %s", expected, actual[0].String())
5692 }
5693}
5694
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005695func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005696 t.Helper()
5697
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005698 bp := `
5699 java_library {
5700 name: "some-updatable-apex-lib",
5701 srcs: ["a.java"],
5702 sdk_version: "current",
5703 apex_available: [
5704 "some-updatable-apex",
5705 ],
5706 }
5707
5708 java_library {
5709 name: "some-non-updatable-apex-lib",
5710 srcs: ["a.java"],
5711 apex_available: [
5712 "some-non-updatable-apex",
5713 ],
5714 }
5715
5716 java_library {
5717 name: "some-platform-lib",
5718 srcs: ["a.java"],
5719 sdk_version: "current",
5720 installable: true,
5721 }
5722
5723 java_library {
5724 name: "some-art-lib",
5725 srcs: ["a.java"],
5726 sdk_version: "current",
5727 apex_available: [
5728 "com.android.art.something",
5729 ],
5730 hostdex: true,
5731 }
5732
5733 apex {
5734 name: "some-updatable-apex",
5735 key: "some-updatable-apex.key",
5736 java_libs: ["some-updatable-apex-lib"],
5737 updatable: true,
5738 min_sdk_version: "current",
5739 }
5740
5741 apex {
5742 name: "some-non-updatable-apex",
5743 key: "some-non-updatable-apex.key",
5744 java_libs: ["some-non-updatable-apex-lib"],
5745 }
5746
5747 apex_key {
5748 name: "some-updatable-apex.key",
5749 }
5750
5751 apex_key {
5752 name: "some-non-updatable-apex.key",
5753 }
5754
5755 apex {
5756 name: "com.android.art.something",
5757 key: "com.android.art.something.key",
5758 java_libs: ["some-art-lib"],
5759 updatable: true,
5760 min_sdk_version: "current",
5761 }
5762
5763 apex_key {
5764 name: "com.android.art.something.key",
5765 }
5766
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005767 filegroup {
5768 name: "some-updatable-apex-file_contexts",
5769 srcs: [
5770 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5771 ],
5772 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005773
5774 filegroup {
5775 name: "some-non-updatable-apex-file_contexts",
5776 srcs: [
5777 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5778 ],
5779 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005780 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005781
5782 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5783}
5784
5785func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5786 t.Helper()
5787
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005788 bp += cc.GatherRequiredDepsForTest(android.Android)
5789 bp += java.GatherRequiredDepsForTest()
5790 bp += dexpreopt.BpToolModulesForTest()
5791
5792 fs := map[string][]byte{
5793 "a.java": nil,
5794 "a.jar": nil,
5795 "build/make/target/product/security": nil,
5796 "apex_manifest.json": nil,
5797 "AndroidManifest.xml": nil,
5798 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005799 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005800 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5801 "framework/aidl/a.aidl": nil,
5802 }
5803 cc.GatherRequiredFilesForTest(fs)
5804
Colin Crossae8600b2020-10-29 17:09:13 -07005805 config := android.TestArchConfig(buildDir, nil, bp, fs)
5806
5807 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005808 ctx.RegisterModuleType("apex", BundleFactory)
5809 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5810 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005811 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005812 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005813 cc.RegisterRequiredBuildComponentsForTest(ctx)
5814 java.RegisterJavaBuildComponents(ctx)
5815 java.RegisterSystemModulesBuildComponents(ctx)
5816 java.RegisterAppBuildComponents(ctx)
5817 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005818 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5819 ctx.PreDepsMutators(RegisterPreDepsMutators)
5820 ctx.PostDepsMutators(RegisterPostDepsMutators)
5821
Colin Crossae8600b2020-10-29 17:09:13 -07005822 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005823
5824 _ = dexpreopt.GlobalSoongConfigForTests(config)
5825 dexpreopt.RegisterToolModulesForTest(ctx)
5826 pathCtx := android.PathContextForTesting(config)
5827 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5828 transformDexpreoptConfig(dexpreoptConfig)
5829 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5830
5831 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5832 android.FailIfErrored(t, errs)
5833
5834 _, errs = ctx.PrepareBuildActions(config)
5835 if errmsg == "" {
5836 android.FailIfErrored(t, errs)
5837 } else if len(errs) > 0 {
5838 android.FailIfNoMatchingErrors(t, errmsg, errs)
5839 return
5840 } else {
5841 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5842 }
5843}
5844
Jooyung Han548640b2020-04-27 12:10:30 +09005845func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5846 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5847 apex {
5848 name: "myapex",
5849 key: "myapex.key",
5850 updatable: true,
5851 }
5852
5853 apex_key {
5854 name: "myapex.key",
5855 public_key: "testkey.avbpubkey",
5856 private_key: "testkey.pem",
5857 }
5858 `)
5859}
5860
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005861func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005862 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005863 var transform func(*dexpreopt.GlobalConfig)
5864
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005865 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5866 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005867 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005868 }
5869 testNoUpdatableJarsInBootImage(t, "", transform)
5870 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005871
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005872 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005873 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 +01005874 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005875 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005876 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005877 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005878 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005879
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005880 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 -07005881 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 +01005882 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005883 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005884 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005885 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005886 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005887
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005888 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 -07005889 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005890 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005891 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005892 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005893 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005894 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005895
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005896 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 -07005897 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 +01005898 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005899 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005900 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005901 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005902 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005903
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005904 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5905 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005906 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005907 }
5908 testNoUpdatableJarsInBootImage(t, "", transform)
5909 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005910
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005911 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005912 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005913 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005914 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005915 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005916 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005917 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005918
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005919 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005920 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005921 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005922 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005923 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005924 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005925 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005926
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005927 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005928 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005929 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005930 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005931 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005932 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005933 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005934
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005935 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5936 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005937 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005938 }
5939 testNoUpdatableJarsInBootImage(t, "", transform)
5940 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005941}
5942
Andrei Onea115e7e72020-06-05 21:14:03 +01005943func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5944 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005945 bp += `
5946 apex_key {
5947 name: "myapex.key",
5948 public_key: "testkey.avbpubkey",
5949 private_key: "testkey.pem",
5950 }`
5951 fs := map[string][]byte{
5952 "lib1/src/A.java": nil,
5953 "lib2/src/B.java": nil,
5954 "system/sepolicy/apex/myapex-file_contexts": nil,
5955 }
5956
Colin Crossae8600b2020-10-29 17:09:13 -07005957 config := android.TestArchConfig(buildDir, nil, bp, fs)
5958 android.SetTestNeverallowRules(config, rules)
5959 updatableBootJars := make([]string, 0, len(apexBootJars))
5960 for _, apexBootJar := range apexBootJars {
5961 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5962 }
5963 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5964
5965 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005966 ctx.RegisterModuleType("apex", BundleFactory)
5967 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5968 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5969 cc.RegisterRequiredBuildComponentsForTest(ctx)
5970 java.RegisterJavaBuildComponents(ctx)
5971 java.RegisterSystemModulesBuildComponents(ctx)
5972 java.RegisterDexpreoptBootJarsComponents(ctx)
5973 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5974 ctx.PreDepsMutators(RegisterPreDepsMutators)
5975 ctx.PostDepsMutators(RegisterPostDepsMutators)
5976 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5977
Colin Crossae8600b2020-10-29 17:09:13 -07005978 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005979
5980 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5981 android.FailIfErrored(t, errs)
5982
5983 _, errs = ctx.PrepareBuildActions(config)
5984 if errmsg == "" {
5985 android.FailIfErrored(t, errs)
5986 } else if len(errs) > 0 {
5987 android.FailIfNoMatchingErrors(t, errmsg, errs)
5988 return
5989 } else {
5990 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5991 }
5992}
5993
5994func TestApexPermittedPackagesRules(t *testing.T) {
5995 testcases := []struct {
5996 name string
5997 expectedError string
5998 bp string
5999 bootJars []string
6000 modulesPackages map[string][]string
6001 }{
6002
6003 {
6004 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6005 expectedError: "",
6006 bp: `
6007 java_library {
6008 name: "bcp_lib1",
6009 srcs: ["lib1/src/*.java"],
6010 permitted_packages: ["foo.bar"],
6011 apex_available: ["myapex"],
6012 sdk_version: "none",
6013 system_modules: "none",
6014 }
6015 java_library {
6016 name: "nonbcp_lib2",
6017 srcs: ["lib2/src/*.java"],
6018 apex_available: ["myapex"],
6019 permitted_packages: ["a.b"],
6020 sdk_version: "none",
6021 system_modules: "none",
6022 }
6023 apex {
6024 name: "myapex",
6025 key: "myapex.key",
6026 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6027 }`,
6028 bootJars: []string{"bcp_lib1"},
6029 modulesPackages: map[string][]string{
6030 "myapex": []string{
6031 "foo.bar",
6032 },
6033 },
6034 },
6035 {
6036 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6037 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.`,
6038 bp: `
6039 java_library {
6040 name: "bcp_lib1",
6041 srcs: ["lib1/src/*.java"],
6042 apex_available: ["myapex"],
6043 permitted_packages: ["foo.bar"],
6044 sdk_version: "none",
6045 system_modules: "none",
6046 }
6047 java_library {
6048 name: "bcp_lib2",
6049 srcs: ["lib2/src/*.java"],
6050 apex_available: ["myapex"],
6051 permitted_packages: ["foo.bar", "bar.baz"],
6052 sdk_version: "none",
6053 system_modules: "none",
6054 }
6055 apex {
6056 name: "myapex",
6057 key: "myapex.key",
6058 java_libs: ["bcp_lib1", "bcp_lib2"],
6059 }
6060 `,
6061 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6062 modulesPackages: map[string][]string{
6063 "myapex": []string{
6064 "foo.bar",
6065 },
6066 },
6067 },
6068 }
6069 for _, tc := range testcases {
6070 t.Run(tc.name, func(t *testing.T) {
6071 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6072 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6073 })
6074 }
6075}
6076
Jiyong Park62304bb2020-04-13 16:19:48 +09006077func TestTestFor(t *testing.T) {
6078 ctx, _ := testApex(t, `
6079 apex {
6080 name: "myapex",
6081 key: "myapex.key",
6082 native_shared_libs: ["mylib", "myprivlib"],
6083 }
6084
6085 apex_key {
6086 name: "myapex.key",
6087 public_key: "testkey.avbpubkey",
6088 private_key: "testkey.pem",
6089 }
6090
6091 cc_library {
6092 name: "mylib",
6093 srcs: ["mylib.cpp"],
6094 system_shared_libs: [],
6095 stl: "none",
6096 stubs: {
6097 versions: ["1"],
6098 },
6099 apex_available: ["myapex"],
6100 }
6101
6102 cc_library {
6103 name: "myprivlib",
6104 srcs: ["mylib.cpp"],
6105 system_shared_libs: [],
6106 stl: "none",
6107 apex_available: ["myapex"],
6108 }
6109
6110
6111 cc_test {
6112 name: "mytest",
6113 gtest: false,
6114 srcs: ["mylib.cpp"],
6115 system_shared_libs: [],
6116 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006117 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006118 test_for: ["myapex"]
6119 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006120
6121 cc_library {
6122 name: "mytestlib",
6123 srcs: ["mylib.cpp"],
6124 system_shared_libs: [],
6125 shared_libs: ["mylib", "myprivlib"],
6126 stl: "none",
6127 test_for: ["myapex"],
6128 }
6129
6130 cc_benchmark {
6131 name: "mybench",
6132 srcs: ["mylib.cpp"],
6133 system_shared_libs: [],
6134 shared_libs: ["mylib", "myprivlib"],
6135 stl: "none",
6136 test_for: ["myapex"],
6137 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006138 `)
6139
6140 // the test 'mytest' is a test for the apex, therefore is linked to the
6141 // actual implementation of mylib instead of its stub.
6142 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6143 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6144 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006145
6146 // The same should be true for cc_library
6147 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6148 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6149 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6150
6151 // ... and for cc_benchmark
6152 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6153 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6154 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006155}
6156
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006157// TODO(jungjw): Move this to proptools
6158func intPtr(i int) *int {
6159 return &i
6160}
6161
6162func TestApexSet(t *testing.T) {
6163 ctx, config := testApex(t, `
6164 apex_set {
6165 name: "myapex",
6166 set: "myapex.apks",
6167 filename: "foo_v2.apex",
6168 overrides: ["foo"],
6169 }
6170 `, func(fs map[string][]byte, config android.Config) {
6171 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006172 config.Targets[android.Android] = []android.Target{
6173 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6174 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6175 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006176 })
6177
6178 m := ctx.ModuleForTests("myapex", "android_common")
6179
6180 // Check extract_apks tool parameters.
6181 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6182 actual := extractedApex.Args["abis"]
6183 expected := "ARMEABI_V7A,ARM64_V8A"
6184 if actual != expected {
6185 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6186 }
6187 actual = extractedApex.Args["sdk-version"]
6188 expected = "30"
6189 if actual != expected {
6190 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6191 }
6192
6193 a := m.Module().(*ApexSet)
6194 expectedOverrides := []string{"foo"}
6195 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6196 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6197 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6198 }
6199}
6200
Jiyong Park7d95a512020-05-10 15:16:24 +09006201func TestNoStaticLinkingToStubsLib(t *testing.T) {
6202 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6203 apex {
6204 name: "myapex",
6205 key: "myapex.key",
6206 native_shared_libs: ["mylib"],
6207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
6215 cc_library {
6216 name: "mylib",
6217 srcs: ["mylib.cpp"],
6218 static_libs: ["otherlib"],
6219 system_shared_libs: [],
6220 stl: "none",
6221 apex_available: [ "myapex" ],
6222 }
6223
6224 cc_library {
6225 name: "otherlib",
6226 srcs: ["mylib.cpp"],
6227 system_shared_libs: [],
6228 stl: "none",
6229 stubs: {
6230 versions: ["1", "2", "3"],
6231 },
6232 apex_available: [ "myapex" ],
6233 }
6234 `)
6235}
6236
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006237func TestApexKeysTxt(t *testing.T) {
6238 ctx, _ := testApex(t, `
6239 apex {
6240 name: "myapex",
6241 key: "myapex.key",
6242 }
6243
6244 apex_key {
6245 name: "myapex.key",
6246 public_key: "testkey.avbpubkey",
6247 private_key: "testkey.pem",
6248 }
6249
6250 prebuilt_apex {
6251 name: "myapex",
6252 prefer: true,
6253 arch: {
6254 arm64: {
6255 src: "myapex-arm64.apex",
6256 },
6257 arm: {
6258 src: "myapex-arm.apex",
6259 },
6260 },
6261 }
6262
6263 apex_set {
6264 name: "myapex_set",
6265 set: "myapex.apks",
6266 filename: "myapex_set.apex",
6267 overrides: ["myapex"],
6268 }
6269 `)
6270
6271 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6272 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6273 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 +09006274 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 +09006275}
6276
Jooyung Han938b5932020-06-20 12:47:47 +09006277func TestAllowedFiles(t *testing.T) {
6278 ctx, _ := testApex(t, `
6279 apex {
6280 name: "myapex",
6281 key: "myapex.key",
6282 apps: ["app"],
6283 allowed_files: "allowed.txt",
6284 }
6285
6286 apex_key {
6287 name: "myapex.key",
6288 public_key: "testkey.avbpubkey",
6289 private_key: "testkey.pem",
6290 }
6291
6292 android_app {
6293 name: "app",
6294 srcs: ["foo/bar/MyClass.java"],
6295 package_name: "foo",
6296 sdk_version: "none",
6297 system_modules: "none",
6298 apex_available: [ "myapex" ],
6299 }
6300 `, withFiles(map[string][]byte{
6301 "sub/Android.bp": []byte(`
6302 override_apex {
6303 name: "override_myapex",
6304 base: "myapex",
6305 apps: ["override_app"],
6306 allowed_files: ":allowed",
6307 }
6308 // Overridable "path" property should be referenced indirectly
6309 filegroup {
6310 name: "allowed",
6311 srcs: ["allowed.txt"],
6312 }
6313 override_android_app {
6314 name: "override_app",
6315 base: "app",
6316 package_name: "bar",
6317 }
6318 `),
6319 }))
6320
6321 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6322 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6323 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6324 }
6325
6326 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6327 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6328 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6329 }
6330}
6331
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006332func TestNonPreferredPrebuiltDependency(t *testing.T) {
6333 _, _ = testApex(t, `
6334 apex {
6335 name: "myapex",
6336 key: "myapex.key",
6337 native_shared_libs: ["mylib"],
6338 }
6339
6340 apex_key {
6341 name: "myapex.key",
6342 public_key: "testkey.avbpubkey",
6343 private_key: "testkey.pem",
6344 }
6345
6346 cc_library {
6347 name: "mylib",
6348 srcs: ["mylib.cpp"],
6349 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006350 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006351 },
6352 apex_available: ["myapex"],
6353 }
6354
6355 cc_prebuilt_library_shared {
6356 name: "mylib",
6357 prefer: false,
6358 srcs: ["prebuilt.so"],
6359 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006360 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006361 },
6362 apex_available: ["myapex"],
6363 }
6364 `)
6365}
6366
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006367func TestCompressedApex(t *testing.T) {
6368 ctx, config := testApex(t, `
6369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 compressible: true,
6373 }
6374 apex_key {
6375 name: "myapex.key",
6376 public_key: "testkey.avbpubkey",
6377 private_key: "testkey.pem",
6378 }
6379 `, func(fs map[string][]byte, config android.Config) {
6380 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6381 })
6382
6383 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6384 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6385
6386 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6387 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6388
6389 // Make sure output of bundle is .capex
6390 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6391 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6392
6393 // Verify android.mk rules
6394 data := android.AndroidMkDataForTest(t, config, "", ab)
6395 var builder strings.Builder
6396 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6397 androidMk := builder.String()
6398 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6399}
6400
Martin Stjernholm2856c662020-12-02 15:03:42 +00006401func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6402 ctx, config := testApex(t, `
6403 apex {
6404 name: "myapex",
6405 key: "myapex.key",
6406 native_shared_libs: ["mylib"],
6407 }
6408
6409 apex_key {
6410 name: "myapex.key",
6411 public_key: "testkey.avbpubkey",
6412 private_key: "testkey.pem",
6413 }
6414
6415 cc_library {
6416 name: "mylib",
6417 srcs: ["mylib.cpp"],
6418 apex_available: ["myapex"],
6419 shared_libs: ["otherlib"],
6420 system_shared_libs: [],
6421 }
6422
6423 cc_library {
6424 name: "otherlib",
6425 srcs: ["mylib.cpp"],
6426 stubs: {
6427 versions: ["current"],
6428 },
6429 }
6430
6431 cc_prebuilt_library_shared {
6432 name: "otherlib",
6433 prefer: true,
6434 srcs: ["prebuilt.so"],
6435 stubs: {
6436 versions: ["current"],
6437 },
6438 }
6439 `)
6440
6441 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6442 data := android.AndroidMkDataForTest(t, config, "", ab)
6443 var builder strings.Builder
6444 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6445 androidMk := builder.String()
6446
6447 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6448 // a thing there.
6449 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6450}
6451
Jiyong Parke3867542020-12-03 17:28:25 +09006452func TestExcludeDependency(t *testing.T) {
6453 ctx, _ := testApex(t, `
6454 apex {
6455 name: "myapex",
6456 key: "myapex.key",
6457 native_shared_libs: ["mylib"],
6458 }
6459
6460 apex_key {
6461 name: "myapex.key",
6462 public_key: "testkey.avbpubkey",
6463 private_key: "testkey.pem",
6464 }
6465
6466 cc_library {
6467 name: "mylib",
6468 srcs: ["mylib.cpp"],
6469 system_shared_libs: [],
6470 stl: "none",
6471 apex_available: ["myapex"],
6472 shared_libs: ["mylib2"],
6473 target: {
6474 apex: {
6475 exclude_shared_libs: ["mylib2"],
6476 },
6477 },
6478 }
6479
6480 cc_library {
6481 name: "mylib2",
6482 srcs: ["mylib.cpp"],
6483 system_shared_libs: [],
6484 stl: "none",
6485 }
6486 `)
6487
6488 // Check if mylib is linked to mylib2 for the non-apex target
6489 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6490 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6491
6492 // Make sure that the link doesn't occur for the apex target
6493 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6494 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6495
6496 // It shouldn't appear in the copy cmd as well.
6497 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6498 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6499}
6500
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006501func TestPrebuiltStubLibDep(t *testing.T) {
6502 bpBase := `
6503 apex {
6504 name: "myapex",
6505 key: "myapex.key",
6506 native_shared_libs: ["mylib"],
6507 }
6508 apex_key {
6509 name: "myapex.key",
6510 public_key: "testkey.avbpubkey",
6511 private_key: "testkey.pem",
6512 }
6513 cc_library {
6514 name: "mylib",
6515 srcs: ["mylib.cpp"],
6516 apex_available: ["myapex"],
6517 shared_libs: ["stublib"],
6518 system_shared_libs: [],
6519 }
6520 apex {
6521 name: "otherapex",
6522 enabled: %s,
6523 key: "myapex.key",
6524 native_shared_libs: ["stublib"],
6525 }
6526 `
6527
6528 stublibSourceBp := `
6529 cc_library {
6530 name: "stublib",
6531 srcs: ["mylib.cpp"],
6532 apex_available: ["otherapex"],
6533 system_shared_libs: [],
6534 stl: "none",
6535 stubs: {
6536 versions: ["1"],
6537 },
6538 }
6539 `
6540
6541 stublibPrebuiltBp := `
6542 cc_prebuilt_library_shared {
6543 name: "stublib",
6544 srcs: ["prebuilt.so"],
6545 apex_available: ["otherapex"],
6546 stubs: {
6547 versions: ["1"],
6548 },
6549 %s
6550 }
6551 `
6552
6553 tests := []struct {
6554 name string
6555 stublibBp string
6556 usePrebuilt bool
6557 modNames []string // Modules to collect AndroidMkEntries for
6558 otherApexEnabled []string
6559 }{
6560 {
6561 name: "only_source",
6562 stublibBp: stublibSourceBp,
6563 usePrebuilt: false,
6564 modNames: []string{"stublib"},
6565 otherApexEnabled: []string{"true", "false"},
6566 },
6567 {
6568 name: "source_preferred",
6569 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
6570 usePrebuilt: false,
6571 modNames: []string{"stublib", "prebuilt_stublib"},
6572 otherApexEnabled: []string{"true", "false"},
6573 },
6574 {
6575 name: "prebuilt_preferred",
6576 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
6577 usePrebuilt: true,
6578 modNames: []string{"stublib", "prebuilt_stublib"},
6579 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6580 },
6581 {
6582 name: "only_prebuilt",
6583 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
6584 usePrebuilt: true,
6585 modNames: []string{"stublib"},
6586 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6587 },
6588 }
6589
6590 for _, test := range tests {
6591 t.Run(test.name, func(t *testing.T) {
6592 for _, otherApexEnabled := range test.otherApexEnabled {
6593 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
6594 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
6595
6596 type modAndMkEntries struct {
6597 mod *cc.Module
6598 mkEntries android.AndroidMkEntries
6599 }
6600 entries := []*modAndMkEntries{}
6601
6602 // Gather shared lib modules that are installable
6603 for _, modName := range test.modNames {
6604 for _, variant := range ctx.ModuleVariantsForTests(modName) {
6605 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
6606 continue
6607 }
6608 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08006609 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006610 continue
6611 }
6612 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
6613 if ent.Disabled {
6614 continue
6615 }
6616 entries = append(entries, &modAndMkEntries{
6617 mod: mod,
6618 mkEntries: ent,
6619 })
6620 }
6621 }
6622 }
6623
6624 var entry *modAndMkEntries = nil
6625 for _, ent := range entries {
6626 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
6627 if entry != nil {
6628 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
6629 } else {
6630 entry = ent
6631 }
6632 }
6633 }
6634
6635 if entry == nil {
6636 t.Errorf("AndroidMk entry for \"stublib\" missing")
6637 } else {
6638 isPrebuilt := entry.mod.Prebuilt() != nil
6639 if isPrebuilt != test.usePrebuilt {
6640 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
6641 }
6642 if !entry.mod.IsStubs() {
6643 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
6644 }
6645 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
6646 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
6647 }
Jiyong Park892a98f2020-12-14 09:20:00 +09006648 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
6649 expected := "-D__STUBLIB_API__=1"
6650 if !android.InList(expected, cflags) {
6651 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
6652 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006653 }
6654 })
6655 }
6656 })
6657 }
6658}
6659
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006660func TestMain(m *testing.M) {
6661 run := func() int {
6662 setUp()
6663 defer tearDown()
6664
6665 return m.Run()
6666 }
6667
6668 os.Exit(run())
6669}