blob: 7c82b05623f57e1cfa8f31f33b497b00cef8b59b [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)
Paul Duffineedc5d52020-06-12 17:46:39 +0100261 java.RegisterSdkLibraryBuildComponents(ctx)
Anton Hanssondff2c782020-12-21 17:10:01 +0000262 java.RegisterPrebuiltApisBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900263 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800264 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265
Colin Cross98be1bb2019-12-13 20:41:13 -0800266 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800267 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800268
Colin Crossae8600b2020-10-29 17:09:13 -0700269 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270
Jooyung Han5c998b92019-06-27 11:30:33 +0900271 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272}
273
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700274func setUp() {
275 var err error
276 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700278 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280}
281
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700282func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700283 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284}
285
Jooyung Han643adc42020-02-27 13:50:06 +0900286// ensure that 'result' equals 'expected'
287func ensureEquals(t *testing.T, result string, expected string) {
288 t.Helper()
289 if result != expected {
290 t.Errorf("%q != %q", expected, result)
291 }
292}
293
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294// ensure that 'result' contains 'expected'
295func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900296 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297 if !strings.Contains(result, expected) {
298 t.Errorf("%q is not found in %q", expected, result)
299 }
300}
301
Liz Kammer5bd365f2020-05-27 15:15:11 -0700302// ensure that 'result' contains 'expected' exactly one time
303func ensureContainsOnce(t *testing.T, result string, expected string) {
304 t.Helper()
305 count := strings.Count(result, expected)
306 if count != 1 {
307 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
308 }
309}
310
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311// ensures that 'result' does not contain 'notExpected'
312func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900313 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 if strings.Contains(result, notExpected) {
315 t.Errorf("%q is found in %q", notExpected, result)
316 }
317}
318
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700319func ensureMatches(t *testing.T, result string, expectedRex string) {
320 ok, err := regexp.MatchString(expectedRex, result)
321 if err != nil {
322 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
323 return
324 }
325 if !ok {
326 t.Errorf("%s does not match regular expession %s", result, expectedRex)
327 }
328}
329
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900331 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 if !android.InList(expected, result) {
333 t.Errorf("%q is not found in %v", expected, result)
334 }
335}
336
337func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900338 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 if android.InList(notExpected, result) {
340 t.Errorf("%q is found in %v", notExpected, result)
341 }
342}
343
Jooyung Hane1633032019-08-01 17:41:43 +0900344func ensureListEmpty(t *testing.T, result []string) {
345 t.Helper()
346 if len(result) > 0 {
347 t.Errorf("%q is expected to be empty", result)
348 }
349}
350
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000351func ensureListNotEmpty(t *testing.T, result []string) {
352 t.Helper()
353 if len(result) == 0 {
354 t.Errorf("%q is expected to be not empty", result)
355 }
356}
357
Jiyong Park25fc6a92018-11-18 18:02:45 +0900358// Minimal test
359func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900360 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900361 apex_defaults {
362 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900363 manifest: ":myapex.manifest",
364 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900365 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900366 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900367 native_shared_libs: [
368 "mylib",
369 "libfoo.ffi",
370 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900371 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800372 multilib: {
373 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900374 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800375 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900376 },
Jiyong Park77acec62020-06-01 21:39:15 +0900377 java_libs: [
378 "myjar",
379 "myjar_dex",
380 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900381 }
382
Jiyong Park30ca9372019-02-07 16:27:23 +0900383 apex {
384 name: "myapex",
385 defaults: ["myapex-defaults"],
386 }
387
Jiyong Park25fc6a92018-11-18 18:02:45 +0900388 apex_key {
389 name: "myapex.key",
390 public_key: "testkey.avbpubkey",
391 private_key: "testkey.pem",
392 }
393
Jiyong Park809bb722019-02-13 21:33:49 +0900394 filegroup {
395 name: "myapex.manifest",
396 srcs: ["apex_manifest.json"],
397 }
398
399 filegroup {
400 name: "myapex.androidmanifest",
401 srcs: ["AndroidManifest.xml"],
402 }
403
Jiyong Park25fc6a92018-11-18 18:02:45 +0900404 cc_library {
405 name: "mylib",
406 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900407 shared_libs: [
408 "mylib2",
409 "libbar.ffi",
410 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900411 system_shared_libs: [],
412 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000413 // TODO: remove //apex_available:platform
414 apex_available: [
415 "//apex_available:platform",
416 "myapex",
417 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900418 }
419
Alex Light3d673592019-01-18 14:37:31 -0800420 cc_binary {
421 name: "foo",
422 srcs: ["mylib.cpp"],
423 compile_multilib: "both",
424 multilib: {
425 lib32: {
426 suffix: "32",
427 },
428 lib64: {
429 suffix: "64",
430 },
431 },
432 symlinks: ["foo_link_"],
433 symlink_preferred_arch: true,
434 system_shared_libs: [],
435 static_executable: true,
436 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700437 apex_available: [ "myapex", "com.android.gki.*" ],
438 }
439
Jiyong Park99644e92020-11-17 22:21:02 +0900440 rust_binary {
441 name: "foo.rust",
442 srcs: ["foo.rs"],
443 rlibs: ["libfoo.rlib.rust"],
444 dylibs: ["libfoo.dylib.rust"],
445 apex_available: ["myapex"],
446 }
447
448 rust_library_rlib {
449 name: "libfoo.rlib.rust",
450 srcs: ["foo.rs"],
451 crate_name: "foo",
452 apex_available: ["myapex"],
453 }
454
455 rust_library_dylib {
456 name: "libfoo.dylib.rust",
457 srcs: ["foo.rs"],
458 crate_name: "foo",
459 apex_available: ["myapex"],
460 }
461
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900462 rust_ffi_shared {
463 name: "libfoo.ffi",
464 srcs: ["foo.rs"],
465 crate_name: "foo",
466 apex_available: ["myapex"],
467 }
468
469 rust_ffi_shared {
470 name: "libbar.ffi",
471 srcs: ["foo.rs"],
472 crate_name: "bar",
473 apex_available: ["myapex"],
474 }
475
Yifan Hongd22a84a2020-07-28 17:37:46 -0700476 apex {
477 name: "com.android.gki.fake",
478 binaries: ["foo"],
479 key: "myapex.key",
480 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800481 }
482
Paul Duffindddd5462020-04-07 15:25:44 +0100483 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900484 name: "mylib2",
485 srcs: ["mylib.cpp"],
486 system_shared_libs: [],
487 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900488 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900489 static_libs: ["libstatic"],
490 // TODO: remove //apex_available:platform
491 apex_available: [
492 "//apex_available:platform",
493 "myapex",
494 ],
495 }
496
Paul Duffindddd5462020-04-07 15:25:44 +0100497 cc_prebuilt_library_shared {
498 name: "mylib2",
499 srcs: ["prebuilt.so"],
500 // TODO: remove //apex_available:platform
501 apex_available: [
502 "//apex_available:platform",
503 "myapex",
504 ],
505 }
506
Jiyong Park9918e1a2020-03-17 19:16:40 +0900507 cc_library_static {
508 name: "libstatic",
509 srcs: ["mylib.cpp"],
510 system_shared_libs: [],
511 stl: "none",
512 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000513 // TODO: remove //apex_available:platform
514 apex_available: [
515 "//apex_available:platform",
516 "myapex",
517 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900519
520 java_library {
521 name: "myjar",
522 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900523 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900524 sdk_version: "none",
525 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900526 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900527 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000528 // TODO: remove //apex_available:platform
529 apex_available: [
530 "//apex_available:platform",
531 "myapex",
532 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900533 }
534
Jiyong Park77acec62020-06-01 21:39:15 +0900535 dex_import {
536 name: "myjar_dex",
537 jars: ["prebuilt.jar"],
538 apex_available: [
539 "//apex_available:platform",
540 "myapex",
541 ],
542 }
543
Jiyong Park7f7766d2019-07-25 22:02:35 +0900544 java_library {
545 name: "myotherjar",
546 srcs: ["foo/bar/MyClass.java"],
547 sdk_version: "none",
548 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900549 // TODO: remove //apex_available:platform
550 apex_available: [
551 "//apex_available:platform",
552 "myapex",
553 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900554 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900555
556 java_library {
557 name: "mysharedjar",
558 srcs: ["foo/bar/MyClass.java"],
559 sdk_version: "none",
560 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900561 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900562 `)
563
Sundong Ahnabb64432019-10-22 13:58:29 +0900564 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900565
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900566 // Make sure that Android.mk is created
567 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
568 data := android.AndroidMkDataForTest(t, config, "", ab)
569 var builder strings.Builder
570 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
571
572 androidMk := builder.String()
573 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
574 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
575
Jiyong Park42cca6c2019-04-01 11:15:50 +0900576 optFlags := apexRule.Args["opt_flags"]
577 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700578 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900579 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900580
Jiyong Park25fc6a92018-11-18 18:02:45 +0900581 copyCmds := apexRule.Args["copy_commands"]
582
583 // Ensure that main rule creates an output
584 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
585
586 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700587 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
588 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
589 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900590 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900591 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900592
593 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700594 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
595 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900596 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
597 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900598 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900599
600 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800601 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
602 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900603 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900604 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900605 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900606 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
607 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900608 // .. but not for java libs
609 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900610 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800611
Colin Cross7113d202019-11-20 16:39:12 -0800612 // Ensure that the platform variant ends with _shared or _common
613 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
614 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900615 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
616 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900617 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
618
619 // Ensure that dynamic dependency to java libs are not included
620 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800621
622 // Ensure that all symlinks are present.
623 found_foo_link_64 := false
624 found_foo := false
625 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900626 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800627 if strings.HasSuffix(cmd, "bin/foo") {
628 found_foo = true
629 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
630 found_foo_link_64 = true
631 }
632 }
633 }
634 good := found_foo && found_foo_link_64
635 if !good {
636 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
637 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900638
Sundong Ahnabb64432019-10-22 13:58:29 +0900639 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700640 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900641 if len(noticeInputs) != 3 {
642 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900643 }
644 ensureListContains(t, noticeInputs, "NOTICE")
645 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900646 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900647
Artur Satayeva8bd1132020-04-27 18:07:06 +0100648 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100649 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
650 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
651 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
652 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
653 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100654
655 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100656 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
657 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
658 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
659 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
660 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800661}
662
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663func TestDefaults(t *testing.T) {
664 ctx, _ := testApex(t, `
665 apex_defaults {
666 name: "myapex-defaults",
667 key: "myapex.key",
668 prebuilts: ["myetc"],
669 native_shared_libs: ["mylib"],
670 java_libs: ["myjar"],
671 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900672 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800673 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900674 }
675
676 prebuilt_etc {
677 name: "myetc",
678 src: "myprebuilt",
679 }
680
681 apex {
682 name: "myapex",
683 defaults: ["myapex-defaults"],
684 }
685
686 apex_key {
687 name: "myapex.key",
688 public_key: "testkey.avbpubkey",
689 private_key: "testkey.pem",
690 }
691
692 cc_library {
693 name: "mylib",
694 system_shared_libs: [],
695 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000696 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900697 }
698
699 java_library {
700 name: "myjar",
701 srcs: ["foo/bar/MyClass.java"],
702 sdk_version: "none",
703 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000704 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900705 }
706
707 android_app {
708 name: "AppFoo",
709 srcs: ["foo/bar/MyClass.java"],
710 sdk_version: "none",
711 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000712 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900713 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900714
715 runtime_resource_overlay {
716 name: "rro",
717 theme: "blue",
718 }
719
markchien2f59ec92020-09-02 16:23:38 +0800720 bpf {
721 name: "bpf",
722 srcs: ["bpf.c", "bpf2.c"],
723 }
724
Jooyung Hanf21c7972019-12-16 22:32:06 +0900725 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000726 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900727 "etc/myetc",
728 "javalib/myjar.jar",
729 "lib64/mylib.so",
730 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900731 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800732 "etc/bpf/bpf.o",
733 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900734 })
735}
736
Jooyung Han01a3ee22019-11-02 02:52:25 +0900737func TestApexManifest(t *testing.T) {
738 ctx, _ := testApex(t, `
739 apex {
740 name: "myapex",
741 key: "myapex.key",
742 }
743
744 apex_key {
745 name: "myapex.key",
746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749 `)
750
751 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900752 args := module.Rule("apexRule").Args
753 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
754 t.Error("manifest should be apex_manifest.pb, but " + manifest)
755 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900756}
757
Alex Light5098a612018-11-29 17:12:15 -0800758func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700759 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800760 apex {
761 name: "myapex",
762 key: "myapex.key",
763 payload_type: "zip",
764 native_shared_libs: ["mylib"],
765 }
766
767 apex_key {
768 name: "myapex.key",
769 public_key: "testkey.avbpubkey",
770 private_key: "testkey.pem",
771 }
772
773 cc_library {
774 name: "mylib",
775 srcs: ["mylib.cpp"],
776 shared_libs: ["mylib2"],
777 system_shared_libs: [],
778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000779 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800780 }
781
782 cc_library {
783 name: "mylib2",
784 srcs: ["mylib.cpp"],
785 system_shared_libs: [],
786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000787 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800788 }
789 `)
790
Sundong Ahnabb64432019-10-22 13:58:29 +0900791 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800792 copyCmds := zipApexRule.Args["copy_commands"]
793
794 // Ensure that main rule creates an output
795 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
796
797 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700798 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800799
800 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800802
803 // Ensure that both direct and indirect deps are copied into apex
804 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
805 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900806}
807
808func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700809 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900810 apex {
811 name: "myapex",
812 key: "myapex.key",
813 native_shared_libs: ["mylib", "mylib3"],
814 }
815
816 apex_key {
817 name: "myapex.key",
818 public_key: "testkey.avbpubkey",
819 private_key: "testkey.pem",
820 }
821
822 cc_library {
823 name: "mylib",
824 srcs: ["mylib.cpp"],
825 shared_libs: ["mylib2", "mylib3"],
826 system_shared_libs: [],
827 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000828 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900829 }
830
831 cc_library {
832 name: "mylib2",
833 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900834 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835 system_shared_libs: [],
836 stl: "none",
837 stubs: {
838 versions: ["1", "2", "3"],
839 },
840 }
841
842 cc_library {
843 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900844 srcs: ["mylib.cpp"],
845 shared_libs: ["mylib4"],
846 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 stl: "none",
848 stubs: {
849 versions: ["10", "11", "12"],
850 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000851 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900852 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900853
854 cc_library {
855 name: "mylib4",
856 srcs: ["mylib.cpp"],
857 system_shared_libs: [],
858 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000859 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900860 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 `)
862
Sundong Ahnabb64432019-10-22 13:58:29 +0900863 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900864 copyCmds := apexRule.Args["copy_commands"]
865
866 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800867 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868
869 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800870 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871
872 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800873 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874
Colin Crossaede88c2020-08-11 12:17:01 -0700875 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900876
877 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900878 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900880 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881
882 // 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 -0700883 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700885 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900886
887 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900888 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900889 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900890
891 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700892 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900893
Jooyung Hana57af4a2020-01-23 05:36:59 +0000894 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900895 "lib64/mylib.so",
896 "lib64/mylib3.so",
897 "lib64/mylib4.so",
898 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899}
900
Colin Cross7812fd32020-09-25 12:35:10 -0700901func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
902 t.Parallel()
903 ctx, _ := testApex(t, `
904 apex {
905 name: "myapex",
906 key: "myapex.key",
907 native_shared_libs: ["mylib", "mylib3"],
908 min_sdk_version: "29",
909 }
910
911 apex_key {
912 name: "myapex.key",
913 public_key: "testkey.avbpubkey",
914 private_key: "testkey.pem",
915 }
916
917 cc_library {
918 name: "mylib",
919 srcs: ["mylib.cpp"],
920 shared_libs: ["mylib2", "mylib3"],
921 system_shared_libs: [],
922 stl: "none",
923 apex_available: [ "myapex" ],
924 min_sdk_version: "28",
925 }
926
927 cc_library {
928 name: "mylib2",
929 srcs: ["mylib.cpp"],
930 cflags: ["-include mylib.h"],
931 system_shared_libs: [],
932 stl: "none",
933 stubs: {
934 versions: ["28", "29", "30", "current"],
935 },
936 min_sdk_version: "28",
937 }
938
939 cc_library {
940 name: "mylib3",
941 srcs: ["mylib.cpp"],
942 shared_libs: ["mylib4"],
943 system_shared_libs: [],
944 stl: "none",
945 stubs: {
946 versions: ["28", "29", "30", "current"],
947 },
948 apex_available: [ "myapex" ],
949 min_sdk_version: "28",
950 }
951
952 cc_library {
953 name: "mylib4",
954 srcs: ["mylib.cpp"],
955 system_shared_libs: [],
956 stl: "none",
957 apex_available: [ "myapex" ],
958 min_sdk_version: "28",
959 }
960 `)
961
962 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
963 copyCmds := apexRule.Args["copy_commands"]
964
965 // Ensure that direct non-stubs dep is always included
966 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
967
968 // Ensure that indirect stubs dep is not included
969 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
970
971 // Ensure that direct stubs dep is included
972 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
973
974 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
975
976 // Ensure that mylib is linking with the version 29 stubs for mylib2
977 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
978 // ... and not linking to the non-stub (impl) variant of mylib2
979 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
980
981 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
982 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
983 // .. and not linking to the stubs variant of mylib3
984 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
985
986 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700987 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700988 ensureNotContains(t, mylib2Cflags, "-include ")
989
990 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700991 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700992
993 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
994 "lib64/mylib.so",
995 "lib64/mylib3.so",
996 "lib64/mylib4.so",
997 })
998}
999
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001000func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001001 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001002 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001003 name: "myapex2",
1004 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001005 native_shared_libs: ["mylib"],
1006 }
1007
1008 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001009 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001010 public_key: "testkey.avbpubkey",
1011 private_key: "testkey.pem",
1012 }
1013
1014 cc_library {
1015 name: "mylib",
1016 srcs: ["mylib.cpp"],
1017 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001018 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001019 system_shared_libs: [],
1020 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001021 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001022 }
1023
1024 cc_library {
1025 name: "libfoo",
1026 srcs: ["mylib.cpp"],
1027 shared_libs: ["libbar"],
1028 system_shared_libs: [],
1029 stl: "none",
1030 stubs: {
1031 versions: ["10", "20", "30"],
1032 },
1033 }
1034
1035 cc_library {
1036 name: "libbar",
1037 srcs: ["mylib.cpp"],
1038 system_shared_libs: [],
1039 stl: "none",
1040 }
1041
Jiyong Park678c8812020-02-07 17:25:49 +09001042 cc_library_static {
1043 name: "libbaz",
1044 srcs: ["mylib.cpp"],
1045 system_shared_libs: [],
1046 stl: "none",
1047 apex_available: [ "myapex2" ],
1048 }
1049
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001050 `)
1051
Jiyong Park83dc74b2020-01-14 18:38:44 +09001052 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001053 copyCmds := apexRule.Args["copy_commands"]
1054
1055 // Ensure that direct non-stubs dep is always included
1056 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1057
1058 // Ensure that indirect stubs dep is not included
1059 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1060
1061 // Ensure that dependency of stubs is not included
1062 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1063
Colin Crossaede88c2020-08-11 12:17:01 -07001064 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001065
1066 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001067 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001068 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001069 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001070
Jiyong Park3ff16992019-12-27 14:11:47 +09001071 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001072
1073 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1074 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001075
Artur Satayeva8bd1132020-04-27 18:07:06 +01001076 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001077 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1078 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1079 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001080
Artur Satayeva8bd1132020-04-27 18:07:06 +01001081 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001082 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1083 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1084 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001085}
1086
Jooyung Hand3639552019-08-09 12:57:43 +09001087func TestApexWithRuntimeLibsDependency(t *testing.T) {
1088 /*
1089 myapex
1090 |
1091 v (runtime_libs)
1092 mylib ------+------> libfoo [provides stub]
1093 |
1094 `------> libbar
1095 */
1096 ctx, _ := testApex(t, `
1097 apex {
1098 name: "myapex",
1099 key: "myapex.key",
1100 native_shared_libs: ["mylib"],
1101 }
1102
1103 apex_key {
1104 name: "myapex.key",
1105 public_key: "testkey.avbpubkey",
1106 private_key: "testkey.pem",
1107 }
1108
1109 cc_library {
1110 name: "mylib",
1111 srcs: ["mylib.cpp"],
1112 runtime_libs: ["libfoo", "libbar"],
1113 system_shared_libs: [],
1114 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001115 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001116 }
1117
1118 cc_library {
1119 name: "libfoo",
1120 srcs: ["mylib.cpp"],
1121 system_shared_libs: [],
1122 stl: "none",
1123 stubs: {
1124 versions: ["10", "20", "30"],
1125 },
1126 }
1127
1128 cc_library {
1129 name: "libbar",
1130 srcs: ["mylib.cpp"],
1131 system_shared_libs: [],
1132 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001133 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001134 }
1135
1136 `)
1137
Sundong Ahnabb64432019-10-22 13:58:29 +09001138 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001139 copyCmds := apexRule.Args["copy_commands"]
1140
1141 // Ensure that direct non-stubs dep is always included
1142 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1143
1144 // Ensure that indirect stubs dep is not included
1145 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1146
1147 // Ensure that runtime_libs dep in included
1148 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1149
Sundong Ahnabb64432019-10-22 13:58:29 +09001150 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001151 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1152 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001153
1154}
1155
Jooyung Han8ce8db92020-05-15 19:05:05 +09001156func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1157 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1158 bp := `
1159 apex {
1160 name: "com.android.runtime",
1161 key: "com.android.runtime.key",
1162 native_shared_libs: ["libc"],
1163 }
1164
1165 apex_key {
1166 name: "com.android.runtime.key",
1167 public_key: "testkey.avbpubkey",
1168 private_key: "testkey.pem",
1169 }
1170
1171 cc_library {
1172 name: "libc",
1173 no_libcrt: true,
1174 nocrt: true,
1175 stl: "none",
1176 system_shared_libs: [],
1177 stubs: { versions: ["1"] },
1178 apex_available: ["com.android.runtime"],
1179
1180 sanitize: {
1181 hwaddress: true,
1182 }
1183 }
1184
1185 cc_prebuilt_library_shared {
1186 name: "libclang_rt.hwasan-aarch64-android",
1187 no_libcrt: true,
1188 nocrt: true,
1189 stl: "none",
1190 system_shared_libs: [],
1191 srcs: [""],
1192 stubs: { versions: ["1"] },
1193
1194 sanitize: {
1195 never: true,
1196 },
1197 }
1198 `
1199 // override bp to use hard-coded names: com.android.runtime and libc
1200 fs["Android.bp"] = []byte(bp)
1201 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1202 })
1203
1204 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1205 "lib64/bionic/libc.so",
1206 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1207 })
1208
1209 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1210
1211 installed := hwasan.Description("install libclang_rt.hwasan")
1212 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1213
1214 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1215 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1216 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1217}
1218
1219func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1220 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1221 bp := `
1222 apex {
1223 name: "com.android.runtime",
1224 key: "com.android.runtime.key",
1225 native_shared_libs: ["libc"],
1226 }
1227
1228 apex_key {
1229 name: "com.android.runtime.key",
1230 public_key: "testkey.avbpubkey",
1231 private_key: "testkey.pem",
1232 }
1233
1234 cc_library {
1235 name: "libc",
1236 no_libcrt: true,
1237 nocrt: true,
1238 stl: "none",
1239 system_shared_libs: [],
1240 stubs: { versions: ["1"] },
1241 apex_available: ["com.android.runtime"],
1242 }
1243
1244 cc_prebuilt_library_shared {
1245 name: "libclang_rt.hwasan-aarch64-android",
1246 no_libcrt: true,
1247 nocrt: true,
1248 stl: "none",
1249 system_shared_libs: [],
1250 srcs: [""],
1251 stubs: { versions: ["1"] },
1252
1253 sanitize: {
1254 never: true,
1255 },
1256 }
1257 `
1258 // override bp to use hard-coded names: com.android.runtime and libc
1259 fs["Android.bp"] = []byte(bp)
1260 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1261
1262 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1263 })
1264
1265 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1266 "lib64/bionic/libc.so",
1267 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1268 })
1269
1270 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1271
1272 installed := hwasan.Description("install libclang_rt.hwasan")
1273 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1274
1275 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1276 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1277 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1278}
1279
Jooyung Han61b66e92020-03-21 14:21:46 +00001280func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1281 testcases := []struct {
1282 name string
1283 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001284 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001285 shouldLink string
1286 shouldNotLink []string
1287 }{
1288 {
Jooyung Han75568392020-03-20 04:29:24 +09001289 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001290 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001291 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001292 shouldLink: "30",
1293 shouldNotLink: []string{"29"},
1294 },
1295 {
1296 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001297 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001298 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001299 shouldLink: "29",
1300 shouldNotLink: []string{"30"},
1301 },
1302 }
1303 for _, tc := range testcases {
1304 t.Run(tc.name, func(t *testing.T) {
1305 ctx, _ := testApex(t, `
1306 apex {
1307 name: "myapex",
1308 key: "myapex.key",
1309 use_vendor: true,
1310 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001311 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001312 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001313
Jooyung Han61b66e92020-03-21 14:21:46 +00001314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001319
Jooyung Han61b66e92020-03-21 14:21:46 +00001320 cc_library {
1321 name: "mylib",
1322 srcs: ["mylib.cpp"],
1323 vendor_available: true,
1324 shared_libs: ["libbar"],
1325 system_shared_libs: [],
1326 stl: "none",
1327 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001328 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001329 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001330
Jooyung Han61b66e92020-03-21 14:21:46 +00001331 cc_library {
1332 name: "libbar",
1333 srcs: ["mylib.cpp"],
1334 system_shared_libs: [],
1335 stl: "none",
1336 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001337 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001338 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001339
Jooyung Han61b66e92020-03-21 14:21:46 +00001340 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001341 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001342 symbol_file: "",
1343 }
1344 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001345 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001346 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001347
Jooyung Han61b66e92020-03-21 14:21:46 +00001348 // Ensure that LLNDK dep is not included
1349 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1350 "lib64/mylib.so",
1351 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001352
Jooyung Han61b66e92020-03-21 14:21:46 +00001353 // Ensure that LLNDK dep is required
1354 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1355 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1356 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001357
Colin Crossaede88c2020-08-11 12:17:01 -07001358 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001359 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1360 for _, ver := range tc.shouldNotLink {
1361 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1362 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001363
Colin Crossaede88c2020-08-11 12:17:01 -07001364 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001365 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1366 })
1367 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001368}
1369
Jiyong Park25fc6a92018-11-18 18:02:45 +09001370func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001371 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001372 apex {
1373 name: "myapex",
1374 key: "myapex.key",
1375 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1376 }
1377
1378 apex_key {
1379 name: "myapex.key",
1380 public_key: "testkey.avbpubkey",
1381 private_key: "testkey.pem",
1382 }
1383
1384 cc_library {
1385 name: "mylib",
1386 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001387 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001388 shared_libs: ["libdl#27"],
1389 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001390 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001391 }
1392
1393 cc_library_shared {
1394 name: "mylib_shared",
1395 srcs: ["mylib.cpp"],
1396 shared_libs: ["libdl#27"],
1397 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001398 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001399 }
1400
1401 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001402 name: "libBootstrap",
1403 srcs: ["mylib.cpp"],
1404 stl: "none",
1405 bootstrap: true,
1406 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001407 `)
1408
Sundong Ahnabb64432019-10-22 13:58:29 +09001409 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001410 copyCmds := apexRule.Args["copy_commands"]
1411
1412 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001413 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001414 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1415 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001416
1417 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001418 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001419
Colin Crossaede88c2020-08-11 12:17:01 -07001420 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1421 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1422 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001423
1424 // For dependency to libc
1425 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001426 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001427 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001428 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001429 // ... Cflags from stub is correctly exported to mylib
1430 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1431 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1432
1433 // For dependency to libm
1434 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001435 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001436 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001437 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001438 // ... and is not compiling with the stub
1439 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1440 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1441
1442 // For dependency to libdl
1443 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001444 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001445 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001446 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1447 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001449 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001450 // ... Cflags from stub is correctly exported to mylib
1451 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1452 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001453
1454 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001455 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1456 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1457 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1458 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001459}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001460
Jooyung Han749dc692020-04-15 11:03:39 +09001461func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001462 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001463 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1464 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001465 // 3) (platform) -> liba -> libz : this should be non-stub link
1466 ctx, _ := testApex(t, `
1467 apex {
1468 name: "myapex",
1469 key: "myapex.key",
1470 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001471 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001472 }
1473
1474 apex {
1475 name: "otherapex",
1476 key: "myapex.key",
1477 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001478 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001479 }
1480
1481 apex_key {
1482 name: "myapex.key",
1483 public_key: "testkey.avbpubkey",
1484 private_key: "testkey.pem",
1485 }
1486
1487 cc_library {
1488 name: "libx",
1489 shared_libs: ["liba"],
1490 system_shared_libs: [],
1491 stl: "none",
1492 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001493 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001494 }
1495
1496 cc_library {
1497 name: "liby",
1498 shared_libs: ["liba"],
1499 system_shared_libs: [],
1500 stl: "none",
1501 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001502 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001503 }
1504
1505 cc_library {
1506 name: "liba",
1507 shared_libs: ["libz"],
1508 system_shared_libs: [],
1509 stl: "none",
1510 apex_available: [
1511 "//apex_available:anyapex",
1512 "//apex_available:platform",
1513 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001514 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001515 }
1516
1517 cc_library {
1518 name: "libz",
1519 system_shared_libs: [],
1520 stl: "none",
1521 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001522 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001523 },
1524 }
Jooyung Han749dc692020-04-15 11:03:39 +09001525 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001526
1527 expectLink := func(from, from_variant, to, to_variant string) {
1528 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1529 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1530 }
1531 expectNoLink := func(from, from_variant, to, to_variant string) {
1532 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1533 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1534 }
1535 // platform liba is linked to non-stub version
1536 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001537 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001538 expectLink("liba", "shared_apex29", "libz", "shared_28")
1539 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1540 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001541 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001542 expectLink("liba", "shared_apex30", "libz", "shared_30")
1543 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1544 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001545}
1546
Jooyung Hanaed150d2020-04-02 01:41:41 +09001547func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1548 ctx, _ := testApex(t, `
1549 apex {
1550 name: "myapex",
1551 key: "myapex.key",
1552 native_shared_libs: ["libx"],
1553 min_sdk_version: "R",
1554 }
1555
1556 apex_key {
1557 name: "myapex.key",
1558 public_key: "testkey.avbpubkey",
1559 private_key: "testkey.pem",
1560 }
1561
1562 cc_library {
1563 name: "libx",
1564 shared_libs: ["libz"],
1565 system_shared_libs: [],
1566 stl: "none",
1567 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001568 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001569 }
1570
1571 cc_library {
1572 name: "libz",
1573 system_shared_libs: [],
1574 stl: "none",
1575 stubs: {
1576 versions: ["29", "R"],
1577 },
1578 }
1579 `, func(fs map[string][]byte, config android.Config) {
1580 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1581 })
1582
1583 expectLink := func(from, from_variant, to, to_variant string) {
1584 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1585 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1586 }
1587 expectNoLink := func(from, from_variant, to, to_variant string) {
1588 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1589 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1590 }
Dan Albertc8060532020-07-22 22:32:17 -07001591 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001592 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1593 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001594}
1595
Jooyung Han749dc692020-04-15 11:03:39 +09001596func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001597 ctx, _ := testApex(t, `
1598 apex {
1599 name: "myapex",
1600 key: "myapex.key",
1601 native_shared_libs: ["libx"],
1602 }
1603
1604 apex_key {
1605 name: "myapex.key",
1606 public_key: "testkey.avbpubkey",
1607 private_key: "testkey.pem",
1608 }
1609
1610 cc_library {
1611 name: "libx",
1612 shared_libs: ["libz"],
1613 system_shared_libs: [],
1614 stl: "none",
1615 apex_available: [ "myapex" ],
1616 }
1617
1618 cc_library {
1619 name: "libz",
1620 system_shared_libs: [],
1621 stl: "none",
1622 stubs: {
1623 versions: ["1", "2"],
1624 },
1625 }
1626 `)
1627
1628 expectLink := func(from, from_variant, to, to_variant string) {
1629 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1630 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1631 }
1632 expectNoLink := func(from, from_variant, to, to_variant string) {
1633 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1634 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1635 }
Colin Crossaede88c2020-08-11 12:17:01 -07001636 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1637 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1638 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001639}
1640
1641func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1642 ctx, _ := testApex(t, `
1643 apex {
1644 name: "myapex",
1645 key: "myapex.key",
1646 native_shared_libs: ["libx"],
1647 }
1648
1649 apex_key {
1650 name: "myapex.key",
1651 public_key: "testkey.avbpubkey",
1652 private_key: "testkey.pem",
1653 }
1654
1655 cc_library {
1656 name: "libx",
1657 system_shared_libs: [],
1658 stl: "none",
1659 apex_available: [ "myapex" ],
1660 stubs: {
1661 versions: ["1", "2"],
1662 },
1663 }
1664
1665 cc_library {
1666 name: "libz",
1667 shared_libs: ["libx"],
1668 system_shared_libs: [],
1669 stl: "none",
1670 }
1671 `)
1672
1673 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001674 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001675 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1676 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1677 }
1678 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001679 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001680 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1681 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1682 }
1683 expectLink("libz", "shared", "libx", "shared_2")
1684 expectNoLink("libz", "shared", "libz", "shared_1")
1685 expectNoLink("libz", "shared", "libz", "shared")
1686}
1687
Jooyung Han75568392020-03-20 04:29:24 +09001688func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001689 ctx, _ := testApex(t, `
1690 apex {
1691 name: "myapex",
1692 key: "myapex.key",
1693 native_shared_libs: ["libx"],
1694 min_sdk_version: "29",
1695 }
1696
1697 apex_key {
1698 name: "myapex.key",
1699 public_key: "testkey.avbpubkey",
1700 private_key: "testkey.pem",
1701 }
1702
1703 cc_library {
1704 name: "libx",
1705 shared_libs: ["libbar"],
1706 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001707 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001708 }
1709
1710 cc_library {
1711 name: "libbar",
1712 stubs: {
1713 versions: ["29", "30"],
1714 },
1715 }
Jooyung Han75568392020-03-20 04:29:24 +09001716 `, func(fs map[string][]byte, config android.Config) {
1717 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1718 })
Jooyung Han03b51852020-02-26 22:45:42 +09001719 expectLink := func(from, from_variant, to, to_variant string) {
1720 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1721 libFlags := ld.Args["libFlags"]
1722 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1723 }
Colin Crossaede88c2020-08-11 12:17:01 -07001724 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001725}
1726
Jooyung Han75568392020-03-20 04:29:24 +09001727func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001728 ctx, _ := testApex(t, `
1729 apex {
1730 name: "myapex",
1731 key: "myapex.key",
1732 native_shared_libs: ["libx"],
1733 min_sdk_version: "29",
1734 }
1735
1736 apex_key {
1737 name: "myapex.key",
1738 public_key: "testkey.avbpubkey",
1739 private_key: "testkey.pem",
1740 }
1741
1742 cc_library {
1743 name: "libx",
1744 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001745 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001746 }
Jooyung Han75568392020-03-20 04:29:24 +09001747 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001748
1749 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001750 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001751 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1752 // note that platform variant is not.
1753 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1754 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001755}
1756
Jooyung Han749dc692020-04-15 11:03:39 +09001757func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001758 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001759 apex {
1760 name: "myapex",
1761 key: "myapex.key",
1762 native_shared_libs: ["libx"],
1763 min_sdk_version: "29",
1764 }
1765
1766 apex_key {
1767 name: "myapex.key",
1768 public_key: "testkey.avbpubkey",
1769 private_key: "testkey.pem",
1770 }
1771
1772 cc_library {
1773 name: "libx",
1774 shared_libs: ["libz"],
1775 system_shared_libs: [],
1776 stl: "none",
1777 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001778 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001779 }
1780
1781 cc_library {
1782 name: "libz",
1783 system_shared_libs: [],
1784 stl: "none",
1785 stubs: {
1786 versions: ["30"],
1787 },
1788 }
Jooyung Han75568392020-03-20 04:29:24 +09001789 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001790}
Jooyung Han03b51852020-02-26 22:45:42 +09001791
Jooyung Han749dc692020-04-15 11:03:39 +09001792func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1793 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001794 apex {
1795 name: "myapex",
1796 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001797 native_shared_libs: ["mylib"],
1798 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001799 }
1800
1801 apex_key {
1802 name: "myapex.key",
1803 public_key: "testkey.avbpubkey",
1804 private_key: "testkey.pem",
1805 }
Jooyung Han749dc692020-04-15 11:03:39 +09001806
1807 cc_library {
1808 name: "mylib",
1809 srcs: ["mylib.cpp"],
1810 system_shared_libs: [],
1811 stl: "none",
1812 apex_available: [
1813 "myapex",
1814 ],
1815 min_sdk_version: "30",
1816 }
1817 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001818
1819 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 native_shared_libs: ["libfoo.ffi"],
1824 min_sdk_version: "29",
1825 }
1826
1827 apex_key {
1828 name: "myapex.key",
1829 public_key: "testkey.avbpubkey",
1830 private_key: "testkey.pem",
1831 }
1832
1833 rust_ffi_shared {
1834 name: "libfoo.ffi",
1835 srcs: ["foo.rs"],
1836 crate_name: "foo",
1837 apex_available: [
1838 "myapex",
1839 ],
1840 min_sdk_version: "30",
1841 }
1842 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001843}
1844
1845func TestApexMinSdkVersion_Okay(t *testing.T) {
1846 testApex(t, `
1847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libfoo"],
1851 java_libs: ["libbar"],
1852 min_sdk_version: "29",
1853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libfoo",
1863 srcs: ["mylib.cpp"],
1864 shared_libs: ["libfoo_dep"],
1865 apex_available: ["myapex"],
1866 min_sdk_version: "29",
1867 }
1868
1869 cc_library {
1870 name: "libfoo_dep",
1871 srcs: ["mylib.cpp"],
1872 apex_available: ["myapex"],
1873 min_sdk_version: "29",
1874 }
1875
1876 java_library {
1877 name: "libbar",
1878 sdk_version: "current",
1879 srcs: ["a.java"],
1880 static_libs: ["libbar_dep"],
1881 apex_available: ["myapex"],
1882 min_sdk_version: "29",
1883 }
1884
1885 java_library {
1886 name: "libbar_dep",
1887 sdk_version: "current",
1888 srcs: ["a.java"],
1889 apex_available: ["myapex"],
1890 min_sdk_version: "29",
1891 }
Jooyung Han03b51852020-02-26 22:45:42 +09001892 `)
1893}
1894
Artur Satayev8cf899a2020-04-15 17:29:42 +01001895func TestJavaStableSdkVersion(t *testing.T) {
1896 testCases := []struct {
1897 name string
1898 expectedError string
1899 bp string
1900 }{
1901 {
1902 name: "Non-updatable apex with non-stable dep",
1903 bp: `
1904 apex {
1905 name: "myapex",
1906 java_libs: ["myjar"],
1907 key: "myapex.key",
1908 }
1909 apex_key {
1910 name: "myapex.key",
1911 public_key: "testkey.avbpubkey",
1912 private_key: "testkey.pem",
1913 }
1914 java_library {
1915 name: "myjar",
1916 srcs: ["foo/bar/MyClass.java"],
1917 sdk_version: "core_platform",
1918 apex_available: ["myapex"],
1919 }
1920 `,
1921 },
1922 {
1923 name: "Updatable apex with stable dep",
1924 bp: `
1925 apex {
1926 name: "myapex",
1927 java_libs: ["myjar"],
1928 key: "myapex.key",
1929 updatable: true,
1930 min_sdk_version: "29",
1931 }
1932 apex_key {
1933 name: "myapex.key",
1934 public_key: "testkey.avbpubkey",
1935 private_key: "testkey.pem",
1936 }
1937 java_library {
1938 name: "myjar",
1939 srcs: ["foo/bar/MyClass.java"],
1940 sdk_version: "current",
1941 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001942 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001943 }
1944 `,
1945 },
1946 {
1947 name: "Updatable apex with non-stable dep",
1948 expectedError: "cannot depend on \"myjar\"",
1949 bp: `
1950 apex {
1951 name: "myapex",
1952 java_libs: ["myjar"],
1953 key: "myapex.key",
1954 updatable: true,
1955 }
1956 apex_key {
1957 name: "myapex.key",
1958 public_key: "testkey.avbpubkey",
1959 private_key: "testkey.pem",
1960 }
1961 java_library {
1962 name: "myjar",
1963 srcs: ["foo/bar/MyClass.java"],
1964 sdk_version: "core_platform",
1965 apex_available: ["myapex"],
1966 }
1967 `,
1968 },
1969 {
1970 name: "Updatable apex with non-stable transitive dep",
1971 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1972 bp: `
1973 apex {
1974 name: "myapex",
1975 java_libs: ["myjar"],
1976 key: "myapex.key",
1977 updatable: true,
1978 }
1979 apex_key {
1980 name: "myapex.key",
1981 public_key: "testkey.avbpubkey",
1982 private_key: "testkey.pem",
1983 }
1984 java_library {
1985 name: "myjar",
1986 srcs: ["foo/bar/MyClass.java"],
1987 sdk_version: "current",
1988 apex_available: ["myapex"],
1989 static_libs: ["transitive-jar"],
1990 }
1991 java_library {
1992 name: "transitive-jar",
1993 srcs: ["foo/bar/MyClass.java"],
1994 sdk_version: "core_platform",
1995 apex_available: ["myapex"],
1996 }
1997 `,
1998 },
1999 }
2000
2001 for _, test := range testCases {
2002 t.Run(test.name, func(t *testing.T) {
2003 if test.expectedError == "" {
2004 testApex(t, test.bp)
2005 } else {
2006 testApexError(t, test.expectedError, test.bp)
2007 }
2008 })
2009 }
2010}
2011
Jooyung Han749dc692020-04-15 11:03:39 +09002012func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2013 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2014 apex {
2015 name: "myapex",
2016 key: "myapex.key",
2017 native_shared_libs: ["mylib"],
2018 min_sdk_version: "29",
2019 }
2020
2021 apex_key {
2022 name: "myapex.key",
2023 public_key: "testkey.avbpubkey",
2024 private_key: "testkey.pem",
2025 }
2026
2027 cc_library {
2028 name: "mylib",
2029 srcs: ["mylib.cpp"],
2030 shared_libs: ["mylib2"],
2031 system_shared_libs: [],
2032 stl: "none",
2033 apex_available: [
2034 "myapex",
2035 ],
2036 min_sdk_version: "29",
2037 }
2038
2039 // indirect part of the apex
2040 cc_library {
2041 name: "mylib2",
2042 srcs: ["mylib.cpp"],
2043 system_shared_libs: [],
2044 stl: "none",
2045 apex_available: [
2046 "myapex",
2047 ],
2048 min_sdk_version: "30",
2049 }
2050 `)
2051}
2052
2053func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2054 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2055 apex {
2056 name: "myapex",
2057 key: "myapex.key",
2058 apps: ["AppFoo"],
2059 min_sdk_version: "29",
2060 }
2061
2062 apex_key {
2063 name: "myapex.key",
2064 public_key: "testkey.avbpubkey",
2065 private_key: "testkey.pem",
2066 }
2067
2068 android_app {
2069 name: "AppFoo",
2070 srcs: ["foo/bar/MyClass.java"],
2071 sdk_version: "current",
2072 min_sdk_version: "29",
2073 system_modules: "none",
2074 stl: "none",
2075 static_libs: ["bar"],
2076 apex_available: [ "myapex" ],
2077 }
2078
2079 java_library {
2080 name: "bar",
2081 sdk_version: "current",
2082 srcs: ["a.java"],
2083 apex_available: [ "myapex" ],
2084 }
2085 `)
2086}
2087
2088func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2089 ctx, _ := testApex(t, `
2090 apex {
2091 name: "myapex",
2092 key: "myapex.key",
2093 native_shared_libs: ["mylib"],
2094 min_sdk_version: "29",
2095 }
2096
2097 apex_key {
2098 name: "myapex.key",
2099 public_key: "testkey.avbpubkey",
2100 private_key: "testkey.pem",
2101 }
2102
2103 // mylib in myapex will link to mylib2#29
2104 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2105 cc_library {
2106 name: "mylib",
2107 srcs: ["mylib.cpp"],
2108 shared_libs: ["mylib2"],
2109 system_shared_libs: [],
2110 stl: "none",
2111 apex_available: ["myapex", "otherapex"],
2112 min_sdk_version: "29",
2113 }
2114
2115 cc_library {
2116 name: "mylib2",
2117 srcs: ["mylib.cpp"],
2118 system_shared_libs: [],
2119 stl: "none",
2120 apex_available: ["otherapex"],
2121 stubs: { versions: ["29", "30"] },
2122 min_sdk_version: "30",
2123 }
2124
2125 apex {
2126 name: "otherapex",
2127 key: "myapex.key",
2128 native_shared_libs: ["mylib", "mylib2"],
2129 min_sdk_version: "30",
2130 }
2131 `)
2132 expectLink := func(from, from_variant, to, to_variant string) {
2133 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2134 libFlags := ld.Args["libFlags"]
2135 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2136 }
Colin Crossaede88c2020-08-11 12:17:01 -07002137 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2138 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002139}
2140
Jiyong Park7c2ee712018-12-07 00:42:25 +09002141func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002142 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002143 apex {
2144 name: "myapex",
2145 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002146 native_shared_libs: ["mylib"],
2147 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002148 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002149 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002150 }
2151
2152 apex_key {
2153 name: "myapex.key",
2154 public_key: "testkey.avbpubkey",
2155 private_key: "testkey.pem",
2156 }
2157
2158 prebuilt_etc {
2159 name: "myetc",
2160 src: "myprebuilt",
2161 sub_dir: "foo/bar",
2162 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002163
2164 cc_library {
2165 name: "mylib",
2166 srcs: ["mylib.cpp"],
2167 relative_install_path: "foo/bar",
2168 system_shared_libs: [],
2169 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002170 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002171 }
2172
2173 cc_binary {
2174 name: "mybin",
2175 srcs: ["mylib.cpp"],
2176 relative_install_path: "foo/bar",
2177 system_shared_libs: [],
2178 static_executable: true,
2179 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002180 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002181 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002182 `)
2183
Sundong Ahnabb64432019-10-22 13:58:29 +09002184 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002185 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2186
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002187 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002188 ensureListContains(t, dirs, "etc")
2189 ensureListContains(t, dirs, "etc/foo")
2190 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002191 ensureListContains(t, dirs, "lib64")
2192 ensureListContains(t, dirs, "lib64/foo")
2193 ensureListContains(t, dirs, "lib64/foo/bar")
2194 ensureListContains(t, dirs, "lib")
2195 ensureListContains(t, dirs, "lib/foo")
2196 ensureListContains(t, dirs, "lib/foo/bar")
2197
Jiyong Parkbd13e442019-03-15 18:10:35 +09002198 ensureListContains(t, dirs, "bin")
2199 ensureListContains(t, dirs, "bin/foo")
2200 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002201}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002202
Jooyung Han35155c42020-02-06 17:33:20 +09002203func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2204 ctx, _ := testApex(t, `
2205 apex {
2206 name: "myapex",
2207 key: "myapex.key",
2208 multilib: {
2209 both: {
2210 native_shared_libs: ["mylib"],
2211 binaries: ["mybin"],
2212 },
2213 },
2214 compile_multilib: "both",
2215 native_bridge_supported: true,
2216 }
2217
2218 apex_key {
2219 name: "myapex.key",
2220 public_key: "testkey.avbpubkey",
2221 private_key: "testkey.pem",
2222 }
2223
2224 cc_library {
2225 name: "mylib",
2226 relative_install_path: "foo/bar",
2227 system_shared_libs: [],
2228 stl: "none",
2229 apex_available: [ "myapex" ],
2230 native_bridge_supported: true,
2231 }
2232
2233 cc_binary {
2234 name: "mybin",
2235 relative_install_path: "foo/bar",
2236 system_shared_libs: [],
2237 static_executable: true,
2238 stl: "none",
2239 apex_available: [ "myapex" ],
2240 native_bridge_supported: true,
2241 compile_multilib: "both", // default is "first" for binary
2242 multilib: {
2243 lib64: {
2244 suffix: "64",
2245 },
2246 },
2247 }
2248 `, withNativeBridgeEnabled)
2249 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2250 "bin/foo/bar/mybin",
2251 "bin/foo/bar/mybin64",
2252 "bin/arm/foo/bar/mybin",
2253 "bin/arm64/foo/bar/mybin64",
2254 "lib/foo/bar/mylib.so",
2255 "lib/arm/foo/bar/mylib.so",
2256 "lib64/foo/bar/mylib.so",
2257 "lib64/arm64/foo/bar/mylib.so",
2258 })
2259}
2260
Jiyong Parkda6eb592018-12-19 17:12:36 +09002261func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002262 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002263 apex {
2264 name: "myapex",
2265 key: "myapex.key",
2266 native_shared_libs: ["mylib"],
2267 use_vendor: true,
2268 }
2269
2270 apex_key {
2271 name: "myapex.key",
2272 public_key: "testkey.avbpubkey",
2273 private_key: "testkey.pem",
2274 }
2275
2276 cc_library {
2277 name: "mylib",
2278 srcs: ["mylib.cpp"],
2279 shared_libs: ["mylib2"],
2280 system_shared_libs: [],
2281 vendor_available: true,
2282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002283 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002284 }
2285
2286 cc_library {
2287 name: "mylib2",
2288 srcs: ["mylib.cpp"],
2289 system_shared_libs: [],
2290 vendor_available: true,
2291 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002292 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002293 }
Jooyung Handc782442019-11-01 03:14:38 +09002294 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002295 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002296 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002297
2298 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002299 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002300 for _, implicit := range i.Implicits {
2301 inputsList = append(inputsList, implicit.String())
2302 }
2303 }
2304 inputsString := strings.Join(inputsList, " ")
2305
2306 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002307 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2308 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002309
2310 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002311 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2312 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002313}
Jiyong Park16e91a02018-12-20 18:18:08 +09002314
Jooyung Han85d61762020-06-24 23:50:26 +09002315func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002316 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2317 apex {
2318 name: "myapex",
2319 key: "myapex.key",
2320 use_vendor: true,
2321 }
2322 apex_key {
2323 name: "myapex.key",
2324 public_key: "testkey.avbpubkey",
2325 private_key: "testkey.pem",
2326 }
2327 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002328 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002329 })
Colin Cross440e0d02020-06-11 11:32:11 -07002330 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002331 testApex(t, `
2332 apex {
2333 name: "myapex",
2334 key: "myapex.key",
2335 use_vendor: true,
2336 }
2337 apex_key {
2338 name: "myapex.key",
2339 public_key: "testkey.avbpubkey",
2340 private_key: "testkey.pem",
2341 }
2342 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002343 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002344 })
2345}
2346
Jooyung Han5c998b92019-06-27 11:30:33 +09002347func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2348 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2349 apex {
2350 name: "myapex",
2351 key: "myapex.key",
2352 native_shared_libs: ["mylib"],
2353 use_vendor: true,
2354 }
2355
2356 apex_key {
2357 name: "myapex.key",
2358 public_key: "testkey.avbpubkey",
2359 private_key: "testkey.pem",
2360 }
2361
2362 cc_library {
2363 name: "mylib",
2364 srcs: ["mylib.cpp"],
2365 system_shared_libs: [],
2366 stl: "none",
2367 }
2368 `)
2369}
2370
Jooyung Han85d61762020-06-24 23:50:26 +09002371func TestVendorApex(t *testing.T) {
2372 ctx, config := testApex(t, `
2373 apex {
2374 name: "myapex",
2375 key: "myapex.key",
2376 binaries: ["mybin"],
2377 vendor: true,
2378 }
2379 apex_key {
2380 name: "myapex.key",
2381 public_key: "testkey.avbpubkey",
2382 private_key: "testkey.pem",
2383 }
2384 cc_binary {
2385 name: "mybin",
2386 vendor: true,
2387 shared_libs: ["libfoo"],
2388 }
2389 cc_library {
2390 name: "libfoo",
2391 proprietary: true,
2392 }
2393 `)
2394
2395 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2396 "bin/mybin",
2397 "lib64/libfoo.so",
2398 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2399 "lib64/libc++.so",
2400 })
2401
2402 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2403 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2404 name := apexBundle.BaseModuleName()
2405 prefix := "TARGET_"
2406 var builder strings.Builder
2407 data.Custom(&builder, name, prefix, "", data)
2408 androidMk := builder.String()
2409 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002410
2411 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2412 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2413 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002414}
2415
Jooyung Handf78e212020-07-22 15:54:47 +09002416func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2417 ctx, _ := testApex(t, `
2418 apex {
2419 name: "myapex",
2420 key: "myapex.key",
2421 binaries: ["mybin"],
2422 vendor: true,
2423 use_vndk_as_stable: true,
2424 }
2425 apex_key {
2426 name: "myapex.key",
2427 public_key: "testkey.avbpubkey",
2428 private_key: "testkey.pem",
2429 }
2430 cc_binary {
2431 name: "mybin",
2432 vendor: true,
2433 shared_libs: ["libvndk", "libvendor"],
2434 }
2435 cc_library {
2436 name: "libvndk",
2437 vndk: {
2438 enabled: true,
2439 },
2440 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002441 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002442 }
2443 cc_library {
2444 name: "libvendor",
2445 vendor: true,
2446 }
2447 `)
2448
2449 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2450
Colin Crossaede88c2020-08-11 12:17:01 -07002451 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002452 libs := names(ldRule.Args["libFlags"])
2453 // VNDK libs(libvndk/libc++) as they are
2454 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2455 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2456 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002457 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002458
2459 // VNDK libs are not included when use_vndk_as_stable: true
2460 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2461 "bin/mybin",
2462 "lib64/libvendor.so",
2463 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002464
2465 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2466 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2467 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002468}
2469
Jooyung Han8e5685d2020-09-21 11:02:57 +09002470func TestApex_withPrebuiltFirmware(t *testing.T) {
2471 testCases := []struct {
2472 name string
2473 additionalProp string
2474 }{
2475 {"system apex with prebuilt_firmware", ""},
2476 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2477 }
2478 for _, tc := range testCases {
2479 t.Run(tc.name, func(t *testing.T) {
2480 ctx, _ := testApex(t, `
2481 apex {
2482 name: "myapex",
2483 key: "myapex.key",
2484 prebuilts: ["myfirmware"],
2485 `+tc.additionalProp+`
2486 }
2487 apex_key {
2488 name: "myapex.key",
2489 public_key: "testkey.avbpubkey",
2490 private_key: "testkey.pem",
2491 }
2492 prebuilt_firmware {
2493 name: "myfirmware",
2494 src: "myfirmware.bin",
2495 filename_from_src: true,
2496 `+tc.additionalProp+`
2497 }
2498 `)
2499 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2500 "etc/firmware/myfirmware.bin",
2501 })
2502 })
2503 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002504}
2505
Jooyung Hanefb184e2020-06-25 17:14:25 +09002506func TestAndroidMk_UseVendorRequired(t *testing.T) {
2507 ctx, config := testApex(t, `
2508 apex {
2509 name: "myapex",
2510 key: "myapex.key",
2511 use_vendor: true,
2512 native_shared_libs: ["mylib"],
2513 }
2514
2515 apex_key {
2516 name: "myapex.key",
2517 public_key: "testkey.avbpubkey",
2518 private_key: "testkey.pem",
2519 }
2520
2521 cc_library {
2522 name: "mylib",
2523 vendor_available: true,
2524 apex_available: ["myapex"],
2525 }
2526 `, func(fs map[string][]byte, config android.Config) {
2527 setUseVendorAllowListForTest(config, []string{"myapex"})
2528 })
2529
2530 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2531 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2532 name := apexBundle.BaseModuleName()
2533 prefix := "TARGET_"
2534 var builder strings.Builder
2535 data.Custom(&builder, name, prefix, "", data)
2536 androidMk := builder.String()
2537 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2538}
2539
2540func TestAndroidMk_VendorApexRequired(t *testing.T) {
2541 ctx, config := testApex(t, `
2542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
2545 vendor: true,
2546 native_shared_libs: ["mylib"],
2547 }
2548
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554
2555 cc_library {
2556 name: "mylib",
2557 vendor_available: true,
2558 }
2559 `)
2560
2561 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2562 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2563 name := apexBundle.BaseModuleName()
2564 prefix := "TARGET_"
2565 var builder strings.Builder
2566 data.Custom(&builder, name, prefix, "", data)
2567 androidMk := builder.String()
2568 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2569}
2570
Jooyung Han2ed99d02020-06-24 23:26:26 +09002571func TestAndroidMkWritesCommonProperties(t *testing.T) {
2572 ctx, config := testApex(t, `
2573 apex {
2574 name: "myapex",
2575 key: "myapex.key",
2576 vintf_fragments: ["fragment.xml"],
2577 init_rc: ["init.rc"],
2578 }
2579 apex_key {
2580 name: "myapex.key",
2581 public_key: "testkey.avbpubkey",
2582 private_key: "testkey.pem",
2583 }
2584 cc_binary {
2585 name: "mybin",
2586 }
2587 `)
2588
2589 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2590 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2591 name := apexBundle.BaseModuleName()
2592 prefix := "TARGET_"
2593 var builder strings.Builder
2594 data.Custom(&builder, name, prefix, "", data)
2595 androidMk := builder.String()
2596 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2597 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2598}
2599
Jiyong Park16e91a02018-12-20 18:18:08 +09002600func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002601 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002602 apex {
2603 name: "myapex",
2604 key: "myapex.key",
2605 native_shared_libs: ["mylib"],
2606 }
2607
2608 apex_key {
2609 name: "myapex.key",
2610 public_key: "testkey.avbpubkey",
2611 private_key: "testkey.pem",
2612 }
2613
2614 cc_library {
2615 name: "mylib",
2616 srcs: ["mylib.cpp"],
2617 system_shared_libs: [],
2618 stl: "none",
2619 stubs: {
2620 versions: ["1", "2", "3"],
2621 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002622 apex_available: [
2623 "//apex_available:platform",
2624 "myapex",
2625 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002626 }
2627
2628 cc_binary {
2629 name: "not_in_apex",
2630 srcs: ["mylib.cpp"],
2631 static_libs: ["mylib"],
2632 static_executable: true,
2633 system_shared_libs: [],
2634 stl: "none",
2635 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002636 `)
2637
Colin Cross7113d202019-11-20 16:39:12 -08002638 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002639
2640 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002641 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002642}
Jiyong Park9335a262018-12-24 11:31:58 +09002643
2644func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002645 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002646 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002647 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002648 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002649 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002650 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002651 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002652 }
2653
2654 cc_library {
2655 name: "mylib",
2656 srcs: ["mylib.cpp"],
2657 system_shared_libs: [],
2658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002659 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002660 }
2661
2662 apex_key {
2663 name: "myapex.key",
2664 public_key: "testkey.avbpubkey",
2665 private_key: "testkey.pem",
2666 }
2667
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002668 android_app_certificate {
2669 name: "myapex.certificate",
2670 certificate: "testkey",
2671 }
2672
2673 android_app_certificate {
2674 name: "myapex.certificate.override",
2675 certificate: "testkey.override",
2676 }
2677
Jiyong Park9335a262018-12-24 11:31:58 +09002678 `)
2679
2680 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002681 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002682
2683 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2684 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2685 "vendor/foo/devkeys/testkey.avbpubkey")
2686 }
2687 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2688 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2689 "vendor/foo/devkeys/testkey.pem")
2690 }
2691
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002692 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002693 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002694 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002695 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002696 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002697 }
2698}
Jiyong Park58e364a2019-01-19 19:24:06 +09002699
Jooyung Hanf121a652019-12-17 14:30:11 +09002700func TestCertificate(t *testing.T) {
2701 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2702 ctx, _ := testApex(t, `
2703 apex {
2704 name: "myapex",
2705 key: "myapex.key",
2706 }
2707 apex_key {
2708 name: "myapex.key",
2709 public_key: "testkey.avbpubkey",
2710 private_key: "testkey.pem",
2711 }`)
2712 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2713 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2714 if actual := rule.Args["certificates"]; actual != expected {
2715 t.Errorf("certificates should be %q, not %q", expected, actual)
2716 }
2717 })
2718 t.Run("override when unspecified", func(t *testing.T) {
2719 ctx, _ := testApex(t, `
2720 apex {
2721 name: "myapex_keytest",
2722 key: "myapex.key",
2723 file_contexts: ":myapex-file_contexts",
2724 }
2725 apex_key {
2726 name: "myapex.key",
2727 public_key: "testkey.avbpubkey",
2728 private_key: "testkey.pem",
2729 }
2730 android_app_certificate {
2731 name: "myapex.certificate.override",
2732 certificate: "testkey.override",
2733 }`)
2734 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2735 expected := "testkey.override.x509.pem testkey.override.pk8"
2736 if actual := rule.Args["certificates"]; actual != expected {
2737 t.Errorf("certificates should be %q, not %q", expected, actual)
2738 }
2739 })
2740 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2741 ctx, _ := testApex(t, `
2742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
2745 certificate: ":myapex.certificate",
2746 }
2747 apex_key {
2748 name: "myapex.key",
2749 public_key: "testkey.avbpubkey",
2750 private_key: "testkey.pem",
2751 }
2752 android_app_certificate {
2753 name: "myapex.certificate",
2754 certificate: "testkey",
2755 }`)
2756 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2757 expected := "testkey.x509.pem testkey.pk8"
2758 if actual := rule.Args["certificates"]; actual != expected {
2759 t.Errorf("certificates should be %q, not %q", expected, actual)
2760 }
2761 })
2762 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2763 ctx, _ := testApex(t, `
2764 apex {
2765 name: "myapex_keytest",
2766 key: "myapex.key",
2767 file_contexts: ":myapex-file_contexts",
2768 certificate: ":myapex.certificate",
2769 }
2770 apex_key {
2771 name: "myapex.key",
2772 public_key: "testkey.avbpubkey",
2773 private_key: "testkey.pem",
2774 }
2775 android_app_certificate {
2776 name: "myapex.certificate.override",
2777 certificate: "testkey.override",
2778 }`)
2779 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2780 expected := "testkey.override.x509.pem testkey.override.pk8"
2781 if actual := rule.Args["certificates"]; actual != expected {
2782 t.Errorf("certificates should be %q, not %q", expected, actual)
2783 }
2784 })
2785 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2786 ctx, _ := testApex(t, `
2787 apex {
2788 name: "myapex",
2789 key: "myapex.key",
2790 certificate: "testkey",
2791 }
2792 apex_key {
2793 name: "myapex.key",
2794 public_key: "testkey.avbpubkey",
2795 private_key: "testkey.pem",
2796 }`)
2797 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2798 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2799 if actual := rule.Args["certificates"]; actual != expected {
2800 t.Errorf("certificates should be %q, not %q", expected, actual)
2801 }
2802 })
2803 t.Run("override when specified as <name>", func(t *testing.T) {
2804 ctx, _ := testApex(t, `
2805 apex {
2806 name: "myapex_keytest",
2807 key: "myapex.key",
2808 file_contexts: ":myapex-file_contexts",
2809 certificate: "testkey",
2810 }
2811 apex_key {
2812 name: "myapex.key",
2813 public_key: "testkey.avbpubkey",
2814 private_key: "testkey.pem",
2815 }
2816 android_app_certificate {
2817 name: "myapex.certificate.override",
2818 certificate: "testkey.override",
2819 }`)
2820 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2821 expected := "testkey.override.x509.pem testkey.override.pk8"
2822 if actual := rule.Args["certificates"]; actual != expected {
2823 t.Errorf("certificates should be %q, not %q", expected, actual)
2824 }
2825 })
2826}
2827
Jiyong Park58e364a2019-01-19 19:24:06 +09002828func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002829 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002830 apex {
2831 name: "myapex",
2832 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002833 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002834 }
2835
2836 apex {
2837 name: "otherapex",
2838 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002839 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002840 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002841 }
2842
2843 apex_key {
2844 name: "myapex.key",
2845 public_key: "testkey.avbpubkey",
2846 private_key: "testkey.pem",
2847 }
2848
2849 cc_library {
2850 name: "mylib",
2851 srcs: ["mylib.cpp"],
2852 system_shared_libs: [],
2853 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002854 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002855 "myapex",
2856 "otherapex",
2857 ],
Jooyung Han24282772020-03-21 23:20:55 +09002858 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002859 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002860 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002861 cc_library {
2862 name: "mylib2",
2863 srcs: ["mylib.cpp"],
2864 system_shared_libs: [],
2865 stl: "none",
2866 apex_available: [
2867 "myapex",
2868 "otherapex",
2869 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002870 static_libs: ["mylib3"],
2871 recovery_available: true,
2872 min_sdk_version: "29",
2873 }
2874 cc_library {
2875 name: "mylib3",
2876 srcs: ["mylib.cpp"],
2877 system_shared_libs: [],
2878 stl: "none",
2879 apex_available: [
2880 "myapex",
2881 "otherapex",
2882 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002883 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002884 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002885 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002886 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002887 `)
2888
Jooyung Hanc87a0592020-03-02 17:44:33 +09002889 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002890 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002891 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002892 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002893
Jooyung Hanccce2f22020-03-07 03:45:53 +09002894 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002895 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002896 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002897 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002898 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002899
Jooyung Hanccce2f22020-03-07 03:45:53 +09002900 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002901 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002902 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002903 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002904 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002905
Colin Crossaede88c2020-08-11 12:17:01 -07002906 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2907 // each variant defines additional macros to distinguish which apex variant it is built for
2908
2909 // non-APEX variant does not have __ANDROID_APEX__ defined
2910 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2911 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2912
2913 // APEX variant has __ANDROID_APEX__ defined
2914 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2915 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2916 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2917 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2918
2919 // APEX variant has __ANDROID_APEX__ defined
2920 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2921 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2922 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2923 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2924
Dan Albertb19953d2020-11-17 15:29:36 -08002925 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002926 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2927 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002928 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002929
2930 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2931 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002932
2933 // non-APEX variant does not have __ANDROID_APEX__ defined
2934 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2935 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2936
2937 // APEX variant has __ANDROID_APEX__ defined
2938 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002939 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002940 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002941 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002942
Jooyung Hanc87a0592020-03-02 17:44:33 +09002943 // APEX variant has __ANDROID_APEX__ defined
2944 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002945 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002946 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002947 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002948
Dan Albertb19953d2020-11-17 15:29:36 -08002949 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002950 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002951 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002952 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002953}
Jiyong Park7e636d02019-01-28 16:16:54 +09002954
2955func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002956 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 native_shared_libs: ["mylib"],
2961 }
2962
2963 apex_key {
2964 name: "myapex.key",
2965 public_key: "testkey.avbpubkey",
2966 private_key: "testkey.pem",
2967 }
2968
2969 cc_library_headers {
2970 name: "mylib_headers",
2971 export_include_dirs: ["my_include"],
2972 system_shared_libs: [],
2973 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002974 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002975 }
2976
2977 cc_library {
2978 name: "mylib",
2979 srcs: ["mylib.cpp"],
2980 system_shared_libs: [],
2981 stl: "none",
2982 header_libs: ["mylib_headers"],
2983 export_header_lib_headers: ["mylib_headers"],
2984 stubs: {
2985 versions: ["1", "2", "3"],
2986 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002987 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002988 }
2989
2990 cc_library {
2991 name: "otherlib",
2992 srcs: ["mylib.cpp"],
2993 system_shared_libs: [],
2994 stl: "none",
2995 shared_libs: ["mylib"],
2996 }
2997 `)
2998
Colin Cross7113d202019-11-20 16:39:12 -08002999 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003000
3001 // Ensure that the include path of the header lib is exported to 'otherlib'
3002 ensureContains(t, cFlags, "-Imy_include")
3003}
Alex Light9670d332019-01-29 18:07:33 -08003004
Jiyong Park7cd10e32020-01-14 09:22:18 +09003005type fileInApex struct {
3006 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003007 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003008 isLink bool
3009}
3010
Jooyung Hana57af4a2020-01-23 05:36:59 +00003011func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003012 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003013 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003014 copyCmds := apexRule.Args["copy_commands"]
3015 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003016 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003017 for _, cmd := range strings.Split(copyCmds, "&&") {
3018 cmd = strings.TrimSpace(cmd)
3019 if cmd == "" {
3020 continue
3021 }
3022 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003023 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003024 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003025 switch terms[0] {
3026 case "mkdir":
3027 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003028 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003029 t.Fatal("copyCmds contains invalid cp command", cmd)
3030 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003031 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003032 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003033 isLink = false
3034 case "ln":
3035 if len(terms) != 3 && len(terms) != 4 {
3036 // ln LINK TARGET or ln -s LINK TARGET
3037 t.Fatal("copyCmds contains invalid ln command", cmd)
3038 }
3039 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003040 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003041 isLink = true
3042 default:
3043 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3044 }
3045 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003046 index := strings.Index(dst, imageApexDir)
3047 if index == -1 {
3048 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3049 }
3050 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003051 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003052 }
3053 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003054 return ret
3055}
3056
Jooyung Hana57af4a2020-01-23 05:36:59 +00003057func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3058 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003059 var failed bool
3060 var surplus []string
3061 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003062 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003063 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003064 for _, expected := range files {
3065 if matched, _ := path.Match(expected, file.path); matched {
3066 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003067 mactchFound = true
3068 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003069 }
3070 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003071 if !mactchFound {
3072 surplus = append(surplus, file.path)
3073 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003074 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003075
Jooyung Han31c470b2019-10-18 16:26:59 +09003076 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003077 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003078 t.Log("surplus files", surplus)
3079 failed = true
3080 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003081
3082 if len(files) > len(filesMatched) {
3083 var missing []string
3084 for _, expected := range files {
3085 if !filesMatched[expected] {
3086 missing = append(missing, expected)
3087 }
3088 }
3089 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003090 t.Log("missing files", missing)
3091 failed = true
3092 }
3093 if failed {
3094 t.Fail()
3095 }
3096}
3097
Jooyung Han344d5432019-08-23 11:17:39 +09003098func TestVndkApexCurrent(t *testing.T) {
3099 ctx, _ := testApex(t, `
3100 apex_vndk {
3101 name: "myapex",
3102 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003103 }
3104
3105 apex_key {
3106 name: "myapex.key",
3107 public_key: "testkey.avbpubkey",
3108 private_key: "testkey.pem",
3109 }
3110
3111 cc_library {
3112 name: "libvndk",
3113 srcs: ["mylib.cpp"],
3114 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003115 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003116 vndk: {
3117 enabled: true,
3118 },
3119 system_shared_libs: [],
3120 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003121 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003122 }
3123
3124 cc_library {
3125 name: "libvndksp",
3126 srcs: ["mylib.cpp"],
3127 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003128 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003129 vndk: {
3130 enabled: true,
3131 support_system_process: true,
3132 },
3133 system_shared_libs: [],
3134 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003135 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003136 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003137 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003138
Jooyung Hana57af4a2020-01-23 05:36:59 +00003139 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003140 "lib/libvndk.so",
3141 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003142 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003143 "lib64/libvndk.so",
3144 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003145 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003146 "etc/llndk.libraries.VER.txt",
3147 "etc/vndkcore.libraries.VER.txt",
3148 "etc/vndksp.libraries.VER.txt",
3149 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003150 })
Jooyung Han344d5432019-08-23 11:17:39 +09003151}
3152
3153func TestVndkApexWithPrebuilt(t *testing.T) {
3154 ctx, _ := testApex(t, `
3155 apex_vndk {
3156 name: "myapex",
3157 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003158 }
3159
3160 apex_key {
3161 name: "myapex.key",
3162 public_key: "testkey.avbpubkey",
3163 private_key: "testkey.pem",
3164 }
3165
3166 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003167 name: "libvndk",
3168 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003169 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003170 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003171 vndk: {
3172 enabled: true,
3173 },
3174 system_shared_libs: [],
3175 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003176 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003177 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003178
3179 cc_prebuilt_library_shared {
3180 name: "libvndk.arm",
3181 srcs: ["libvndk.arm.so"],
3182 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003183 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003184 vndk: {
3185 enabled: true,
3186 },
3187 enabled: false,
3188 arch: {
3189 arm: {
3190 enabled: true,
3191 },
3192 },
3193 system_shared_libs: [],
3194 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003195 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003196 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003197 `+vndkLibrariesTxtFiles("current"),
3198 withFiles(map[string][]byte{
3199 "libvndk.so": nil,
3200 "libvndk.arm.so": nil,
3201 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003202
Jooyung Hana57af4a2020-01-23 05:36:59 +00003203 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003204 "lib/libvndk.so",
3205 "lib/libvndk.arm.so",
3206 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003207 "lib/libc++.so",
3208 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003209 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003210 })
Jooyung Han344d5432019-08-23 11:17:39 +09003211}
3212
Jooyung Han39edb6c2019-11-06 16:53:07 +09003213func vndkLibrariesTxtFiles(vers ...string) (result string) {
3214 for _, v := range vers {
3215 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003216 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003217 result += `
3218 vndk_libraries_txt {
3219 name: "` + txt + `.libraries.txt",
3220 }
3221 `
3222 }
3223 } else {
3224 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3225 result += `
3226 prebuilt_etc {
3227 name: "` + txt + `.libraries.` + v + `.txt",
3228 src: "dummy.txt",
3229 }
3230 `
3231 }
3232 }
3233 }
3234 return
3235}
3236
Jooyung Han344d5432019-08-23 11:17:39 +09003237func TestVndkApexVersion(t *testing.T) {
3238 ctx, _ := testApex(t, `
3239 apex_vndk {
3240 name: "myapex_v27",
3241 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003242 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003243 vndk_version: "27",
3244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
Jooyung Han31c470b2019-10-18 16:26:59 +09003252 vndk_prebuilt_shared {
3253 name: "libvndk27",
3254 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003255 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003256 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003257 vndk: {
3258 enabled: true,
3259 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003260 target_arch: "arm64",
3261 arch: {
3262 arm: {
3263 srcs: ["libvndk27_arm.so"],
3264 },
3265 arm64: {
3266 srcs: ["libvndk27_arm64.so"],
3267 },
3268 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003269 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003270 }
3271
3272 vndk_prebuilt_shared {
3273 name: "libvndk27",
3274 version: "27",
3275 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003276 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003277 vndk: {
3278 enabled: true,
3279 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003280 target_arch: "x86_64",
3281 arch: {
3282 x86: {
3283 srcs: ["libvndk27_x86.so"],
3284 },
3285 x86_64: {
3286 srcs: ["libvndk27_x86_64.so"],
3287 },
3288 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003289 }
3290 `+vndkLibrariesTxtFiles("27"),
3291 withFiles(map[string][]byte{
3292 "libvndk27_arm.so": nil,
3293 "libvndk27_arm64.so": nil,
3294 "libvndk27_x86.so": nil,
3295 "libvndk27_x86_64.so": nil,
3296 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003297
Jooyung Hana57af4a2020-01-23 05:36:59 +00003298 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003299 "lib/libvndk27_arm.so",
3300 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003301 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003302 })
Jooyung Han344d5432019-08-23 11:17:39 +09003303}
3304
3305func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3306 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3307 apex_vndk {
3308 name: "myapex_v27",
3309 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003310 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003311 vndk_version: "27",
3312 }
3313 apex_vndk {
3314 name: "myapex_v27_other",
3315 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003316 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003317 vndk_version: "27",
3318 }
3319
3320 apex_key {
3321 name: "myapex.key",
3322 public_key: "testkey.avbpubkey",
3323 private_key: "testkey.pem",
3324 }
3325
3326 cc_library {
3327 name: "libvndk",
3328 srcs: ["mylib.cpp"],
3329 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003330 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003331 vndk: {
3332 enabled: true,
3333 },
3334 system_shared_libs: [],
3335 stl: "none",
3336 }
3337
3338 vndk_prebuilt_shared {
3339 name: "libvndk",
3340 version: "27",
3341 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003342 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003343 vndk: {
3344 enabled: true,
3345 },
3346 srcs: ["libvndk.so"],
3347 }
3348 `, withFiles(map[string][]byte{
3349 "libvndk.so": nil,
3350 }))
3351}
3352
Jooyung Han90eee022019-10-01 20:02:42 +09003353func TestVndkApexNameRule(t *testing.T) {
3354 ctx, _ := testApex(t, `
3355 apex_vndk {
3356 name: "myapex",
3357 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003358 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003359 }
3360 apex_vndk {
3361 name: "myapex_v28",
3362 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003363 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003364 vndk_version: "28",
3365 }
3366 apex_key {
3367 name: "myapex.key",
3368 public_key: "testkey.avbpubkey",
3369 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003370 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003371
3372 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003373 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003374 actual := proptools.String(bundle.properties.Apex_name)
3375 if !reflect.DeepEqual(actual, expected) {
3376 t.Errorf("Got '%v', expected '%v'", actual, expected)
3377 }
3378 }
3379
3380 assertApexName("com.android.vndk.vVER", "myapex")
3381 assertApexName("com.android.vndk.v28", "myapex_v28")
3382}
3383
Jooyung Han344d5432019-08-23 11:17:39 +09003384func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3385 ctx, _ := testApex(t, `
3386 apex_vndk {
3387 name: "myapex",
3388 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003389 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003390 }
3391
3392 apex_key {
3393 name: "myapex.key",
3394 public_key: "testkey.avbpubkey",
3395 private_key: "testkey.pem",
3396 }
3397
3398 cc_library {
3399 name: "libvndk",
3400 srcs: ["mylib.cpp"],
3401 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003402 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003403 native_bridge_supported: true,
3404 host_supported: true,
3405 vndk: {
3406 enabled: true,
3407 },
3408 system_shared_libs: [],
3409 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003410 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003411 }
Jooyung Han35155c42020-02-06 17:33:20 +09003412 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003413
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003415 "lib/libvndk.so",
3416 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003417 "lib/libc++.so",
3418 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003419 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003420 })
Jooyung Han344d5432019-08-23 11:17:39 +09003421}
3422
3423func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3424 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3425 apex_vndk {
3426 name: "myapex",
3427 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003428 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003429 native_bridge_supported: true,
3430 }
3431
3432 apex_key {
3433 name: "myapex.key",
3434 public_key: "testkey.avbpubkey",
3435 private_key: "testkey.pem",
3436 }
3437
3438 cc_library {
3439 name: "libvndk",
3440 srcs: ["mylib.cpp"],
3441 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003442 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003443 native_bridge_supported: true,
3444 host_supported: true,
3445 vndk: {
3446 enabled: true,
3447 },
3448 system_shared_libs: [],
3449 stl: "none",
3450 }
3451 `)
3452}
3453
Jooyung Han31c470b2019-10-18 16:26:59 +09003454func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003455 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003456 apex_vndk {
3457 name: "myapex_v27",
3458 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003459 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003460 vndk_version: "27",
3461 }
3462
3463 apex_key {
3464 name: "myapex.key",
3465 public_key: "testkey.avbpubkey",
3466 private_key: "testkey.pem",
3467 }
3468
3469 vndk_prebuilt_shared {
3470 name: "libvndk27",
3471 version: "27",
3472 target_arch: "arm",
3473 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003474 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003475 vndk: {
3476 enabled: true,
3477 },
3478 arch: {
3479 arm: {
3480 srcs: ["libvndk27.so"],
3481 }
3482 },
3483 }
3484
3485 vndk_prebuilt_shared {
3486 name: "libvndk27",
3487 version: "27",
3488 target_arch: "arm",
3489 binder32bit: true,
3490 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003491 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003492 vndk: {
3493 enabled: true,
3494 },
3495 arch: {
3496 arm: {
3497 srcs: ["libvndk27binder32.so"],
3498 }
3499 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003500 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003501 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003502 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003503 withFiles(map[string][]byte{
3504 "libvndk27.so": nil,
3505 "libvndk27binder32.so": nil,
3506 }),
3507 withBinder32bit,
3508 withTargets(map[android.OsType][]android.Target{
3509 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003510 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3511 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003512 },
3513 }),
3514 )
3515
Jooyung Hana57af4a2020-01-23 05:36:59 +00003516 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003517 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003518 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003519 })
3520}
3521
Jooyung Han45a96772020-06-15 14:59:42 +09003522func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3523 ctx, _ := testApex(t, `
3524 apex_vndk {
3525 name: "myapex",
3526 key: "myapex.key",
3527 file_contexts: ":myapex-file_contexts",
3528 }
3529
3530 apex_key {
3531 name: "myapex.key",
3532 public_key: "testkey.avbpubkey",
3533 private_key: "testkey.pem",
3534 }
3535
3536 cc_library {
3537 name: "libz",
3538 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003539 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003540 vndk: {
3541 enabled: true,
3542 },
3543 stubs: {
3544 symbol_file: "libz.map.txt",
3545 versions: ["30"],
3546 }
3547 }
3548 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3549 "libz.map.txt": nil,
3550 }))
3551
3552 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3553 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3554 ensureListEmpty(t, provideNativeLibs)
3555}
3556
Jooyung Hane1633032019-08-01 17:41:43 +09003557func TestDependenciesInApexManifest(t *testing.T) {
3558 ctx, _ := testApex(t, `
3559 apex {
3560 name: "myapex_nodep",
3561 key: "myapex.key",
3562 native_shared_libs: ["lib_nodep"],
3563 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003564 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003565 }
3566
3567 apex {
3568 name: "myapex_dep",
3569 key: "myapex.key",
3570 native_shared_libs: ["lib_dep"],
3571 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003572 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003573 }
3574
3575 apex {
3576 name: "myapex_provider",
3577 key: "myapex.key",
3578 native_shared_libs: ["libfoo"],
3579 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003580 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003581 }
3582
3583 apex {
3584 name: "myapex_selfcontained",
3585 key: "myapex.key",
3586 native_shared_libs: ["lib_dep", "libfoo"],
3587 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003588 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003589 }
3590
3591 apex_key {
3592 name: "myapex.key",
3593 public_key: "testkey.avbpubkey",
3594 private_key: "testkey.pem",
3595 }
3596
3597 cc_library {
3598 name: "lib_nodep",
3599 srcs: ["mylib.cpp"],
3600 system_shared_libs: [],
3601 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003602 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003603 }
3604
3605 cc_library {
3606 name: "lib_dep",
3607 srcs: ["mylib.cpp"],
3608 shared_libs: ["libfoo"],
3609 system_shared_libs: [],
3610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003611 apex_available: [
3612 "myapex_dep",
3613 "myapex_provider",
3614 "myapex_selfcontained",
3615 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003616 }
3617
3618 cc_library {
3619 name: "libfoo",
3620 srcs: ["mytest.cpp"],
3621 stubs: {
3622 versions: ["1"],
3623 },
3624 system_shared_libs: [],
3625 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003626 apex_available: [
3627 "myapex_provider",
3628 "myapex_selfcontained",
3629 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003630 }
3631 `)
3632
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003633 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003634 var provideNativeLibs, requireNativeLibs []string
3635
Sundong Ahnabb64432019-10-22 13:58:29 +09003636 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003637 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3638 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003639 ensureListEmpty(t, provideNativeLibs)
3640 ensureListEmpty(t, requireNativeLibs)
3641
Sundong Ahnabb64432019-10-22 13:58:29 +09003642 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003643 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3644 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003645 ensureListEmpty(t, provideNativeLibs)
3646 ensureListContains(t, requireNativeLibs, "libfoo.so")
3647
Sundong Ahnabb64432019-10-22 13:58:29 +09003648 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003649 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3650 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003651 ensureListContains(t, provideNativeLibs, "libfoo.so")
3652 ensureListEmpty(t, requireNativeLibs)
3653
Sundong Ahnabb64432019-10-22 13:58:29 +09003654 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003655 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3656 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003657 ensureListContains(t, provideNativeLibs, "libfoo.so")
3658 ensureListEmpty(t, requireNativeLibs)
3659}
3660
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003661func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003662 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003663 apex {
3664 name: "myapex",
3665 key: "myapex.key",
3666 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003667 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003668 }
3669
3670 apex_key {
3671 name: "myapex.key",
3672 public_key: "testkey.avbpubkey",
3673 private_key: "testkey.pem",
3674 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003675
3676 cc_library {
3677 name: "mylib",
3678 srcs: ["mylib.cpp"],
3679 system_shared_libs: [],
3680 stl: "none",
3681 apex_available: [
3682 "//apex_available:platform",
3683 "myapex",
3684 ],
3685 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003686 `)
3687
Sundong Ahnabb64432019-10-22 13:58:29 +09003688 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003689 apexManifestRule := module.Rule("apexManifestRule")
3690 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3691 apexRule := module.Rule("apexRule")
3692 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003693
3694 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3695 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3696 name := apexBundle.BaseModuleName()
3697 prefix := "TARGET_"
3698 var builder strings.Builder
3699 data.Custom(&builder, name, prefix, "", data)
3700 androidMk := builder.String()
3701 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3702 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003703}
3704
Alex Light0851b882019-02-07 13:20:53 -08003705func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003706 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003707 apex {
3708 name: "myapex",
3709 key: "myapex.key",
3710 native_shared_libs: ["mylib_common"],
3711 }
3712
3713 apex_key {
3714 name: "myapex.key",
3715 public_key: "testkey.avbpubkey",
3716 private_key: "testkey.pem",
3717 }
3718
3719 cc_library {
3720 name: "mylib_common",
3721 srcs: ["mylib.cpp"],
3722 system_shared_libs: [],
3723 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003724 apex_available: [
3725 "//apex_available:platform",
3726 "myapex",
3727 ],
Alex Light0851b882019-02-07 13:20:53 -08003728 }
3729 `)
3730
Sundong Ahnabb64432019-10-22 13:58:29 +09003731 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003732 apexRule := module.Rule("apexRule")
3733 copyCmds := apexRule.Args["copy_commands"]
3734
3735 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3736 t.Log("Apex was a test apex!")
3737 t.Fail()
3738 }
3739 // Ensure that main rule creates an output
3740 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3741
3742 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003743 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003744
3745 // Ensure that both direct and indirect deps are copied into apex
3746 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3747
Colin Cross7113d202019-11-20 16:39:12 -08003748 // Ensure that the platform variant ends with _shared
3749 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003750
Colin Cross56a83212020-09-15 18:30:11 -07003751 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003752 t.Log("Found mylib_common not in any apex!")
3753 t.Fail()
3754 }
3755}
3756
3757func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003758 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003759 apex_test {
3760 name: "myapex",
3761 key: "myapex.key",
3762 native_shared_libs: ["mylib_common_test"],
3763 }
3764
3765 apex_key {
3766 name: "myapex.key",
3767 public_key: "testkey.avbpubkey",
3768 private_key: "testkey.pem",
3769 }
3770
3771 cc_library {
3772 name: "mylib_common_test",
3773 srcs: ["mylib.cpp"],
3774 system_shared_libs: [],
3775 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003776 // TODO: remove //apex_available:platform
3777 apex_available: [
3778 "//apex_available:platform",
3779 "myapex",
3780 ],
Alex Light0851b882019-02-07 13:20:53 -08003781 }
3782 `)
3783
Sundong Ahnabb64432019-10-22 13:58:29 +09003784 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003785 apexRule := module.Rule("apexRule")
3786 copyCmds := apexRule.Args["copy_commands"]
3787
3788 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3789 t.Log("Apex was not a test apex!")
3790 t.Fail()
3791 }
3792 // Ensure that main rule creates an output
3793 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3794
3795 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003796 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003797
3798 // Ensure that both direct and indirect deps are copied into apex
3799 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3800
Colin Cross7113d202019-11-20 16:39:12 -08003801 // Ensure that the platform variant ends with _shared
3802 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003803}
3804
Alex Light9670d332019-01-29 18:07:33 -08003805func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003806 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003807 apex {
3808 name: "myapex",
3809 key: "myapex.key",
3810 multilib: {
3811 first: {
3812 native_shared_libs: ["mylib_common"],
3813 }
3814 },
3815 target: {
3816 android: {
3817 multilib: {
3818 first: {
3819 native_shared_libs: ["mylib"],
3820 }
3821 }
3822 },
3823 host: {
3824 multilib: {
3825 first: {
3826 native_shared_libs: ["mylib2"],
3827 }
3828 }
3829 }
3830 }
3831 }
3832
3833 apex_key {
3834 name: "myapex.key",
3835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
3839 cc_library {
3840 name: "mylib",
3841 srcs: ["mylib.cpp"],
3842 system_shared_libs: [],
3843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003844 // TODO: remove //apex_available:platform
3845 apex_available: [
3846 "//apex_available:platform",
3847 "myapex",
3848 ],
Alex Light9670d332019-01-29 18:07:33 -08003849 }
3850
3851 cc_library {
3852 name: "mylib_common",
3853 srcs: ["mylib.cpp"],
3854 system_shared_libs: [],
3855 stl: "none",
3856 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003857 // TODO: remove //apex_available:platform
3858 apex_available: [
3859 "//apex_available:platform",
3860 "myapex",
3861 ],
Alex Light9670d332019-01-29 18:07:33 -08003862 }
3863
3864 cc_library {
3865 name: "mylib2",
3866 srcs: ["mylib.cpp"],
3867 system_shared_libs: [],
3868 stl: "none",
3869 compile_multilib: "first",
3870 }
3871 `)
3872
Sundong Ahnabb64432019-10-22 13:58:29 +09003873 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003874 copyCmds := apexRule.Args["copy_commands"]
3875
3876 // Ensure that main rule creates an output
3877 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3878
3879 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003880 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3881 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3882 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003883
3884 // Ensure that both direct and indirect deps are copied into apex
3885 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3886 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3887 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3888
Colin Cross7113d202019-11-20 16:39:12 -08003889 // Ensure that the platform variant ends with _shared
3890 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3891 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3892 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003893}
Jiyong Park04480cf2019-02-06 00:16:29 +09003894
Jiyong Park59140302020-12-14 18:44:04 +09003895func TestApexWithArch(t *testing.T) {
3896 ctx, _ := testApex(t, `
3897 apex {
3898 name: "myapex",
3899 key: "myapex.key",
3900 arch: {
3901 arm64: {
3902 native_shared_libs: ["mylib.arm64"],
3903 },
3904 x86_64: {
3905 native_shared_libs: ["mylib.x64"],
3906 },
3907 }
3908 }
3909
3910 apex_key {
3911 name: "myapex.key",
3912 public_key: "testkey.avbpubkey",
3913 private_key: "testkey.pem",
3914 }
3915
3916 cc_library {
3917 name: "mylib.arm64",
3918 srcs: ["mylib.cpp"],
3919 system_shared_libs: [],
3920 stl: "none",
3921 // TODO: remove //apex_available:platform
3922 apex_available: [
3923 "//apex_available:platform",
3924 "myapex",
3925 ],
3926 }
3927
3928 cc_library {
3929 name: "mylib.x64",
3930 srcs: ["mylib.cpp"],
3931 system_shared_libs: [],
3932 stl: "none",
3933 // TODO: remove //apex_available:platform
3934 apex_available: [
3935 "//apex_available:platform",
3936 "myapex",
3937 ],
3938 }
3939 `)
3940
3941 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
3942 copyCmds := apexRule.Args["copy_commands"]
3943
3944 // Ensure that apex variant is created for the direct dep
3945 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
3946 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
3947
3948 // Ensure that both direct and indirect deps are copied into apex
3949 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
3950 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
3951}
3952
Jiyong Park04480cf2019-02-06 00:16:29 +09003953func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003954 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003955 apex {
3956 name: "myapex",
3957 key: "myapex.key",
3958 binaries: ["myscript"],
3959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
3967 sh_binary {
3968 name: "myscript",
3969 src: "mylib.cpp",
3970 filename: "myscript.sh",
3971 sub_dir: "script",
3972 }
3973 `)
3974
Sundong Ahnabb64432019-10-22 13:58:29 +09003975 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003976 copyCmds := apexRule.Args["copy_commands"]
3977
3978 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3979}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003980
Jooyung Han91df2082019-11-20 01:49:42 +09003981func TestApexInVariousPartition(t *testing.T) {
3982 testcases := []struct {
3983 propName, parition, flattenedPartition string
3984 }{
3985 {"", "system", "system_ext"},
3986 {"product_specific: true", "product", "product"},
3987 {"soc_specific: true", "vendor", "vendor"},
3988 {"proprietary: true", "vendor", "vendor"},
3989 {"vendor: true", "vendor", "vendor"},
3990 {"system_ext_specific: true", "system_ext", "system_ext"},
3991 }
3992 for _, tc := range testcases {
3993 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3994 ctx, _ := testApex(t, `
3995 apex {
3996 name: "myapex",
3997 key: "myapex.key",
3998 `+tc.propName+`
3999 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004000
Jooyung Han91df2082019-11-20 01:49:42 +09004001 apex_key {
4002 name: "myapex.key",
4003 public_key: "testkey.avbpubkey",
4004 private_key: "testkey.pem",
4005 }
4006 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004007
Jooyung Han91df2082019-11-20 01:49:42 +09004008 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4009 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4010 actual := apex.installDir.String()
4011 if actual != expected {
4012 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4013 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004014
Jooyung Han91df2082019-11-20 01:49:42 +09004015 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4016 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4017 actual = flattened.installDir.String()
4018 if actual != expected {
4019 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4020 }
4021 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004022 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004023}
Jiyong Park67882562019-03-21 01:11:21 +09004024
Jooyung Han580eb4f2020-06-24 19:33:06 +09004025func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004026 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004027 apex {
4028 name: "myapex",
4029 key: "myapex.key",
4030 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031
Jooyung Han580eb4f2020-06-24 19:33:06 +09004032 apex_key {
4033 name: "myapex.key",
4034 public_key: "testkey.avbpubkey",
4035 private_key: "testkey.pem",
4036 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004037 `)
4038 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004039 rule := module.Output("file_contexts")
4040 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4041}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004042
Jooyung Han580eb4f2020-06-24 19:33:06 +09004043func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004044 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004045 apex {
4046 name: "myapex",
4047 key: "myapex.key",
4048 file_contexts: "my_own_file_contexts",
4049 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004050
Jooyung Han580eb4f2020-06-24 19:33:06 +09004051 apex_key {
4052 name: "myapex.key",
4053 public_key: "testkey.avbpubkey",
4054 private_key: "testkey.pem",
4055 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004056 `, withFiles(map[string][]byte{
4057 "my_own_file_contexts": nil,
4058 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004059}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060
Jooyung Han580eb4f2020-06-24 19:33:06 +09004061func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004062 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004063 apex {
4064 name: "myapex",
4065 key: "myapex.key",
4066 product_specific: true,
4067 file_contexts: "product_specific_file_contexts",
4068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004069
Jooyung Han580eb4f2020-06-24 19:33:06 +09004070 apex_key {
4071 name: "myapex.key",
4072 public_key: "testkey.avbpubkey",
4073 private_key: "testkey.pem",
4074 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004075 `)
4076
Jooyung Han580eb4f2020-06-24 19:33:06 +09004077 ctx, _ := testApex(t, `
4078 apex {
4079 name: "myapex",
4080 key: "myapex.key",
4081 product_specific: true,
4082 file_contexts: "product_specific_file_contexts",
4083 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004084
Jooyung Han580eb4f2020-06-24 19:33:06 +09004085 apex_key {
4086 name: "myapex.key",
4087 public_key: "testkey.avbpubkey",
4088 private_key: "testkey.pem",
4089 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004090 `, withFiles(map[string][]byte{
4091 "product_specific_file_contexts": nil,
4092 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004093 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4094 rule := module.Output("file_contexts")
4095 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4096}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004097
Jooyung Han580eb4f2020-06-24 19:33:06 +09004098func TestFileContexts_SetViaFileGroup(t *testing.T) {
4099 ctx, _ := testApex(t, `
4100 apex {
4101 name: "myapex",
4102 key: "myapex.key",
4103 product_specific: true,
4104 file_contexts: ":my-file-contexts",
4105 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004106
Jooyung Han580eb4f2020-06-24 19:33:06 +09004107 apex_key {
4108 name: "myapex.key",
4109 public_key: "testkey.avbpubkey",
4110 private_key: "testkey.pem",
4111 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004112
Jooyung Han580eb4f2020-06-24 19:33:06 +09004113 filegroup {
4114 name: "my-file-contexts",
4115 srcs: ["product_specific_file_contexts"],
4116 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004117 `, withFiles(map[string][]byte{
4118 "product_specific_file_contexts": nil,
4119 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004120 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4121 rule := module.Output("file_contexts")
4122 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004123}
4124
Jiyong Park67882562019-03-21 01:11:21 +09004125func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004126 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004127 apex_key {
4128 name: "myapex.key",
4129 public_key: ":my.avbpubkey",
4130 private_key: ":my.pem",
4131 product_specific: true,
4132 }
4133
4134 filegroup {
4135 name: "my.avbpubkey",
4136 srcs: ["testkey2.avbpubkey"],
4137 }
4138
4139 filegroup {
4140 name: "my.pem",
4141 srcs: ["testkey2.pem"],
4142 }
4143 `)
4144
4145 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4146 expected_pubkey := "testkey2.avbpubkey"
4147 actual_pubkey := apex_key.public_key_file.String()
4148 if actual_pubkey != expected_pubkey {
4149 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4150 }
4151 expected_privkey := "testkey2.pem"
4152 actual_privkey := apex_key.private_key_file.String()
4153 if actual_privkey != expected_privkey {
4154 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4155 }
4156}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004157
4158func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004159 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004160 prebuilt_apex {
4161 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004162 arch: {
4163 arm64: {
4164 src: "myapex-arm64.apex",
4165 },
4166 arm: {
4167 src: "myapex-arm.apex",
4168 },
4169 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004170 }
4171 `)
4172
4173 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4174
Jiyong Parkc95714e2019-03-29 14:23:10 +09004175 expectedInput := "myapex-arm64.apex"
4176 if prebuilt.inputApex.String() != expectedInput {
4177 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4178 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004179}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004180
4181func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004182 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004183 prebuilt_apex {
4184 name: "myapex",
4185 src: "myapex-arm.apex",
4186 filename: "notmyapex.apex",
4187 }
4188 `)
4189
4190 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4191
4192 expected := "notmyapex.apex"
4193 if p.installFilename != expected {
4194 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4195 }
4196}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004197
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004198func TestPrebuiltOverrides(t *testing.T) {
4199 ctx, config := testApex(t, `
4200 prebuilt_apex {
4201 name: "myapex.prebuilt",
4202 src: "myapex-arm.apex",
4203 overrides: [
4204 "myapex",
4205 ],
4206 }
4207 `)
4208
4209 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4210
4211 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004212 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004213 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004214 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004215 }
4216}
4217
Roland Levillain630846d2019-06-26 12:48:34 +01004218func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004219 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004220 apex_test {
4221 name: "myapex",
4222 key: "myapex.key",
4223 tests: [
4224 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004225 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004226 ],
4227 }
4228
4229 apex_key {
4230 name: "myapex.key",
4231 public_key: "testkey.avbpubkey",
4232 private_key: "testkey.pem",
4233 }
4234
Liz Kammer1c14a212020-05-12 15:26:55 -07004235 filegroup {
4236 name: "fg",
4237 srcs: [
4238 "baz",
4239 "bar/baz"
4240 ],
4241 }
4242
Roland Levillain630846d2019-06-26 12:48:34 +01004243 cc_test {
4244 name: "mytest",
4245 gtest: false,
4246 srcs: ["mytest.cpp"],
4247 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004248 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004249 system_shared_libs: [],
4250 static_executable: true,
4251 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004252 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004253 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004254
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004255 cc_library {
4256 name: "mylib",
4257 srcs: ["mylib.cpp"],
4258 system_shared_libs: [],
4259 stl: "none",
4260 }
4261
Liz Kammer5bd365f2020-05-27 15:15:11 -07004262 filegroup {
4263 name: "fg2",
4264 srcs: [
4265 "testdata/baz"
4266 ],
4267 }
4268
Roland Levillain9b5fde92019-06-28 15:41:19 +01004269 cc_test {
4270 name: "mytests",
4271 gtest: false,
4272 srcs: [
4273 "mytest1.cpp",
4274 "mytest2.cpp",
4275 "mytest3.cpp",
4276 ],
4277 test_per_src: true,
4278 relative_install_path: "test",
4279 system_shared_libs: [],
4280 static_executable: true,
4281 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004282 data: [
4283 ":fg",
4284 ":fg2",
4285 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004286 }
Roland Levillain630846d2019-06-26 12:48:34 +01004287 `)
4288
Sundong Ahnabb64432019-10-22 13:58:29 +09004289 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004290 copyCmds := apexRule.Args["copy_commands"]
4291
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004292 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004293 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004294 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004295
Liz Kammer1c14a212020-05-12 15:26:55 -07004296 //Ensure that test data are copied into apex.
4297 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4298 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4299
Roland Levillain9b5fde92019-06-28 15:41:19 +01004300 // Ensure that test deps built with `test_per_src` are copied into apex.
4301 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4302 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4303 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004304
4305 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004306 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4307 data := android.AndroidMkDataForTest(t, config, "", bundle)
4308 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004309 prefix := "TARGET_"
4310 var builder strings.Builder
4311 data.Custom(&builder, name, prefix, "", data)
4312 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004313 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4314 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4315 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4316 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004317 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004318 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004319 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004320
4321 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4322 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4323 data.Custom(&builder, name, prefix, "", data)
4324 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004325 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4326 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004327}
4328
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004329func TestInstallExtraFlattenedApexes(t *testing.T) {
4330 ctx, config := testApex(t, `
4331 apex {
4332 name: "myapex",
4333 key: "myapex.key",
4334 }
4335 apex_key {
4336 name: "myapex.key",
4337 public_key: "testkey.avbpubkey",
4338 private_key: "testkey.pem",
4339 }
4340 `, func(fs map[string][]byte, config android.Config) {
4341 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4342 })
4343 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004344 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004345 mk := android.AndroidMkDataForTest(t, config, "", ab)
4346 var builder strings.Builder
4347 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4348 androidMk := builder.String()
4349 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4350}
4351
Jooyung Hand48f3c32019-08-23 11:18:57 +09004352func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4353 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4354 apex {
4355 name: "myapex",
4356 key: "myapex.key",
4357 native_shared_libs: ["libfoo"],
4358 }
4359
4360 apex_key {
4361 name: "myapex.key",
4362 public_key: "testkey.avbpubkey",
4363 private_key: "testkey.pem",
4364 }
4365
4366 cc_library {
4367 name: "libfoo",
4368 stl: "none",
4369 system_shared_libs: [],
4370 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004371 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004372 }
4373 `)
4374 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4375 apex {
4376 name: "myapex",
4377 key: "myapex.key",
4378 java_libs: ["myjar"],
4379 }
4380
4381 apex_key {
4382 name: "myapex.key",
4383 public_key: "testkey.avbpubkey",
4384 private_key: "testkey.pem",
4385 }
4386
4387 java_library {
4388 name: "myjar",
4389 srcs: ["foo/bar/MyClass.java"],
4390 sdk_version: "none",
4391 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004392 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004393 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004394 }
4395 `)
4396}
4397
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004398func TestApexWithApps(t *testing.T) {
4399 ctx, _ := testApex(t, `
4400 apex {
4401 name: "myapex",
4402 key: "myapex.key",
4403 apps: [
4404 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004405 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004406 ],
4407 }
4408
4409 apex_key {
4410 name: "myapex.key",
4411 public_key: "testkey.avbpubkey",
4412 private_key: "testkey.pem",
4413 }
4414
4415 android_app {
4416 name: "AppFoo",
4417 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004418 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004419 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004420 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004421 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004422 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004423 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004424
4425 android_app {
4426 name: "AppFooPriv",
4427 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004428 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004429 system_modules: "none",
4430 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004431 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004432 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004433 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004434
4435 cc_library_shared {
4436 name: "libjni",
4437 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004438 shared_libs: ["libfoo"],
4439 stl: "none",
4440 system_shared_libs: [],
4441 apex_available: [ "myapex" ],
4442 sdk_version: "current",
4443 }
4444
4445 cc_library_shared {
4446 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004447 stl: "none",
4448 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004449 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004450 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004451 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004452 `)
4453
Sundong Ahnabb64432019-10-22 13:58:29 +09004454 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004455 apexRule := module.Rule("apexRule")
4456 copyCmds := apexRule.Args["copy_commands"]
4457
4458 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004459 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004460
Colin Crossaede88c2020-08-11 12:17:01 -07004461 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004462 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004463 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004464 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004465 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004466 // JNI libraries including transitive deps are
4467 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004468 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004469 // ... embedded inside APK (jnilibs.zip)
4470 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4471 // ... and not directly inside the APEX
4472 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4473 }
Dario Frenicde2a032019-10-27 00:29:22 +01004474}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004475
Dario Frenicde2a032019-10-27 00:29:22 +01004476func TestApexWithAppImports(t *testing.T) {
4477 ctx, _ := testApex(t, `
4478 apex {
4479 name: "myapex",
4480 key: "myapex.key",
4481 apps: [
4482 "AppFooPrebuilt",
4483 "AppFooPrivPrebuilt",
4484 ],
4485 }
4486
4487 apex_key {
4488 name: "myapex.key",
4489 public_key: "testkey.avbpubkey",
4490 private_key: "testkey.pem",
4491 }
4492
4493 android_app_import {
4494 name: "AppFooPrebuilt",
4495 apk: "PrebuiltAppFoo.apk",
4496 presigned: true,
4497 dex_preopt: {
4498 enabled: false,
4499 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004500 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004501 }
4502
4503 android_app_import {
4504 name: "AppFooPrivPrebuilt",
4505 apk: "PrebuiltAppFooPriv.apk",
4506 privileged: true,
4507 presigned: true,
4508 dex_preopt: {
4509 enabled: false,
4510 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004511 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004512 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004513 }
4514 `)
4515
Sundong Ahnabb64432019-10-22 13:58:29 +09004516 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004517 apexRule := module.Rule("apexRule")
4518 copyCmds := apexRule.Args["copy_commands"]
4519
4520 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004521 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4522}
4523
4524func TestApexWithAppImportsPrefer(t *testing.T) {
4525 ctx, _ := testApex(t, `
4526 apex {
4527 name: "myapex",
4528 key: "myapex.key",
4529 apps: [
4530 "AppFoo",
4531 ],
4532 }
4533
4534 apex_key {
4535 name: "myapex.key",
4536 public_key: "testkey.avbpubkey",
4537 private_key: "testkey.pem",
4538 }
4539
4540 android_app {
4541 name: "AppFoo",
4542 srcs: ["foo/bar/MyClass.java"],
4543 sdk_version: "none",
4544 system_modules: "none",
4545 apex_available: [ "myapex" ],
4546 }
4547
4548 android_app_import {
4549 name: "AppFoo",
4550 apk: "AppFooPrebuilt.apk",
4551 filename: "AppFooPrebuilt.apk",
4552 presigned: true,
4553 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004554 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004555 }
4556 `, withFiles(map[string][]byte{
4557 "AppFooPrebuilt.apk": nil,
4558 }))
4559
4560 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4561 "app/AppFoo/AppFooPrebuilt.apk",
4562 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004563}
4564
Dario Freni6f3937c2019-12-20 22:58:03 +00004565func TestApexWithTestHelperApp(t *testing.T) {
4566 ctx, _ := testApex(t, `
4567 apex {
4568 name: "myapex",
4569 key: "myapex.key",
4570 apps: [
4571 "TesterHelpAppFoo",
4572 ],
4573 }
4574
4575 apex_key {
4576 name: "myapex.key",
4577 public_key: "testkey.avbpubkey",
4578 private_key: "testkey.pem",
4579 }
4580
4581 android_test_helper_app {
4582 name: "TesterHelpAppFoo",
4583 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004584 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004585 }
4586
4587 `)
4588
4589 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4590 apexRule := module.Rule("apexRule")
4591 copyCmds := apexRule.Args["copy_commands"]
4592
4593 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4594}
4595
Jooyung Han18020ea2019-11-13 10:50:48 +09004596func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4597 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004598 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004599 apex {
4600 name: "myapex",
4601 key: "myapex.key",
4602 native_shared_libs: ["libfoo"],
4603 }
4604
4605 apex_key {
4606 name: "myapex.key",
4607 public_key: "testkey.avbpubkey",
4608 private_key: "testkey.pem",
4609 }
4610
4611 apex {
4612 name: "otherapex",
4613 key: "myapex.key",
4614 native_shared_libs: ["libfoo"],
4615 }
4616
4617 cc_defaults {
4618 name: "libfoo-defaults",
4619 apex_available: ["otherapex"],
4620 }
4621
4622 cc_library {
4623 name: "libfoo",
4624 defaults: ["libfoo-defaults"],
4625 stl: "none",
4626 system_shared_libs: [],
4627 }`)
4628}
4629
Paul Duffine52e66f2020-03-30 17:54:29 +01004630func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004631 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004632 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004633 apex {
4634 name: "myapex",
4635 key: "myapex.key",
4636 native_shared_libs: ["libfoo"],
4637 }
4638
4639 apex_key {
4640 name: "myapex.key",
4641 public_key: "testkey.avbpubkey",
4642 private_key: "testkey.pem",
4643 }
4644
4645 apex {
4646 name: "otherapex",
4647 key: "otherapex.key",
4648 native_shared_libs: ["libfoo"],
4649 }
4650
4651 apex_key {
4652 name: "otherapex.key",
4653 public_key: "testkey.avbpubkey",
4654 private_key: "testkey.pem",
4655 }
4656
4657 cc_library {
4658 name: "libfoo",
4659 stl: "none",
4660 system_shared_libs: [],
4661 apex_available: ["otherapex"],
4662 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004663}
Jiyong Park127b40b2019-09-30 16:04:35 +09004664
Paul Duffine52e66f2020-03-30 17:54:29 +01004665func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004666 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004667 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004668.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004669.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004670.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004671.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004672.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004673.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004674 apex {
4675 name: "myapex",
4676 key: "myapex.key",
4677 native_shared_libs: ["libfoo"],
4678 }
4679
4680 apex_key {
4681 name: "myapex.key",
4682 public_key: "testkey.avbpubkey",
4683 private_key: "testkey.pem",
4684 }
4685
Jiyong Park127b40b2019-09-30 16:04:35 +09004686 cc_library {
4687 name: "libfoo",
4688 stl: "none",
4689 shared_libs: ["libbar"],
4690 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004691 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004692 }
4693
4694 cc_library {
4695 name: "libbar",
4696 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004697 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004698 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004699 apex_available: ["myapex"],
4700 }
4701
4702 cc_library {
4703 name: "libbaz",
4704 stl: "none",
4705 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004706 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004707}
Jiyong Park127b40b2019-09-30 16:04:35 +09004708
Paul Duffine52e66f2020-03-30 17:54:29 +01004709func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004710 testApexError(t, "\"otherapex\" is not a valid module name", `
4711 apex {
4712 name: "myapex",
4713 key: "myapex.key",
4714 native_shared_libs: ["libfoo"],
4715 }
4716
4717 apex_key {
4718 name: "myapex.key",
4719 public_key: "testkey.avbpubkey",
4720 private_key: "testkey.pem",
4721 }
4722
4723 cc_library {
4724 name: "libfoo",
4725 stl: "none",
4726 system_shared_libs: [],
4727 apex_available: ["otherapex"],
4728 }`)
4729
Paul Duffine52e66f2020-03-30 17:54:29 +01004730 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004731 apex {
4732 name: "myapex",
4733 key: "myapex.key",
4734 native_shared_libs: ["libfoo", "libbar"],
4735 }
4736
4737 apex_key {
4738 name: "myapex.key",
4739 public_key: "testkey.avbpubkey",
4740 private_key: "testkey.pem",
4741 }
4742
4743 cc_library {
4744 name: "libfoo",
4745 stl: "none",
4746 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004747 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004748 apex_available: ["myapex"],
4749 }
4750
4751 cc_library {
4752 name: "libbar",
4753 stl: "none",
4754 system_shared_libs: [],
4755 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004756 }
4757
4758 cc_library {
4759 name: "libbaz",
4760 stl: "none",
4761 system_shared_libs: [],
4762 stubs: {
4763 versions: ["10", "20", "30"],
4764 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004765 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004766}
Jiyong Park127b40b2019-09-30 16:04:35 +09004767
Jiyong Park89e850a2020-04-07 16:37:39 +09004768func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004769 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004770 apex {
4771 name: "myapex",
4772 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004773 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004774 }
4775
4776 apex_key {
4777 name: "myapex.key",
4778 public_key: "testkey.avbpubkey",
4779 private_key: "testkey.pem",
4780 }
4781
4782 cc_library {
4783 name: "libfoo",
4784 stl: "none",
4785 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004786 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004787 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004788 }
4789
4790 cc_library {
4791 name: "libfoo2",
4792 stl: "none",
4793 system_shared_libs: [],
4794 shared_libs: ["libbaz"],
4795 apex_available: ["//apex_available:platform"],
4796 }
4797
4798 cc_library {
4799 name: "libbar",
4800 stl: "none",
4801 system_shared_libs: [],
4802 apex_available: ["myapex"],
4803 }
4804
4805 cc_library {
4806 name: "libbaz",
4807 stl: "none",
4808 system_shared_libs: [],
4809 apex_available: ["myapex"],
4810 stubs: {
4811 versions: ["1"],
4812 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004813 }`)
4814
Jiyong Park89e850a2020-04-07 16:37:39 +09004815 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4816 // because it depends on libbar which isn't available to platform
4817 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4818 if libfoo.NotAvailableForPlatform() != true {
4819 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4820 }
4821
4822 // libfoo2 however can be available to platform because it depends on libbaz which provides
4823 // stubs
4824 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4825 if libfoo2.NotAvailableForPlatform() == true {
4826 t.Errorf("%q should be available to platform", libfoo2.String())
4827 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004828}
Jiyong Parka90ca002019-10-07 15:47:24 +09004829
Paul Duffine52e66f2020-03-30 17:54:29 +01004830func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004831 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004832 apex {
4833 name: "myapex",
4834 key: "myapex.key",
4835 native_shared_libs: ["libfoo"],
4836 }
4837
4838 apex_key {
4839 name: "myapex.key",
4840 public_key: "testkey.avbpubkey",
4841 private_key: "testkey.pem",
4842 }
4843
4844 cc_library {
4845 name: "libfoo",
4846 stl: "none",
4847 system_shared_libs: [],
4848 apex_available: ["myapex"],
4849 static: {
4850 apex_available: ["//apex_available:platform"],
4851 },
4852 }`)
4853
Jiyong Park89e850a2020-04-07 16:37:39 +09004854 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4855 if libfooShared.NotAvailableForPlatform() != true {
4856 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4857 }
4858 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4859 if libfooStatic.NotAvailableForPlatform() != false {
4860 t.Errorf("%q should be available to platform", libfooStatic.String())
4861 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004862}
4863
Jiyong Park5d790c32019-11-15 18:40:32 +09004864func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004865 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004870 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004871 }
4872
4873 override_apex {
4874 name: "override_myapex",
4875 base: "myapex",
4876 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004877 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004878 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004879 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004880 }
4881
4882 apex_key {
4883 name: "myapex.key",
4884 public_key: "testkey.avbpubkey",
4885 private_key: "testkey.pem",
4886 }
4887
4888 android_app {
4889 name: "app",
4890 srcs: ["foo/bar/MyClass.java"],
4891 package_name: "foo",
4892 sdk_version: "none",
4893 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004894 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004895 }
4896
4897 override_android_app {
4898 name: "override_app",
4899 base: "app",
4900 package_name: "bar",
4901 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004902 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004903
Jiyong Park317645e2019-12-05 13:20:58 +09004904 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4905 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4906 if originalVariant.GetOverriddenBy() != "" {
4907 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4908 }
4909 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4910 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4911 }
4912
Jiyong Park5d790c32019-11-15 18:40:32 +09004913 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4914 apexRule := module.Rule("apexRule")
4915 copyCmds := apexRule.Args["copy_commands"]
4916
4917 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004918 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004919
4920 apexBundle := module.Module().(*apexBundle)
4921 name := apexBundle.Name()
4922 if name != "override_myapex" {
4923 t.Errorf("name should be \"override_myapex\", but was %q", name)
4924 }
4925
Baligh Uddin004d7172020-02-19 21:29:28 -08004926 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4927 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4928 }
4929
Jiyong Park20bacab2020-03-03 11:45:41 +09004930 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004931 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004932
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004933 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4934 var builder strings.Builder
4935 data.Custom(&builder, name, "TARGET_", "", data)
4936 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004937 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004938 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4939 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004940 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004941 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004942 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004943 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4944 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004945}
4946
Jooyung Han214bf372019-11-12 13:03:50 +09004947func TestLegacyAndroid10Support(t *testing.T) {
4948 ctx, _ := testApex(t, `
4949 apex {
4950 name: "myapex",
4951 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004952 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004953 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004954 }
4955
4956 apex_key {
4957 name: "myapex.key",
4958 public_key: "testkey.avbpubkey",
4959 private_key: "testkey.pem",
4960 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004961
4962 cc_library {
4963 name: "mylib",
4964 srcs: ["mylib.cpp"],
4965 stl: "libc++",
4966 system_shared_libs: [],
4967 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004968 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004969 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004970 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004971
4972 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4973 args := module.Rule("apexRule").Args
4974 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004975 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004976
4977 // The copies of the libraries in the apex should have one more dependency than
4978 // the ones outside the apex, namely the unwinder. Ideally we should check
4979 // the dependency names directly here but for some reason the names are blank in
4980 // this test.
4981 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004982 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004983 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4984 if len(apexImplicits) != len(nonApexImplicits)+1 {
4985 t.Errorf("%q missing unwinder dep", lib)
4986 }
4987 }
Jooyung Han214bf372019-11-12 13:03:50 +09004988}
4989
Paul Duffin9b879592020-05-26 13:21:35 +01004990var filesForSdkLibrary = map[string][]byte{
4991 "api/current.txt": nil,
4992 "api/removed.txt": nil,
4993 "api/system-current.txt": nil,
4994 "api/system-removed.txt": nil,
4995 "api/test-current.txt": nil,
4996 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004997
Anton Hanssondff2c782020-12-21 17:10:01 +00004998 "100/public/api/foo.txt": nil,
4999 "100/public/api/foo-removed.txt": nil,
5000 "100/system/api/foo.txt": nil,
5001 "100/system/api/foo-removed.txt": nil,
5002
Paul Duffineedc5d52020-06-12 17:46:39 +01005003 // For java_sdk_library_import
5004 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005005}
5006
Jooyung Han58f26ab2019-12-18 15:34:32 +09005007func TestJavaSDKLibrary(t *testing.T) {
5008 ctx, _ := testApex(t, `
5009 apex {
5010 name: "myapex",
5011 key: "myapex.key",
5012 java_libs: ["foo"],
5013 }
5014
5015 apex_key {
5016 name: "myapex.key",
5017 public_key: "testkey.avbpubkey",
5018 private_key: "testkey.pem",
5019 }
5020
5021 java_sdk_library {
5022 name: "foo",
5023 srcs: ["a.java"],
5024 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005025 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005026 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005027
5028 prebuilt_apis {
5029 name: "sdk",
5030 api_dirs: ["100"],
5031 }
Paul Duffin9b879592020-05-26 13:21:35 +01005032 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005033
5034 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005035 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005036 "javalib/foo.jar",
5037 "etc/permissions/foo.xml",
5038 })
5039 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005040 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5041 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005042}
5043
Paul Duffin9b879592020-05-26 13:21:35 +01005044func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5045 ctx, _ := testApex(t, `
5046 apex {
5047 name: "myapex",
5048 key: "myapex.key",
5049 java_libs: ["foo", "bar"],
5050 }
5051
5052 apex_key {
5053 name: "myapex.key",
5054 public_key: "testkey.avbpubkey",
5055 private_key: "testkey.pem",
5056 }
5057
5058 java_sdk_library {
5059 name: "foo",
5060 srcs: ["a.java"],
5061 api_packages: ["foo"],
5062 apex_available: ["myapex"],
5063 sdk_version: "none",
5064 system_modules: "none",
5065 }
5066
5067 java_library {
5068 name: "bar",
5069 srcs: ["a.java"],
5070 libs: ["foo"],
5071 apex_available: ["myapex"],
5072 sdk_version: "none",
5073 system_modules: "none",
5074 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005075
5076 prebuilt_apis {
5077 name: "sdk",
5078 api_dirs: ["100"],
5079 }
Paul Duffin9b879592020-05-26 13:21:35 +01005080 `, withFiles(filesForSdkLibrary))
5081
5082 // java_sdk_library installs both impl jar and permission XML
5083 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5084 "javalib/bar.jar",
5085 "javalib/foo.jar",
5086 "etc/permissions/foo.xml",
5087 })
5088
5089 // The bar library should depend on the implementation jar.
5090 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5091 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5092 t.Errorf("expected %q, found %#q", expected, actual)
5093 }
5094}
5095
5096func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5097 ctx, _ := testApex(t, `
5098 apex {
5099 name: "myapex",
5100 key: "myapex.key",
5101 java_libs: ["foo"],
5102 }
5103
5104 apex_key {
5105 name: "myapex.key",
5106 public_key: "testkey.avbpubkey",
5107 private_key: "testkey.pem",
5108 }
5109
5110 java_sdk_library {
5111 name: "foo",
5112 srcs: ["a.java"],
5113 api_packages: ["foo"],
5114 apex_available: ["myapex"],
5115 sdk_version: "none",
5116 system_modules: "none",
5117 }
5118
5119 java_library {
5120 name: "bar",
5121 srcs: ["a.java"],
5122 libs: ["foo"],
5123 sdk_version: "none",
5124 system_modules: "none",
5125 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005126
5127 prebuilt_apis {
5128 name: "sdk",
5129 api_dirs: ["100"],
5130 }
Paul Duffin9b879592020-05-26 13:21:35 +01005131 `, withFiles(filesForSdkLibrary))
5132
5133 // java_sdk_library installs both impl jar and permission XML
5134 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5135 "javalib/foo.jar",
5136 "etc/permissions/foo.xml",
5137 })
5138
5139 // The bar library should depend on the stubs jar.
5140 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5141 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5142 t.Errorf("expected %q, found %#q", expected, actual)
5143 }
5144}
5145
Paul Duffineedc5d52020-06-12 17:46:39 +01005146func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Anton Hanssondff2c782020-12-21 17:10:01 +00005147 ctx, _ := testApex(t, `
5148 prebuilt_apis {
5149 name: "sdk",
5150 api_dirs: ["100"],
5151 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005152 withFiles(map[string][]byte{
5153 "apex/a.java": nil,
5154 "apex/apex_manifest.json": nil,
5155 "apex/Android.bp": []byte(`
5156 package {
5157 default_visibility: ["//visibility:private"],
5158 }
5159
5160 apex {
5161 name: "myapex",
5162 key: "myapex.key",
5163 java_libs: ["foo", "bar"],
5164 }
5165
5166 apex_key {
5167 name: "myapex.key",
5168 public_key: "testkey.avbpubkey",
5169 private_key: "testkey.pem",
5170 }
5171
5172 java_library {
5173 name: "bar",
5174 srcs: ["a.java"],
5175 libs: ["foo"],
5176 apex_available: ["myapex"],
5177 sdk_version: "none",
5178 system_modules: "none",
5179 }
5180`),
5181 "source/a.java": nil,
5182 "source/api/current.txt": nil,
5183 "source/api/removed.txt": nil,
5184 "source/Android.bp": []byte(`
5185 package {
5186 default_visibility: ["//visibility:private"],
5187 }
5188
5189 java_sdk_library {
5190 name: "foo",
5191 visibility: ["//apex"],
5192 srcs: ["a.java"],
5193 api_packages: ["foo"],
5194 apex_available: ["myapex"],
5195 sdk_version: "none",
5196 system_modules: "none",
5197 public: {
5198 enabled: true,
5199 },
5200 }
5201`),
5202 "prebuilt/a.jar": nil,
5203 "prebuilt/Android.bp": []byte(`
5204 package {
5205 default_visibility: ["//visibility:private"],
5206 }
5207
5208 java_sdk_library_import {
5209 name: "foo",
5210 visibility: ["//apex", "//source"],
5211 apex_available: ["myapex"],
5212 prefer: true,
5213 public: {
5214 jars: ["a.jar"],
5215 },
5216 }
5217`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005218 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005219 )
5220
5221 // java_sdk_library installs both impl jar and permission XML
5222 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5223 "javalib/bar.jar",
5224 "javalib/foo.jar",
5225 "etc/permissions/foo.xml",
5226 })
5227
5228 // The bar library should depend on the implementation jar.
5229 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5230 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5231 t.Errorf("expected %q, found %#q", expected, actual)
5232 }
5233}
5234
5235func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5236 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5237 apex {
5238 name: "myapex",
5239 key: "myapex.key",
5240 java_libs: ["foo"],
5241 }
5242
5243 apex_key {
5244 name: "myapex.key",
5245 public_key: "testkey.avbpubkey",
5246 private_key: "testkey.pem",
5247 }
5248
5249 java_sdk_library_import {
5250 name: "foo",
5251 apex_available: ["myapex"],
5252 prefer: true,
5253 public: {
5254 jars: ["a.jar"],
5255 },
5256 }
5257
5258 `, withFiles(filesForSdkLibrary))
5259}
5260
atrost6e126252020-01-27 17:01:16 +00005261func TestCompatConfig(t *testing.T) {
5262 ctx, _ := testApex(t, `
5263 apex {
5264 name: "myapex",
5265 key: "myapex.key",
5266 prebuilts: ["myjar-platform-compat-config"],
5267 java_libs: ["myjar"],
5268 }
5269
5270 apex_key {
5271 name: "myapex.key",
5272 public_key: "testkey.avbpubkey",
5273 private_key: "testkey.pem",
5274 }
5275
5276 platform_compat_config {
5277 name: "myjar-platform-compat-config",
5278 src: ":myjar",
5279 }
5280
5281 java_library {
5282 name: "myjar",
5283 srcs: ["foo/bar/MyClass.java"],
5284 sdk_version: "none",
5285 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005286 apex_available: [ "myapex" ],
5287 }
5288 `)
5289 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5290 "etc/compatconfig/myjar-platform-compat-config.xml",
5291 "javalib/myjar.jar",
5292 })
5293}
5294
Jiyong Park479321d2019-12-16 11:47:12 +09005295func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5296 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5297 apex {
5298 name: "myapex",
5299 key: "myapex.key",
5300 java_libs: ["myjar"],
5301 }
5302
5303 apex_key {
5304 name: "myapex.key",
5305 public_key: "testkey.avbpubkey",
5306 private_key: "testkey.pem",
5307 }
5308
5309 java_library {
5310 name: "myjar",
5311 srcs: ["foo/bar/MyClass.java"],
5312 sdk_version: "none",
5313 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005314 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005315 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005316 }
5317 `)
5318}
5319
Jiyong Park7afd1072019-12-30 16:56:33 +09005320func TestCarryRequiredModuleNames(t *testing.T) {
5321 ctx, config := testApex(t, `
5322 apex {
5323 name: "myapex",
5324 key: "myapex.key",
5325 native_shared_libs: ["mylib"],
5326 }
5327
5328 apex_key {
5329 name: "myapex.key",
5330 public_key: "testkey.avbpubkey",
5331 private_key: "testkey.pem",
5332 }
5333
5334 cc_library {
5335 name: "mylib",
5336 srcs: ["mylib.cpp"],
5337 system_shared_libs: [],
5338 stl: "none",
5339 required: ["a", "b"],
5340 host_required: ["c", "d"],
5341 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005342 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005343 }
5344 `)
5345
5346 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5347 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5348 name := apexBundle.BaseModuleName()
5349 prefix := "TARGET_"
5350 var builder strings.Builder
5351 data.Custom(&builder, name, prefix, "", data)
5352 androidMk := builder.String()
5353 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5354 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5355 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5356}
5357
Jiyong Park7cd10e32020-01-14 09:22:18 +09005358func TestSymlinksFromApexToSystem(t *testing.T) {
5359 bp := `
5360 apex {
5361 name: "myapex",
5362 key: "myapex.key",
5363 native_shared_libs: ["mylib"],
5364 java_libs: ["myjar"],
5365 }
5366
Jiyong Park9d677202020-02-19 16:29:35 +09005367 apex {
5368 name: "myapex.updatable",
5369 key: "myapex.key",
5370 native_shared_libs: ["mylib"],
5371 java_libs: ["myjar"],
5372 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005373 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005374 }
5375
Jiyong Park7cd10e32020-01-14 09:22:18 +09005376 apex_key {
5377 name: "myapex.key",
5378 public_key: "testkey.avbpubkey",
5379 private_key: "testkey.pem",
5380 }
5381
5382 cc_library {
5383 name: "mylib",
5384 srcs: ["mylib.cpp"],
5385 shared_libs: ["myotherlib"],
5386 system_shared_libs: [],
5387 stl: "none",
5388 apex_available: [
5389 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005390 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005391 "//apex_available:platform",
5392 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005393 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005394 }
5395
5396 cc_library {
5397 name: "myotherlib",
5398 srcs: ["mylib.cpp"],
5399 system_shared_libs: [],
5400 stl: "none",
5401 apex_available: [
5402 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005403 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005404 "//apex_available:platform",
5405 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005406 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005407 }
5408
5409 java_library {
5410 name: "myjar",
5411 srcs: ["foo/bar/MyClass.java"],
5412 sdk_version: "none",
5413 system_modules: "none",
5414 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005415 apex_available: [
5416 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005417 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005418 "//apex_available:platform",
5419 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005420 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005421 }
5422
5423 java_library {
5424 name: "myotherjar",
5425 srcs: ["foo/bar/MyClass.java"],
5426 sdk_version: "none",
5427 system_modules: "none",
5428 apex_available: [
5429 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005430 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005431 "//apex_available:platform",
5432 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005433 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005434 }
5435 `
5436
5437 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5438 for _, f := range files {
5439 if f.path == file {
5440 if f.isLink {
5441 t.Errorf("%q is not a real file", file)
5442 }
5443 return
5444 }
5445 }
5446 t.Errorf("%q is not found", file)
5447 }
5448
5449 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5450 for _, f := range files {
5451 if f.path == file {
5452 if !f.isLink {
5453 t.Errorf("%q is not a symlink", file)
5454 }
5455 return
5456 }
5457 }
5458 t.Errorf("%q is not found", file)
5459 }
5460
Jiyong Park9d677202020-02-19 16:29:35 +09005461 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5462 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005463 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005464 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005465 ensureRealfileExists(t, files, "javalib/myjar.jar")
5466 ensureRealfileExists(t, files, "lib64/mylib.so")
5467 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5468
Jiyong Park9d677202020-02-19 16:29:35 +09005469 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5470 ensureRealfileExists(t, files, "javalib/myjar.jar")
5471 ensureRealfileExists(t, files, "lib64/mylib.so")
5472 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5473
5474 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005475 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005476 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005477 ensureRealfileExists(t, files, "javalib/myjar.jar")
5478 ensureRealfileExists(t, files, "lib64/mylib.so")
5479 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005480
5481 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5482 ensureRealfileExists(t, files, "javalib/myjar.jar")
5483 ensureRealfileExists(t, files, "lib64/mylib.so")
5484 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005485}
5486
Yo Chiange8128052020-07-23 20:09:18 +08005487func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5488 ctx, config := testApex(t, `
5489 apex {
5490 name: "myapex",
5491 key: "myapex.key",
5492 native_shared_libs: ["mylib"],
5493 }
5494
5495 apex_key {
5496 name: "myapex.key",
5497 public_key: "testkey.avbpubkey",
5498 private_key: "testkey.pem",
5499 }
5500
5501 cc_library_shared {
5502 name: "mylib",
5503 srcs: ["mylib.cpp"],
5504 shared_libs: ["myotherlib"],
5505 system_shared_libs: [],
5506 stl: "none",
5507 apex_available: [
5508 "myapex",
5509 "//apex_available:platform",
5510 ],
5511 }
5512
5513 cc_prebuilt_library_shared {
5514 name: "myotherlib",
5515 srcs: ["prebuilt.so"],
5516 system_shared_libs: [],
5517 stl: "none",
5518 apex_available: [
5519 "myapex",
5520 "//apex_available:platform",
5521 ],
5522 }
5523 `)
5524
5525 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5526 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5527 var builder strings.Builder
5528 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5529 androidMk := builder.String()
5530 // `myotherlib` is added to `myapex` as symlink
5531 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5532 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5533 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5534 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5535 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5536}
5537
Jooyung Han643adc42020-02-27 13:50:06 +09005538func TestApexWithJniLibs(t *testing.T) {
5539 ctx, _ := testApex(t, `
5540 apex {
5541 name: "myapex",
5542 key: "myapex.key",
5543 jni_libs: ["mylib"],
5544 }
5545
5546 apex_key {
5547 name: "myapex.key",
5548 public_key: "testkey.avbpubkey",
5549 private_key: "testkey.pem",
5550 }
5551
5552 cc_library {
5553 name: "mylib",
5554 srcs: ["mylib.cpp"],
5555 shared_libs: ["mylib2"],
5556 system_shared_libs: [],
5557 stl: "none",
5558 apex_available: [ "myapex" ],
5559 }
5560
5561 cc_library {
5562 name: "mylib2",
5563 srcs: ["mylib.cpp"],
5564 system_shared_libs: [],
5565 stl: "none",
5566 apex_available: [ "myapex" ],
5567 }
5568 `)
5569
5570 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5571 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5572 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5573 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5574 "lib64/mylib.so",
5575 "lib64/mylib2.so",
5576 })
5577}
5578
Jooyung Han49f67012020-04-17 13:43:10 +09005579func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5580 ctx, _ := testApex(t, `
5581 apex {
5582 name: "myapex",
5583 key: "myapex.key",
5584 }
5585 apex_key {
5586 name: "myapex.key",
5587 public_key: "testkey.avbpubkey",
5588 private_key: "testkey.pem",
5589 }
5590 `, func(fs map[string][]byte, config android.Config) {
5591 delete(config.Targets, android.Android)
5592 config.AndroidCommonTarget = android.Target{}
5593 })
5594
5595 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5596 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5597 }
5598}
5599
Jiyong Parkbd159612020-02-28 15:22:21 +09005600func TestAppBundle(t *testing.T) {
5601 ctx, _ := testApex(t, `
5602 apex {
5603 name: "myapex",
5604 key: "myapex.key",
5605 apps: ["AppFoo"],
5606 }
5607
5608 apex_key {
5609 name: "myapex.key",
5610 public_key: "testkey.avbpubkey",
5611 private_key: "testkey.pem",
5612 }
5613
5614 android_app {
5615 name: "AppFoo",
5616 srcs: ["foo/bar/MyClass.java"],
5617 sdk_version: "none",
5618 system_modules: "none",
5619 apex_available: [ "myapex" ],
5620 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005621 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005622
Colin Crosscf371cc2020-11-13 11:48:42 -08005623 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005624 content := bundleConfigRule.Args["content"]
5625
5626 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005627 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 +09005628}
5629
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005630func TestAppSetBundle(t *testing.T) {
5631 ctx, _ := testApex(t, `
5632 apex {
5633 name: "myapex",
5634 key: "myapex.key",
5635 apps: ["AppSet"],
5636 }
5637
5638 apex_key {
5639 name: "myapex.key",
5640 public_key: "testkey.avbpubkey",
5641 private_key: "testkey.pem",
5642 }
5643
5644 android_app_set {
5645 name: "AppSet",
5646 set: "AppSet.apks",
5647 }`)
5648 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005649 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005650 content := bundleConfigRule.Args["content"]
5651 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5652 s := mod.Rule("apexRule").Args["copy_commands"]
5653 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5654 if len(copyCmds) != 3 {
5655 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5656 }
5657 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5658 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5659 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5660}
5661
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005662func TestAppSetBundlePrebuilt(t *testing.T) {
5663 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5664 bp := `
5665 apex_set {
5666 name: "myapex",
5667 filename: "foo_v2.apex",
5668 sanitized: {
5669 none: { set: "myapex.apks", },
5670 hwaddress: { set: "myapex.hwasan.apks", },
5671 },
5672 }`
5673 fs["Android.bp"] = []byte(bp)
5674
5675 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5676 })
5677
5678 m := ctx.ModuleForTests("myapex", "android_common")
5679 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5680
5681 actual := extractedApex.Inputs
5682 if len(actual) != 1 {
5683 t.Errorf("expected a single input")
5684 }
5685
5686 expected := "myapex.hwasan.apks"
5687 if actual[0].String() != expected {
5688 t.Errorf("expected %s, got %s", expected, actual[0].String())
5689 }
5690}
5691
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005692func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005693 t.Helper()
5694
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005695 bp := `
5696 java_library {
5697 name: "some-updatable-apex-lib",
5698 srcs: ["a.java"],
5699 sdk_version: "current",
5700 apex_available: [
5701 "some-updatable-apex",
5702 ],
5703 }
5704
5705 java_library {
5706 name: "some-non-updatable-apex-lib",
5707 srcs: ["a.java"],
5708 apex_available: [
5709 "some-non-updatable-apex",
5710 ],
5711 }
5712
5713 java_library {
5714 name: "some-platform-lib",
5715 srcs: ["a.java"],
5716 sdk_version: "current",
5717 installable: true,
5718 }
5719
5720 java_library {
5721 name: "some-art-lib",
5722 srcs: ["a.java"],
5723 sdk_version: "current",
5724 apex_available: [
5725 "com.android.art.something",
5726 ],
5727 hostdex: true,
5728 }
5729
5730 apex {
5731 name: "some-updatable-apex",
5732 key: "some-updatable-apex.key",
5733 java_libs: ["some-updatable-apex-lib"],
5734 updatable: true,
5735 min_sdk_version: "current",
5736 }
5737
5738 apex {
5739 name: "some-non-updatable-apex",
5740 key: "some-non-updatable-apex.key",
5741 java_libs: ["some-non-updatable-apex-lib"],
5742 }
5743
5744 apex_key {
5745 name: "some-updatable-apex.key",
5746 }
5747
5748 apex_key {
5749 name: "some-non-updatable-apex.key",
5750 }
5751
5752 apex {
5753 name: "com.android.art.something",
5754 key: "com.android.art.something.key",
5755 java_libs: ["some-art-lib"],
5756 updatable: true,
5757 min_sdk_version: "current",
5758 }
5759
5760 apex_key {
5761 name: "com.android.art.something.key",
5762 }
5763
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005764 filegroup {
5765 name: "some-updatable-apex-file_contexts",
5766 srcs: [
5767 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5768 ],
5769 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005770
5771 filegroup {
5772 name: "some-non-updatable-apex-file_contexts",
5773 srcs: [
5774 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5775 ],
5776 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005777 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005778
5779 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5780}
5781
5782func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5783 t.Helper()
5784
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005785 bp += cc.GatherRequiredDepsForTest(android.Android)
5786 bp += java.GatherRequiredDepsForTest()
5787 bp += dexpreopt.BpToolModulesForTest()
5788
5789 fs := map[string][]byte{
5790 "a.java": nil,
5791 "a.jar": nil,
5792 "build/make/target/product/security": nil,
5793 "apex_manifest.json": nil,
5794 "AndroidManifest.xml": nil,
5795 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005796 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005797 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5798 "framework/aidl/a.aidl": nil,
5799 }
5800 cc.GatherRequiredFilesForTest(fs)
5801
Colin Crossae8600b2020-10-29 17:09:13 -07005802 config := android.TestArchConfig(buildDir, nil, bp, fs)
5803
5804 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005805 ctx.RegisterModuleType("apex", BundleFactory)
5806 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5807 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005808 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005809 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005810 cc.RegisterRequiredBuildComponentsForTest(ctx)
5811 java.RegisterJavaBuildComponents(ctx)
5812 java.RegisterSystemModulesBuildComponents(ctx)
5813 java.RegisterAppBuildComponents(ctx)
5814 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005815 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5816 ctx.PreDepsMutators(RegisterPreDepsMutators)
5817 ctx.PostDepsMutators(RegisterPostDepsMutators)
5818
Colin Crossae8600b2020-10-29 17:09:13 -07005819 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005820
5821 _ = dexpreopt.GlobalSoongConfigForTests(config)
5822 dexpreopt.RegisterToolModulesForTest(ctx)
5823 pathCtx := android.PathContextForTesting(config)
5824 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5825 transformDexpreoptConfig(dexpreoptConfig)
5826 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5827
5828 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5829 android.FailIfErrored(t, errs)
5830
5831 _, errs = ctx.PrepareBuildActions(config)
5832 if errmsg == "" {
5833 android.FailIfErrored(t, errs)
5834 } else if len(errs) > 0 {
5835 android.FailIfNoMatchingErrors(t, errmsg, errs)
5836 return
5837 } else {
5838 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5839 }
5840}
5841
Jooyung Han548640b2020-04-27 12:10:30 +09005842func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5843 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5844 apex {
5845 name: "myapex",
5846 key: "myapex.key",
5847 updatable: true,
5848 }
5849
5850 apex_key {
5851 name: "myapex.key",
5852 public_key: "testkey.avbpubkey",
5853 private_key: "testkey.pem",
5854 }
5855 `)
5856}
5857
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005858func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005859 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005860 var transform func(*dexpreopt.GlobalConfig)
5861
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005862 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5863 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005864 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005865 }
5866 testNoUpdatableJarsInBootImage(t, "", transform)
5867 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005868
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005869 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005870 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 +01005871 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005872 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005873 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005874 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005875 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005876
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005877 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 -07005878 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 +01005879 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005880 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005881 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005882 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005883 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005884
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005885 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 -07005886 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005887 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005888 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005889 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005890 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005891 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005892
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005893 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 -07005894 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 +01005895 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005896 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005897 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005898 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005899 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005900
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005901 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5902 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005903 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005904 }
5905 testNoUpdatableJarsInBootImage(t, "", transform)
5906 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005907
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005908 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005909 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005910 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005911 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005912 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005913 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005914 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005915
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005916 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005917 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005918 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005919 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005920 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005921 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005922 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005923
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005924 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005925 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005926 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005927 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005928 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005929 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005930 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005931
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005932 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5933 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005934 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005935 }
5936 testNoUpdatableJarsInBootImage(t, "", transform)
5937 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005938}
5939
Andrei Onea115e7e72020-06-05 21:14:03 +01005940func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5941 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005942 bp += `
5943 apex_key {
5944 name: "myapex.key",
5945 public_key: "testkey.avbpubkey",
5946 private_key: "testkey.pem",
5947 }`
5948 fs := map[string][]byte{
5949 "lib1/src/A.java": nil,
5950 "lib2/src/B.java": nil,
5951 "system/sepolicy/apex/myapex-file_contexts": nil,
5952 }
5953
Colin Crossae8600b2020-10-29 17:09:13 -07005954 config := android.TestArchConfig(buildDir, nil, bp, fs)
5955 android.SetTestNeverallowRules(config, rules)
5956 updatableBootJars := make([]string, 0, len(apexBootJars))
5957 for _, apexBootJar := range apexBootJars {
5958 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5959 }
5960 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5961
5962 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005963 ctx.RegisterModuleType("apex", BundleFactory)
5964 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5965 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5966 cc.RegisterRequiredBuildComponentsForTest(ctx)
5967 java.RegisterJavaBuildComponents(ctx)
5968 java.RegisterSystemModulesBuildComponents(ctx)
5969 java.RegisterDexpreoptBootJarsComponents(ctx)
5970 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5971 ctx.PreDepsMutators(RegisterPreDepsMutators)
5972 ctx.PostDepsMutators(RegisterPostDepsMutators)
5973 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5974
Colin Crossae8600b2020-10-29 17:09:13 -07005975 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005976
5977 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5978 android.FailIfErrored(t, errs)
5979
5980 _, errs = ctx.PrepareBuildActions(config)
5981 if errmsg == "" {
5982 android.FailIfErrored(t, errs)
5983 } else if len(errs) > 0 {
5984 android.FailIfNoMatchingErrors(t, errmsg, errs)
5985 return
5986 } else {
5987 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5988 }
5989}
5990
5991func TestApexPermittedPackagesRules(t *testing.T) {
5992 testcases := []struct {
5993 name string
5994 expectedError string
5995 bp string
5996 bootJars []string
5997 modulesPackages map[string][]string
5998 }{
5999
6000 {
6001 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6002 expectedError: "",
6003 bp: `
6004 java_library {
6005 name: "bcp_lib1",
6006 srcs: ["lib1/src/*.java"],
6007 permitted_packages: ["foo.bar"],
6008 apex_available: ["myapex"],
6009 sdk_version: "none",
6010 system_modules: "none",
6011 }
6012 java_library {
6013 name: "nonbcp_lib2",
6014 srcs: ["lib2/src/*.java"],
6015 apex_available: ["myapex"],
6016 permitted_packages: ["a.b"],
6017 sdk_version: "none",
6018 system_modules: "none",
6019 }
6020 apex {
6021 name: "myapex",
6022 key: "myapex.key",
6023 java_libs: ["bcp_lib1", "nonbcp_lib2"],
6024 }`,
6025 bootJars: []string{"bcp_lib1"},
6026 modulesPackages: map[string][]string{
6027 "myapex": []string{
6028 "foo.bar",
6029 },
6030 },
6031 },
6032 {
6033 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6034 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.`,
6035 bp: `
6036 java_library {
6037 name: "bcp_lib1",
6038 srcs: ["lib1/src/*.java"],
6039 apex_available: ["myapex"],
6040 permitted_packages: ["foo.bar"],
6041 sdk_version: "none",
6042 system_modules: "none",
6043 }
6044 java_library {
6045 name: "bcp_lib2",
6046 srcs: ["lib2/src/*.java"],
6047 apex_available: ["myapex"],
6048 permitted_packages: ["foo.bar", "bar.baz"],
6049 sdk_version: "none",
6050 system_modules: "none",
6051 }
6052 apex {
6053 name: "myapex",
6054 key: "myapex.key",
6055 java_libs: ["bcp_lib1", "bcp_lib2"],
6056 }
6057 `,
6058 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6059 modulesPackages: map[string][]string{
6060 "myapex": []string{
6061 "foo.bar",
6062 },
6063 },
6064 },
6065 }
6066 for _, tc := range testcases {
6067 t.Run(tc.name, func(t *testing.T) {
6068 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6069 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6070 })
6071 }
6072}
6073
Jiyong Park62304bb2020-04-13 16:19:48 +09006074func TestTestFor(t *testing.T) {
6075 ctx, _ := testApex(t, `
6076 apex {
6077 name: "myapex",
6078 key: "myapex.key",
6079 native_shared_libs: ["mylib", "myprivlib"],
6080 }
6081
6082 apex_key {
6083 name: "myapex.key",
6084 public_key: "testkey.avbpubkey",
6085 private_key: "testkey.pem",
6086 }
6087
6088 cc_library {
6089 name: "mylib",
6090 srcs: ["mylib.cpp"],
6091 system_shared_libs: [],
6092 stl: "none",
6093 stubs: {
6094 versions: ["1"],
6095 },
6096 apex_available: ["myapex"],
6097 }
6098
6099 cc_library {
6100 name: "myprivlib",
6101 srcs: ["mylib.cpp"],
6102 system_shared_libs: [],
6103 stl: "none",
6104 apex_available: ["myapex"],
6105 }
6106
6107
6108 cc_test {
6109 name: "mytest",
6110 gtest: false,
6111 srcs: ["mylib.cpp"],
6112 system_shared_libs: [],
6113 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006114 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006115 test_for: ["myapex"]
6116 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006117
6118 cc_library {
6119 name: "mytestlib",
6120 srcs: ["mylib.cpp"],
6121 system_shared_libs: [],
6122 shared_libs: ["mylib", "myprivlib"],
6123 stl: "none",
6124 test_for: ["myapex"],
6125 }
6126
6127 cc_benchmark {
6128 name: "mybench",
6129 srcs: ["mylib.cpp"],
6130 system_shared_libs: [],
6131 shared_libs: ["mylib", "myprivlib"],
6132 stl: "none",
6133 test_for: ["myapex"],
6134 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006135 `)
6136
6137 // the test 'mytest' is a test for the apex, therefore is linked to the
6138 // actual implementation of mylib instead of its stub.
6139 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6140 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6141 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006142
6143 // The same should be true for cc_library
6144 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6145 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6146 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6147
6148 // ... and for cc_benchmark
6149 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6150 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6151 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006152}
6153
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006154// TODO(jungjw): Move this to proptools
6155func intPtr(i int) *int {
6156 return &i
6157}
6158
6159func TestApexSet(t *testing.T) {
6160 ctx, config := testApex(t, `
6161 apex_set {
6162 name: "myapex",
6163 set: "myapex.apks",
6164 filename: "foo_v2.apex",
6165 overrides: ["foo"],
6166 }
6167 `, func(fs map[string][]byte, config android.Config) {
6168 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006169 config.Targets[android.Android] = []android.Target{
6170 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6171 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6172 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006173 })
6174
6175 m := ctx.ModuleForTests("myapex", "android_common")
6176
6177 // Check extract_apks tool parameters.
6178 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6179 actual := extractedApex.Args["abis"]
6180 expected := "ARMEABI_V7A,ARM64_V8A"
6181 if actual != expected {
6182 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6183 }
6184 actual = extractedApex.Args["sdk-version"]
6185 expected = "30"
6186 if actual != expected {
6187 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6188 }
6189
6190 a := m.Module().(*ApexSet)
6191 expectedOverrides := []string{"foo"}
6192 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6193 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6194 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6195 }
6196}
6197
Jiyong Park7d95a512020-05-10 15:16:24 +09006198func TestNoStaticLinkingToStubsLib(t *testing.T) {
6199 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6200 apex {
6201 name: "myapex",
6202 key: "myapex.key",
6203 native_shared_libs: ["mylib"],
6204 }
6205
6206 apex_key {
6207 name: "myapex.key",
6208 public_key: "testkey.avbpubkey",
6209 private_key: "testkey.pem",
6210 }
6211
6212 cc_library {
6213 name: "mylib",
6214 srcs: ["mylib.cpp"],
6215 static_libs: ["otherlib"],
6216 system_shared_libs: [],
6217 stl: "none",
6218 apex_available: [ "myapex" ],
6219 }
6220
6221 cc_library {
6222 name: "otherlib",
6223 srcs: ["mylib.cpp"],
6224 system_shared_libs: [],
6225 stl: "none",
6226 stubs: {
6227 versions: ["1", "2", "3"],
6228 },
6229 apex_available: [ "myapex" ],
6230 }
6231 `)
6232}
6233
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006234func TestApexKeysTxt(t *testing.T) {
6235 ctx, _ := testApex(t, `
6236 apex {
6237 name: "myapex",
6238 key: "myapex.key",
6239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 prebuilt_apex {
6248 name: "myapex",
6249 prefer: true,
6250 arch: {
6251 arm64: {
6252 src: "myapex-arm64.apex",
6253 },
6254 arm: {
6255 src: "myapex-arm.apex",
6256 },
6257 },
6258 }
6259
6260 apex_set {
6261 name: "myapex_set",
6262 set: "myapex.apks",
6263 filename: "myapex_set.apex",
6264 overrides: ["myapex"],
6265 }
6266 `)
6267
6268 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6269 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6270 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 +09006271 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 +09006272}
6273
Jooyung Han938b5932020-06-20 12:47:47 +09006274func TestAllowedFiles(t *testing.T) {
6275 ctx, _ := testApex(t, `
6276 apex {
6277 name: "myapex",
6278 key: "myapex.key",
6279 apps: ["app"],
6280 allowed_files: "allowed.txt",
6281 }
6282
6283 apex_key {
6284 name: "myapex.key",
6285 public_key: "testkey.avbpubkey",
6286 private_key: "testkey.pem",
6287 }
6288
6289 android_app {
6290 name: "app",
6291 srcs: ["foo/bar/MyClass.java"],
6292 package_name: "foo",
6293 sdk_version: "none",
6294 system_modules: "none",
6295 apex_available: [ "myapex" ],
6296 }
6297 `, withFiles(map[string][]byte{
6298 "sub/Android.bp": []byte(`
6299 override_apex {
6300 name: "override_myapex",
6301 base: "myapex",
6302 apps: ["override_app"],
6303 allowed_files: ":allowed",
6304 }
6305 // Overridable "path" property should be referenced indirectly
6306 filegroup {
6307 name: "allowed",
6308 srcs: ["allowed.txt"],
6309 }
6310 override_android_app {
6311 name: "override_app",
6312 base: "app",
6313 package_name: "bar",
6314 }
6315 `),
6316 }))
6317
6318 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6319 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6320 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6321 }
6322
6323 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6324 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6325 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6326 }
6327}
6328
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006329func TestNonPreferredPrebuiltDependency(t *testing.T) {
6330 _, _ = testApex(t, `
6331 apex {
6332 name: "myapex",
6333 key: "myapex.key",
6334 native_shared_libs: ["mylib"],
6335 }
6336
6337 apex_key {
6338 name: "myapex.key",
6339 public_key: "testkey.avbpubkey",
6340 private_key: "testkey.pem",
6341 }
6342
6343 cc_library {
6344 name: "mylib",
6345 srcs: ["mylib.cpp"],
6346 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006347 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006348 },
6349 apex_available: ["myapex"],
6350 }
6351
6352 cc_prebuilt_library_shared {
6353 name: "mylib",
6354 prefer: false,
6355 srcs: ["prebuilt.so"],
6356 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006357 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006358 },
6359 apex_available: ["myapex"],
6360 }
6361 `)
6362}
6363
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006364func TestCompressedApex(t *testing.T) {
6365 ctx, config := testApex(t, `
6366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 compressible: true,
6370 }
6371 apex_key {
6372 name: "myapex.key",
6373 public_key: "testkey.avbpubkey",
6374 private_key: "testkey.pem",
6375 }
6376 `, func(fs map[string][]byte, config android.Config) {
6377 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6378 })
6379
6380 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6381 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6382
6383 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6384 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6385
6386 // Make sure output of bundle is .capex
6387 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6388 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6389
6390 // Verify android.mk rules
6391 data := android.AndroidMkDataForTest(t, config, "", ab)
6392 var builder strings.Builder
6393 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6394 androidMk := builder.String()
6395 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6396}
6397
Martin Stjernholm2856c662020-12-02 15:03:42 +00006398func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6399 ctx, config := testApex(t, `
6400 apex {
6401 name: "myapex",
6402 key: "myapex.key",
6403 native_shared_libs: ["mylib"],
6404 }
6405
6406 apex_key {
6407 name: "myapex.key",
6408 public_key: "testkey.avbpubkey",
6409 private_key: "testkey.pem",
6410 }
6411
6412 cc_library {
6413 name: "mylib",
6414 srcs: ["mylib.cpp"],
6415 apex_available: ["myapex"],
6416 shared_libs: ["otherlib"],
6417 system_shared_libs: [],
6418 }
6419
6420 cc_library {
6421 name: "otherlib",
6422 srcs: ["mylib.cpp"],
6423 stubs: {
6424 versions: ["current"],
6425 },
6426 }
6427
6428 cc_prebuilt_library_shared {
6429 name: "otherlib",
6430 prefer: true,
6431 srcs: ["prebuilt.so"],
6432 stubs: {
6433 versions: ["current"],
6434 },
6435 }
6436 `)
6437
6438 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6439 data := android.AndroidMkDataForTest(t, config, "", ab)
6440 var builder strings.Builder
6441 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6442 androidMk := builder.String()
6443
6444 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6445 // a thing there.
6446 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6447}
6448
Jiyong Parke3867542020-12-03 17:28:25 +09006449func TestExcludeDependency(t *testing.T) {
6450 ctx, _ := testApex(t, `
6451 apex {
6452 name: "myapex",
6453 key: "myapex.key",
6454 native_shared_libs: ["mylib"],
6455 }
6456
6457 apex_key {
6458 name: "myapex.key",
6459 public_key: "testkey.avbpubkey",
6460 private_key: "testkey.pem",
6461 }
6462
6463 cc_library {
6464 name: "mylib",
6465 srcs: ["mylib.cpp"],
6466 system_shared_libs: [],
6467 stl: "none",
6468 apex_available: ["myapex"],
6469 shared_libs: ["mylib2"],
6470 target: {
6471 apex: {
6472 exclude_shared_libs: ["mylib2"],
6473 },
6474 },
6475 }
6476
6477 cc_library {
6478 name: "mylib2",
6479 srcs: ["mylib.cpp"],
6480 system_shared_libs: [],
6481 stl: "none",
6482 }
6483 `)
6484
6485 // Check if mylib is linked to mylib2 for the non-apex target
6486 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6487 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6488
6489 // Make sure that the link doesn't occur for the apex target
6490 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6491 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6492
6493 // It shouldn't appear in the copy cmd as well.
6494 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6495 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6496}
6497
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006498func TestPrebuiltStubLibDep(t *testing.T) {
6499 bpBase := `
6500 apex {
6501 name: "myapex",
6502 key: "myapex.key",
6503 native_shared_libs: ["mylib"],
6504 }
6505 apex_key {
6506 name: "myapex.key",
6507 public_key: "testkey.avbpubkey",
6508 private_key: "testkey.pem",
6509 }
6510 cc_library {
6511 name: "mylib",
6512 srcs: ["mylib.cpp"],
6513 apex_available: ["myapex"],
6514 shared_libs: ["stublib"],
6515 system_shared_libs: [],
6516 }
6517 apex {
6518 name: "otherapex",
6519 enabled: %s,
6520 key: "myapex.key",
6521 native_shared_libs: ["stublib"],
6522 }
6523 `
6524
6525 stublibSourceBp := `
6526 cc_library {
6527 name: "stublib",
6528 srcs: ["mylib.cpp"],
6529 apex_available: ["otherapex"],
6530 system_shared_libs: [],
6531 stl: "none",
6532 stubs: {
6533 versions: ["1"],
6534 },
6535 }
6536 `
6537
6538 stublibPrebuiltBp := `
6539 cc_prebuilt_library_shared {
6540 name: "stublib",
6541 srcs: ["prebuilt.so"],
6542 apex_available: ["otherapex"],
6543 stubs: {
6544 versions: ["1"],
6545 },
6546 %s
6547 }
6548 `
6549
6550 tests := []struct {
6551 name string
6552 stublibBp string
6553 usePrebuilt bool
6554 modNames []string // Modules to collect AndroidMkEntries for
6555 otherApexEnabled []string
6556 }{
6557 {
6558 name: "only_source",
6559 stublibBp: stublibSourceBp,
6560 usePrebuilt: false,
6561 modNames: []string{"stublib"},
6562 otherApexEnabled: []string{"true", "false"},
6563 },
6564 {
6565 name: "source_preferred",
6566 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
6567 usePrebuilt: false,
6568 modNames: []string{"stublib", "prebuilt_stublib"},
6569 otherApexEnabled: []string{"true", "false"},
6570 },
6571 {
6572 name: "prebuilt_preferred",
6573 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
6574 usePrebuilt: true,
6575 modNames: []string{"stublib", "prebuilt_stublib"},
6576 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6577 },
6578 {
6579 name: "only_prebuilt",
6580 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
6581 usePrebuilt: true,
6582 modNames: []string{"stublib"},
6583 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
6584 },
6585 }
6586
6587 for _, test := range tests {
6588 t.Run(test.name, func(t *testing.T) {
6589 for _, otherApexEnabled := range test.otherApexEnabled {
6590 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
6591 ctx, config := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
6592
6593 type modAndMkEntries struct {
6594 mod *cc.Module
6595 mkEntries android.AndroidMkEntries
6596 }
6597 entries := []*modAndMkEntries{}
6598
6599 // Gather shared lib modules that are installable
6600 for _, modName := range test.modNames {
6601 for _, variant := range ctx.ModuleVariantsForTests(modName) {
6602 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
6603 continue
6604 }
6605 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08006606 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006607 continue
6608 }
6609 for _, ent := range android.AndroidMkEntriesForTest(t, config, "", mod) {
6610 if ent.Disabled {
6611 continue
6612 }
6613 entries = append(entries, &modAndMkEntries{
6614 mod: mod,
6615 mkEntries: ent,
6616 })
6617 }
6618 }
6619 }
6620
6621 var entry *modAndMkEntries = nil
6622 for _, ent := range entries {
6623 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
6624 if entry != nil {
6625 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
6626 } else {
6627 entry = ent
6628 }
6629 }
6630 }
6631
6632 if entry == nil {
6633 t.Errorf("AndroidMk entry for \"stublib\" missing")
6634 } else {
6635 isPrebuilt := entry.mod.Prebuilt() != nil
6636 if isPrebuilt != test.usePrebuilt {
6637 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
6638 }
6639 if !entry.mod.IsStubs() {
6640 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
6641 }
6642 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
6643 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
6644 }
Jiyong Park892a98f2020-12-14 09:20:00 +09006645 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
6646 expected := "-D__STUBLIB_API__=1"
6647 if !android.InList(expected, cflags) {
6648 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
6649 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09006650 }
6651 })
6652 }
6653 })
6654 }
6655}
6656
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006657func TestMain(m *testing.M) {
6658 run := func() int {
6659 setUp()
6660 defer tearDown()
6661
6662 return m.Run()
6663 }
6664
6665 os.Exit(run())
6666}