blob: 08f54f724a062ff2fc93452cdcd46c9f9307a72d [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"
Paul Duffin37856732021-02-26 14:24:15 +000022 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070023 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010024 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090025 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070041var buildDir string
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Jooyung Han344d5432019-08-23 11:17:39 +090053func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
54 t.Helper()
55 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090056 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
57 if len(errs) > 0 {
58 android.FailIfNoMatchingErrors(t, pattern, errs)
59 return
60 }
61 _, errs = ctx.PrepareBuildActions(config)
62 if len(errs) > 0 {
63 android.FailIfNoMatchingErrors(t, pattern, errs)
64 return
65 }
66
67 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
68}
69
Colin Cross1c460562021-02-16 17:55:47 -080070func testApex(t *testing.T, bp string, handlers ...testCustomizer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090071 t.Helper()
72 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010073 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090074 android.FailIfErrored(t, errs)
75 _, errs = ctx.PrepareBuildActions(config)
76 android.FailIfErrored(t, errs)
Colin Cross1c460562021-02-16 17:55:47 -080077 return ctx
Jooyung Han5c998b92019-06-27 11:30:33 +090078}
79
Jooyung Han344d5432019-08-23 11:17:39 +090080type testCustomizer func(fs map[string][]byte, config android.Config)
81
82func withFiles(files map[string][]byte) testCustomizer {
83 return func(fs map[string][]byte, config android.Config) {
84 for k, v := range files {
85 fs[k] = v
86 }
87 }
88}
89
90func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
91 return func(fs map[string][]byte, config android.Config) {
92 for k, v := range targets {
93 config.Targets[k] = v
94 }
95 }
96}
97
Jooyung Han35155c42020-02-06 17:33:20 +090098// withNativeBridgeTargets sets configuration with targets including:
99// - X86_64 (primary)
100// - X86 (secondary)
101// - Arm64 on X86_64 (native bridge)
102// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700103func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900104 config.Targets[android.Android] = []android.Target{
105 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
109 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
110 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
111 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
112 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
113 }
114}
115
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900116func withManifestPackageNameOverrides(specs []string) testCustomizer {
117 return func(fs map[string][]byte, config android.Config) {
118 config.TestProductVariables.ManifestPackageNameOverrides = specs
119 }
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900123 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900127 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
128}
129
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700130func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900131 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900132 filegroup {
133 name: "myapex-file_contexts",
134 srcs: [
135 "system/sepolicy/apex/myapex-file_contexts",
136 ],
137 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900138 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800139
Colin Crossf9aabd72020-02-15 11:29:50 -0800140 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
141
Jiyong Park99644e92020-11-17 22:21:02 +0900142 bp = bp + rust.GatherRequiredDepsForTest()
143
Dario Frenicde2a032019-10-27 00:29:22 +0100144 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900145
Jooyung Han344d5432019-08-23 11:17:39 +0900146 fs := map[string][]byte{
Colin Cross2807f002021-03-02 10:15:29 -0800147 "a.java": nil,
148 "PrebuiltAppFoo.apk": nil,
149 "PrebuiltAppFooPriv.apk": nil,
150 "build/make/target/product/security": nil,
151 "apex_manifest.json": nil,
152 "AndroidManifest.xml": nil,
153 "system/sepolicy/apex/myapex-file_contexts": nil,
154 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
155 "system/sepolicy/apex/myapex2-file_contexts": nil,
156 "system/sepolicy/apex/otherapex-file_contexts": nil,
157 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
158 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800159 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800160 "mytest.cpp": nil,
161 "mytest1.cpp": nil,
162 "mytest2.cpp": nil,
163 "mytest3.cpp": nil,
164 "myprebuilt": nil,
165 "my_include": nil,
166 "foo/bar/MyClass.java": nil,
167 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100168 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800169 "vendor/foo/devkeys/test.x509.pem": nil,
170 "vendor/foo/devkeys/test.pk8": nil,
171 "testkey.x509.pem": nil,
172 "testkey.pk8": nil,
173 "testkey.override.x509.pem": nil,
174 "testkey.override.pk8": nil,
175 "vendor/foo/devkeys/testkey.avbpubkey": nil,
176 "vendor/foo/devkeys/testkey.pem": nil,
177 "NOTICE": nil,
178 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900179 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800180 "testkey2.avbpubkey": nil,
181 "testkey2.pem": nil,
182 "myapex-arm64.apex": nil,
183 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700184 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800185 "frameworks/base/api/current.txt": nil,
186 "framework/aidl/a.aidl": nil,
187 "build/make/core/proguard.flags": nil,
188 "build/make/core/proguard_basic_keeps.flags": nil,
189 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700190 "baz": nil,
191 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700192 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700193 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900194 "foo.rs": nil,
Paul Duffin064b70c2020-11-02 17:32:38 +0000195 "libfoo.jar": nil,
Paul Duffin39853512021-02-26 11:09:39 +0000196 "libbar.jar": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900197 }
198
Colin Crossf9aabd72020-02-15 11:29:50 -0800199 cc.GatherRequiredFilesForTest(fs)
200
Jooyung Han344d5432019-08-23 11:17:39 +0900201 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800202 // The fs now needs to be populated before creating the config, call handlers twice
203 // for now, once to get any fs changes, and later after the config was created to
204 // set product variables or targets.
205 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
206 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900207 }
208
Colin Cross98be1bb2019-12-13 20:41:13 -0800209 config := android.TestArchConfig(buildDir, nil, bp, fs)
210 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
211 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
212 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
213 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
214 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700215 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800216 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
217
218 for _, handler := range handlers {
219 // The fs now needs to be populated before creating the config, call handlers twice
220 // for now, earlier to get any fs changes, and now after the config was created to
221 // set product variables or targets.
222 tempFS := map[string][]byte{}
223 handler(tempFS, config)
224 }
225
Colin Crossae8600b2020-10-29 17:09:13 -0700226 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100227
228 // from android package
229 android.RegisterPackageBuildComponents(ctx)
230 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
231
Paul Duffin667893c2021-03-09 22:34:13 +0000232 registerApexBuildComponents(ctx)
233 registerApexKeyBuildComponents(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800234
Jooyung Hana57af4a2020-01-23 05:36:59 +0000235 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100236 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000237
Paul Duffin021f4e52020-07-30 16:04:17 +0100238 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 // Register these after the prebuilt mutators have been registered to match what
241 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100242 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
243 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
244
Paul Duffin6d119b82021-03-05 13:57:33 +0000245 // These must come after prebuilts and visibility rules to match runtime.
246 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
247
248 // These must come after override rules to match the runtime.
Paul Duffin021f4e52020-07-30 16:04:17 +0100249 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900250 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +0000251 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100252
Colin Cross98be1bb2019-12-13 20:41:13 -0800253 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800254 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800255 cc.RegisterVndkLibraryTxtTypes(ctx)
Jooyung Han0703fd82020-08-26 22:11:53 +0900256 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000257 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700258 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800259 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
markchien2f59ec92020-09-02 16:23:38 +0800260 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800261
Colin Crossae8600b2020-10-29 17:09:13 -0700262 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265}
266
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700267func setUp() {
268 var err error
269 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700271 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273}
274
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700275func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700276 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277}
278
Jooyung Han643adc42020-02-27 13:50:06 +0900279// ensure that 'result' equals 'expected'
280func ensureEquals(t *testing.T, result string, expected string) {
281 t.Helper()
282 if result != expected {
283 t.Errorf("%q != %q", expected, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287// ensure that 'result' contains 'expected'
288func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if !strings.Contains(result, expected) {
291 t.Errorf("%q is not found in %q", expected, result)
292 }
293}
294
Liz Kammer5bd365f2020-05-27 15:15:11 -0700295// ensure that 'result' contains 'expected' exactly one time
296func ensureContainsOnce(t *testing.T, result string, expected string) {
297 t.Helper()
298 count := strings.Count(result, expected)
299 if count != 1 {
300 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
301 }
302}
303
Jiyong Park25fc6a92018-11-18 18:02:45 +0900304// ensures that 'result' does not contain 'notExpected'
305func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900306 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307 if strings.Contains(result, notExpected) {
308 t.Errorf("%q is found in %q", notExpected, result)
309 }
310}
311
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700312func ensureMatches(t *testing.T, result string, expectedRex string) {
313 ok, err := regexp.MatchString(expectedRex, result)
314 if err != nil {
315 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
316 return
317 }
318 if !ok {
319 t.Errorf("%s does not match regular expession %s", result, expectedRex)
320 }
321}
322
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900324 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 if !android.InList(expected, result) {
326 t.Errorf("%q is not found in %v", expected, result)
327 }
328}
329
330func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900331 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 if android.InList(notExpected, result) {
333 t.Errorf("%q is found in %v", notExpected, result)
334 }
335}
336
Jooyung Hane1633032019-08-01 17:41:43 +0900337func ensureListEmpty(t *testing.T, result []string) {
338 t.Helper()
339 if len(result) > 0 {
340 t.Errorf("%q is expected to be empty", result)
341 }
342}
343
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000344func ensureListNotEmpty(t *testing.T, result []string) {
345 t.Helper()
346 if len(result) == 0 {
347 t.Errorf("%q is expected to be not empty", result)
348 }
349}
350
Jiyong Park25fc6a92018-11-18 18:02:45 +0900351// Minimal test
352func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800353 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900354 apex_defaults {
355 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900356 manifest: ":myapex.manifest",
357 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900358 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900359 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900360 native_shared_libs: [
361 "mylib",
362 "libfoo.ffi",
363 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900364 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800365 multilib: {
366 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900367 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800368 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900369 },
Jiyong Park77acec62020-06-01 21:39:15 +0900370 java_libs: [
371 "myjar",
372 "myjar_dex",
373 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000374 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900375 }
376
Jiyong Park30ca9372019-02-07 16:27:23 +0900377 apex {
378 name: "myapex",
379 defaults: ["myapex-defaults"],
380 }
381
Jiyong Park25fc6a92018-11-18 18:02:45 +0900382 apex_key {
383 name: "myapex.key",
384 public_key: "testkey.avbpubkey",
385 private_key: "testkey.pem",
386 }
387
Jiyong Park809bb722019-02-13 21:33:49 +0900388 filegroup {
389 name: "myapex.manifest",
390 srcs: ["apex_manifest.json"],
391 }
392
393 filegroup {
394 name: "myapex.androidmanifest",
395 srcs: ["AndroidManifest.xml"],
396 }
397
Jiyong Park25fc6a92018-11-18 18:02:45 +0900398 cc_library {
399 name: "mylib",
400 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900401 shared_libs: [
402 "mylib2",
403 "libbar.ffi",
404 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900405 system_shared_libs: [],
406 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000407 // TODO: remove //apex_available:platform
408 apex_available: [
409 "//apex_available:platform",
410 "myapex",
411 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900412 }
413
Alex Light3d673592019-01-18 14:37:31 -0800414 cc_binary {
415 name: "foo",
416 srcs: ["mylib.cpp"],
417 compile_multilib: "both",
418 multilib: {
419 lib32: {
420 suffix: "32",
421 },
422 lib64: {
423 suffix: "64",
424 },
425 },
426 symlinks: ["foo_link_"],
427 symlink_preferred_arch: true,
428 system_shared_libs: [],
429 static_executable: true,
430 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700431 apex_available: [ "myapex", "com.android.gki.*" ],
432 }
433
Jiyong Park99644e92020-11-17 22:21:02 +0900434 rust_binary {
435 name: "foo.rust",
436 srcs: ["foo.rs"],
437 rlibs: ["libfoo.rlib.rust"],
438 dylibs: ["libfoo.dylib.rust"],
439 apex_available: ["myapex"],
440 }
441
442 rust_library_rlib {
443 name: "libfoo.rlib.rust",
444 srcs: ["foo.rs"],
445 crate_name: "foo",
446 apex_available: ["myapex"],
447 }
448
449 rust_library_dylib {
450 name: "libfoo.dylib.rust",
451 srcs: ["foo.rs"],
452 crate_name: "foo",
453 apex_available: ["myapex"],
454 }
455
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900456 rust_ffi_shared {
457 name: "libfoo.ffi",
458 srcs: ["foo.rs"],
459 crate_name: "foo",
460 apex_available: ["myapex"],
461 }
462
463 rust_ffi_shared {
464 name: "libbar.ffi",
465 srcs: ["foo.rs"],
466 crate_name: "bar",
467 apex_available: ["myapex"],
468 }
469
Yifan Hongd22a84a2020-07-28 17:37:46 -0700470 apex {
471 name: "com.android.gki.fake",
472 binaries: ["foo"],
473 key: "myapex.key",
474 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000475 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800476 }
477
Paul Duffindddd5462020-04-07 15:25:44 +0100478 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900479 name: "mylib2",
480 srcs: ["mylib.cpp"],
481 system_shared_libs: [],
482 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900483 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900484 static_libs: ["libstatic"],
485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
490 }
491
Paul Duffindddd5462020-04-07 15:25:44 +0100492 cc_prebuilt_library_shared {
493 name: "mylib2",
494 srcs: ["prebuilt.so"],
495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
500 }
501
Jiyong Park9918e1a2020-03-17 19:16:40 +0900502 cc_library_static {
503 name: "libstatic",
504 srcs: ["mylib.cpp"],
505 system_shared_libs: [],
506 stl: "none",
507 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900513 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900514
515 java_library {
516 name: "myjar",
517 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900518 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900519 sdk_version: "none",
520 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900521 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900522 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000523 // TODO: remove //apex_available:platform
524 apex_available: [
525 "//apex_available:platform",
526 "myapex",
527 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900528 }
529
Jiyong Park77acec62020-06-01 21:39:15 +0900530 dex_import {
531 name: "myjar_dex",
532 jars: ["prebuilt.jar"],
533 apex_available: [
534 "//apex_available:platform",
535 "myapex",
536 ],
537 }
538
Jiyong Park7f7766d2019-07-25 22:02:35 +0900539 java_library {
540 name: "myotherjar",
541 srcs: ["foo/bar/MyClass.java"],
542 sdk_version: "none",
543 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900544 // TODO: remove //apex_available:platform
545 apex_available: [
546 "//apex_available:platform",
547 "myapex",
548 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900549 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900550
551 java_library {
552 name: "mysharedjar",
553 srcs: ["foo/bar/MyClass.java"],
554 sdk_version: "none",
555 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900556 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557 `)
558
Sundong Ahnabb64432019-10-22 13:58:29 +0900559 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900560
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900561 // Make sure that Android.mk is created
562 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700563 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900564 var builder strings.Builder
565 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
566
567 androidMk := builder.String()
568 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
569 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
570
Jiyong Park42cca6c2019-04-01 11:15:50 +0900571 optFlags := apexRule.Args["opt_flags"]
572 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700573 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900574 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900575
Jiyong Park25fc6a92018-11-18 18:02:45 +0900576 copyCmds := apexRule.Args["copy_commands"]
577
578 // Ensure that main rule creates an output
579 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
580
581 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700582 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
583 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
584 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900585 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900586 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900587
588 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700589 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
590 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900591 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
592 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900593 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900594
595 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
597 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900598 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900599 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900600 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900601 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
602 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900603 // .. but not for java libs
604 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900605 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800606
Colin Cross7113d202019-11-20 16:39:12 -0800607 // Ensure that the platform variant ends with _shared or _common
608 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
609 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900610 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
611 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900612 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
613
614 // Ensure that dynamic dependency to java libs are not included
615 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800616
617 // Ensure that all symlinks are present.
618 found_foo_link_64 := false
619 found_foo := false
620 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900621 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800622 if strings.HasSuffix(cmd, "bin/foo") {
623 found_foo = true
624 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
625 found_foo_link_64 = true
626 }
627 }
628 }
629 good := found_foo && found_foo_link_64
630 if !good {
631 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
632 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900633
Sundong Ahnabb64432019-10-22 13:58:29 +0900634 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700635 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900636 if len(noticeInputs) != 3 {
637 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900638 }
639 ensureListContains(t, noticeInputs, "NOTICE")
640 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900641 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900642
Artur Satayeva8bd1132020-04-27 18:07:06 +0100643 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100644 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
645 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
646 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
647 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
648 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100649
650 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100651 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
652 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
653 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
654 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
655 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800656}
657
Jooyung Hanf21c7972019-12-16 22:32:06 +0900658func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800659 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 apex_defaults {
661 name: "myapex-defaults",
662 key: "myapex.key",
663 prebuilts: ["myetc"],
664 native_shared_libs: ["mylib"],
665 java_libs: ["myjar"],
666 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900667 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800668 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000669 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900670 }
671
672 prebuilt_etc {
673 name: "myetc",
674 src: "myprebuilt",
675 }
676
677 apex {
678 name: "myapex",
679 defaults: ["myapex-defaults"],
680 }
681
682 apex_key {
683 name: "myapex.key",
684 public_key: "testkey.avbpubkey",
685 private_key: "testkey.pem",
686 }
687
688 cc_library {
689 name: "mylib",
690 system_shared_libs: [],
691 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000692 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900693 }
694
695 java_library {
696 name: "myjar",
697 srcs: ["foo/bar/MyClass.java"],
698 sdk_version: "none",
699 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000700 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900701 }
702
703 android_app {
704 name: "AppFoo",
705 srcs: ["foo/bar/MyClass.java"],
706 sdk_version: "none",
707 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000708 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900709 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900710
711 runtime_resource_overlay {
712 name: "rro",
713 theme: "blue",
714 }
715
markchien2f59ec92020-09-02 16:23:38 +0800716 bpf {
717 name: "bpf",
718 srcs: ["bpf.c", "bpf2.c"],
719 }
720
Jooyung Hanf21c7972019-12-16 22:32:06 +0900721 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000722 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900723 "etc/myetc",
724 "javalib/myjar.jar",
725 "lib64/mylib.so",
726 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900727 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800728 "etc/bpf/bpf.o",
729 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900730 })
731}
732
Jooyung Han01a3ee22019-11-02 02:52:25 +0900733func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800734 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900735 apex {
736 name: "myapex",
737 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000738 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746 `)
747
748 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900749 args := module.Rule("apexRule").Args
750 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
751 t.Error("manifest should be apex_manifest.pb, but " + manifest)
752 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900753}
754
Alex Light5098a612018-11-29 17:12:15 -0800755func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800756 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800757 apex {
758 name: "myapex",
759 key: "myapex.key",
760 payload_type: "zip",
761 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000762 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800763 }
764
765 apex_key {
766 name: "myapex.key",
767 public_key: "testkey.avbpubkey",
768 private_key: "testkey.pem",
769 }
770
771 cc_library {
772 name: "mylib",
773 srcs: ["mylib.cpp"],
774 shared_libs: ["mylib2"],
775 system_shared_libs: [],
776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000777 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800778 }
779
780 cc_library {
781 name: "mylib2",
782 srcs: ["mylib.cpp"],
783 system_shared_libs: [],
784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000785 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800786 }
787 `)
788
Sundong Ahnabb64432019-10-22 13:58:29 +0900789 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800790 copyCmds := zipApexRule.Args["copy_commands"]
791
792 // Ensure that main rule creates an output
793 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
794
795 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700796 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800797
798 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800800
801 // Ensure that both direct and indirect deps are copied into apex
802 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
803 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804}
805
806func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800807 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900808 apex {
809 name: "myapex",
810 key: "myapex.key",
811 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000812 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900813 }
814
815 apex_key {
816 name: "myapex.key",
817 public_key: "testkey.avbpubkey",
818 private_key: "testkey.pem",
819 }
820
821 cc_library {
822 name: "mylib",
823 srcs: ["mylib.cpp"],
824 shared_libs: ["mylib2", "mylib3"],
825 system_shared_libs: [],
826 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000827 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900828 }
829
830 cc_library {
831 name: "mylib2",
832 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900833 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900834 system_shared_libs: [],
835 stl: "none",
836 stubs: {
837 versions: ["1", "2", "3"],
838 },
839 }
840
841 cc_library {
842 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900843 srcs: ["mylib.cpp"],
844 shared_libs: ["mylib4"],
845 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 stl: "none",
847 stubs: {
848 versions: ["10", "11", "12"],
849 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000850 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900851 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900852
853 cc_library {
854 name: "mylib4",
855 srcs: ["mylib.cpp"],
856 system_shared_libs: [],
857 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000858 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900859 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900860 `)
861
Sundong Ahnabb64432019-10-22 13:58:29 +0900862 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 copyCmds := apexRule.Args["copy_commands"]
864
865 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800866 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867
868 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800869 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870
871 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800872 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873
Colin Crossaede88c2020-08-11 12:17:01 -0700874 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900875
876 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900877 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900879 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880
881 // 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 -0700882 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700884 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900885
886 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900887 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900888 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900889
890 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700891 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900892
Jooyung Hana57af4a2020-01-23 05:36:59 +0000893 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900894 "lib64/mylib.so",
895 "lib64/mylib3.so",
896 "lib64/mylib4.so",
897 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898}
899
Colin Cross7812fd32020-09-25 12:35:10 -0700900func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
901 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800902 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700903 apex {
904 name: "myapex",
905 key: "myapex.key",
906 native_shared_libs: ["mylib", "mylib3"],
907 min_sdk_version: "29",
908 }
909
910 apex_key {
911 name: "myapex.key",
912 public_key: "testkey.avbpubkey",
913 private_key: "testkey.pem",
914 }
915
916 cc_library {
917 name: "mylib",
918 srcs: ["mylib.cpp"],
919 shared_libs: ["mylib2", "mylib3"],
920 system_shared_libs: [],
921 stl: "none",
922 apex_available: [ "myapex" ],
923 min_sdk_version: "28",
924 }
925
926 cc_library {
927 name: "mylib2",
928 srcs: ["mylib.cpp"],
929 cflags: ["-include mylib.h"],
930 system_shared_libs: [],
931 stl: "none",
932 stubs: {
933 versions: ["28", "29", "30", "current"],
934 },
935 min_sdk_version: "28",
936 }
937
938 cc_library {
939 name: "mylib3",
940 srcs: ["mylib.cpp"],
941 shared_libs: ["mylib4"],
942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
945 versions: ["28", "29", "30", "current"],
946 },
947 apex_available: [ "myapex" ],
948 min_sdk_version: "28",
949 }
950
951 cc_library {
952 name: "mylib4",
953 srcs: ["mylib.cpp"],
954 system_shared_libs: [],
955 stl: "none",
956 apex_available: [ "myapex" ],
957 min_sdk_version: "28",
958 }
959 `)
960
961 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
962 copyCmds := apexRule.Args["copy_commands"]
963
964 // Ensure that direct non-stubs dep is always included
965 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
966
967 // Ensure that indirect stubs dep is not included
968 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
969
970 // Ensure that direct stubs dep is included
971 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
972
973 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
974
Jiyong Park55549df2021-02-26 23:57:23 +0900975 // Ensure that mylib is linking with the latest version of stub for mylib2
976 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -0700977 // ... and not linking to the non-stub (impl) variant of mylib2
978 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
979
980 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
981 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
982 // .. and not linking to the stubs variant of mylib3
983 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
984
985 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700986 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700987 ensureNotContains(t, mylib2Cflags, "-include ")
988
989 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700990 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700991
992 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
993 "lib64/mylib.so",
994 "lib64/mylib3.so",
995 "lib64/mylib4.so",
996 })
997}
998
Jooyung Han11b0fbd2021-02-05 02:28:22 +0900999func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1000 t.Parallel()
1001 // myapex (Z)
1002 // mylib -----------------.
1003 // |
1004 // otherapex (29) |
1005 // libstub's versions: 29 Z current
1006 // |
1007 // <platform> |
1008 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001009 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001010 apex {
1011 name: "myapex",
1012 key: "myapex.key",
1013 native_shared_libs: ["mylib"],
1014 min_sdk_version: "Z", // non-final
1015 }
1016
1017 cc_library {
1018 name: "mylib",
1019 srcs: ["mylib.cpp"],
1020 shared_libs: ["libstub"],
1021 apex_available: ["myapex"],
1022 min_sdk_version: "Z",
1023 }
1024
1025 apex_key {
1026 name: "myapex.key",
1027 public_key: "testkey.avbpubkey",
1028 private_key: "testkey.pem",
1029 }
1030
1031 apex {
1032 name: "otherapex",
1033 key: "myapex.key",
1034 native_shared_libs: ["libstub"],
1035 min_sdk_version: "29",
1036 }
1037
1038 cc_library {
1039 name: "libstub",
1040 srcs: ["mylib.cpp"],
1041 stubs: {
1042 versions: ["29", "Z", "current"],
1043 },
1044 apex_available: ["otherapex"],
1045 min_sdk_version: "29",
1046 }
1047
1048 // platform module depending on libstub from otherapex should use the latest stub("current")
1049 cc_library {
1050 name: "libplatform",
1051 srcs: ["mylib.cpp"],
1052 shared_libs: ["libstub"],
1053 }
1054 `, func(fs map[string][]byte, config android.Config) {
1055 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1056 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1057 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1058 })
1059
Jiyong Park55549df2021-02-26 23:57:23 +09001060 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001061 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001062 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001063 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001064 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001065
1066 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1067 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1068 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1069 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1070 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1071}
1072
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001073func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001074 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001075 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001076 name: "myapex2",
1077 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001078 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001079 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001080 }
1081
1082 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001083 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001084 public_key: "testkey.avbpubkey",
1085 private_key: "testkey.pem",
1086 }
1087
1088 cc_library {
1089 name: "mylib",
1090 srcs: ["mylib.cpp"],
1091 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001092 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001093 system_shared_libs: [],
1094 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001095 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001096 }
1097
1098 cc_library {
1099 name: "libfoo",
1100 srcs: ["mylib.cpp"],
1101 shared_libs: ["libbar"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 stubs: {
1105 versions: ["10", "20", "30"],
1106 },
1107 }
1108
1109 cc_library {
1110 name: "libbar",
1111 srcs: ["mylib.cpp"],
1112 system_shared_libs: [],
1113 stl: "none",
1114 }
1115
Jiyong Park678c8812020-02-07 17:25:49 +09001116 cc_library_static {
1117 name: "libbaz",
1118 srcs: ["mylib.cpp"],
1119 system_shared_libs: [],
1120 stl: "none",
1121 apex_available: [ "myapex2" ],
1122 }
1123
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001124 `)
1125
Jiyong Park83dc74b2020-01-14 18:38:44 +09001126 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001127 copyCmds := apexRule.Args["copy_commands"]
1128
1129 // Ensure that direct non-stubs dep is always included
1130 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1131
1132 // Ensure that indirect stubs dep is not included
1133 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1134
1135 // Ensure that dependency of stubs is not included
1136 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1137
Colin Crossaede88c2020-08-11 12:17:01 -07001138 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001139
1140 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001141 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001142 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001143 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001144
Jiyong Park3ff16992019-12-27 14:11:47 +09001145 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001146
1147 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1148 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001149
Artur Satayeva8bd1132020-04-27 18:07:06 +01001150 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001151 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1152 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1153 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001154
Artur Satayeva8bd1132020-04-27 18:07:06 +01001155 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001156 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1157 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1158 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001159}
1160
Jooyung Hand3639552019-08-09 12:57:43 +09001161func TestApexWithRuntimeLibsDependency(t *testing.T) {
1162 /*
1163 myapex
1164 |
1165 v (runtime_libs)
1166 mylib ------+------> libfoo [provides stub]
1167 |
1168 `------> libbar
1169 */
Colin Cross1c460562021-02-16 17:55:47 -08001170 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001171 apex {
1172 name: "myapex",
1173 key: "myapex.key",
1174 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001175 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001176 }
1177
1178 apex_key {
1179 name: "myapex.key",
1180 public_key: "testkey.avbpubkey",
1181 private_key: "testkey.pem",
1182 }
1183
1184 cc_library {
1185 name: "mylib",
1186 srcs: ["mylib.cpp"],
1187 runtime_libs: ["libfoo", "libbar"],
1188 system_shared_libs: [],
1189 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001190 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001191 }
1192
1193 cc_library {
1194 name: "libfoo",
1195 srcs: ["mylib.cpp"],
1196 system_shared_libs: [],
1197 stl: "none",
1198 stubs: {
1199 versions: ["10", "20", "30"],
1200 },
1201 }
1202
1203 cc_library {
1204 name: "libbar",
1205 srcs: ["mylib.cpp"],
1206 system_shared_libs: [],
1207 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001208 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001209 }
1210
1211 `)
1212
Sundong Ahnabb64432019-10-22 13:58:29 +09001213 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001214 copyCmds := apexRule.Args["copy_commands"]
1215
1216 // Ensure that direct non-stubs dep is always included
1217 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1218
1219 // Ensure that indirect stubs dep is not included
1220 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1221
1222 // Ensure that runtime_libs dep in included
1223 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1224
Sundong Ahnabb64432019-10-22 13:58:29 +09001225 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001226 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1227 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001228
1229}
1230
Jooyung Han8ce8db92020-05-15 19:05:05 +09001231func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001232 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001233 bp := `
1234 apex {
1235 name: "com.android.runtime",
1236 key: "com.android.runtime.key",
1237 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001238 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001239 }
1240
1241 apex_key {
1242 name: "com.android.runtime.key",
1243 public_key: "testkey.avbpubkey",
1244 private_key: "testkey.pem",
1245 }
1246
1247 cc_library {
1248 name: "libc",
1249 no_libcrt: true,
1250 nocrt: true,
1251 stl: "none",
1252 system_shared_libs: [],
1253 stubs: { versions: ["1"] },
1254 apex_available: ["com.android.runtime"],
1255
1256 sanitize: {
1257 hwaddress: true,
1258 }
1259 }
1260
1261 cc_prebuilt_library_shared {
1262 name: "libclang_rt.hwasan-aarch64-android",
1263 no_libcrt: true,
1264 nocrt: true,
1265 stl: "none",
1266 system_shared_libs: [],
1267 srcs: [""],
1268 stubs: { versions: ["1"] },
1269
1270 sanitize: {
1271 never: true,
1272 },
1273 }
1274 `
1275 // override bp to use hard-coded names: com.android.runtime and libc
1276 fs["Android.bp"] = []byte(bp)
1277 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1278 })
1279
1280 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1281 "lib64/bionic/libc.so",
1282 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1283 })
1284
1285 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1286
1287 installed := hwasan.Description("install libclang_rt.hwasan")
1288 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1289
1290 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1291 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1292 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1293}
1294
1295func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001296 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001297 bp := `
1298 apex {
1299 name: "com.android.runtime",
1300 key: "com.android.runtime.key",
1301 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001302 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001303 }
1304
1305 apex_key {
1306 name: "com.android.runtime.key",
1307 public_key: "testkey.avbpubkey",
1308 private_key: "testkey.pem",
1309 }
1310
1311 cc_library {
1312 name: "libc",
1313 no_libcrt: true,
1314 nocrt: true,
1315 stl: "none",
1316 system_shared_libs: [],
1317 stubs: { versions: ["1"] },
1318 apex_available: ["com.android.runtime"],
1319 }
1320
1321 cc_prebuilt_library_shared {
1322 name: "libclang_rt.hwasan-aarch64-android",
1323 no_libcrt: true,
1324 nocrt: true,
1325 stl: "none",
1326 system_shared_libs: [],
1327 srcs: [""],
1328 stubs: { versions: ["1"] },
1329
1330 sanitize: {
1331 never: true,
1332 },
1333 }
1334 `
1335 // override bp to use hard-coded names: com.android.runtime and libc
1336 fs["Android.bp"] = []byte(bp)
1337 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1338
1339 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1340 })
1341
1342 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1343 "lib64/bionic/libc.so",
1344 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1345 })
1346
1347 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1348
1349 installed := hwasan.Description("install libclang_rt.hwasan")
1350 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1351
1352 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1353 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1354 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1355}
1356
Jooyung Han61b66e92020-03-21 14:21:46 +00001357func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1358 testcases := []struct {
1359 name string
1360 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001361 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001362 shouldLink string
1363 shouldNotLink []string
1364 }{
1365 {
Jiyong Park55549df2021-02-26 23:57:23 +09001366 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001367 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001368 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001369 shouldLink: "30",
1370 shouldNotLink: []string{"29"},
1371 },
1372 {
Jiyong Park55549df2021-02-26 23:57:23 +09001373 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001374 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001375 apexVariant: "apex29",
Jiyong Park55549df2021-02-26 23:57:23 +09001376 shouldLink: "30",
1377 shouldNotLink: []string{"29"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001378 },
1379 }
1380 for _, tc := range testcases {
1381 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001382 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001383 apex {
1384 name: "myapex",
1385 key: "myapex.key",
1386 use_vendor: true,
1387 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001388 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001389 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001390 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001391
Jooyung Han61b66e92020-03-21 14:21:46 +00001392 apex_key {
1393 name: "myapex.key",
1394 public_key: "testkey.avbpubkey",
1395 private_key: "testkey.pem",
1396 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001397
Jooyung Han61b66e92020-03-21 14:21:46 +00001398 cc_library {
1399 name: "mylib",
1400 srcs: ["mylib.cpp"],
1401 vendor_available: true,
1402 shared_libs: ["libbar"],
1403 system_shared_libs: [],
1404 stl: "none",
1405 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001406 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001407 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001408
Jooyung Han61b66e92020-03-21 14:21:46 +00001409 cc_library {
1410 name: "libbar",
1411 srcs: ["mylib.cpp"],
1412 system_shared_libs: [],
1413 stl: "none",
1414 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001415 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001416 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001417
Jooyung Han61b66e92020-03-21 14:21:46 +00001418 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001419 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001420 symbol_file: "",
1421 }
1422 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001423 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001424 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001425
Jooyung Han61b66e92020-03-21 14:21:46 +00001426 // Ensure that LLNDK dep is not included
1427 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1428 "lib64/mylib.so",
1429 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001430
Jooyung Han61b66e92020-03-21 14:21:46 +00001431 // Ensure that LLNDK dep is required
1432 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1433 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1434 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001435
Colin Crossaede88c2020-08-11 12:17:01 -07001436 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001437 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001438 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001439 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001440 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001441
Colin Crossaede88c2020-08-11 12:17:01 -07001442 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001443 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1444 })
1445 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001446}
1447
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001449 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001450 apex {
1451 name: "myapex",
1452 key: "myapex.key",
1453 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001454 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001455 }
1456
1457 apex_key {
1458 name: "myapex.key",
1459 public_key: "testkey.avbpubkey",
1460 private_key: "testkey.pem",
1461 }
1462
1463 cc_library {
1464 name: "mylib",
1465 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001466 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001467 shared_libs: ["libdl#27"],
1468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001469 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001470 }
1471
1472 cc_library_shared {
1473 name: "mylib_shared",
1474 srcs: ["mylib.cpp"],
1475 shared_libs: ["libdl#27"],
1476 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001477 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001478 }
1479
1480 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001481 name: "libBootstrap",
1482 srcs: ["mylib.cpp"],
1483 stl: "none",
1484 bootstrap: true,
1485 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001486 `)
1487
Sundong Ahnabb64432019-10-22 13:58:29 +09001488 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001489 copyCmds := apexRule.Args["copy_commands"]
1490
1491 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001492 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001493 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1494 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001495
1496 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001497 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001498
Colin Crossaede88c2020-08-11 12:17:01 -07001499 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1500 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1501 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001502
1503 // For dependency to libc
1504 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001505 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001506 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001507 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001508 // ... Cflags from stub is correctly exported to mylib
1509 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1510 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1511
1512 // For dependency to libm
1513 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001514 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001515 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001516 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001517 // ... and is not compiling with the stub
1518 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1519 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1520
1521 // For dependency to libdl
1522 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001523 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001524 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001525 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1526 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001527 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001528 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001529 // ... Cflags from stub is correctly exported to mylib
1530 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1531 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001532
1533 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001534 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1535 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1536 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1537 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001538}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001539
Jooyung Han749dc692020-04-15 11:03:39 +09001540func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001541 // there are three links between liba --> libz.
1542 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001543 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001544 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001545 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001546 apex {
1547 name: "myapex",
1548 key: "myapex.key",
1549 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001550 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001551 }
1552
1553 apex {
1554 name: "otherapex",
1555 key: "myapex.key",
1556 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001557 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001558 }
1559
1560 apex_key {
1561 name: "myapex.key",
1562 public_key: "testkey.avbpubkey",
1563 private_key: "testkey.pem",
1564 }
1565
1566 cc_library {
1567 name: "libx",
1568 shared_libs: ["liba"],
1569 system_shared_libs: [],
1570 stl: "none",
1571 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001572 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001573 }
1574
1575 cc_library {
1576 name: "liby",
1577 shared_libs: ["liba"],
1578 system_shared_libs: [],
1579 stl: "none",
1580 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001581 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001582 }
1583
1584 cc_library {
1585 name: "liba",
1586 shared_libs: ["libz"],
1587 system_shared_libs: [],
1588 stl: "none",
1589 apex_available: [
1590 "//apex_available:anyapex",
1591 "//apex_available:platform",
1592 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001593 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001594 }
1595
1596 cc_library {
1597 name: "libz",
1598 system_shared_libs: [],
1599 stl: "none",
1600 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001601 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001602 },
1603 }
Jooyung Han749dc692020-04-15 11:03:39 +09001604 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001605
1606 expectLink := func(from, from_variant, to, to_variant string) {
1607 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1608 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1609 }
1610 expectNoLink := func(from, from_variant, to, to_variant string) {
1611 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1612 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1613 }
1614 // platform liba is linked to non-stub version
1615 expectLink("liba", "shared", "libz", "shared")
Jiyong Park55549df2021-02-26 23:57:23 +09001616 // liba in myapex is linked to #30
1617 expectLink("liba", "shared_apex29", "libz", "shared_30")
1618 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001619 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001620 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001621 expectLink("liba", "shared_apex30", "libz", "shared_30")
1622 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1623 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001624}
1625
Jooyung Hanaed150d2020-04-02 01:41:41 +09001626func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001627 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001628 apex {
1629 name: "myapex",
1630 key: "myapex.key",
1631 native_shared_libs: ["libx"],
1632 min_sdk_version: "R",
1633 }
1634
1635 apex_key {
1636 name: "myapex.key",
1637 public_key: "testkey.avbpubkey",
1638 private_key: "testkey.pem",
1639 }
1640
1641 cc_library {
1642 name: "libx",
1643 shared_libs: ["libz"],
1644 system_shared_libs: [],
1645 stl: "none",
1646 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001647 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001648 }
1649
1650 cc_library {
1651 name: "libz",
1652 system_shared_libs: [],
1653 stl: "none",
1654 stubs: {
1655 versions: ["29", "R"],
1656 },
1657 }
1658 `, func(fs map[string][]byte, config android.Config) {
1659 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1660 })
1661
1662 expectLink := func(from, from_variant, to, to_variant string) {
1663 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1664 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1665 }
1666 expectNoLink := func(from, from_variant, to, to_variant string) {
1667 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1668 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1669 }
Dan Albertc8060532020-07-22 22:32:17 -07001670 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001671 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1672 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001673}
1674
Jooyung Han749dc692020-04-15 11:03:39 +09001675func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001676 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001677 apex {
1678 name: "myapex",
1679 key: "myapex.key",
1680 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001681 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001682 }
1683
1684 apex_key {
1685 name: "myapex.key",
1686 public_key: "testkey.avbpubkey",
1687 private_key: "testkey.pem",
1688 }
1689
1690 cc_library {
1691 name: "libx",
1692 shared_libs: ["libz"],
1693 system_shared_libs: [],
1694 stl: "none",
1695 apex_available: [ "myapex" ],
1696 }
1697
1698 cc_library {
1699 name: "libz",
1700 system_shared_libs: [],
1701 stl: "none",
1702 stubs: {
1703 versions: ["1", "2"],
1704 },
1705 }
1706 `)
1707
1708 expectLink := func(from, from_variant, to, to_variant string) {
1709 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1710 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1711 }
1712 expectNoLink := func(from, from_variant, to, to_variant string) {
1713 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1714 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1715 }
Colin Crossaede88c2020-08-11 12:17:01 -07001716 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1717 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1718 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001719}
1720
1721func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001722 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001723 apex {
1724 name: "myapex",
1725 key: "myapex.key",
1726 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001727 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001728 }
1729
1730 apex_key {
1731 name: "myapex.key",
1732 public_key: "testkey.avbpubkey",
1733 private_key: "testkey.pem",
1734 }
1735
1736 cc_library {
1737 name: "libx",
1738 system_shared_libs: [],
1739 stl: "none",
1740 apex_available: [ "myapex" ],
1741 stubs: {
1742 versions: ["1", "2"],
1743 },
1744 }
1745
1746 cc_library {
1747 name: "libz",
1748 shared_libs: ["libx"],
1749 system_shared_libs: [],
1750 stl: "none",
1751 }
1752 `)
1753
1754 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001755 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001756 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1757 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1758 }
1759 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001760 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001761 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1762 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1763 }
1764 expectLink("libz", "shared", "libx", "shared_2")
1765 expectNoLink("libz", "shared", "libz", "shared_1")
1766 expectNoLink("libz", "shared", "libz", "shared")
1767}
1768
Jooyung Han75568392020-03-20 04:29:24 +09001769func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001770 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001771 apex {
1772 name: "myapex",
1773 key: "myapex.key",
1774 native_shared_libs: ["libx"],
1775 min_sdk_version: "29",
1776 }
1777
1778 apex_key {
1779 name: "myapex.key",
1780 public_key: "testkey.avbpubkey",
1781 private_key: "testkey.pem",
1782 }
1783
1784 cc_library {
1785 name: "libx",
1786 shared_libs: ["libbar"],
1787 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001788 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001789 }
1790
1791 cc_library {
1792 name: "libbar",
1793 stubs: {
1794 versions: ["29", "30"],
1795 },
1796 }
Jooyung Han75568392020-03-20 04:29:24 +09001797 `, func(fs map[string][]byte, config android.Config) {
1798 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1799 })
Jooyung Han03b51852020-02-26 22:45:42 +09001800 expectLink := func(from, from_variant, to, to_variant string) {
1801 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1802 libFlags := ld.Args["libFlags"]
1803 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1804 }
Colin Crossaede88c2020-08-11 12:17:01 -07001805 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001806}
1807
Jooyung Han75568392020-03-20 04:29:24 +09001808func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001809 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001810 apex {
1811 name: "myapex",
1812 key: "myapex.key",
1813 native_shared_libs: ["libx"],
1814 min_sdk_version: "29",
1815 }
1816
1817 apex_key {
1818 name: "myapex.key",
1819 public_key: "testkey.avbpubkey",
1820 private_key: "testkey.pem",
1821 }
1822
1823 cc_library {
1824 name: "libx",
1825 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001826 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001827 }
Jooyung Han75568392020-03-20 04:29:24 +09001828 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001829
1830 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001831 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001832 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001833 // note that platform variant is not.
1834 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001835 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001836}
1837
Jooyung Han749dc692020-04-15 11:03:39 +09001838func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1839 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001840 apex {
1841 name: "myapex",
1842 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001843 native_shared_libs: ["mylib"],
1844 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001845 }
1846
1847 apex_key {
1848 name: "myapex.key",
1849 public_key: "testkey.avbpubkey",
1850 private_key: "testkey.pem",
1851 }
Jooyung Han749dc692020-04-15 11:03:39 +09001852
1853 cc_library {
1854 name: "mylib",
1855 srcs: ["mylib.cpp"],
1856 system_shared_libs: [],
1857 stl: "none",
1858 apex_available: [
1859 "myapex",
1860 ],
1861 min_sdk_version: "30",
1862 }
1863 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001864
1865 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1866 apex {
1867 name: "myapex",
1868 key: "myapex.key",
1869 native_shared_libs: ["libfoo.ffi"],
1870 min_sdk_version: "29",
1871 }
1872
1873 apex_key {
1874 name: "myapex.key",
1875 public_key: "testkey.avbpubkey",
1876 private_key: "testkey.pem",
1877 }
1878
1879 rust_ffi_shared {
1880 name: "libfoo.ffi",
1881 srcs: ["foo.rs"],
1882 crate_name: "foo",
1883 apex_available: [
1884 "myapex",
1885 ],
1886 min_sdk_version: "30",
1887 }
1888 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001889}
1890
1891func TestApexMinSdkVersion_Okay(t *testing.T) {
1892 testApex(t, `
1893 apex {
1894 name: "myapex",
1895 key: "myapex.key",
1896 native_shared_libs: ["libfoo"],
1897 java_libs: ["libbar"],
1898 min_sdk_version: "29",
1899 }
1900
1901 apex_key {
1902 name: "myapex.key",
1903 public_key: "testkey.avbpubkey",
1904 private_key: "testkey.pem",
1905 }
1906
1907 cc_library {
1908 name: "libfoo",
1909 srcs: ["mylib.cpp"],
1910 shared_libs: ["libfoo_dep"],
1911 apex_available: ["myapex"],
1912 min_sdk_version: "29",
1913 }
1914
1915 cc_library {
1916 name: "libfoo_dep",
1917 srcs: ["mylib.cpp"],
1918 apex_available: ["myapex"],
1919 min_sdk_version: "29",
1920 }
1921
1922 java_library {
1923 name: "libbar",
1924 sdk_version: "current",
1925 srcs: ["a.java"],
1926 static_libs: ["libbar_dep"],
1927 apex_available: ["myapex"],
1928 min_sdk_version: "29",
1929 }
1930
1931 java_library {
1932 name: "libbar_dep",
1933 sdk_version: "current",
1934 srcs: ["a.java"],
1935 apex_available: ["myapex"],
1936 min_sdk_version: "29",
1937 }
Jooyung Han03b51852020-02-26 22:45:42 +09001938 `)
1939}
1940
Artur Satayev8cf899a2020-04-15 17:29:42 +01001941func TestJavaStableSdkVersion(t *testing.T) {
1942 testCases := []struct {
1943 name string
1944 expectedError string
1945 bp string
1946 }{
1947 {
1948 name: "Non-updatable apex with non-stable dep",
1949 bp: `
1950 apex {
1951 name: "myapex",
1952 java_libs: ["myjar"],
1953 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001954 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01001955 }
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 stable dep",
1971 bp: `
1972 apex {
1973 name: "myapex",
1974 java_libs: ["myjar"],
1975 key: "myapex.key",
1976 updatable: true,
1977 min_sdk_version: "29",
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"],
Jooyung Han749dc692020-04-15 11:03:39 +09001989 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001990 }
1991 `,
1992 },
1993 {
1994 name: "Updatable apex with non-stable dep",
1995 expectedError: "cannot depend on \"myjar\"",
1996 bp: `
1997 apex {
1998 name: "myapex",
1999 java_libs: ["myjar"],
2000 key: "myapex.key",
2001 updatable: true,
2002 }
2003 apex_key {
2004 name: "myapex.key",
2005 public_key: "testkey.avbpubkey",
2006 private_key: "testkey.pem",
2007 }
2008 java_library {
2009 name: "myjar",
2010 srcs: ["foo/bar/MyClass.java"],
2011 sdk_version: "core_platform",
2012 apex_available: ["myapex"],
2013 }
2014 `,
2015 },
2016 {
2017 name: "Updatable apex with non-stable transitive dep",
Jiyong Park670e0f62021-02-18 13:10:18 +09002018 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002019 bp: `
2020 apex {
2021 name: "myapex",
2022 java_libs: ["myjar"],
2023 key: "myapex.key",
2024 updatable: true,
2025 }
2026 apex_key {
2027 name: "myapex.key",
2028 public_key: "testkey.avbpubkey",
2029 private_key: "testkey.pem",
2030 }
2031 java_library {
2032 name: "myjar",
2033 srcs: ["foo/bar/MyClass.java"],
2034 sdk_version: "current",
2035 apex_available: ["myapex"],
2036 static_libs: ["transitive-jar"],
2037 }
2038 java_library {
2039 name: "transitive-jar",
2040 srcs: ["foo/bar/MyClass.java"],
2041 sdk_version: "core_platform",
2042 apex_available: ["myapex"],
2043 }
2044 `,
2045 },
2046 }
2047
2048 for _, test := range testCases {
2049 t.Run(test.name, func(t *testing.T) {
2050 if test.expectedError == "" {
2051 testApex(t, test.bp)
2052 } else {
2053 testApexError(t, test.expectedError, test.bp)
2054 }
2055 })
2056 }
2057}
2058
Jooyung Han749dc692020-04-15 11:03:39 +09002059func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2060 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2061 apex {
2062 name: "myapex",
2063 key: "myapex.key",
2064 native_shared_libs: ["mylib"],
2065 min_sdk_version: "29",
2066 }
2067
2068 apex_key {
2069 name: "myapex.key",
2070 public_key: "testkey.avbpubkey",
2071 private_key: "testkey.pem",
2072 }
2073
2074 cc_library {
2075 name: "mylib",
2076 srcs: ["mylib.cpp"],
2077 shared_libs: ["mylib2"],
2078 system_shared_libs: [],
2079 stl: "none",
2080 apex_available: [
2081 "myapex",
2082 ],
2083 min_sdk_version: "29",
2084 }
2085
2086 // indirect part of the apex
2087 cc_library {
2088 name: "mylib2",
2089 srcs: ["mylib.cpp"],
2090 system_shared_libs: [],
2091 stl: "none",
2092 apex_available: [
2093 "myapex",
2094 ],
2095 min_sdk_version: "30",
2096 }
2097 `)
2098}
2099
2100func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2101 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2102 apex {
2103 name: "myapex",
2104 key: "myapex.key",
2105 apps: ["AppFoo"],
2106 min_sdk_version: "29",
2107 }
2108
2109 apex_key {
2110 name: "myapex.key",
2111 public_key: "testkey.avbpubkey",
2112 private_key: "testkey.pem",
2113 }
2114
2115 android_app {
2116 name: "AppFoo",
2117 srcs: ["foo/bar/MyClass.java"],
2118 sdk_version: "current",
2119 min_sdk_version: "29",
2120 system_modules: "none",
2121 stl: "none",
2122 static_libs: ["bar"],
2123 apex_available: [ "myapex" ],
2124 }
2125
2126 java_library {
2127 name: "bar",
2128 sdk_version: "current",
2129 srcs: ["a.java"],
2130 apex_available: [ "myapex" ],
2131 }
2132 `)
2133}
2134
2135func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002136 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 native_shared_libs: ["mylib"],
2141 min_sdk_version: "29",
2142 }
2143
2144 apex_key {
2145 name: "myapex.key",
2146 public_key: "testkey.avbpubkey",
2147 private_key: "testkey.pem",
2148 }
2149
Jiyong Park55549df2021-02-26 23:57:23 +09002150 // mylib in myapex will link to mylib2#30
Jooyung Han749dc692020-04-15 11:03:39 +09002151 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2152 cc_library {
2153 name: "mylib",
2154 srcs: ["mylib.cpp"],
2155 shared_libs: ["mylib2"],
2156 system_shared_libs: [],
2157 stl: "none",
2158 apex_available: ["myapex", "otherapex"],
2159 min_sdk_version: "29",
2160 }
2161
2162 cc_library {
2163 name: "mylib2",
2164 srcs: ["mylib.cpp"],
2165 system_shared_libs: [],
2166 stl: "none",
2167 apex_available: ["otherapex"],
2168 stubs: { versions: ["29", "30"] },
2169 min_sdk_version: "30",
2170 }
2171
2172 apex {
2173 name: "otherapex",
2174 key: "myapex.key",
2175 native_shared_libs: ["mylib", "mylib2"],
2176 min_sdk_version: "30",
2177 }
2178 `)
2179 expectLink := func(from, from_variant, to, to_variant string) {
2180 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2181 libFlags := ld.Args["libFlags"]
2182 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2183 }
Jiyong Park55549df2021-02-26 23:57:23 +09002184 expectLink("mylib", "shared_apex29", "mylib2", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002185 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002186}
2187
Jooyung Haned124c32021-01-26 11:43:46 +09002188func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2189 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2190 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2191 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2192 }
2193 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2194 apex {
2195 name: "myapex",
2196 key: "myapex.key",
2197 native_shared_libs: ["libfoo"],
2198 min_sdk_version: "S",
2199 }
2200 apex_key {
2201 name: "myapex.key",
2202 public_key: "testkey.avbpubkey",
2203 private_key: "testkey.pem",
2204 }
2205 cc_library {
2206 name: "libfoo",
2207 shared_libs: ["libbar"],
2208 apex_available: ["myapex"],
2209 min_sdk_version: "29",
2210 }
2211 cc_library {
2212 name: "libbar",
2213 apex_available: ["myapex"],
2214 }
2215 `, withSAsActiveCodeNames)
2216}
2217
2218func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2219 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2220 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2221 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2222 }
Colin Cross1c460562021-02-16 17:55:47 -08002223 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002224 apex {
2225 name: "myapex",
2226 key: "myapex.key",
2227 native_shared_libs: ["libfoo"],
2228 min_sdk_version: "S",
2229 }
2230 apex_key {
2231 name: "myapex.key",
2232 public_key: "testkey.avbpubkey",
2233 private_key: "testkey.pem",
2234 }
2235 cc_library {
2236 name: "libfoo",
2237 shared_libs: ["libbar"],
2238 apex_available: ["myapex"],
2239 min_sdk_version: "S",
2240 }
2241 cc_library {
2242 name: "libbar",
2243 stubs: {
2244 symbol_file: "libbar.map.txt",
2245 versions: ["30", "S", "T"],
2246 },
2247 }
2248 `, withSAsActiveCodeNames)
2249
2250 // ensure libfoo is linked with "S" version of libbar stub
2251 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2252 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09002253 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_T/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002254}
2255
Jiyong Park7c2ee712018-12-07 00:42:25 +09002256func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002257 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002258 apex {
2259 name: "myapex",
2260 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002261 native_shared_libs: ["mylib"],
2262 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002263 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002264 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002265 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002266 }
2267
2268 apex_key {
2269 name: "myapex.key",
2270 public_key: "testkey.avbpubkey",
2271 private_key: "testkey.pem",
2272 }
2273
2274 prebuilt_etc {
2275 name: "myetc",
2276 src: "myprebuilt",
2277 sub_dir: "foo/bar",
2278 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002279
2280 cc_library {
2281 name: "mylib",
2282 srcs: ["mylib.cpp"],
2283 relative_install_path: "foo/bar",
2284 system_shared_libs: [],
2285 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002286 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002287 }
2288
2289 cc_binary {
2290 name: "mybin",
2291 srcs: ["mylib.cpp"],
2292 relative_install_path: "foo/bar",
2293 system_shared_libs: [],
2294 static_executable: true,
2295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002296 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002297 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002298 `)
2299
Sundong Ahnabb64432019-10-22 13:58:29 +09002300 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002301 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2302
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002303 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002304 ensureListContains(t, dirs, "etc")
2305 ensureListContains(t, dirs, "etc/foo")
2306 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002307 ensureListContains(t, dirs, "lib64")
2308 ensureListContains(t, dirs, "lib64/foo")
2309 ensureListContains(t, dirs, "lib64/foo/bar")
2310 ensureListContains(t, dirs, "lib")
2311 ensureListContains(t, dirs, "lib/foo")
2312 ensureListContains(t, dirs, "lib/foo/bar")
2313
Jiyong Parkbd13e442019-03-15 18:10:35 +09002314 ensureListContains(t, dirs, "bin")
2315 ensureListContains(t, dirs, "bin/foo")
2316 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002317}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002318
Jooyung Han35155c42020-02-06 17:33:20 +09002319func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002320 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002321 apex {
2322 name: "myapex",
2323 key: "myapex.key",
2324 multilib: {
2325 both: {
2326 native_shared_libs: ["mylib"],
2327 binaries: ["mybin"],
2328 },
2329 },
2330 compile_multilib: "both",
2331 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002332 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002333 }
2334
2335 apex_key {
2336 name: "myapex.key",
2337 public_key: "testkey.avbpubkey",
2338 private_key: "testkey.pem",
2339 }
2340
2341 cc_library {
2342 name: "mylib",
2343 relative_install_path: "foo/bar",
2344 system_shared_libs: [],
2345 stl: "none",
2346 apex_available: [ "myapex" ],
2347 native_bridge_supported: true,
2348 }
2349
2350 cc_binary {
2351 name: "mybin",
2352 relative_install_path: "foo/bar",
2353 system_shared_libs: [],
2354 static_executable: true,
2355 stl: "none",
2356 apex_available: [ "myapex" ],
2357 native_bridge_supported: true,
2358 compile_multilib: "both", // default is "first" for binary
2359 multilib: {
2360 lib64: {
2361 suffix: "64",
2362 },
2363 },
2364 }
2365 `, withNativeBridgeEnabled)
2366 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2367 "bin/foo/bar/mybin",
2368 "bin/foo/bar/mybin64",
2369 "bin/arm/foo/bar/mybin",
2370 "bin/arm64/foo/bar/mybin64",
2371 "lib/foo/bar/mylib.so",
2372 "lib/arm/foo/bar/mylib.so",
2373 "lib64/foo/bar/mylib.so",
2374 "lib64/arm64/foo/bar/mylib.so",
2375 })
2376}
2377
Jiyong Parkda6eb592018-12-19 17:12:36 +09002378func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002379 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002380 apex {
2381 name: "myapex",
2382 key: "myapex.key",
2383 native_shared_libs: ["mylib"],
2384 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002385 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002386 }
2387
2388 apex_key {
2389 name: "myapex.key",
2390 public_key: "testkey.avbpubkey",
2391 private_key: "testkey.pem",
2392 }
2393
2394 cc_library {
2395 name: "mylib",
2396 srcs: ["mylib.cpp"],
2397 shared_libs: ["mylib2"],
2398 system_shared_libs: [],
2399 vendor_available: true,
2400 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002401 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002402 }
2403
2404 cc_library {
2405 name: "mylib2",
2406 srcs: ["mylib.cpp"],
2407 system_shared_libs: [],
2408 vendor_available: true,
2409 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002410 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002411 }
Jooyung Handc782442019-11-01 03:14:38 +09002412 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002413 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002414 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002415
2416 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002417 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002418 for _, implicit := range i.Implicits {
2419 inputsList = append(inputsList, implicit.String())
2420 }
2421 }
2422 inputsString := strings.Join(inputsList, " ")
2423
2424 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002425 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2426 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002427
2428 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002429 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2430 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002431}
Jiyong Park16e91a02018-12-20 18:18:08 +09002432
Jooyung Han85d61762020-06-24 23:50:26 +09002433func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002434 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2435 apex {
2436 name: "myapex",
2437 key: "myapex.key",
2438 use_vendor: true,
2439 }
2440 apex_key {
2441 name: "myapex.key",
2442 public_key: "testkey.avbpubkey",
2443 private_key: "testkey.pem",
2444 }
2445 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002446 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002447 })
Colin Cross440e0d02020-06-11 11:32:11 -07002448 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002449 testApex(t, `
2450 apex {
2451 name: "myapex",
2452 key: "myapex.key",
2453 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002454 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002455 }
2456 apex_key {
2457 name: "myapex.key",
2458 public_key: "testkey.avbpubkey",
2459 private_key: "testkey.pem",
2460 }
2461 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002462 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002463 })
2464}
2465
Jooyung Han5c998b92019-06-27 11:30:33 +09002466func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2467 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2468 apex {
2469 name: "myapex",
2470 key: "myapex.key",
2471 native_shared_libs: ["mylib"],
2472 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002473 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002474 }
2475
2476 apex_key {
2477 name: "myapex.key",
2478 public_key: "testkey.avbpubkey",
2479 private_key: "testkey.pem",
2480 }
2481
2482 cc_library {
2483 name: "mylib",
2484 srcs: ["mylib.cpp"],
2485 system_shared_libs: [],
2486 stl: "none",
2487 }
2488 `)
2489}
2490
Jooyung Han85d61762020-06-24 23:50:26 +09002491func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002492 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002493 apex {
2494 name: "myapex",
2495 key: "myapex.key",
2496 binaries: ["mybin"],
2497 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002498 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002499 }
2500 apex_key {
2501 name: "myapex.key",
2502 public_key: "testkey.avbpubkey",
2503 private_key: "testkey.pem",
2504 }
2505 cc_binary {
2506 name: "mybin",
2507 vendor: true,
2508 shared_libs: ["libfoo"],
2509 }
2510 cc_library {
2511 name: "libfoo",
2512 proprietary: true,
2513 }
2514 `)
2515
2516 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2517 "bin/mybin",
2518 "lib64/libfoo.so",
2519 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2520 "lib64/libc++.so",
2521 })
2522
2523 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002524 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002525 name := apexBundle.BaseModuleName()
2526 prefix := "TARGET_"
2527 var builder strings.Builder
2528 data.Custom(&builder, name, prefix, "", data)
2529 androidMk := builder.String()
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002530 installPath := path.Join(buildDir, "../target/product/test_device/vendor/apex")
2531 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002532
2533 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2534 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2535 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002536}
2537
Jooyung Handf78e212020-07-22 15:54:47 +09002538func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002539 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002540 apex {
2541 name: "myapex",
2542 key: "myapex.key",
2543 binaries: ["mybin"],
2544 vendor: true,
2545 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002546 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553 cc_binary {
2554 name: "mybin",
2555 vendor: true,
2556 shared_libs: ["libvndk", "libvendor"],
2557 }
2558 cc_library {
2559 name: "libvndk",
2560 vndk: {
2561 enabled: true,
2562 },
2563 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002564 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002565 }
2566 cc_library {
2567 name: "libvendor",
2568 vendor: true,
2569 }
2570 `)
2571
2572 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2573
Colin Crossaede88c2020-08-11 12:17:01 -07002574 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002575 libs := names(ldRule.Args["libFlags"])
2576 // VNDK libs(libvndk/libc++) as they are
2577 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2578 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2579 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002580 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002581
2582 // VNDK libs are not included when use_vndk_as_stable: true
2583 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2584 "bin/mybin",
2585 "lib64/libvendor.so",
2586 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002587
2588 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2589 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2590 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002591}
2592
Jooyung Han8e5685d2020-09-21 11:02:57 +09002593func TestApex_withPrebuiltFirmware(t *testing.T) {
2594 testCases := []struct {
2595 name string
2596 additionalProp string
2597 }{
2598 {"system apex with prebuilt_firmware", ""},
2599 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2600 }
2601 for _, tc := range testCases {
2602 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002603 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002604 apex {
2605 name: "myapex",
2606 key: "myapex.key",
2607 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002608 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002609 `+tc.additionalProp+`
2610 }
2611 apex_key {
2612 name: "myapex.key",
2613 public_key: "testkey.avbpubkey",
2614 private_key: "testkey.pem",
2615 }
2616 prebuilt_firmware {
2617 name: "myfirmware",
2618 src: "myfirmware.bin",
2619 filename_from_src: true,
2620 `+tc.additionalProp+`
2621 }
2622 `)
2623 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2624 "etc/firmware/myfirmware.bin",
2625 })
2626 })
2627 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002628}
2629
Jooyung Hanefb184e2020-06-25 17:14:25 +09002630func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002631 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002632 apex {
2633 name: "myapex",
2634 key: "myapex.key",
2635 use_vendor: true,
2636 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002637 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002638 }
2639
2640 apex_key {
2641 name: "myapex.key",
2642 public_key: "testkey.avbpubkey",
2643 private_key: "testkey.pem",
2644 }
2645
2646 cc_library {
2647 name: "mylib",
2648 vendor_available: true,
2649 apex_available: ["myapex"],
2650 }
2651 `, func(fs map[string][]byte, config android.Config) {
2652 setUseVendorAllowListForTest(config, []string{"myapex"})
2653 })
2654
2655 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002656 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002657 name := apexBundle.BaseModuleName()
2658 prefix := "TARGET_"
2659 var builder strings.Builder
2660 data.Custom(&builder, name, prefix, "", data)
2661 androidMk := builder.String()
2662 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2663}
2664
2665func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002666 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002667 apex {
2668 name: "myapex",
2669 key: "myapex.key",
2670 vendor: true,
2671 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002672 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002673 }
2674
2675 apex_key {
2676 name: "myapex.key",
2677 public_key: "testkey.avbpubkey",
2678 private_key: "testkey.pem",
2679 }
2680
2681 cc_library {
2682 name: "mylib",
2683 vendor_available: true,
2684 }
2685 `)
2686
2687 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002688 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002689 name := apexBundle.BaseModuleName()
2690 prefix := "TARGET_"
2691 var builder strings.Builder
2692 data.Custom(&builder, name, prefix, "", data)
2693 androidMk := builder.String()
2694 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2695}
2696
Jooyung Han2ed99d02020-06-24 23:26:26 +09002697func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002698 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002699 apex {
2700 name: "myapex",
2701 key: "myapex.key",
2702 vintf_fragments: ["fragment.xml"],
2703 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002704 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002705 }
2706 apex_key {
2707 name: "myapex.key",
2708 public_key: "testkey.avbpubkey",
2709 private_key: "testkey.pem",
2710 }
2711 cc_binary {
2712 name: "mybin",
2713 }
2714 `)
2715
2716 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002717 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002718 name := apexBundle.BaseModuleName()
2719 prefix := "TARGET_"
2720 var builder strings.Builder
2721 data.Custom(&builder, name, prefix, "", data)
2722 androidMk := builder.String()
2723 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2724 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2725}
2726
Jiyong Park16e91a02018-12-20 18:18:08 +09002727func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002728 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002733 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002734 }
2735
2736 apex_key {
2737 name: "myapex.key",
2738 public_key: "testkey.avbpubkey",
2739 private_key: "testkey.pem",
2740 }
2741
2742 cc_library {
2743 name: "mylib",
2744 srcs: ["mylib.cpp"],
2745 system_shared_libs: [],
2746 stl: "none",
2747 stubs: {
2748 versions: ["1", "2", "3"],
2749 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002750 apex_available: [
2751 "//apex_available:platform",
2752 "myapex",
2753 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002754 }
2755
2756 cc_binary {
2757 name: "not_in_apex",
2758 srcs: ["mylib.cpp"],
2759 static_libs: ["mylib"],
2760 static_executable: true,
2761 system_shared_libs: [],
2762 stl: "none",
2763 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002764 `)
2765
Colin Cross7113d202019-11-20 16:39:12 -08002766 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002767
2768 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002769 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002770}
Jiyong Park9335a262018-12-24 11:31:58 +09002771
2772func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002773 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002774 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002775 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002776 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002777 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002778 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002779 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002780 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002781 }
2782
2783 cc_library {
2784 name: "mylib",
2785 srcs: ["mylib.cpp"],
2786 system_shared_libs: [],
2787 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002788 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002789 }
2790
2791 apex_key {
2792 name: "myapex.key",
2793 public_key: "testkey.avbpubkey",
2794 private_key: "testkey.pem",
2795 }
2796
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002797 android_app_certificate {
2798 name: "myapex.certificate",
2799 certificate: "testkey",
2800 }
2801
2802 android_app_certificate {
2803 name: "myapex.certificate.override",
2804 certificate: "testkey.override",
2805 }
2806
Jiyong Park9335a262018-12-24 11:31:58 +09002807 `)
2808
2809 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002810 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002811
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002812 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2813 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002814 "vendor/foo/devkeys/testkey.avbpubkey")
2815 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002816 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2817 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002818 "vendor/foo/devkeys/testkey.pem")
2819 }
2820
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002821 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002822 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002823 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002824 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002825 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002826 }
2827}
Jiyong Park58e364a2019-01-19 19:24:06 +09002828
Jooyung Hanf121a652019-12-17 14:30:11 +09002829func TestCertificate(t *testing.T) {
2830 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002831 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002832 apex {
2833 name: "myapex",
2834 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002835 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002836 }
2837 apex_key {
2838 name: "myapex.key",
2839 public_key: "testkey.avbpubkey",
2840 private_key: "testkey.pem",
2841 }`)
2842 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2843 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2844 if actual := rule.Args["certificates"]; actual != expected {
2845 t.Errorf("certificates should be %q, not %q", expected, actual)
2846 }
2847 })
2848 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002849 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002850 apex {
2851 name: "myapex_keytest",
2852 key: "myapex.key",
2853 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002854 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002855 }
2856 apex_key {
2857 name: "myapex.key",
2858 public_key: "testkey.avbpubkey",
2859 private_key: "testkey.pem",
2860 }
2861 android_app_certificate {
2862 name: "myapex.certificate.override",
2863 certificate: "testkey.override",
2864 }`)
2865 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2866 expected := "testkey.override.x509.pem testkey.override.pk8"
2867 if actual := rule.Args["certificates"]; actual != expected {
2868 t.Errorf("certificates should be %q, not %q", expected, actual)
2869 }
2870 })
2871 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002872 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002873 apex {
2874 name: "myapex",
2875 key: "myapex.key",
2876 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002877 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002878 }
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884 android_app_certificate {
2885 name: "myapex.certificate",
2886 certificate: "testkey",
2887 }`)
2888 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2889 expected := "testkey.x509.pem testkey.pk8"
2890 if actual := rule.Args["certificates"]; actual != expected {
2891 t.Errorf("certificates should be %q, not %q", expected, actual)
2892 }
2893 })
2894 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002895 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002896 apex {
2897 name: "myapex_keytest",
2898 key: "myapex.key",
2899 file_contexts: ":myapex-file_contexts",
2900 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002901 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002902 }
2903 apex_key {
2904 name: "myapex.key",
2905 public_key: "testkey.avbpubkey",
2906 private_key: "testkey.pem",
2907 }
2908 android_app_certificate {
2909 name: "myapex.certificate.override",
2910 certificate: "testkey.override",
2911 }`)
2912 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2913 expected := "testkey.override.x509.pem testkey.override.pk8"
2914 if actual := rule.Args["certificates"]; actual != expected {
2915 t.Errorf("certificates should be %q, not %q", expected, actual)
2916 }
2917 })
2918 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002919 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002920 apex {
2921 name: "myapex",
2922 key: "myapex.key",
2923 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002924 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002925 }
2926 apex_key {
2927 name: "myapex.key",
2928 public_key: "testkey.avbpubkey",
2929 private_key: "testkey.pem",
2930 }`)
2931 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2932 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2933 if actual := rule.Args["certificates"]; actual != expected {
2934 t.Errorf("certificates should be %q, not %q", expected, actual)
2935 }
2936 })
2937 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002938 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002939 apex {
2940 name: "myapex_keytest",
2941 key: "myapex.key",
2942 file_contexts: ":myapex-file_contexts",
2943 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002944 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002945 }
2946 apex_key {
2947 name: "myapex.key",
2948 public_key: "testkey.avbpubkey",
2949 private_key: "testkey.pem",
2950 }
2951 android_app_certificate {
2952 name: "myapex.certificate.override",
2953 certificate: "testkey.override",
2954 }`)
2955 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2956 expected := "testkey.override.x509.pem testkey.override.pk8"
2957 if actual := rule.Args["certificates"]; actual != expected {
2958 t.Errorf("certificates should be %q, not %q", expected, actual)
2959 }
2960 })
2961}
2962
Jiyong Park58e364a2019-01-19 19:24:06 +09002963func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002964 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002968 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002969 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09002970 }
2971
2972 apex {
2973 name: "otherapex",
2974 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002975 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002976 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002977 }
2978
2979 apex_key {
2980 name: "myapex.key",
2981 public_key: "testkey.avbpubkey",
2982 private_key: "testkey.pem",
2983 }
2984
2985 cc_library {
2986 name: "mylib",
2987 srcs: ["mylib.cpp"],
2988 system_shared_libs: [],
2989 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002990 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002991 "myapex",
2992 "otherapex",
2993 ],
Jooyung Han24282772020-03-21 23:20:55 +09002994 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002995 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002996 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002997 cc_library {
2998 name: "mylib2",
2999 srcs: ["mylib.cpp"],
3000 system_shared_libs: [],
3001 stl: "none",
3002 apex_available: [
3003 "myapex",
3004 "otherapex",
3005 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003006 static_libs: ["mylib3"],
3007 recovery_available: true,
3008 min_sdk_version: "29",
3009 }
3010 cc_library {
3011 name: "mylib3",
3012 srcs: ["mylib.cpp"],
3013 system_shared_libs: [],
3014 stl: "none",
3015 apex_available: [
3016 "myapex",
3017 "otherapex",
3018 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09003019 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07003020 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003021 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003022 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003023 `)
3024
Jooyung Hanc87a0592020-03-02 17:44:33 +09003025 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003026 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003027 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003028 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003029
Jooyung Hanccce2f22020-03-07 03:45:53 +09003030 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003031 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003032 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003033 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003034 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003035
Jooyung Hanccce2f22020-03-07 03:45:53 +09003036 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003037 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003038 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003039 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003040 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003041
Colin Crossaede88c2020-08-11 12:17:01 -07003042 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3043 // each variant defines additional macros to distinguish which apex variant it is built for
3044
3045 // non-APEX variant does not have __ANDROID_APEX__ defined
3046 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3047 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3048
3049 // APEX variant has __ANDROID_APEX__ defined
3050 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3051 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3052 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3053 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3054
3055 // APEX variant has __ANDROID_APEX__ defined
3056 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3057 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3058 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3059 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3060
Dan Albertb19953d2020-11-17 15:29:36 -08003061 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003062 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3063 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003064 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003065
3066 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3067 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003068
3069 // non-APEX variant does not have __ANDROID_APEX__ defined
3070 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3071 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3072
3073 // APEX variant has __ANDROID_APEX__ defined
3074 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003075 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003076 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003077 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003078
Jooyung Hanc87a0592020-03-02 17:44:33 +09003079 // APEX variant has __ANDROID_APEX__ defined
3080 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003081 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003082 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003083 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003084
Dan Albertb19953d2020-11-17 15:29:36 -08003085 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003086 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003087 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003088 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003089}
Jiyong Park7e636d02019-01-28 16:16:54 +09003090
3091func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003092 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003093 apex {
3094 name: "myapex",
3095 key: "myapex.key",
3096 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003097 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003098 }
3099
3100 apex_key {
3101 name: "myapex.key",
3102 public_key: "testkey.avbpubkey",
3103 private_key: "testkey.pem",
3104 }
3105
3106 cc_library_headers {
3107 name: "mylib_headers",
3108 export_include_dirs: ["my_include"],
3109 system_shared_libs: [],
3110 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003111 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003112 }
3113
3114 cc_library {
3115 name: "mylib",
3116 srcs: ["mylib.cpp"],
3117 system_shared_libs: [],
3118 stl: "none",
3119 header_libs: ["mylib_headers"],
3120 export_header_lib_headers: ["mylib_headers"],
3121 stubs: {
3122 versions: ["1", "2", "3"],
3123 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003124 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003125 }
3126
3127 cc_library {
3128 name: "otherlib",
3129 srcs: ["mylib.cpp"],
3130 system_shared_libs: [],
3131 stl: "none",
3132 shared_libs: ["mylib"],
3133 }
3134 `)
3135
Colin Cross7113d202019-11-20 16:39:12 -08003136 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003137
3138 // Ensure that the include path of the header lib is exported to 'otherlib'
3139 ensureContains(t, cFlags, "-Imy_include")
3140}
Alex Light9670d332019-01-29 18:07:33 -08003141
Jiyong Park7cd10e32020-01-14 09:22:18 +09003142type fileInApex struct {
3143 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003144 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003145 isLink bool
3146}
3147
Jooyung Hana57af4a2020-01-23 05:36:59 +00003148func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003149 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003150 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003151 copyCmds := apexRule.Args["copy_commands"]
3152 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003153 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003154 for _, cmd := range strings.Split(copyCmds, "&&") {
3155 cmd = strings.TrimSpace(cmd)
3156 if cmd == "" {
3157 continue
3158 }
3159 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003160 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003161 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003162 switch terms[0] {
3163 case "mkdir":
3164 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003165 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003166 t.Fatal("copyCmds contains invalid cp command", cmd)
3167 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003168 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003169 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003170 isLink = false
3171 case "ln":
3172 if len(terms) != 3 && len(terms) != 4 {
3173 // ln LINK TARGET or ln -s LINK TARGET
3174 t.Fatal("copyCmds contains invalid ln command", cmd)
3175 }
3176 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003177 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003178 isLink = true
3179 default:
3180 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3181 }
3182 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003183 index := strings.Index(dst, imageApexDir)
3184 if index == -1 {
3185 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3186 }
3187 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003188 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003189 }
3190 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003191 return ret
3192}
3193
Jooyung Hana57af4a2020-01-23 05:36:59 +00003194func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3195 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003196 var failed bool
3197 var surplus []string
3198 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003199 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003200 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003201 for _, expected := range files {
3202 if matched, _ := path.Match(expected, file.path); matched {
3203 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003204 mactchFound = true
3205 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003206 }
3207 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003208 if !mactchFound {
3209 surplus = append(surplus, file.path)
3210 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003211 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003212
Jooyung Han31c470b2019-10-18 16:26:59 +09003213 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003214 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003215 t.Log("surplus files", surplus)
3216 failed = true
3217 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003218
3219 if len(files) > len(filesMatched) {
3220 var missing []string
3221 for _, expected := range files {
3222 if !filesMatched[expected] {
3223 missing = append(missing, expected)
3224 }
3225 }
3226 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003227 t.Log("missing files", missing)
3228 failed = true
3229 }
3230 if failed {
3231 t.Fail()
3232 }
3233}
3234
Jooyung Han344d5432019-08-23 11:17:39 +09003235func TestVndkApexCurrent(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003236 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003237 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003238 name: "com.android.vndk.current",
3239 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003240 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003241 }
3242
3243 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003244 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003245 public_key: "testkey.avbpubkey",
3246 private_key: "testkey.pem",
3247 }
3248
3249 cc_library {
3250 name: "libvndk",
3251 srcs: ["mylib.cpp"],
3252 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003253 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003254 vndk: {
3255 enabled: true,
3256 },
3257 system_shared_libs: [],
3258 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003259 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003260 }
3261
3262 cc_library {
3263 name: "libvndksp",
3264 srcs: ["mylib.cpp"],
3265 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003266 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003267 vndk: {
3268 enabled: true,
3269 support_system_process: true,
3270 },
3271 system_shared_libs: [],
3272 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003273 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003274 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003275 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003276
Colin Cross2807f002021-03-02 10:15:29 -08003277 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003278 "lib/libvndk.so",
3279 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003280 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003281 "lib64/libvndk.so",
3282 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003283 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003284 "etc/llndk.libraries.VER.txt",
3285 "etc/vndkcore.libraries.VER.txt",
3286 "etc/vndksp.libraries.VER.txt",
3287 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003288 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003289 })
Jooyung Han344d5432019-08-23 11:17:39 +09003290}
3291
3292func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003293 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003294 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003295 name: "com.android.vndk.current",
3296 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003297 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003298 }
3299
3300 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003301 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003302 public_key: "testkey.avbpubkey",
3303 private_key: "testkey.pem",
3304 }
3305
3306 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003307 name: "libvndk",
3308 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003309 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003310 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003311 vndk: {
3312 enabled: true,
3313 },
3314 system_shared_libs: [],
3315 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003316 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003317 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003318
3319 cc_prebuilt_library_shared {
3320 name: "libvndk.arm",
3321 srcs: ["libvndk.arm.so"],
3322 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003323 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003324 vndk: {
3325 enabled: true,
3326 },
3327 enabled: false,
3328 arch: {
3329 arm: {
3330 enabled: true,
3331 },
3332 },
3333 system_shared_libs: [],
3334 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003335 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003336 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003337 `+vndkLibrariesTxtFiles("current"),
3338 withFiles(map[string][]byte{
3339 "libvndk.so": nil,
3340 "libvndk.arm.so": nil,
3341 }))
Colin Cross2807f002021-03-02 10:15:29 -08003342 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003343 "lib/libvndk.so",
3344 "lib/libvndk.arm.so",
3345 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003346 "lib/libc++.so",
3347 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003348 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003349 })
Jooyung Han344d5432019-08-23 11:17:39 +09003350}
3351
Jooyung Han39edb6c2019-11-06 16:53:07 +09003352func vndkLibrariesTxtFiles(vers ...string) (result string) {
3353 for _, v := range vers {
3354 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003355 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003356 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003357 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003358 name: "` + txt + `.libraries.txt",
3359 }
3360 `
3361 }
3362 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003363 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003364 result += `
3365 prebuilt_etc {
3366 name: "` + txt + `.libraries.` + v + `.txt",
3367 src: "dummy.txt",
3368 }
3369 `
3370 }
3371 }
3372 }
3373 return
3374}
3375
Jooyung Han344d5432019-08-23 11:17:39 +09003376func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003377 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003378 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003379 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003380 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003381 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003382 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003383 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003384 }
3385
3386 apex_key {
3387 name: "myapex.key",
3388 public_key: "testkey.avbpubkey",
3389 private_key: "testkey.pem",
3390 }
3391
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 vndk_prebuilt_shared {
3393 name: "libvndk27",
3394 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003395 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003396 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003397 vndk: {
3398 enabled: true,
3399 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003400 target_arch: "arm64",
3401 arch: {
3402 arm: {
3403 srcs: ["libvndk27_arm.so"],
3404 },
3405 arm64: {
3406 srcs: ["libvndk27_arm64.so"],
3407 },
3408 },
Colin Cross2807f002021-03-02 10:15:29 -08003409 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003410 }
3411
3412 vndk_prebuilt_shared {
3413 name: "libvndk27",
3414 version: "27",
3415 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003416 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003417 vndk: {
3418 enabled: true,
3419 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003420 target_arch: "x86_64",
3421 arch: {
3422 x86: {
3423 srcs: ["libvndk27_x86.so"],
3424 },
3425 x86_64: {
3426 srcs: ["libvndk27_x86_64.so"],
3427 },
3428 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003429 }
3430 `+vndkLibrariesTxtFiles("27"),
3431 withFiles(map[string][]byte{
3432 "libvndk27_arm.so": nil,
3433 "libvndk27_arm64.so": nil,
3434 "libvndk27_x86.so": nil,
3435 "libvndk27_x86_64.so": nil,
3436 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003437
Colin Cross2807f002021-03-02 10:15:29 -08003438 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003439 "lib/libvndk27_arm.so",
3440 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003441 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003442 })
Jooyung Han344d5432019-08-23 11:17:39 +09003443}
3444
Jooyung Han90eee022019-10-01 20:02:42 +09003445func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003446 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003447 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003448 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003449 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003450 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003451 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003452 }
3453 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003454 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003455 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003456 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003457 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003458 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003459 }
3460 apex_key {
3461 name: "myapex.key",
3462 public_key: "testkey.avbpubkey",
3463 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003464 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003465
3466 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003467 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003468 actual := proptools.String(bundle.properties.Apex_name)
3469 if !reflect.DeepEqual(actual, expected) {
3470 t.Errorf("Got '%v', expected '%v'", actual, expected)
3471 }
3472 }
3473
Colin Cross2807f002021-03-02 10:15:29 -08003474 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3475 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003476}
3477
Jooyung Han344d5432019-08-23 11:17:39 +09003478func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003479 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003480 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003481 name: "com.android.vndk.current",
3482 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003483 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003484 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003485 }
3486
3487 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003488 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003489 public_key: "testkey.avbpubkey",
3490 private_key: "testkey.pem",
3491 }
3492
3493 cc_library {
3494 name: "libvndk",
3495 srcs: ["mylib.cpp"],
3496 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003497 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003498 native_bridge_supported: true,
3499 host_supported: true,
3500 vndk: {
3501 enabled: true,
3502 },
3503 system_shared_libs: [],
3504 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003505 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003506 }
Colin Cross2807f002021-03-02 10:15:29 -08003507 `+vndkLibrariesTxtFiles("current"),
3508 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003509
Colin Cross2807f002021-03-02 10:15:29 -08003510 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003511 "lib/libvndk.so",
3512 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib/libc++.so",
3514 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003515 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003516 })
Jooyung Han344d5432019-08-23 11:17:39 +09003517}
3518
3519func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003520 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003521 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003522 name: "com.android.vndk.current",
3523 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003524 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003525 native_bridge_supported: true,
3526 }
3527
3528 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003529 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003530 public_key: "testkey.avbpubkey",
3531 private_key: "testkey.pem",
3532 }
3533
3534 cc_library {
3535 name: "libvndk",
3536 srcs: ["mylib.cpp"],
3537 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003538 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003539 native_bridge_supported: true,
3540 host_supported: true,
3541 vndk: {
3542 enabled: true,
3543 },
3544 system_shared_libs: [],
3545 stl: "none",
3546 }
3547 `)
3548}
3549
Jooyung Han31c470b2019-10-18 16:26:59 +09003550func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003551 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003552 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003553 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003554 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003555 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003556 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003557 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003558 }
3559
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565
3566 vndk_prebuilt_shared {
3567 name: "libvndk27",
3568 version: "27",
3569 target_arch: "arm",
3570 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003571 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003572 vndk: {
3573 enabled: true,
3574 },
3575 arch: {
3576 arm: {
3577 srcs: ["libvndk27.so"],
3578 }
3579 },
3580 }
3581
3582 vndk_prebuilt_shared {
3583 name: "libvndk27",
3584 version: "27",
3585 target_arch: "arm",
3586 binder32bit: true,
3587 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003588 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003589 vndk: {
3590 enabled: true,
3591 },
3592 arch: {
3593 arm: {
3594 srcs: ["libvndk27binder32.so"],
3595 }
3596 },
Colin Cross2807f002021-03-02 10:15:29 -08003597 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003598 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003599 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 withFiles(map[string][]byte{
3601 "libvndk27.so": nil,
3602 "libvndk27binder32.so": nil,
3603 }),
3604 withBinder32bit,
3605 withTargets(map[android.OsType][]android.Target{
3606 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003607 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3608 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003609 },
3610 }),
3611 )
3612
Colin Cross2807f002021-03-02 10:15:29 -08003613 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003615 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 })
3617}
3618
Jooyung Han45a96772020-06-15 14:59:42 +09003619func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003620 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003621 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003622 name: "com.android.vndk.current",
3623 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003624 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003625 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003626 }
3627
3628 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003629 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003630 public_key: "testkey.avbpubkey",
3631 private_key: "testkey.pem",
3632 }
3633
3634 cc_library {
3635 name: "libz",
3636 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003637 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003638 vndk: {
3639 enabled: true,
3640 },
3641 stubs: {
3642 symbol_file: "libz.map.txt",
3643 versions: ["30"],
3644 }
3645 }
3646 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3647 "libz.map.txt": nil,
3648 }))
3649
Colin Cross2807f002021-03-02 10:15:29 -08003650 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003651 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3652 ensureListEmpty(t, provideNativeLibs)
3653}
3654
Jooyung Hane1633032019-08-01 17:41:43 +09003655func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003656 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003657 apex {
3658 name: "myapex_nodep",
3659 key: "myapex.key",
3660 native_shared_libs: ["lib_nodep"],
3661 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003662 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003663 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003664 }
3665
3666 apex {
3667 name: "myapex_dep",
3668 key: "myapex.key",
3669 native_shared_libs: ["lib_dep"],
3670 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003671 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003672 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003673 }
3674
3675 apex {
3676 name: "myapex_provider",
3677 key: "myapex.key",
3678 native_shared_libs: ["libfoo"],
3679 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003680 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003681 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003682 }
3683
3684 apex {
3685 name: "myapex_selfcontained",
3686 key: "myapex.key",
3687 native_shared_libs: ["lib_dep", "libfoo"],
3688 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003689 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003690 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003691 }
3692
3693 apex_key {
3694 name: "myapex.key",
3695 public_key: "testkey.avbpubkey",
3696 private_key: "testkey.pem",
3697 }
3698
3699 cc_library {
3700 name: "lib_nodep",
3701 srcs: ["mylib.cpp"],
3702 system_shared_libs: [],
3703 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003704 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003705 }
3706
3707 cc_library {
3708 name: "lib_dep",
3709 srcs: ["mylib.cpp"],
3710 shared_libs: ["libfoo"],
3711 system_shared_libs: [],
3712 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003713 apex_available: [
3714 "myapex_dep",
3715 "myapex_provider",
3716 "myapex_selfcontained",
3717 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003718 }
3719
3720 cc_library {
3721 name: "libfoo",
3722 srcs: ["mytest.cpp"],
3723 stubs: {
3724 versions: ["1"],
3725 },
3726 system_shared_libs: [],
3727 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003728 apex_available: [
3729 "myapex_provider",
3730 "myapex_selfcontained",
3731 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003732 }
3733 `)
3734
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003735 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003736 var provideNativeLibs, requireNativeLibs []string
3737
Sundong Ahnabb64432019-10-22 13:58:29 +09003738 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003739 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3740 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003741 ensureListEmpty(t, provideNativeLibs)
3742 ensureListEmpty(t, requireNativeLibs)
3743
Sundong Ahnabb64432019-10-22 13:58:29 +09003744 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003745 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3746 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003747 ensureListEmpty(t, provideNativeLibs)
3748 ensureListContains(t, requireNativeLibs, "libfoo.so")
3749
Sundong Ahnabb64432019-10-22 13:58:29 +09003750 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003751 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3752 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003753 ensureListContains(t, provideNativeLibs, "libfoo.so")
3754 ensureListEmpty(t, requireNativeLibs)
3755
Sundong Ahnabb64432019-10-22 13:58:29 +09003756 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003757 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3758 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003759 ensureListContains(t, provideNativeLibs, "libfoo.so")
3760 ensureListEmpty(t, requireNativeLibs)
3761}
3762
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003763func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003764 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003765 apex {
3766 name: "myapex",
3767 key: "myapex.key",
3768 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003769 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003770 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003771 }
3772
3773 apex_key {
3774 name: "myapex.key",
3775 public_key: "testkey.avbpubkey",
3776 private_key: "testkey.pem",
3777 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003778
3779 cc_library {
3780 name: "mylib",
3781 srcs: ["mylib.cpp"],
3782 system_shared_libs: [],
3783 stl: "none",
3784 apex_available: [
3785 "//apex_available:platform",
3786 "myapex",
3787 ],
3788 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003789 `)
3790
Sundong Ahnabb64432019-10-22 13:58:29 +09003791 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003792 apexManifestRule := module.Rule("apexManifestRule")
3793 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3794 apexRule := module.Rule("apexRule")
3795 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003796
3797 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003798 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003799 name := apexBundle.BaseModuleName()
3800 prefix := "TARGET_"
3801 var builder strings.Builder
3802 data.Custom(&builder, name, prefix, "", data)
3803 androidMk := builder.String()
3804 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3805 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003806}
3807
Alex Light0851b882019-02-07 13:20:53 -08003808func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003809 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003810 apex {
3811 name: "myapex",
3812 key: "myapex.key",
3813 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003814 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003815 }
3816
3817 apex_key {
3818 name: "myapex.key",
3819 public_key: "testkey.avbpubkey",
3820 private_key: "testkey.pem",
3821 }
3822
3823 cc_library {
3824 name: "mylib_common",
3825 srcs: ["mylib.cpp"],
3826 system_shared_libs: [],
3827 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003828 apex_available: [
3829 "//apex_available:platform",
3830 "myapex",
3831 ],
Alex Light0851b882019-02-07 13:20:53 -08003832 }
3833 `)
3834
Sundong Ahnabb64432019-10-22 13:58:29 +09003835 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003836 apexRule := module.Rule("apexRule")
3837 copyCmds := apexRule.Args["copy_commands"]
3838
3839 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3840 t.Log("Apex was a test apex!")
3841 t.Fail()
3842 }
3843 // Ensure that main rule creates an output
3844 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3845
3846 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003847 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003848
3849 // Ensure that both direct and indirect deps are copied into apex
3850 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3851
Colin Cross7113d202019-11-20 16:39:12 -08003852 // Ensure that the platform variant ends with _shared
3853 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003854
Colin Cross56a83212020-09-15 18:30:11 -07003855 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003856 t.Log("Found mylib_common not in any apex!")
3857 t.Fail()
3858 }
3859}
3860
3861func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003862 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003863 apex_test {
3864 name: "myapex",
3865 key: "myapex.key",
3866 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003867 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003868 }
3869
3870 apex_key {
3871 name: "myapex.key",
3872 public_key: "testkey.avbpubkey",
3873 private_key: "testkey.pem",
3874 }
3875
3876 cc_library {
3877 name: "mylib_common_test",
3878 srcs: ["mylib.cpp"],
3879 system_shared_libs: [],
3880 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003881 // TODO: remove //apex_available:platform
3882 apex_available: [
3883 "//apex_available:platform",
3884 "myapex",
3885 ],
Alex Light0851b882019-02-07 13:20:53 -08003886 }
3887 `)
3888
Sundong Ahnabb64432019-10-22 13:58:29 +09003889 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003890 apexRule := module.Rule("apexRule")
3891 copyCmds := apexRule.Args["copy_commands"]
3892
3893 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3894 t.Log("Apex was not a test apex!")
3895 t.Fail()
3896 }
3897 // Ensure that main rule creates an output
3898 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3899
3900 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003901 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003902
3903 // Ensure that both direct and indirect deps are copied into apex
3904 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3905
Colin Cross7113d202019-11-20 16:39:12 -08003906 // Ensure that the platform variant ends with _shared
3907 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003908}
3909
Alex Light9670d332019-01-29 18:07:33 -08003910func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003911 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003912 apex {
3913 name: "myapex",
3914 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003916 multilib: {
3917 first: {
3918 native_shared_libs: ["mylib_common"],
3919 }
3920 },
3921 target: {
3922 android: {
3923 multilib: {
3924 first: {
3925 native_shared_libs: ["mylib"],
3926 }
3927 }
3928 },
3929 host: {
3930 multilib: {
3931 first: {
3932 native_shared_libs: ["mylib2"],
3933 }
3934 }
3935 }
3936 }
3937 }
3938
3939 apex_key {
3940 name: "myapex.key",
3941 public_key: "testkey.avbpubkey",
3942 private_key: "testkey.pem",
3943 }
3944
3945 cc_library {
3946 name: "mylib",
3947 srcs: ["mylib.cpp"],
3948 system_shared_libs: [],
3949 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003950 // TODO: remove //apex_available:platform
3951 apex_available: [
3952 "//apex_available:platform",
3953 "myapex",
3954 ],
Alex Light9670d332019-01-29 18:07:33 -08003955 }
3956
3957 cc_library {
3958 name: "mylib_common",
3959 srcs: ["mylib.cpp"],
3960 system_shared_libs: [],
3961 stl: "none",
3962 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003963 // TODO: remove //apex_available:platform
3964 apex_available: [
3965 "//apex_available:platform",
3966 "myapex",
3967 ],
Alex Light9670d332019-01-29 18:07:33 -08003968 }
3969
3970 cc_library {
3971 name: "mylib2",
3972 srcs: ["mylib.cpp"],
3973 system_shared_libs: [],
3974 stl: "none",
3975 compile_multilib: "first",
3976 }
3977 `)
3978
Sundong Ahnabb64432019-10-22 13:58:29 +09003979 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003980 copyCmds := apexRule.Args["copy_commands"]
3981
3982 // Ensure that main rule creates an output
3983 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3984
3985 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003986 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3987 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3988 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003989
3990 // Ensure that both direct and indirect deps are copied into apex
3991 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3992 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3993 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3994
Colin Cross7113d202019-11-20 16:39:12 -08003995 // Ensure that the platform variant ends with _shared
3996 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3997 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3998 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003999}
Jiyong Park04480cf2019-02-06 00:16:29 +09004000
Jiyong Park59140302020-12-14 18:44:04 +09004001func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004002 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004003 apex {
4004 name: "myapex",
4005 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004006 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004007 arch: {
4008 arm64: {
4009 native_shared_libs: ["mylib.arm64"],
4010 },
4011 x86_64: {
4012 native_shared_libs: ["mylib.x64"],
4013 },
4014 }
4015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "mylib.arm64",
4025 srcs: ["mylib.cpp"],
4026 system_shared_libs: [],
4027 stl: "none",
4028 // TODO: remove //apex_available:platform
4029 apex_available: [
4030 "//apex_available:platform",
4031 "myapex",
4032 ],
4033 }
4034
4035 cc_library {
4036 name: "mylib.x64",
4037 srcs: ["mylib.cpp"],
4038 system_shared_libs: [],
4039 stl: "none",
4040 // TODO: remove //apex_available:platform
4041 apex_available: [
4042 "//apex_available:platform",
4043 "myapex",
4044 ],
4045 }
4046 `)
4047
4048 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4049 copyCmds := apexRule.Args["copy_commands"]
4050
4051 // Ensure that apex variant is created for the direct dep
4052 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4053 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4054
4055 // Ensure that both direct and indirect deps are copied into apex
4056 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4057 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4058}
4059
Jiyong Park04480cf2019-02-06 00:16:29 +09004060func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004061 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004062 apex {
4063 name: "myapex",
4064 key: "myapex.key",
4065 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004066 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004067 }
4068
4069 apex_key {
4070 name: "myapex.key",
4071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 sh_binary {
4076 name: "myscript",
4077 src: "mylib.cpp",
4078 filename: "myscript.sh",
4079 sub_dir: "script",
4080 }
4081 `)
4082
Sundong Ahnabb64432019-10-22 13:58:29 +09004083 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004084 copyCmds := apexRule.Args["copy_commands"]
4085
4086 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4087}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004088
Jooyung Han91df2082019-11-20 01:49:42 +09004089func TestApexInVariousPartition(t *testing.T) {
4090 testcases := []struct {
4091 propName, parition, flattenedPartition string
4092 }{
4093 {"", "system", "system_ext"},
4094 {"product_specific: true", "product", "product"},
4095 {"soc_specific: true", "vendor", "vendor"},
4096 {"proprietary: true", "vendor", "vendor"},
4097 {"vendor: true", "vendor", "vendor"},
4098 {"system_ext_specific: true", "system_ext", "system_ext"},
4099 }
4100 for _, tc := range testcases {
4101 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004102 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004103 apex {
4104 name: "myapex",
4105 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004106 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004107 `+tc.propName+`
4108 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004109
Jooyung Han91df2082019-11-20 01:49:42 +09004110 apex_key {
4111 name: "myapex.key",
4112 public_key: "testkey.avbpubkey",
4113 private_key: "testkey.pem",
4114 }
4115 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004116
Jooyung Han91df2082019-11-20 01:49:42 +09004117 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4118 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4119 actual := apex.installDir.String()
4120 if actual != expected {
4121 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4122 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004123
Jooyung Han91df2082019-11-20 01:49:42 +09004124 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4125 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4126 actual = flattened.installDir.String()
4127 if actual != expected {
4128 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4129 }
4130 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004131 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004132}
Jiyong Park67882562019-03-21 01:11:21 +09004133
Jooyung Han580eb4f2020-06-24 19:33:06 +09004134func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004135 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004136 apex {
4137 name: "myapex",
4138 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004139 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004140 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004141
Jooyung Han580eb4f2020-06-24 19:33:06 +09004142 apex_key {
4143 name: "myapex.key",
4144 public_key: "testkey.avbpubkey",
4145 private_key: "testkey.pem",
4146 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004147 `)
4148 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004149 rule := module.Output("file_contexts")
4150 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4151}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004152
Jooyung Han580eb4f2020-06-24 19:33:06 +09004153func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004154 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004155 apex {
4156 name: "myapex",
4157 key: "myapex.key",
4158 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004159 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004160 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004161
Jooyung Han580eb4f2020-06-24 19:33:06 +09004162 apex_key {
4163 name: "myapex.key",
4164 public_key: "testkey.avbpubkey",
4165 private_key: "testkey.pem",
4166 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004167 `, withFiles(map[string][]byte{
4168 "my_own_file_contexts": nil,
4169 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004170}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004171
Jooyung Han580eb4f2020-06-24 19:33:06 +09004172func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004173 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004174 apex {
4175 name: "myapex",
4176 key: "myapex.key",
4177 product_specific: true,
4178 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004179 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004180 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004181
Jooyung Han580eb4f2020-06-24 19:33:06 +09004182 apex_key {
4183 name: "myapex.key",
4184 public_key: "testkey.avbpubkey",
4185 private_key: "testkey.pem",
4186 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004187 `)
4188
Colin Cross1c460562021-02-16 17:55:47 -08004189 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004190 apex {
4191 name: "myapex",
4192 key: "myapex.key",
4193 product_specific: true,
4194 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004195 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004196 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004197
Jooyung Han580eb4f2020-06-24 19:33:06 +09004198 apex_key {
4199 name: "myapex.key",
4200 public_key: "testkey.avbpubkey",
4201 private_key: "testkey.pem",
4202 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004203 `, withFiles(map[string][]byte{
4204 "product_specific_file_contexts": nil,
4205 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004206 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4207 rule := module.Output("file_contexts")
4208 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4209}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004210
Jooyung Han580eb4f2020-06-24 19:33:06 +09004211func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004212 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004213 apex {
4214 name: "myapex",
4215 key: "myapex.key",
4216 product_specific: true,
4217 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004218 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004219 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004220
Jooyung Han580eb4f2020-06-24 19:33:06 +09004221 apex_key {
4222 name: "myapex.key",
4223 public_key: "testkey.avbpubkey",
4224 private_key: "testkey.pem",
4225 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004226
Jooyung Han580eb4f2020-06-24 19:33:06 +09004227 filegroup {
4228 name: "my-file-contexts",
4229 srcs: ["product_specific_file_contexts"],
4230 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004231 `, withFiles(map[string][]byte{
4232 "product_specific_file_contexts": nil,
4233 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004234 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4235 rule := module.Output("file_contexts")
4236 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004237}
4238
Jiyong Park67882562019-03-21 01:11:21 +09004239func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004240 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004241 apex_key {
4242 name: "myapex.key",
4243 public_key: ":my.avbpubkey",
4244 private_key: ":my.pem",
4245 product_specific: true,
4246 }
4247
4248 filegroup {
4249 name: "my.avbpubkey",
4250 srcs: ["testkey2.avbpubkey"],
4251 }
4252
4253 filegroup {
4254 name: "my.pem",
4255 srcs: ["testkey2.pem"],
4256 }
4257 `)
4258
4259 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4260 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004261 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004262 if actual_pubkey != expected_pubkey {
4263 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4264 }
4265 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004266 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004267 if actual_privkey != expected_privkey {
4268 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4269 }
4270}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004271
4272func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004273 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004274 prebuilt_apex {
4275 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004276 arch: {
4277 arm64: {
4278 src: "myapex-arm64.apex",
4279 },
4280 arm: {
4281 src: "myapex-arm.apex",
4282 },
4283 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004284 }
4285 `)
4286
4287 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4288
Jiyong Parkc95714e2019-03-29 14:23:10 +09004289 expectedInput := "myapex-arm64.apex"
4290 if prebuilt.inputApex.String() != expectedInput {
4291 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4292 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004293}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004294
4295func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004296 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004297 prebuilt_apex {
4298 name: "myapex",
4299 src: "myapex-arm.apex",
4300 filename: "notmyapex.apex",
4301 }
4302 `)
4303
4304 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4305
4306 expected := "notmyapex.apex"
4307 if p.installFilename != expected {
4308 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4309 }
4310}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004311
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004312func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004313 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004314 prebuilt_apex {
4315 name: "myapex.prebuilt",
4316 src: "myapex-arm.apex",
4317 overrides: [
4318 "myapex",
4319 ],
4320 }
4321 `)
4322
4323 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4324
4325 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004326 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004327 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004328 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004329 }
4330}
4331
Paul Duffin092153d2021-01-26 11:42:39 +00004332// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4333// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004334func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4335 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004336 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004337 }
4338
Paul Duffin89886cb2021-02-05 16:44:03 +00004339 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004340 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004341 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004342 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004343 stem := android.RemoveOptionalPrebuiltPrefix(name)
4344 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004345 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4346 }
4347 }
4348
Paul Duffin39853512021-02-26 11:09:39 +00004349 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004350 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004351 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004352 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4353 }
4354 }
4355
4356 t.Run("prebuilt only", func(t *testing.T) {
4357 bp := `
4358 prebuilt_apex {
4359 name: "myapex",
4360 arch: {
4361 arm64: {
4362 src: "myapex-arm64.apex",
4363 },
4364 arm: {
4365 src: "myapex-arm.apex",
4366 },
4367 },
Paul Duffin39853512021-02-26 11:09:39 +00004368 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004369 }
4370
4371 java_import {
4372 name: "libfoo",
4373 jars: ["libfoo.jar"],
4374 }
Paul Duffin39853512021-02-26 11:09:39 +00004375
4376 java_sdk_library_import {
4377 name: "libbar",
4378 public: {
4379 jars: ["libbar.jar"],
4380 },
4381 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004382 `
4383
4384 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4385 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4386
Paul Duffinf6932af2021-02-26 18:21:56 +00004387 // Make sure that the deapexer has the correct input APEX.
4388 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4389 rule := deapexer.Rule("deapexer")
4390 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4391 t.Errorf("expected: %q, found: %q", expected, actual)
4392 }
4393
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004394 // Make sure that the prebuilt_apex has the correct input APEX.
4395 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4396 rule = prebuiltApex.Rule("android/soong/android.Cp")
4397 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4398 t.Errorf("expected: %q, found: %q", expected, actual)
4399 }
4400
Paul Duffin89886cb2021-02-05 16:44:03 +00004401 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004402
4403 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004404 })
4405
4406 t.Run("prebuilt with source preferred", func(t *testing.T) {
4407
4408 bp := `
4409 prebuilt_apex {
4410 name: "myapex",
4411 arch: {
4412 arm64: {
4413 src: "myapex-arm64.apex",
4414 },
4415 arm: {
4416 src: "myapex-arm.apex",
4417 },
4418 },
Paul Duffin39853512021-02-26 11:09:39 +00004419 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004420 }
4421
4422 java_import {
4423 name: "libfoo",
4424 jars: ["libfoo.jar"],
4425 }
4426
4427 java_library {
4428 name: "libfoo",
4429 }
Paul Duffin39853512021-02-26 11:09:39 +00004430
4431 java_sdk_library_import {
4432 name: "libbar",
4433 public: {
4434 jars: ["libbar.jar"],
4435 },
4436 }
4437
4438 java_sdk_library {
4439 name: "libbar",
4440 srcs: ["foo/bar/MyClass.java"],
4441 unsafe_ignore_missing_latest_api: true,
4442 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004443 `
4444
4445 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4446 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4447
Paul Duffin89886cb2021-02-05 16:44:03 +00004448 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004449 ensureNoSourceVariant(t, ctx, "libfoo")
4450
4451 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4452 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004453 })
4454
4455 t.Run("prebuilt preferred with source", func(t *testing.T) {
4456 bp := `
4457 prebuilt_apex {
4458 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004459 arch: {
4460 arm64: {
4461 src: "myapex-arm64.apex",
4462 },
4463 arm: {
4464 src: "myapex-arm.apex",
4465 },
4466 },
Paul Duffin39853512021-02-26 11:09:39 +00004467 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004468 }
4469
4470 java_import {
4471 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004472 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004473 jars: ["libfoo.jar"],
4474 }
4475
4476 java_library {
4477 name: "libfoo",
4478 }
Paul Duffin39853512021-02-26 11:09:39 +00004479
4480 java_sdk_library_import {
4481 name: "libbar",
4482 prefer: true,
4483 public: {
4484 jars: ["libbar.jar"],
4485 },
4486 }
4487
4488 java_sdk_library {
4489 name: "libbar",
4490 srcs: ["foo/bar/MyClass.java"],
4491 unsafe_ignore_missing_latest_api: true,
4492 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004493 `
4494
4495 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4496 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4497
Paul Duffin89886cb2021-02-05 16:44:03 +00004498 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004499 ensureNoSourceVariant(t, ctx, "libfoo")
4500
4501 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4502 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004503 })
4504}
4505
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004506func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4507 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004508 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004509 }
4510
Paul Duffin37856732021-02-26 14:24:15 +00004511 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4512 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004513 s := ctx.SingletonForTests("dex_bootjars")
4514 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004515 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004516 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004517 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004518 foundLibfooJar = true
4519 buildRule := s.Output(output)
4520 actual := android.NormalizePathForTesting(buildRule.Input)
4521 if actual != bootDexJarPath {
4522 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4523 }
4524 }
4525 }
4526 if !foundLibfooJar {
4527 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4528 }
4529 }
4530
Paul Duffin4fd997b2021-02-03 20:06:33 +00004531 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004532 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004533 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4534 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4535 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4536 }
4537
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004538 t.Run("prebuilt only", func(t *testing.T) {
4539 bp := `
4540 prebuilt_apex {
4541 name: "myapex",
4542 arch: {
4543 arm64: {
4544 src: "myapex-arm64.apex",
4545 },
4546 arm: {
4547 src: "myapex-arm.apex",
4548 },
4549 },
Paul Duffin37856732021-02-26 14:24:15 +00004550 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004551 }
4552
4553 java_import {
4554 name: "libfoo",
4555 jars: ["libfoo.jar"],
4556 apex_available: ["myapex"],
4557 }
Paul Duffin37856732021-02-26 14:24:15 +00004558
4559 java_sdk_library_import {
4560 name: "libbar",
4561 public: {
4562 jars: ["libbar.jar"],
4563 },
4564 apex_available: ["myapex"],
4565 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004566 `
4567
4568 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004569 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4570 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004571
Paul Duffin9d67ca62021-02-03 20:06:33 +00004572 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4573 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004574.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004575.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4576`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004577 })
4578
4579 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4580 bp := `
4581 prebuilt_apex {
4582 name: "myapex",
4583 arch: {
4584 arm64: {
4585 src: "myapex-arm64.apex",
4586 },
4587 arm: {
4588 src: "myapex-arm.apex",
4589 },
4590 },
Paul Duffin37856732021-02-26 14:24:15 +00004591 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004592 }
4593
4594 java_import {
4595 name: "libfoo",
4596 jars: ["libfoo.jar"],
4597 apex_available: ["myapex"],
4598 }
4599
4600 java_library {
4601 name: "libfoo",
4602 srcs: ["foo/bar/MyClass.java"],
4603 apex_available: ["myapex"],
4604 }
Paul Duffin37856732021-02-26 14:24:15 +00004605
4606 java_sdk_library_import {
4607 name: "libbar",
4608 public: {
4609 jars: ["libbar.jar"],
4610 },
4611 apex_available: ["myapex"],
4612 }
4613
4614 java_sdk_library {
4615 name: "libbar",
4616 srcs: ["foo/bar/MyClass.java"],
4617 unsafe_ignore_missing_latest_api: true,
4618 apex_available: ["myapex"],
4619 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004620 `
4621
4622 // In this test the source (java_library) libfoo is active since the
4623 // prebuilt (java_import) defaults to prefer:false. However the
4624 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4625 // find the dex boot jar in it. We either need to disable the source libfoo
4626 // or make the prebuilt libfoo preferred.
4627 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4628 })
4629
4630 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4631 bp := `
4632 prebuilt_apex {
4633 name: "myapex",
4634 arch: {
4635 arm64: {
4636 src: "myapex-arm64.apex",
4637 },
4638 arm: {
4639 src: "myapex-arm.apex",
4640 },
4641 },
Paul Duffin37856732021-02-26 14:24:15 +00004642 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004643 }
4644
4645 java_import {
4646 name: "libfoo",
4647 prefer: true,
4648 jars: ["libfoo.jar"],
4649 apex_available: ["myapex"],
4650 }
4651
4652 java_library {
4653 name: "libfoo",
4654 srcs: ["foo/bar/MyClass.java"],
4655 apex_available: ["myapex"],
4656 }
Paul Duffin37856732021-02-26 14:24:15 +00004657
4658 java_sdk_library_import {
4659 name: "libbar",
4660 prefer: true,
4661 public: {
4662 jars: ["libbar.jar"],
4663 },
4664 apex_available: ["myapex"],
4665 }
4666
4667 java_sdk_library {
4668 name: "libbar",
4669 srcs: ["foo/bar/MyClass.java"],
4670 unsafe_ignore_missing_latest_api: true,
4671 apex_available: ["myapex"],
4672 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004673 `
4674
4675 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004676 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4677 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004678
Paul Duffin9d67ca62021-02-03 20:06:33 +00004679 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4680 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004681.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004682.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4683`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004684 })
4685
4686 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4687 bp := `
4688 apex {
4689 name: "myapex",
4690 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004691 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004692 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004693 }
4694
4695 apex_key {
4696 name: "myapex.key",
4697 public_key: "testkey.avbpubkey",
4698 private_key: "testkey.pem",
4699 }
4700
4701 prebuilt_apex {
4702 name: "myapex",
4703 arch: {
4704 arm64: {
4705 src: "myapex-arm64.apex",
4706 },
4707 arm: {
4708 src: "myapex-arm.apex",
4709 },
4710 },
Paul Duffin37856732021-02-26 14:24:15 +00004711 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004712 }
4713
4714 java_import {
4715 name: "libfoo",
4716 jars: ["libfoo.jar"],
4717 apex_available: ["myapex"],
4718 }
4719
4720 java_library {
4721 name: "libfoo",
4722 srcs: ["foo/bar/MyClass.java"],
4723 apex_available: ["myapex"],
4724 }
Paul Duffin37856732021-02-26 14:24:15 +00004725
4726 java_sdk_library_import {
4727 name: "libbar",
4728 public: {
4729 jars: ["libbar.jar"],
4730 },
4731 apex_available: ["myapex"],
4732 }
4733
4734 java_sdk_library {
4735 name: "libbar",
4736 srcs: ["foo/bar/MyClass.java"],
4737 unsafe_ignore_missing_latest_api: true,
4738 apex_available: ["myapex"],
4739 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004740 `
4741
4742 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004743 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4744 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004745
4746 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4747 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004748.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004749.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4750`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004751 })
4752
4753 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4754 bp := `
4755 apex {
4756 name: "myapex",
4757 enabled: false,
4758 key: "myapex.key",
4759 java_libs: ["libfoo"],
4760 }
4761
4762 apex_key {
4763 name: "myapex.key",
4764 public_key: "testkey.avbpubkey",
4765 private_key: "testkey.pem",
4766 }
4767
4768 prebuilt_apex {
4769 name: "myapex",
4770 arch: {
4771 arm64: {
4772 src: "myapex-arm64.apex",
4773 },
4774 arm: {
4775 src: "myapex-arm.apex",
4776 },
4777 },
Paul Duffin37856732021-02-26 14:24:15 +00004778 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004779 }
4780
4781 java_import {
4782 name: "libfoo",
4783 prefer: true,
4784 jars: ["libfoo.jar"],
4785 apex_available: ["myapex"],
4786 }
4787
4788 java_library {
4789 name: "libfoo",
4790 srcs: ["foo/bar/MyClass.java"],
4791 apex_available: ["myapex"],
4792 }
Paul Duffin37856732021-02-26 14:24:15 +00004793
4794 java_sdk_library_import {
4795 name: "libbar",
4796 prefer: true,
4797 public: {
4798 jars: ["libbar.jar"],
4799 },
4800 apex_available: ["myapex"],
4801 }
4802
4803 java_sdk_library {
4804 name: "libbar",
4805 srcs: ["foo/bar/MyClass.java"],
4806 unsafe_ignore_missing_latest_api: true,
4807 apex_available: ["myapex"],
4808 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004809 `
4810
4811 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004812 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4813 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004814
Paul Duffin9d67ca62021-02-03 20:06:33 +00004815 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4816 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004817.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004818.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4819`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004820 })
4821}
4822
Roland Levillain630846d2019-06-26 12:48:34 +01004823func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004824 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004825 apex_test {
4826 name: "myapex",
4827 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004828 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004829 tests: [
4830 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004831 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004832 ],
4833 }
4834
4835 apex_key {
4836 name: "myapex.key",
4837 public_key: "testkey.avbpubkey",
4838 private_key: "testkey.pem",
4839 }
4840
Liz Kammer1c14a212020-05-12 15:26:55 -07004841 filegroup {
4842 name: "fg",
4843 srcs: [
4844 "baz",
4845 "bar/baz"
4846 ],
4847 }
4848
Roland Levillain630846d2019-06-26 12:48:34 +01004849 cc_test {
4850 name: "mytest",
4851 gtest: false,
4852 srcs: ["mytest.cpp"],
4853 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004854 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004855 system_shared_libs: [],
4856 static_executable: true,
4857 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004858 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004859 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004860
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004861 cc_library {
4862 name: "mylib",
4863 srcs: ["mylib.cpp"],
4864 system_shared_libs: [],
4865 stl: "none",
4866 }
4867
Liz Kammer5bd365f2020-05-27 15:15:11 -07004868 filegroup {
4869 name: "fg2",
4870 srcs: [
4871 "testdata/baz"
4872 ],
4873 }
4874
Roland Levillain9b5fde92019-06-28 15:41:19 +01004875 cc_test {
4876 name: "mytests",
4877 gtest: false,
4878 srcs: [
4879 "mytest1.cpp",
4880 "mytest2.cpp",
4881 "mytest3.cpp",
4882 ],
4883 test_per_src: true,
4884 relative_install_path: "test",
4885 system_shared_libs: [],
4886 static_executable: true,
4887 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004888 data: [
4889 ":fg",
4890 ":fg2",
4891 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004892 }
Roland Levillain630846d2019-06-26 12:48:34 +01004893 `)
4894
Sundong Ahnabb64432019-10-22 13:58:29 +09004895 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004896 copyCmds := apexRule.Args["copy_commands"]
4897
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004898 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004899 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004900 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004901
Liz Kammer1c14a212020-05-12 15:26:55 -07004902 //Ensure that test data are copied into apex.
4903 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4904 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4905
Roland Levillain9b5fde92019-06-28 15:41:19 +01004906 // Ensure that test deps built with `test_per_src` are copied into apex.
4907 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4908 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4909 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004910
4911 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004912 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004913 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004914 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004915 prefix := "TARGET_"
4916 var builder strings.Builder
4917 data.Custom(&builder, name, prefix, "", data)
4918 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004919 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4920 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4921 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4922 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004923 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004924 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004925 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004926
4927 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004928 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004929 data.Custom(&builder, name, prefix, "", data)
4930 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004931 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4932 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004933}
4934
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004935func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004936 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004937 apex {
4938 name: "myapex",
4939 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004940 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004941 }
4942 apex_key {
4943 name: "myapex.key",
4944 public_key: "testkey.avbpubkey",
4945 private_key: "testkey.pem",
4946 }
4947 `, func(fs map[string][]byte, config android.Config) {
4948 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4949 })
4950 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004951 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004952 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004953 var builder strings.Builder
4954 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4955 androidMk := builder.String()
4956 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4957}
4958
Jooyung Hand48f3c32019-08-23 11:18:57 +09004959func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4960 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4961 apex {
4962 name: "myapex",
4963 key: "myapex.key",
4964 native_shared_libs: ["libfoo"],
4965 }
4966
4967 apex_key {
4968 name: "myapex.key",
4969 public_key: "testkey.avbpubkey",
4970 private_key: "testkey.pem",
4971 }
4972
4973 cc_library {
4974 name: "libfoo",
4975 stl: "none",
4976 system_shared_libs: [],
4977 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004978 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004979 }
4980 `)
4981 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4982 apex {
4983 name: "myapex",
4984 key: "myapex.key",
4985 java_libs: ["myjar"],
4986 }
4987
4988 apex_key {
4989 name: "myapex.key",
4990 public_key: "testkey.avbpubkey",
4991 private_key: "testkey.pem",
4992 }
4993
4994 java_library {
4995 name: "myjar",
4996 srcs: ["foo/bar/MyClass.java"],
4997 sdk_version: "none",
4998 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004999 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005000 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005001 }
5002 `)
5003}
5004
Bill Peckhama41a6962021-01-11 10:58:54 -08005005func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005006 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005007 apex {
5008 name: "myapex",
5009 key: "myapex.key",
5010 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005011 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005012 }
5013
5014 apex_key {
5015 name: "myapex.key",
5016 public_key: "testkey.avbpubkey",
5017 private_key: "testkey.pem",
5018 }
5019
5020 java_import {
5021 name: "myjavaimport",
5022 apex_available: ["myapex"],
5023 jars: ["my.jar"],
5024 compile_dex: true,
5025 }
5026 `)
5027
5028 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5029 apexRule := module.Rule("apexRule")
5030 copyCmds := apexRule.Args["copy_commands"]
5031 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5032}
5033
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005034func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005035 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005036 apex {
5037 name: "myapex",
5038 key: "myapex.key",
5039 apps: [
5040 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005041 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005042 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005043 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005044 }
5045
5046 apex_key {
5047 name: "myapex.key",
5048 public_key: "testkey.avbpubkey",
5049 private_key: "testkey.pem",
5050 }
5051
5052 android_app {
5053 name: "AppFoo",
5054 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005055 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005056 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005057 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005058 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005059 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005060 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005061
5062 android_app {
5063 name: "AppFooPriv",
5064 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005065 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005066 system_modules: "none",
5067 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005068 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005069 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005070 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005071
5072 cc_library_shared {
5073 name: "libjni",
5074 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005075 shared_libs: ["libfoo"],
5076 stl: "none",
5077 system_shared_libs: [],
5078 apex_available: [ "myapex" ],
5079 sdk_version: "current",
5080 }
5081
5082 cc_library_shared {
5083 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005084 stl: "none",
5085 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005086 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005087 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005088 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005089 `)
5090
Sundong Ahnabb64432019-10-22 13:58:29 +09005091 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005092 apexRule := module.Rule("apexRule")
5093 copyCmds := apexRule.Args["copy_commands"]
5094
5095 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005096 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005097
Colin Crossaede88c2020-08-11 12:17:01 -07005098 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005099 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005100 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005101 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005102 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005103 // JNI libraries including transitive deps are
5104 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005105 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005106 // ... embedded inside APK (jnilibs.zip)
5107 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5108 // ... and not directly inside the APEX
5109 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5110 }
Dario Frenicde2a032019-10-27 00:29:22 +01005111}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005112
Dario Frenicde2a032019-10-27 00:29:22 +01005113func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005114 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005115 apex {
5116 name: "myapex",
5117 key: "myapex.key",
5118 apps: [
5119 "AppFooPrebuilt",
5120 "AppFooPrivPrebuilt",
5121 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005122 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005123 }
5124
5125 apex_key {
5126 name: "myapex.key",
5127 public_key: "testkey.avbpubkey",
5128 private_key: "testkey.pem",
5129 }
5130
5131 android_app_import {
5132 name: "AppFooPrebuilt",
5133 apk: "PrebuiltAppFoo.apk",
5134 presigned: true,
5135 dex_preopt: {
5136 enabled: false,
5137 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005138 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005139 }
5140
5141 android_app_import {
5142 name: "AppFooPrivPrebuilt",
5143 apk: "PrebuiltAppFooPriv.apk",
5144 privileged: true,
5145 presigned: true,
5146 dex_preopt: {
5147 enabled: false,
5148 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005149 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005150 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005151 }
5152 `)
5153
Sundong Ahnabb64432019-10-22 13:58:29 +09005154 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005155 apexRule := module.Rule("apexRule")
5156 copyCmds := apexRule.Args["copy_commands"]
5157
5158 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005159 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5160}
5161
5162func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005163 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005164 apex {
5165 name: "myapex",
5166 key: "myapex.key",
5167 apps: [
5168 "AppFoo",
5169 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005170 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005171 }
5172
5173 apex_key {
5174 name: "myapex.key",
5175 public_key: "testkey.avbpubkey",
5176 private_key: "testkey.pem",
5177 }
5178
5179 android_app {
5180 name: "AppFoo",
5181 srcs: ["foo/bar/MyClass.java"],
5182 sdk_version: "none",
5183 system_modules: "none",
5184 apex_available: [ "myapex" ],
5185 }
5186
5187 android_app_import {
5188 name: "AppFoo",
5189 apk: "AppFooPrebuilt.apk",
5190 filename: "AppFooPrebuilt.apk",
5191 presigned: true,
5192 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005193 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005194 }
5195 `, withFiles(map[string][]byte{
5196 "AppFooPrebuilt.apk": nil,
5197 }))
5198
5199 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005200 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005201 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005202}
5203
Dario Freni6f3937c2019-12-20 22:58:03 +00005204func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005205 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005206 apex {
5207 name: "myapex",
5208 key: "myapex.key",
5209 apps: [
5210 "TesterHelpAppFoo",
5211 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005212 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005213 }
5214
5215 apex_key {
5216 name: "myapex.key",
5217 public_key: "testkey.avbpubkey",
5218 private_key: "testkey.pem",
5219 }
5220
5221 android_test_helper_app {
5222 name: "TesterHelpAppFoo",
5223 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005224 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005225 }
5226
5227 `)
5228
5229 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5230 apexRule := module.Rule("apexRule")
5231 copyCmds := apexRule.Args["copy_commands"]
5232
5233 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5234}
5235
Jooyung Han18020ea2019-11-13 10:50:48 +09005236func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5237 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005238 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005239 apex {
5240 name: "myapex",
5241 key: "myapex.key",
5242 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005243 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005244 }
5245
5246 apex_key {
5247 name: "myapex.key",
5248 public_key: "testkey.avbpubkey",
5249 private_key: "testkey.pem",
5250 }
5251
5252 apex {
5253 name: "otherapex",
5254 key: "myapex.key",
5255 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005256 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005257 }
5258
5259 cc_defaults {
5260 name: "libfoo-defaults",
5261 apex_available: ["otherapex"],
5262 }
5263
5264 cc_library {
5265 name: "libfoo",
5266 defaults: ["libfoo-defaults"],
5267 stl: "none",
5268 system_shared_libs: [],
5269 }`)
5270}
5271
Paul Duffine52e66f2020-03-30 17:54:29 +01005272func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005273 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005274 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005275 apex {
5276 name: "myapex",
5277 key: "myapex.key",
5278 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005279 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005280 }
5281
5282 apex_key {
5283 name: "myapex.key",
5284 public_key: "testkey.avbpubkey",
5285 private_key: "testkey.pem",
5286 }
5287
5288 apex {
5289 name: "otherapex",
5290 key: "otherapex.key",
5291 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005292 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005293 }
5294
5295 apex_key {
5296 name: "otherapex.key",
5297 public_key: "testkey.avbpubkey",
5298 private_key: "testkey.pem",
5299 }
5300
5301 cc_library {
5302 name: "libfoo",
5303 stl: "none",
5304 system_shared_libs: [],
5305 apex_available: ["otherapex"],
5306 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005307}
Jiyong Park127b40b2019-09-30 16:04:35 +09005308
Paul Duffine52e66f2020-03-30 17:54:29 +01005309func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005310 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005311 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005312.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005313.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005314.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005315.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005316.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005317.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005318 apex {
5319 name: "myapex",
5320 key: "myapex.key",
5321 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005322 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005323 }
5324
5325 apex_key {
5326 name: "myapex.key",
5327 public_key: "testkey.avbpubkey",
5328 private_key: "testkey.pem",
5329 }
5330
Jiyong Park127b40b2019-09-30 16:04:35 +09005331 cc_library {
5332 name: "libfoo",
5333 stl: "none",
5334 shared_libs: ["libbar"],
5335 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005336 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005337 }
5338
5339 cc_library {
5340 name: "libbar",
5341 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005342 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005343 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005344 apex_available: ["myapex"],
5345 }
5346
5347 cc_library {
5348 name: "libbaz",
5349 stl: "none",
5350 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005351 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005352}
Jiyong Park127b40b2019-09-30 16:04:35 +09005353
Paul Duffine52e66f2020-03-30 17:54:29 +01005354func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005355 testApexError(t, "\"otherapex\" is not a valid module name", `
5356 apex {
5357 name: "myapex",
5358 key: "myapex.key",
5359 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005360 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005361 }
5362
5363 apex_key {
5364 name: "myapex.key",
5365 public_key: "testkey.avbpubkey",
5366 private_key: "testkey.pem",
5367 }
5368
5369 cc_library {
5370 name: "libfoo",
5371 stl: "none",
5372 system_shared_libs: [],
5373 apex_available: ["otherapex"],
5374 }`)
5375
Paul Duffine52e66f2020-03-30 17:54:29 +01005376 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005377 apex {
5378 name: "myapex",
5379 key: "myapex.key",
5380 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005381 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005382 }
5383
5384 apex_key {
5385 name: "myapex.key",
5386 public_key: "testkey.avbpubkey",
5387 private_key: "testkey.pem",
5388 }
5389
5390 cc_library {
5391 name: "libfoo",
5392 stl: "none",
5393 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005394 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005395 apex_available: ["myapex"],
5396 }
5397
5398 cc_library {
5399 name: "libbar",
5400 stl: "none",
5401 system_shared_libs: [],
5402 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005403 }
5404
5405 cc_library {
5406 name: "libbaz",
5407 stl: "none",
5408 system_shared_libs: [],
5409 stubs: {
5410 versions: ["10", "20", "30"],
5411 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005412 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005413}
Jiyong Park127b40b2019-09-30 16:04:35 +09005414
Jiyong Park89e850a2020-04-07 16:37:39 +09005415func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005416 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005417 apex {
5418 name: "myapex",
5419 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005420 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005421 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005422 }
5423
5424 apex_key {
5425 name: "myapex.key",
5426 public_key: "testkey.avbpubkey",
5427 private_key: "testkey.pem",
5428 }
5429
5430 cc_library {
5431 name: "libfoo",
5432 stl: "none",
5433 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005434 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005435 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005436 }
5437
5438 cc_library {
5439 name: "libfoo2",
5440 stl: "none",
5441 system_shared_libs: [],
5442 shared_libs: ["libbaz"],
5443 apex_available: ["//apex_available:platform"],
5444 }
5445
5446 cc_library {
5447 name: "libbar",
5448 stl: "none",
5449 system_shared_libs: [],
5450 apex_available: ["myapex"],
5451 }
5452
5453 cc_library {
5454 name: "libbaz",
5455 stl: "none",
5456 system_shared_libs: [],
5457 apex_available: ["myapex"],
5458 stubs: {
5459 versions: ["1"],
5460 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005461 }`)
5462
Jiyong Park89e850a2020-04-07 16:37:39 +09005463 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5464 // because it depends on libbar which isn't available to platform
5465 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5466 if libfoo.NotAvailableForPlatform() != true {
5467 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5468 }
5469
5470 // libfoo2 however can be available to platform because it depends on libbaz which provides
5471 // stubs
5472 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5473 if libfoo2.NotAvailableForPlatform() == true {
5474 t.Errorf("%q should be available to platform", libfoo2.String())
5475 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005476}
Jiyong Parka90ca002019-10-07 15:47:24 +09005477
Paul Duffine52e66f2020-03-30 17:54:29 +01005478func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005479 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005480 apex {
5481 name: "myapex",
5482 key: "myapex.key",
5483 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005484 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005485 }
5486
5487 apex_key {
5488 name: "myapex.key",
5489 public_key: "testkey.avbpubkey",
5490 private_key: "testkey.pem",
5491 }
5492
5493 cc_library {
5494 name: "libfoo",
5495 stl: "none",
5496 system_shared_libs: [],
5497 apex_available: ["myapex"],
5498 static: {
5499 apex_available: ["//apex_available:platform"],
5500 },
5501 }`)
5502
Jiyong Park89e850a2020-04-07 16:37:39 +09005503 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5504 if libfooShared.NotAvailableForPlatform() != true {
5505 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5506 }
5507 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5508 if libfooStatic.NotAvailableForPlatform() != false {
5509 t.Errorf("%q should be available to platform", libfooStatic.String())
5510 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005511}
5512
Jiyong Park5d790c32019-11-15 18:40:32 +09005513func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005514 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005515 apex {
5516 name: "myapex",
5517 key: "myapex.key",
5518 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005519 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005520 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005521 }
5522
5523 override_apex {
5524 name: "override_myapex",
5525 base: "myapex",
5526 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005527 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005528 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005529 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005530 }
5531
5532 apex_key {
5533 name: "myapex.key",
5534 public_key: "testkey.avbpubkey",
5535 private_key: "testkey.pem",
5536 }
5537
5538 android_app {
5539 name: "app",
5540 srcs: ["foo/bar/MyClass.java"],
5541 package_name: "foo",
5542 sdk_version: "none",
5543 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005544 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005545 }
5546
5547 override_android_app {
5548 name: "override_app",
5549 base: "app",
5550 package_name: "bar",
5551 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005552 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005553
Jiyong Park317645e2019-12-05 13:20:58 +09005554 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5555 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5556 if originalVariant.GetOverriddenBy() != "" {
5557 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5558 }
5559 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5560 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5561 }
5562
Jiyong Park5d790c32019-11-15 18:40:32 +09005563 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5564 apexRule := module.Rule("apexRule")
5565 copyCmds := apexRule.Args["copy_commands"]
5566
5567 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005568 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005569
5570 apexBundle := module.Module().(*apexBundle)
5571 name := apexBundle.Name()
5572 if name != "override_myapex" {
5573 t.Errorf("name should be \"override_myapex\", but was %q", name)
5574 }
5575
Baligh Uddin004d7172020-02-19 21:29:28 -08005576 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5577 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5578 }
5579
Jiyong Park20bacab2020-03-03 11:45:41 +09005580 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005581 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005582
Colin Crossaa255532020-07-03 13:18:24 -07005583 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005584 var builder strings.Builder
5585 data.Custom(&builder, name, "TARGET_", "", data)
5586 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005587 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005588 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5589 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005590 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005591 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005592 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005593 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5594 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005595}
5596
Jooyung Han214bf372019-11-12 13:03:50 +09005597func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005598 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005599 apex {
5600 name: "myapex",
5601 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005602 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005603 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005604 }
5605
5606 apex_key {
5607 name: "myapex.key",
5608 public_key: "testkey.avbpubkey",
5609 private_key: "testkey.pem",
5610 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005611
5612 cc_library {
5613 name: "mylib",
5614 srcs: ["mylib.cpp"],
5615 stl: "libc++",
5616 system_shared_libs: [],
5617 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005618 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005619 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005620 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005621
5622 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5623 args := module.Rule("apexRule").Args
5624 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005625 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005626
5627 // The copies of the libraries in the apex should have one more dependency than
5628 // the ones outside the apex, namely the unwinder. Ideally we should check
5629 // the dependency names directly here but for some reason the names are blank in
5630 // this test.
5631 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005632 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005633 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5634 if len(apexImplicits) != len(nonApexImplicits)+1 {
5635 t.Errorf("%q missing unwinder dep", lib)
5636 }
5637 }
Jooyung Han214bf372019-11-12 13:03:50 +09005638}
5639
Paul Duffin9b879592020-05-26 13:21:35 +01005640var filesForSdkLibrary = map[string][]byte{
5641 "api/current.txt": nil,
5642 "api/removed.txt": nil,
5643 "api/system-current.txt": nil,
5644 "api/system-removed.txt": nil,
5645 "api/test-current.txt": nil,
5646 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005647
Anton Hanssondff2c782020-12-21 17:10:01 +00005648 "100/public/api/foo.txt": nil,
5649 "100/public/api/foo-removed.txt": nil,
5650 "100/system/api/foo.txt": nil,
5651 "100/system/api/foo-removed.txt": nil,
5652
Paul Duffineedc5d52020-06-12 17:46:39 +01005653 // For java_sdk_library_import
5654 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005655}
5656
Jooyung Han58f26ab2019-12-18 15:34:32 +09005657func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005658 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005659 apex {
5660 name: "myapex",
5661 key: "myapex.key",
5662 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005663 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005664 }
5665
5666 apex_key {
5667 name: "myapex.key",
5668 public_key: "testkey.avbpubkey",
5669 private_key: "testkey.pem",
5670 }
5671
5672 java_sdk_library {
5673 name: "foo",
5674 srcs: ["a.java"],
5675 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005676 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005677 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005678
5679 prebuilt_apis {
5680 name: "sdk",
5681 api_dirs: ["100"],
5682 }
Paul Duffin9b879592020-05-26 13:21:35 +01005683 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005684
5685 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005686 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005687 "javalib/foo.jar",
5688 "etc/permissions/foo.xml",
5689 })
5690 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005691 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5692 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005693}
5694
Paul Duffin9b879592020-05-26 13:21:35 +01005695func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005696 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005697 apex {
5698 name: "myapex",
5699 key: "myapex.key",
5700 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005701 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005702 }
5703
5704 apex_key {
5705 name: "myapex.key",
5706 public_key: "testkey.avbpubkey",
5707 private_key: "testkey.pem",
5708 }
5709
5710 java_sdk_library {
5711 name: "foo",
5712 srcs: ["a.java"],
5713 api_packages: ["foo"],
5714 apex_available: ["myapex"],
5715 sdk_version: "none",
5716 system_modules: "none",
5717 }
5718
5719 java_library {
5720 name: "bar",
5721 srcs: ["a.java"],
5722 libs: ["foo"],
5723 apex_available: ["myapex"],
5724 sdk_version: "none",
5725 system_modules: "none",
5726 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005727
5728 prebuilt_apis {
5729 name: "sdk",
5730 api_dirs: ["100"],
5731 }
Paul Duffin9b879592020-05-26 13:21:35 +01005732 `, withFiles(filesForSdkLibrary))
5733
5734 // java_sdk_library installs both impl jar and permission XML
5735 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5736 "javalib/bar.jar",
5737 "javalib/foo.jar",
5738 "etc/permissions/foo.xml",
5739 })
5740
5741 // The bar library should depend on the implementation jar.
5742 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5743 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5744 t.Errorf("expected %q, found %#q", expected, actual)
5745 }
5746}
5747
5748func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005749 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005750 apex {
5751 name: "myapex",
5752 key: "myapex.key",
5753 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005754 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005755 }
5756
5757 apex_key {
5758 name: "myapex.key",
5759 public_key: "testkey.avbpubkey",
5760 private_key: "testkey.pem",
5761 }
5762
5763 java_sdk_library {
5764 name: "foo",
5765 srcs: ["a.java"],
5766 api_packages: ["foo"],
5767 apex_available: ["myapex"],
5768 sdk_version: "none",
5769 system_modules: "none",
5770 }
5771
5772 java_library {
5773 name: "bar",
5774 srcs: ["a.java"],
5775 libs: ["foo"],
5776 sdk_version: "none",
5777 system_modules: "none",
5778 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005779
5780 prebuilt_apis {
5781 name: "sdk",
5782 api_dirs: ["100"],
5783 }
Paul Duffin9b879592020-05-26 13:21:35 +01005784 `, withFiles(filesForSdkLibrary))
5785
5786 // java_sdk_library installs both impl jar and permission XML
5787 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5788 "javalib/foo.jar",
5789 "etc/permissions/foo.xml",
5790 })
5791
5792 // The bar library should depend on the stubs jar.
5793 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5794 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5795 t.Errorf("expected %q, found %#q", expected, actual)
5796 }
5797}
5798
Paul Duffineedc5d52020-06-12 17:46:39 +01005799func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005800 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005801 prebuilt_apis {
5802 name: "sdk",
5803 api_dirs: ["100"],
5804 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005805 withFiles(map[string][]byte{
5806 "apex/a.java": nil,
5807 "apex/apex_manifest.json": nil,
5808 "apex/Android.bp": []byte(`
5809 package {
5810 default_visibility: ["//visibility:private"],
5811 }
5812
5813 apex {
5814 name: "myapex",
5815 key: "myapex.key",
5816 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005817 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005818 }
5819
5820 apex_key {
5821 name: "myapex.key",
5822 public_key: "testkey.avbpubkey",
5823 private_key: "testkey.pem",
5824 }
5825
5826 java_library {
5827 name: "bar",
5828 srcs: ["a.java"],
5829 libs: ["foo"],
5830 apex_available: ["myapex"],
5831 sdk_version: "none",
5832 system_modules: "none",
5833 }
5834`),
5835 "source/a.java": nil,
5836 "source/api/current.txt": nil,
5837 "source/api/removed.txt": nil,
5838 "source/Android.bp": []byte(`
5839 package {
5840 default_visibility: ["//visibility:private"],
5841 }
5842
5843 java_sdk_library {
5844 name: "foo",
5845 visibility: ["//apex"],
5846 srcs: ["a.java"],
5847 api_packages: ["foo"],
5848 apex_available: ["myapex"],
5849 sdk_version: "none",
5850 system_modules: "none",
5851 public: {
5852 enabled: true,
5853 },
5854 }
5855`),
5856 "prebuilt/a.jar": nil,
5857 "prebuilt/Android.bp": []byte(`
5858 package {
5859 default_visibility: ["//visibility:private"],
5860 }
5861
5862 java_sdk_library_import {
5863 name: "foo",
5864 visibility: ["//apex", "//source"],
5865 apex_available: ["myapex"],
5866 prefer: true,
5867 public: {
5868 jars: ["a.jar"],
5869 },
5870 }
5871`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005872 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005873 )
5874
5875 // java_sdk_library installs both impl jar and permission XML
5876 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5877 "javalib/bar.jar",
5878 "javalib/foo.jar",
5879 "etc/permissions/foo.xml",
5880 })
5881
5882 // The bar library should depend on the implementation jar.
5883 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5884 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5885 t.Errorf("expected %q, found %#q", expected, actual)
5886 }
5887}
5888
5889func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5890 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005895 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
5904 java_sdk_library_import {
5905 name: "foo",
5906 apex_available: ["myapex"],
5907 prefer: true,
5908 public: {
5909 jars: ["a.jar"],
5910 },
5911 }
5912
5913 `, withFiles(filesForSdkLibrary))
5914}
5915
atrost6e126252020-01-27 17:01:16 +00005916func TestCompatConfig(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005917 ctx := testApex(t, `
atrost6e126252020-01-27 17:01:16 +00005918 apex {
5919 name: "myapex",
5920 key: "myapex.key",
5921 prebuilts: ["myjar-platform-compat-config"],
5922 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005923 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005924 }
5925
5926 apex_key {
5927 name: "myapex.key",
5928 public_key: "testkey.avbpubkey",
5929 private_key: "testkey.pem",
5930 }
5931
5932 platform_compat_config {
5933 name: "myjar-platform-compat-config",
5934 src: ":myjar",
5935 }
5936
5937 java_library {
5938 name: "myjar",
5939 srcs: ["foo/bar/MyClass.java"],
5940 sdk_version: "none",
5941 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005942 apex_available: [ "myapex" ],
5943 }
5944 `)
5945 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5946 "etc/compatconfig/myjar-platform-compat-config.xml",
5947 "javalib/myjar.jar",
5948 })
5949}
5950
Jiyong Park479321d2019-12-16 11:47:12 +09005951func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5952 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5953 apex {
5954 name: "myapex",
5955 key: "myapex.key",
5956 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005957 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09005958 }
5959
5960 apex_key {
5961 name: "myapex.key",
5962 public_key: "testkey.avbpubkey",
5963 private_key: "testkey.pem",
5964 }
5965
5966 java_library {
5967 name: "myjar",
5968 srcs: ["foo/bar/MyClass.java"],
5969 sdk_version: "none",
5970 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005971 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005972 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005973 }
5974 `)
5975}
5976
Jiyong Park7afd1072019-12-30 16:56:33 +09005977func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005978 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005979 apex {
5980 name: "myapex",
5981 key: "myapex.key",
5982 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005983 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09005984 }
5985
5986 apex_key {
5987 name: "myapex.key",
5988 public_key: "testkey.avbpubkey",
5989 private_key: "testkey.pem",
5990 }
5991
5992 cc_library {
5993 name: "mylib",
5994 srcs: ["mylib.cpp"],
5995 system_shared_libs: [],
5996 stl: "none",
5997 required: ["a", "b"],
5998 host_required: ["c", "d"],
5999 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006000 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006001 }
6002 `)
6003
6004 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006005 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006006 name := apexBundle.BaseModuleName()
6007 prefix := "TARGET_"
6008 var builder strings.Builder
6009 data.Custom(&builder, name, prefix, "", data)
6010 androidMk := builder.String()
6011 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6012 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6013 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6014}
6015
Jiyong Park7cd10e32020-01-14 09:22:18 +09006016func TestSymlinksFromApexToSystem(t *testing.T) {
6017 bp := `
6018 apex {
6019 name: "myapex",
6020 key: "myapex.key",
6021 native_shared_libs: ["mylib"],
6022 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006023 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006024 }
6025
Jiyong Park9d677202020-02-19 16:29:35 +09006026 apex {
6027 name: "myapex.updatable",
6028 key: "myapex.key",
6029 native_shared_libs: ["mylib"],
6030 java_libs: ["myjar"],
6031 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006032 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006033 }
6034
Jiyong Park7cd10e32020-01-14 09:22:18 +09006035 apex_key {
6036 name: "myapex.key",
6037 public_key: "testkey.avbpubkey",
6038 private_key: "testkey.pem",
6039 }
6040
6041 cc_library {
6042 name: "mylib",
6043 srcs: ["mylib.cpp"],
6044 shared_libs: ["myotherlib"],
6045 system_shared_libs: [],
6046 stl: "none",
6047 apex_available: [
6048 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006049 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006050 "//apex_available:platform",
6051 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006052 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006053 }
6054
6055 cc_library {
6056 name: "myotherlib",
6057 srcs: ["mylib.cpp"],
6058 system_shared_libs: [],
6059 stl: "none",
6060 apex_available: [
6061 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006062 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006063 "//apex_available:platform",
6064 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006065 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006066 }
6067
6068 java_library {
6069 name: "myjar",
6070 srcs: ["foo/bar/MyClass.java"],
6071 sdk_version: "none",
6072 system_modules: "none",
6073 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006074 apex_available: [
6075 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006076 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006077 "//apex_available:platform",
6078 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006079 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006080 }
6081
6082 java_library {
6083 name: "myotherjar",
6084 srcs: ["foo/bar/MyClass.java"],
6085 sdk_version: "none",
6086 system_modules: "none",
6087 apex_available: [
6088 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006089 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006090 "//apex_available:platform",
6091 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006092 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006093 }
6094 `
6095
6096 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6097 for _, f := range files {
6098 if f.path == file {
6099 if f.isLink {
6100 t.Errorf("%q is not a real file", file)
6101 }
6102 return
6103 }
6104 }
6105 t.Errorf("%q is not found", file)
6106 }
6107
6108 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6109 for _, f := range files {
6110 if f.path == file {
6111 if !f.isLink {
6112 t.Errorf("%q is not a symlink", file)
6113 }
6114 return
6115 }
6116 }
6117 t.Errorf("%q is not found", file)
6118 }
6119
Jiyong Park9d677202020-02-19 16:29:35 +09006120 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6121 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006122 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006123 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006124 ensureRealfileExists(t, files, "javalib/myjar.jar")
6125 ensureRealfileExists(t, files, "lib64/mylib.so")
6126 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6127
Jiyong Park9d677202020-02-19 16:29:35 +09006128 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6129 ensureRealfileExists(t, files, "javalib/myjar.jar")
6130 ensureRealfileExists(t, files, "lib64/mylib.so")
6131 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6132
6133 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006134 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006135 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006136 ensureRealfileExists(t, files, "javalib/myjar.jar")
6137 ensureRealfileExists(t, files, "lib64/mylib.so")
6138 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006139
6140 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6141 ensureRealfileExists(t, files, "javalib/myjar.jar")
6142 ensureRealfileExists(t, files, "lib64/mylib.so")
6143 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006144}
6145
Yo Chiange8128052020-07-23 20:09:18 +08006146func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006147 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006148 apex {
6149 name: "myapex",
6150 key: "myapex.key",
6151 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006152 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006153 }
6154
6155 apex_key {
6156 name: "myapex.key",
6157 public_key: "testkey.avbpubkey",
6158 private_key: "testkey.pem",
6159 }
6160
6161 cc_library_shared {
6162 name: "mylib",
6163 srcs: ["mylib.cpp"],
6164 shared_libs: ["myotherlib"],
6165 system_shared_libs: [],
6166 stl: "none",
6167 apex_available: [
6168 "myapex",
6169 "//apex_available:platform",
6170 ],
6171 }
6172
6173 cc_prebuilt_library_shared {
6174 name: "myotherlib",
6175 srcs: ["prebuilt.so"],
6176 system_shared_libs: [],
6177 stl: "none",
6178 apex_available: [
6179 "myapex",
6180 "//apex_available:platform",
6181 ],
6182 }
6183 `)
6184
6185 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006186 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006187 var builder strings.Builder
6188 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6189 androidMk := builder.String()
6190 // `myotherlib` is added to `myapex` as symlink
6191 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6192 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6193 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6194 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006195 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08006196}
6197
Jooyung Han643adc42020-02-27 13:50:06 +09006198func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006199 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006200 apex {
6201 name: "myapex",
6202 key: "myapex.key",
6203 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006204 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006205 }
6206
6207 apex_key {
6208 name: "myapex.key",
6209 public_key: "testkey.avbpubkey",
6210 private_key: "testkey.pem",
6211 }
6212
6213 cc_library {
6214 name: "mylib",
6215 srcs: ["mylib.cpp"],
6216 shared_libs: ["mylib2"],
6217 system_shared_libs: [],
6218 stl: "none",
6219 apex_available: [ "myapex" ],
6220 }
6221
6222 cc_library {
6223 name: "mylib2",
6224 srcs: ["mylib.cpp"],
6225 system_shared_libs: [],
6226 stl: "none",
6227 apex_available: [ "myapex" ],
6228 }
6229 `)
6230
6231 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6232 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6233 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6234 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6235 "lib64/mylib.so",
6236 "lib64/mylib2.so",
6237 })
6238}
6239
Jooyung Han49f67012020-04-17 13:43:10 +09006240func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006241 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006242 apex {
6243 name: "myapex",
6244 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006245 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006246 }
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
6252 `, func(fs map[string][]byte, config android.Config) {
6253 delete(config.Targets, android.Android)
6254 config.AndroidCommonTarget = android.Target{}
6255 })
6256
6257 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6258 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6259 }
6260}
6261
Jiyong Parkbd159612020-02-28 15:22:21 +09006262func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006263 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006264 apex {
6265 name: "myapex",
6266 key: "myapex.key",
6267 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006268 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006269 }
6270
6271 apex_key {
6272 name: "myapex.key",
6273 public_key: "testkey.avbpubkey",
6274 private_key: "testkey.pem",
6275 }
6276
6277 android_app {
6278 name: "AppFoo",
6279 srcs: ["foo/bar/MyClass.java"],
6280 sdk_version: "none",
6281 system_modules: "none",
6282 apex_available: [ "myapex" ],
6283 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006284 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006285
Colin Crosscf371cc2020-11-13 11:48:42 -08006286 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006287 content := bundleConfigRule.Args["content"]
6288
6289 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006290 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 +09006291}
6292
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006293func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006294 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006295 apex {
6296 name: "myapex",
6297 key: "myapex.key",
6298 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006299 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006300 }
6301
6302 apex_key {
6303 name: "myapex.key",
6304 public_key: "testkey.avbpubkey",
6305 private_key: "testkey.pem",
6306 }
6307
6308 android_app_set {
6309 name: "AppSet",
6310 set: "AppSet.apks",
6311 }`)
6312 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006313 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006314 content := bundleConfigRule.Args["content"]
6315 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6316 s := mod.Rule("apexRule").Args["copy_commands"]
6317 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6318 if len(copyCmds) != 3 {
6319 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6320 }
6321 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6322 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6323 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6324}
6325
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006326func TestAppSetBundlePrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006327 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006328 bp := `
6329 apex_set {
6330 name: "myapex",
6331 filename: "foo_v2.apex",
6332 sanitized: {
6333 none: { set: "myapex.apks", },
6334 hwaddress: { set: "myapex.hwasan.apks", },
6335 },
6336 }`
6337 fs["Android.bp"] = []byte(bp)
6338
6339 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6340 })
6341
6342 m := ctx.ModuleForTests("myapex", "android_common")
6343 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6344
6345 actual := extractedApex.Inputs
6346 if len(actual) != 1 {
6347 t.Errorf("expected a single input")
6348 }
6349
6350 expected := "myapex.hwasan.apks"
6351 if actual[0].String() != expected {
6352 t.Errorf("expected %s, got %s", expected, actual[0].String())
6353 }
6354}
6355
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006356func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006357 t.Helper()
6358
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006359 bp := `
6360 java_library {
6361 name: "some-updatable-apex-lib",
6362 srcs: ["a.java"],
6363 sdk_version: "current",
6364 apex_available: [
6365 "some-updatable-apex",
6366 ],
6367 }
6368
6369 java_library {
6370 name: "some-non-updatable-apex-lib",
6371 srcs: ["a.java"],
6372 apex_available: [
6373 "some-non-updatable-apex",
6374 ],
6375 }
6376
6377 java_library {
6378 name: "some-platform-lib",
6379 srcs: ["a.java"],
6380 sdk_version: "current",
6381 installable: true,
6382 }
6383
6384 java_library {
6385 name: "some-art-lib",
6386 srcs: ["a.java"],
6387 sdk_version: "current",
6388 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006389 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006390 ],
6391 hostdex: true,
6392 }
6393
6394 apex {
6395 name: "some-updatable-apex",
6396 key: "some-updatable-apex.key",
6397 java_libs: ["some-updatable-apex-lib"],
6398 updatable: true,
6399 min_sdk_version: "current",
6400 }
6401
6402 apex {
6403 name: "some-non-updatable-apex",
6404 key: "some-non-updatable-apex.key",
6405 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006406 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006407 }
6408
6409 apex_key {
6410 name: "some-updatable-apex.key",
6411 }
6412
6413 apex_key {
6414 name: "some-non-updatable-apex.key",
6415 }
6416
6417 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006418 name: "com.android.art.debug",
6419 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006420 java_libs: ["some-art-lib"],
6421 updatable: true,
6422 min_sdk_version: "current",
6423 }
6424
6425 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006426 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006427 }
6428
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006429 filegroup {
6430 name: "some-updatable-apex-file_contexts",
6431 srcs: [
6432 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6433 ],
6434 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006435
6436 filegroup {
6437 name: "some-non-updatable-apex-file_contexts",
6438 srcs: [
6439 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6440 ],
6441 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006442 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006443
6444 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6445}
6446
Paul Duffin064b70c2020-11-02 17:32:38 +00006447func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006448 t.Helper()
6449
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006450 bp += cc.GatherRequiredDepsForTest(android.Android)
6451 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006452
6453 fs := map[string][]byte{
6454 "a.java": nil,
6455 "a.jar": nil,
6456 "build/make/target/product/security": nil,
6457 "apex_manifest.json": nil,
6458 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006459 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006460 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6461 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6462 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006463 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006464 }
6465 cc.GatherRequiredFilesForTest(fs)
6466
Paul Duffin39853512021-02-26 11:09:39 +00006467 for k, v := range filesForSdkLibrary {
6468 fs[k] = v
6469 }
Colin Crossae8600b2020-10-29 17:09:13 -07006470 config := android.TestArchConfig(buildDir, nil, bp, fs)
6471
6472 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006473 ctx.RegisterModuleType("apex", BundleFactory)
6474 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006475 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006476 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006477 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006478 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006479 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006480 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006481 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006482 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006483 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6484 ctx.PreDepsMutators(RegisterPreDepsMutators)
6485 ctx.PostDepsMutators(RegisterPostDepsMutators)
6486
Colin Crossae8600b2020-10-29 17:09:13 -07006487 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006488
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006489 pathCtx := android.PathContextForTesting(config)
6490 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6491 transformDexpreoptConfig(dexpreoptConfig)
6492 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6493
Paul Duffinf38931c2021-02-05 16:58:28 +00006494 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006495 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006496 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6497 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6498
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006499 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6500 android.FailIfErrored(t, errs)
6501
6502 _, errs = ctx.PrepareBuildActions(config)
6503 if errmsg == "" {
6504 android.FailIfErrored(t, errs)
6505 } else if len(errs) > 0 {
6506 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006507 } else {
6508 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6509 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006510
6511 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006512}
6513
Jooyung Han548640b2020-04-27 12:10:30 +09006514func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6515 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6516 apex {
6517 name: "myapex",
6518 key: "myapex.key",
6519 updatable: true,
6520 }
6521
6522 apex_key {
6523 name: "myapex.key",
6524 public_key: "testkey.avbpubkey",
6525 private_key: "testkey.pem",
6526 }
6527 `)
6528}
6529
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006530func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6531 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6532 apex {
6533 name: "myapex",
6534 key: "myapex.key",
6535 }
6536
6537 apex_key {
6538 name: "myapex.key",
6539 public_key: "testkey.avbpubkey",
6540 private_key: "testkey.pem",
6541 }
6542 `)
6543}
6544
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006545func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006546 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006547 var transform func(*dexpreopt.GlobalConfig)
6548
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006549 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6550 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006551 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006552 }
6553 testNoUpdatableJarsInBootImage(t, "", transform)
6554 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006555
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006556 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006557 err = `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006558 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006559 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006560 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006561 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006562 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006563
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006564 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 -07006565 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 +01006566 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006567 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006568 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006569 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006570 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006571
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006572 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 -07006573 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006574 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006575 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006576 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006577 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006578 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006579
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006580 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 -07006581 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 +01006582 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006583 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006584 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006585 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006586 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006587
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006588 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6589 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006590 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006591 }
6592 testNoUpdatableJarsInBootImage(t, "", transform)
6593 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006594
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006595 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006596 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006597 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006598 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006599 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006600 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006601 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006602
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006603 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006604 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006605 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006606 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006607 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006608 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006609 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006610
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006611 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006612 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006613 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006614 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006615 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006616 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006617 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006618
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006619 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6620 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006621 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006622 }
6623 testNoUpdatableJarsInBootImage(t, "", transform)
6624 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006625
6626}
6627
6628func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6629 transform := func(config *dexpreopt.GlobalConfig) {
6630 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6631 }
6632 t.Run("prebuilt no source", func(t *testing.T) {
6633 testDexpreoptWithApexes(t, `
6634 prebuilt_apex {
6635 name: "myapex" ,
6636 arch: {
6637 arm64: {
6638 src: "myapex-arm64.apex",
6639 },
6640 arm: {
6641 src: "myapex-arm.apex",
6642 },
6643 },
6644 exported_java_libs: ["libfoo"],
6645 }
6646
6647 java_import {
6648 name: "libfoo",
6649 jars: ["libfoo.jar"],
6650 }
6651`, "", transform)
6652 })
6653
6654 t.Run("prebuilt no source", func(t *testing.T) {
6655 testDexpreoptWithApexes(t, `
6656 prebuilt_apex {
6657 name: "myapex" ,
6658 arch: {
6659 arm64: {
6660 src: "myapex-arm64.apex",
6661 },
6662 arm: {
6663 src: "myapex-arm.apex",
6664 },
6665 },
6666 exported_java_libs: ["libfoo"],
6667 }
6668
6669 java_import {
6670 name: "libfoo",
6671 jars: ["libfoo.jar"],
6672 }
6673`, "", transform)
6674 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006675}
6676
Andrei Onea115e7e72020-06-05 21:14:03 +01006677func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6678 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006679 bp += `
6680 apex_key {
6681 name: "myapex.key",
6682 public_key: "testkey.avbpubkey",
6683 private_key: "testkey.pem",
6684 }`
6685 fs := map[string][]byte{
6686 "lib1/src/A.java": nil,
6687 "lib2/src/B.java": nil,
6688 "system/sepolicy/apex/myapex-file_contexts": nil,
6689 }
6690
Colin Crossae8600b2020-10-29 17:09:13 -07006691 config := android.TestArchConfig(buildDir, nil, bp, fs)
6692 android.SetTestNeverallowRules(config, rules)
6693 updatableBootJars := make([]string, 0, len(apexBootJars))
6694 for _, apexBootJar := range apexBootJars {
6695 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6696 }
6697 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6698
6699 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006700 ctx.RegisterModuleType("apex", BundleFactory)
6701 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6702 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6703 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006704 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006705 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6706 ctx.PreDepsMutators(RegisterPreDepsMutators)
6707 ctx.PostDepsMutators(RegisterPostDepsMutators)
6708 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6709
Colin Crossae8600b2020-10-29 17:09:13 -07006710 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006711
6712 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6713 android.FailIfErrored(t, errs)
6714
6715 _, errs = ctx.PrepareBuildActions(config)
6716 if errmsg == "" {
6717 android.FailIfErrored(t, errs)
6718 } else if len(errs) > 0 {
6719 android.FailIfNoMatchingErrors(t, errmsg, errs)
6720 return
6721 } else {
6722 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6723 }
6724}
6725
6726func TestApexPermittedPackagesRules(t *testing.T) {
6727 testcases := []struct {
6728 name string
6729 expectedError string
6730 bp string
6731 bootJars []string
6732 modulesPackages map[string][]string
6733 }{
6734
6735 {
6736 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6737 expectedError: "",
6738 bp: `
6739 java_library {
6740 name: "bcp_lib1",
6741 srcs: ["lib1/src/*.java"],
6742 permitted_packages: ["foo.bar"],
6743 apex_available: ["myapex"],
6744 sdk_version: "none",
6745 system_modules: "none",
6746 }
6747 java_library {
6748 name: "nonbcp_lib2",
6749 srcs: ["lib2/src/*.java"],
6750 apex_available: ["myapex"],
6751 permitted_packages: ["a.b"],
6752 sdk_version: "none",
6753 system_modules: "none",
6754 }
6755 apex {
6756 name: "myapex",
6757 key: "myapex.key",
6758 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006759 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006760 }`,
6761 bootJars: []string{"bcp_lib1"},
6762 modulesPackages: map[string][]string{
6763 "myapex": []string{
6764 "foo.bar",
6765 },
6766 },
6767 },
6768 {
6769 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6770 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.`,
6771 bp: `
6772 java_library {
6773 name: "bcp_lib1",
6774 srcs: ["lib1/src/*.java"],
6775 apex_available: ["myapex"],
6776 permitted_packages: ["foo.bar"],
6777 sdk_version: "none",
6778 system_modules: "none",
6779 }
6780 java_library {
6781 name: "bcp_lib2",
6782 srcs: ["lib2/src/*.java"],
6783 apex_available: ["myapex"],
6784 permitted_packages: ["foo.bar", "bar.baz"],
6785 sdk_version: "none",
6786 system_modules: "none",
6787 }
6788 apex {
6789 name: "myapex",
6790 key: "myapex.key",
6791 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006792 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006793 }
6794 `,
6795 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6796 modulesPackages: map[string][]string{
6797 "myapex": []string{
6798 "foo.bar",
6799 },
6800 },
6801 },
6802 }
6803 for _, tc := range testcases {
6804 t.Run(tc.name, func(t *testing.T) {
6805 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6806 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6807 })
6808 }
6809}
6810
Jiyong Park62304bb2020-04-13 16:19:48 +09006811func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006812 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006813 apex {
6814 name: "myapex",
6815 key: "myapex.key",
6816 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006817 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006818 }
6819
6820 apex_key {
6821 name: "myapex.key",
6822 public_key: "testkey.avbpubkey",
6823 private_key: "testkey.pem",
6824 }
6825
6826 cc_library {
6827 name: "mylib",
6828 srcs: ["mylib.cpp"],
6829 system_shared_libs: [],
6830 stl: "none",
6831 stubs: {
6832 versions: ["1"],
6833 },
6834 apex_available: ["myapex"],
6835 }
6836
6837 cc_library {
6838 name: "myprivlib",
6839 srcs: ["mylib.cpp"],
6840 system_shared_libs: [],
6841 stl: "none",
6842 apex_available: ["myapex"],
6843 }
6844
6845
6846 cc_test {
6847 name: "mytest",
6848 gtest: false,
6849 srcs: ["mylib.cpp"],
6850 system_shared_libs: [],
6851 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006852 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006853 test_for: ["myapex"]
6854 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006855
6856 cc_library {
6857 name: "mytestlib",
6858 srcs: ["mylib.cpp"],
6859 system_shared_libs: [],
6860 shared_libs: ["mylib", "myprivlib"],
6861 stl: "none",
6862 test_for: ["myapex"],
6863 }
6864
6865 cc_benchmark {
6866 name: "mybench",
6867 srcs: ["mylib.cpp"],
6868 system_shared_libs: [],
6869 shared_libs: ["mylib", "myprivlib"],
6870 stl: "none",
6871 test_for: ["myapex"],
6872 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006873 `)
6874
6875 // the test 'mytest' is a test for the apex, therefore is linked to the
6876 // actual implementation of mylib instead of its stub.
6877 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6878 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6879 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006880
6881 // The same should be true for cc_library
6882 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6883 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6884 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6885
6886 // ... and for cc_benchmark
6887 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6888 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6889 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006890}
6891
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006892// TODO(jungjw): Move this to proptools
6893func intPtr(i int) *int {
6894 return &i
6895}
6896
6897func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006898 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006899 apex_set {
6900 name: "myapex",
6901 set: "myapex.apks",
6902 filename: "foo_v2.apex",
6903 overrides: ["foo"],
6904 }
6905 `, func(fs map[string][]byte, config android.Config) {
6906 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006907 config.Targets[android.Android] = []android.Target{
6908 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6909 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6910 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006911 })
6912
6913 m := ctx.ModuleForTests("myapex", "android_common")
6914
6915 // Check extract_apks tool parameters.
6916 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6917 actual := extractedApex.Args["abis"]
6918 expected := "ARMEABI_V7A,ARM64_V8A"
6919 if actual != expected {
6920 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6921 }
6922 actual = extractedApex.Args["sdk-version"]
6923 expected = "30"
6924 if actual != expected {
6925 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6926 }
6927
6928 a := m.Module().(*ApexSet)
6929 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006930 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006931 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6932 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6933 }
6934}
6935
Jiyong Park7d95a512020-05-10 15:16:24 +09006936func TestNoStaticLinkingToStubsLib(t *testing.T) {
6937 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6938 apex {
6939 name: "myapex",
6940 key: "myapex.key",
6941 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006942 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09006943 }
6944
6945 apex_key {
6946 name: "myapex.key",
6947 public_key: "testkey.avbpubkey",
6948 private_key: "testkey.pem",
6949 }
6950
6951 cc_library {
6952 name: "mylib",
6953 srcs: ["mylib.cpp"],
6954 static_libs: ["otherlib"],
6955 system_shared_libs: [],
6956 stl: "none",
6957 apex_available: [ "myapex" ],
6958 }
6959
6960 cc_library {
6961 name: "otherlib",
6962 srcs: ["mylib.cpp"],
6963 system_shared_libs: [],
6964 stl: "none",
6965 stubs: {
6966 versions: ["1", "2", "3"],
6967 },
6968 apex_available: [ "myapex" ],
6969 }
6970 `)
6971}
6972
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006973func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006974 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006978 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006979 }
6980
6981 apex_key {
6982 name: "myapex.key",
6983 public_key: "testkey.avbpubkey",
6984 private_key: "testkey.pem",
6985 }
6986
6987 prebuilt_apex {
6988 name: "myapex",
6989 prefer: true,
6990 arch: {
6991 arm64: {
6992 src: "myapex-arm64.apex",
6993 },
6994 arm: {
6995 src: "myapex-arm.apex",
6996 },
6997 },
6998 }
6999
7000 apex_set {
7001 name: "myapex_set",
7002 set: "myapex.apks",
7003 filename: "myapex_set.apex",
7004 overrides: ["myapex"],
7005 }
7006 `)
7007
7008 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7009 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7010 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 +09007011 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 +09007012}
7013
Jooyung Han938b5932020-06-20 12:47:47 +09007014func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007015 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007016 apex {
7017 name: "myapex",
7018 key: "myapex.key",
7019 apps: ["app"],
7020 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007021 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007022 }
7023
7024 apex_key {
7025 name: "myapex.key",
7026 public_key: "testkey.avbpubkey",
7027 private_key: "testkey.pem",
7028 }
7029
7030 android_app {
7031 name: "app",
7032 srcs: ["foo/bar/MyClass.java"],
7033 package_name: "foo",
7034 sdk_version: "none",
7035 system_modules: "none",
7036 apex_available: [ "myapex" ],
7037 }
7038 `, withFiles(map[string][]byte{
7039 "sub/Android.bp": []byte(`
7040 override_apex {
7041 name: "override_myapex",
7042 base: "myapex",
7043 apps: ["override_app"],
7044 allowed_files: ":allowed",
7045 }
7046 // Overridable "path" property should be referenced indirectly
7047 filegroup {
7048 name: "allowed",
7049 srcs: ["allowed.txt"],
7050 }
7051 override_android_app {
7052 name: "override_app",
7053 base: "app",
7054 package_name: "bar",
7055 }
7056 `),
7057 }))
7058
7059 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7060 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7061 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7062 }
7063
7064 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7065 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7066 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7067 }
7068}
7069
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007070func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007071 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007072 apex {
7073 name: "myapex",
7074 key: "myapex.key",
7075 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007076 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
7085 cc_library {
7086 name: "mylib",
7087 srcs: ["mylib.cpp"],
7088 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007089 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007090 },
7091 apex_available: ["myapex"],
7092 }
7093
7094 cc_prebuilt_library_shared {
7095 name: "mylib",
7096 prefer: false,
7097 srcs: ["prebuilt.so"],
7098 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007099 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007100 },
7101 apex_available: ["myapex"],
7102 }
7103 `)
7104}
7105
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007106func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007107 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007108 apex {
7109 name: "myapex",
7110 key: "myapex.key",
7111 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007112 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007113 }
7114 apex_key {
7115 name: "myapex.key",
7116 public_key: "testkey.avbpubkey",
7117 private_key: "testkey.pem",
7118 }
7119 `, func(fs map[string][]byte, config android.Config) {
7120 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7121 })
7122
7123 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7124 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7125
7126 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7127 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7128
7129 // Make sure output of bundle is .capex
7130 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7131 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7132
7133 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007134 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007135 var builder strings.Builder
7136 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7137 androidMk := builder.String()
7138 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7139}
7140
Martin Stjernholm2856c662020-12-02 15:03:42 +00007141func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007142 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007143 apex {
7144 name: "myapex",
7145 key: "myapex.key",
7146 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007147 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007148 }
7149
7150 apex_key {
7151 name: "myapex.key",
7152 public_key: "testkey.avbpubkey",
7153 private_key: "testkey.pem",
7154 }
7155
7156 cc_library {
7157 name: "mylib",
7158 srcs: ["mylib.cpp"],
7159 apex_available: ["myapex"],
7160 shared_libs: ["otherlib"],
7161 system_shared_libs: [],
7162 }
7163
7164 cc_library {
7165 name: "otherlib",
7166 srcs: ["mylib.cpp"],
7167 stubs: {
7168 versions: ["current"],
7169 },
7170 }
7171
7172 cc_prebuilt_library_shared {
7173 name: "otherlib",
7174 prefer: true,
7175 srcs: ["prebuilt.so"],
7176 stubs: {
7177 versions: ["current"],
7178 },
7179 }
7180 `)
7181
7182 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007183 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007184 var builder strings.Builder
7185 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7186 androidMk := builder.String()
7187
7188 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7189 // a thing there.
7190 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7191}
7192
Jiyong Parke3867542020-12-03 17:28:25 +09007193func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007194 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007195 apex {
7196 name: "myapex",
7197 key: "myapex.key",
7198 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007199 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007200 }
7201
7202 apex_key {
7203 name: "myapex.key",
7204 public_key: "testkey.avbpubkey",
7205 private_key: "testkey.pem",
7206 }
7207
7208 cc_library {
7209 name: "mylib",
7210 srcs: ["mylib.cpp"],
7211 system_shared_libs: [],
7212 stl: "none",
7213 apex_available: ["myapex"],
7214 shared_libs: ["mylib2"],
7215 target: {
7216 apex: {
7217 exclude_shared_libs: ["mylib2"],
7218 },
7219 },
7220 }
7221
7222 cc_library {
7223 name: "mylib2",
7224 srcs: ["mylib.cpp"],
7225 system_shared_libs: [],
7226 stl: "none",
7227 }
7228 `)
7229
7230 // Check if mylib is linked to mylib2 for the non-apex target
7231 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7232 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7233
7234 // Make sure that the link doesn't occur for the apex target
7235 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7236 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7237
7238 // It shouldn't appear in the copy cmd as well.
7239 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7240 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7241}
7242
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007243func TestPrebuiltStubLibDep(t *testing.T) {
7244 bpBase := `
7245 apex {
7246 name: "myapex",
7247 key: "myapex.key",
7248 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007249 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007250 }
7251 apex_key {
7252 name: "myapex.key",
7253 public_key: "testkey.avbpubkey",
7254 private_key: "testkey.pem",
7255 }
7256 cc_library {
7257 name: "mylib",
7258 srcs: ["mylib.cpp"],
7259 apex_available: ["myapex"],
7260 shared_libs: ["stublib"],
7261 system_shared_libs: [],
7262 }
7263 apex {
7264 name: "otherapex",
7265 enabled: %s,
7266 key: "myapex.key",
7267 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007268 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007269 }
7270 `
7271
7272 stublibSourceBp := `
7273 cc_library {
7274 name: "stublib",
7275 srcs: ["mylib.cpp"],
7276 apex_available: ["otherapex"],
7277 system_shared_libs: [],
7278 stl: "none",
7279 stubs: {
7280 versions: ["1"],
7281 },
7282 }
7283 `
7284
7285 stublibPrebuiltBp := `
7286 cc_prebuilt_library_shared {
7287 name: "stublib",
7288 srcs: ["prebuilt.so"],
7289 apex_available: ["otherapex"],
7290 stubs: {
7291 versions: ["1"],
7292 },
7293 %s
7294 }
7295 `
7296
7297 tests := []struct {
7298 name string
7299 stublibBp string
7300 usePrebuilt bool
7301 modNames []string // Modules to collect AndroidMkEntries for
7302 otherApexEnabled []string
7303 }{
7304 {
7305 name: "only_source",
7306 stublibBp: stublibSourceBp,
7307 usePrebuilt: false,
7308 modNames: []string{"stublib"},
7309 otherApexEnabled: []string{"true", "false"},
7310 },
7311 {
7312 name: "source_preferred",
7313 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7314 usePrebuilt: false,
7315 modNames: []string{"stublib", "prebuilt_stublib"},
7316 otherApexEnabled: []string{"true", "false"},
7317 },
7318 {
7319 name: "prebuilt_preferred",
7320 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7321 usePrebuilt: true,
7322 modNames: []string{"stublib", "prebuilt_stublib"},
7323 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7324 },
7325 {
7326 name: "only_prebuilt",
7327 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7328 usePrebuilt: true,
7329 modNames: []string{"stublib"},
7330 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7331 },
7332 }
7333
7334 for _, test := range tests {
7335 t.Run(test.name, func(t *testing.T) {
7336 for _, otherApexEnabled := range test.otherApexEnabled {
7337 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007338 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007339
7340 type modAndMkEntries struct {
7341 mod *cc.Module
7342 mkEntries android.AndroidMkEntries
7343 }
7344 entries := []*modAndMkEntries{}
7345
7346 // Gather shared lib modules that are installable
7347 for _, modName := range test.modNames {
7348 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7349 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7350 continue
7351 }
7352 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007353 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007354 continue
7355 }
Colin Crossaa255532020-07-03 13:18:24 -07007356 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007357 if ent.Disabled {
7358 continue
7359 }
7360 entries = append(entries, &modAndMkEntries{
7361 mod: mod,
7362 mkEntries: ent,
7363 })
7364 }
7365 }
7366 }
7367
7368 var entry *modAndMkEntries = nil
7369 for _, ent := range entries {
7370 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7371 if entry != nil {
7372 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7373 } else {
7374 entry = ent
7375 }
7376 }
7377 }
7378
7379 if entry == nil {
7380 t.Errorf("AndroidMk entry for \"stublib\" missing")
7381 } else {
7382 isPrebuilt := entry.mod.Prebuilt() != nil
7383 if isPrebuilt != test.usePrebuilt {
7384 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7385 }
7386 if !entry.mod.IsStubs() {
7387 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7388 }
7389 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7390 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7391 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007392 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7393 expected := "-D__STUBLIB_API__=1"
7394 if !android.InList(expected, cflags) {
7395 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7396 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007397 }
7398 })
7399 }
7400 })
7401 }
7402}
7403
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007404func TestMain(m *testing.M) {
7405 run := func() int {
7406 setUp()
7407 defer tearDown()
7408
7409 return m.Run()
7410 }
7411
7412 os.Exit(run())
7413}