blob: 70464fc7a72f7b568d42e5b3e9c7468721876e30 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070032 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090033 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090035)
36
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070037var buildDir string
38
Jooyung Hand3639552019-08-09 12:57:43 +090039// names returns name list from white space separated string
40func names(s string) (ns []string) {
41 for _, n := range strings.Split(s, " ") {
42 if len(n) > 0 {
43 ns = append(ns, n)
44 }
45 }
46 return
47}
48
Jooyung Han344d5432019-08-23 11:17:39 +090049func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
50 t.Helper()
51 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090052 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
53 if len(errs) > 0 {
54 android.FailIfNoMatchingErrors(t, pattern, errs)
55 return
56 }
57 _, errs = ctx.PrepareBuildActions(config)
58 if len(errs) > 0 {
59 android.FailIfNoMatchingErrors(t, pattern, errs)
60 return
61 }
62
63 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
64}
65
Jooyung Han344d5432019-08-23 11:17:39 +090066func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
67 t.Helper()
68 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010069 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090070 android.FailIfErrored(t, errs)
71 _, errs = ctx.PrepareBuildActions(config)
72 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070073 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090074}
75
Jooyung Han344d5432019-08-23 11:17:39 +090076type testCustomizer func(fs map[string][]byte, config android.Config)
77
78func withFiles(files map[string][]byte) testCustomizer {
79 return func(fs map[string][]byte, config android.Config) {
80 for k, v := range files {
81 fs[k] = v
82 }
83 }
84}
85
86func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
87 return func(fs map[string][]byte, config android.Config) {
88 for k, v := range targets {
89 config.Targets[k] = v
90 }
91 }
92}
93
Jooyung Han35155c42020-02-06 17:33:20 +090094// withNativeBridgeTargets sets configuration with targets including:
95// - X86_64 (primary)
96// - X86 (secondary)
97// - Arm64 on X86_64 (native bridge)
98// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -070099func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110}
111
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900112func withManifestPackageNameOverrides(specs []string) testCustomizer {
113 return func(fs map[string][]byte, config android.Config) {
114 config.TestProductVariables.ManifestPackageNameOverrides = specs
115 }
116}
117
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700118func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900119 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900123 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900127 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128
129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Dario Frenicde2a032019-10-27 00:29:22 +0100140 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900141
Jooyung Han344d5432019-08-23 11:17:39 +0900142 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "build/make/target/product/security": nil,
147 "apex_manifest.json": nil,
148 "AndroidManifest.xml": nil,
149 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900151 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/commonapex-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800155 "mylib.cpp": nil,
156 "mylib_common.cpp": nil,
157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900191 }
192
Colin Crossf9aabd72020-02-15 11:29:50 -0800193 cc.GatherRequiredFilesForTest(fs)
194
Jooyung Han344d5432019-08-23 11:17:39 +0900195 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800196 // The fs now needs to be populated before creating the config, call handlers twice
197 // for now, once to get any fs changes, and later after the config was created to
198 // set product variables or targets.
199 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
200 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900201 }
202
Colin Cross98be1bb2019-12-13 20:41:13 -0800203 config := android.TestArchConfig(buildDir, nil, bp, fs)
204 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
205 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
206 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
207 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
208 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jooyung Han749dc692020-04-15 11:03:39 +0900209 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800210 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
211
212 for _, handler := range handlers {
213 // The fs now needs to be populated before creating the config, call handlers twice
214 // for now, earlier to get any fs changes, and now after the config was created to
215 // set product variables or targets.
216 tempFS := map[string][]byte{}
217 handler(tempFS, config)
218 }
219
220 ctx := android.NewTestArchContext()
Paul Duffineedc5d52020-06-12 17:46:39 +0100221
222 // from android package
223 android.RegisterPackageBuildComponents(ctx)
224 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
225
Colin Cross98be1bb2019-12-13 20:41:13 -0800226 ctx.RegisterModuleType("apex", BundleFactory)
227 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
228 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
229 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
230 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
231 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
232 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700233 ctx.RegisterModuleType("apex_set", apexSetFactory)
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 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
238
Paul Duffin021f4e52020-07-30 16:04:17 +0100239 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100240
Paul Duffin021f4e52020-07-30 16:04:17 +0100241 // Register these after the prebuilt mutators have been registered to match what
242 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100243 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
244 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
245
Paul Duffin021f4e52020-07-30 16:04:17 +0100246 cc.RegisterRequiredBuildComponentsForTest(ctx)
247
Colin Cross98be1bb2019-12-13 20:41:13 -0800248 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800249 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
250 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700251 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000252 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700253 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800254 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000255 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000256 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000257 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100258 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900259 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800260
Colin Cross98be1bb2019-12-13 20:41:13 -0800261 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800262 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
264 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267}
268
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700269func setUp() {
270 var err error
271 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700273 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275}
276
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700277func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700278 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279}
280
Jooyung Han643adc42020-02-27 13:50:06 +0900281// ensure that 'result' equals 'expected'
282func ensureEquals(t *testing.T, result string, expected string) {
283 t.Helper()
284 if result != expected {
285 t.Errorf("%q != %q", expected, result)
286 }
287}
288
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289// ensure that 'result' contains 'expected'
290func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900291 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292 if !strings.Contains(result, expected) {
293 t.Errorf("%q is not found in %q", expected, result)
294 }
295}
296
Liz Kammer5bd365f2020-05-27 15:15:11 -0700297// ensure that 'result' contains 'expected' exactly one time
298func ensureContainsOnce(t *testing.T, result string, expected string) {
299 t.Helper()
300 count := strings.Count(result, expected)
301 if count != 1 {
302 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// ensures that 'result' does not contain 'notExpected'
307func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900308 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309 if strings.Contains(result, notExpected) {
310 t.Errorf("%q is found in %q", notExpected, result)
311 }
312}
313
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700314func ensureMatches(t *testing.T, result string, expectedRex string) {
315 ok, err := regexp.MatchString(expectedRex, result)
316 if err != nil {
317 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
318 return
319 }
320 if !ok {
321 t.Errorf("%s does not match regular expession %s", result, expectedRex)
322 }
323}
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900326 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 if !android.InList(expected, result) {
328 t.Errorf("%q is not found in %v", expected, result)
329 }
330}
331
332func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900333 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 if android.InList(notExpected, result) {
335 t.Errorf("%q is found in %v", notExpected, result)
336 }
337}
338
Jooyung Hane1633032019-08-01 17:41:43 +0900339func ensureListEmpty(t *testing.T, result []string) {
340 t.Helper()
341 if len(result) > 0 {
342 t.Errorf("%q is expected to be empty", result)
343 }
344}
345
Jiyong Park25fc6a92018-11-18 18:02:45 +0900346// Minimal test
347func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900348 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900349 apex_defaults {
350 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900351 manifest: ":myapex.manifest",
352 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 key: "myapex.key",
354 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800355 multilib: {
356 both: {
357 binaries: ["foo",],
358 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900359 },
Jiyong Park77acec62020-06-01 21:39:15 +0900360 java_libs: [
361 "myjar",
362 "myjar_dex",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 }
365
Jiyong Park30ca9372019-02-07 16:27:23 +0900366 apex {
367 name: "myapex",
368 defaults: ["myapex-defaults"],
369 }
370
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 apex_key {
372 name: "myapex.key",
373 public_key: "testkey.avbpubkey",
374 private_key: "testkey.pem",
375 }
376
Jiyong Park809bb722019-02-13 21:33:49 +0900377 filegroup {
378 name: "myapex.manifest",
379 srcs: ["apex_manifest.json"],
380 }
381
382 filegroup {
383 name: "myapex.androidmanifest",
384 srcs: ["AndroidManifest.xml"],
385 }
386
Jiyong Park25fc6a92018-11-18 18:02:45 +0900387 cc_library {
388 name: "mylib",
389 srcs: ["mylib.cpp"],
390 shared_libs: ["mylib2"],
391 system_shared_libs: [],
392 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000393 // TODO: remove //apex_available:platform
394 apex_available: [
395 "//apex_available:platform",
396 "myapex",
397 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900398 }
399
Alex Light3d673592019-01-18 14:37:31 -0800400 cc_binary {
401 name: "foo",
402 srcs: ["mylib.cpp"],
403 compile_multilib: "both",
404 multilib: {
405 lib32: {
406 suffix: "32",
407 },
408 lib64: {
409 suffix: "64",
410 },
411 },
412 symlinks: ["foo_link_"],
413 symlink_preferred_arch: true,
414 system_shared_libs: [],
415 static_executable: true,
416 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700417 apex_available: [ "myapex", "com.android.gki.*" ],
418 }
419
420 apex {
421 name: "com.android.gki.fake",
422 binaries: ["foo"],
423 key: "myapex.key",
424 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800425 }
426
Paul Duffindddd5462020-04-07 15:25:44 +0100427 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900428 name: "mylib2",
429 srcs: ["mylib.cpp"],
430 system_shared_libs: [],
431 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900432 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900433 static_libs: ["libstatic"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_prebuilt_library_shared {
442 name: "mylib2",
443 srcs: ["prebuilt.so"],
444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
449 }
450
Jiyong Park9918e1a2020-03-17 19:16:40 +0900451 cc_library_static {
452 name: "libstatic",
453 srcs: ["mylib.cpp"],
454 system_shared_libs: [],
455 stl: "none",
456 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900462 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463
464 java_library {
465 name: "myjar",
466 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900467 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 sdk_version: "none",
469 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900471 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 }
478
Jiyong Park77acec62020-06-01 21:39:15 +0900479 dex_import {
480 name: "myjar_dex",
481 jars: ["prebuilt.jar"],
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 java_library {
489 name: "myotherjar",
490 srcs: ["foo/bar/MyClass.java"],
491 sdk_version: "none",
492 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900499
500 java_library {
501 name: "mysharedjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900506 `)
507
Sundong Ahnabb64432019-10-22 13:58:29 +0900508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900509
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900510 // Make sure that Android.mk is created
511 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
512 data := android.AndroidMkDataForTest(t, config, "", ab)
513 var builder strings.Builder
514 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
515
516 androidMk := builder.String()
517 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
518 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
519
Jiyong Park42cca6c2019-04-01 11:15:50 +0900520 optFlags := apexRule.Args["opt_flags"]
521 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700522 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900523 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 copyCmds := apexRule.Args["copy_commands"]
526
527 // Ensure that main rule creates an output
528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
529
530 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
533 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534
535 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700536 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
537 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800540 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
541 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900542 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900543 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900544 // .. but not for java libs
545 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900546 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800547
Colin Cross7113d202019-11-20 16:39:12 -0800548 // Ensure that the platform variant ends with _shared or _common
549 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
554
555 // Ensure that dynamic dependency to java libs are not included
556 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800557
558 // Ensure that all symlinks are present.
559 found_foo_link_64 := false
560 found_foo := false
561 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900562 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800563 if strings.HasSuffix(cmd, "bin/foo") {
564 found_foo = true
565 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
566 found_foo_link_64 = true
567 }
568 }
569 }
570 good := found_foo && found_foo_link_64
571 if !good {
572 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
573 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900574
Sundong Ahnabb64432019-10-22 13:58:29 +0900575 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700576 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900577 if len(noticeInputs) != 3 {
578 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900579 }
580 ensureListContains(t, noticeInputs, "NOTICE")
581 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900582 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900583
Artur Satayeva8bd1132020-04-27 18:07:06 +0100584 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000585 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
586 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
587 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
588 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
589 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100590
591 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000592 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
593 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
594 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
595 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
596 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800597}
598
Jooyung Hanf21c7972019-12-16 22:32:06 +0900599func TestDefaults(t *testing.T) {
600 ctx, _ := testApex(t, `
601 apex_defaults {
602 name: "myapex-defaults",
603 key: "myapex.key",
604 prebuilts: ["myetc"],
605 native_shared_libs: ["mylib"],
606 java_libs: ["myjar"],
607 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900608 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900609 }
610
611 prebuilt_etc {
612 name: "myetc",
613 src: "myprebuilt",
614 }
615
616 apex {
617 name: "myapex",
618 defaults: ["myapex-defaults"],
619 }
620
621 apex_key {
622 name: "myapex.key",
623 public_key: "testkey.avbpubkey",
624 private_key: "testkey.pem",
625 }
626
627 cc_library {
628 name: "mylib",
629 system_shared_libs: [],
630 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000631 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900632 }
633
634 java_library {
635 name: "myjar",
636 srcs: ["foo/bar/MyClass.java"],
637 sdk_version: "none",
638 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 android_app {
643 name: "AppFoo",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900649
650 runtime_resource_overlay {
651 name: "rro",
652 theme: "blue",
653 }
654
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000656 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 "etc/myetc",
658 "javalib/myjar.jar",
659 "lib64/mylib.so",
660 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900661 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 })
663}
664
Jooyung Han01a3ee22019-11-02 02:52:25 +0900665func TestApexManifest(t *testing.T) {
666 ctx, _ := testApex(t, `
667 apex {
668 name: "myapex",
669 key: "myapex.key",
670 }
671
672 apex_key {
673 name: "myapex.key",
674 public_key: "testkey.avbpubkey",
675 private_key: "testkey.pem",
676 }
677 `)
678
679 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900680 args := module.Rule("apexRule").Args
681 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
682 t.Error("manifest should be apex_manifest.pb, but " + manifest)
683 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900684}
685
Alex Light5098a612018-11-29 17:12:15 -0800686func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700687 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800688 apex {
689 name: "myapex",
690 key: "myapex.key",
691 payload_type: "zip",
692 native_shared_libs: ["mylib"],
693 }
694
695 apex_key {
696 name: "myapex.key",
697 public_key: "testkey.avbpubkey",
698 private_key: "testkey.pem",
699 }
700
701 cc_library {
702 name: "mylib",
703 srcs: ["mylib.cpp"],
704 shared_libs: ["mylib2"],
705 system_shared_libs: [],
706 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000707 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800708 }
709
710 cc_library {
711 name: "mylib2",
712 srcs: ["mylib.cpp"],
713 system_shared_libs: [],
714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000715 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800716 }
717 `)
718
Sundong Ahnabb64432019-10-22 13:58:29 +0900719 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800720 copyCmds := zipApexRule.Args["copy_commands"]
721
722 // Ensure that main rule creates an output
723 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
724
725 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700726 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800727
728 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700729 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800730
731 // Ensure that both direct and indirect deps are copied into apex
732 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
733 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900734}
735
736func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700737 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900738 apex {
739 name: "myapex",
740 key: "myapex.key",
741 native_shared_libs: ["mylib", "mylib3"],
742 }
743
744 apex_key {
745 name: "myapex.key",
746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749
750 cc_library {
751 name: "mylib",
752 srcs: ["mylib.cpp"],
753 shared_libs: ["mylib2", "mylib3"],
754 system_shared_libs: [],
755 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000756 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900757 }
758
759 cc_library {
760 name: "mylib2",
761 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900762 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900763 system_shared_libs: [],
764 stl: "none",
765 stubs: {
766 versions: ["1", "2", "3"],
767 },
768 }
769
770 cc_library {
771 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900772 srcs: ["mylib.cpp"],
773 shared_libs: ["mylib4"],
774 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900775 stl: "none",
776 stubs: {
777 versions: ["10", "11", "12"],
778 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000779 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900781
782 cc_library {
783 name: "mylib4",
784 srcs: ["mylib.cpp"],
785 system_shared_libs: [],
786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000787 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900788 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789 `)
790
Sundong Ahnabb64432019-10-22 13:58:29 +0900791 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900792 copyCmds := apexRule.Args["copy_commands"]
793
794 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800795 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900796
797 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800798 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900799
800 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800801 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802
Colin Crossaede88c2020-08-11 12:17:01 -0700803 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804
805 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900806 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900808 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809
810 // 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 -0700811 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900812 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700813 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900814
815 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900816 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900817 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900818
819 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900820 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900821
Jooyung Hana57af4a2020-01-23 05:36:59 +0000822 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900823 "lib64/mylib.so",
824 "lib64/mylib3.so",
825 "lib64/mylib4.so",
826 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827}
828
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700830 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900831 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900832 name: "myapex2",
833 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900834 native_shared_libs: ["mylib"],
835 }
836
837 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900838 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839 public_key: "testkey.avbpubkey",
840 private_key: "testkey.pem",
841 }
842
843 cc_library {
844 name: "mylib",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900847 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900848 system_shared_libs: [],
849 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000850 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900851 }
852
853 cc_library {
854 name: "libfoo",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["libbar"],
857 system_shared_libs: [],
858 stl: "none",
859 stubs: {
860 versions: ["10", "20", "30"],
861 },
862 }
863
864 cc_library {
865 name: "libbar",
866 srcs: ["mylib.cpp"],
867 system_shared_libs: [],
868 stl: "none",
869 }
870
Jiyong Park678c8812020-02-07 17:25:49 +0900871 cc_library_static {
872 name: "libbaz",
873 srcs: ["mylib.cpp"],
874 system_shared_libs: [],
875 stl: "none",
876 apex_available: [ "myapex2" ],
877 }
878
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900879 `)
880
Jiyong Park83dc74b2020-01-14 18:38:44 +0900881 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900882 copyCmds := apexRule.Args["copy_commands"]
883
884 // Ensure that direct non-stubs dep is always included
885 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
886
887 // Ensure that indirect stubs dep is not included
888 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
889
890 // Ensure that dependency of stubs is not included
891 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
892
Colin Crossaede88c2020-08-11 12:17:01 -0700893 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900894
895 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900896 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900897 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900898 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900899
Jiyong Park3ff16992019-12-27 14:11:47 +0900900 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900901
902 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
903 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900904
Artur Satayeva8bd1132020-04-27 18:07:06 +0100905 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000906 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
907 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
908 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900909
Artur Satayeva8bd1132020-04-27 18:07:06 +0100910 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
satayev53bbc082020-07-23 15:15:54 +0000911 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
912 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
913 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900914}
915
Jooyung Hand3639552019-08-09 12:57:43 +0900916func TestApexWithRuntimeLibsDependency(t *testing.T) {
917 /*
918 myapex
919 |
920 v (runtime_libs)
921 mylib ------+------> libfoo [provides stub]
922 |
923 `------> libbar
924 */
925 ctx, _ := testApex(t, `
926 apex {
927 name: "myapex",
928 key: "myapex.key",
929 native_shared_libs: ["mylib"],
930 }
931
932 apex_key {
933 name: "myapex.key",
934 public_key: "testkey.avbpubkey",
935 private_key: "testkey.pem",
936 }
937
938 cc_library {
939 name: "mylib",
940 srcs: ["mylib.cpp"],
941 runtime_libs: ["libfoo", "libbar"],
942 system_shared_libs: [],
943 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000944 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900945 }
946
947 cc_library {
948 name: "libfoo",
949 srcs: ["mylib.cpp"],
950 system_shared_libs: [],
951 stl: "none",
952 stubs: {
953 versions: ["10", "20", "30"],
954 },
955 }
956
957 cc_library {
958 name: "libbar",
959 srcs: ["mylib.cpp"],
960 system_shared_libs: [],
961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000962 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900963 }
964
965 `)
966
Sundong Ahnabb64432019-10-22 13:58:29 +0900967 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900968 copyCmds := apexRule.Args["copy_commands"]
969
970 // Ensure that direct non-stubs dep is always included
971 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
972
973 // Ensure that indirect stubs dep is not included
974 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
975
976 // Ensure that runtime_libs dep in included
977 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
978
Sundong Ahnabb64432019-10-22 13:58:29 +0900979 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900980 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
981 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900982
983}
984
Jooyung Han8ce8db92020-05-15 19:05:05 +0900985func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
986 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
987 bp := `
988 apex {
989 name: "com.android.runtime",
990 key: "com.android.runtime.key",
991 native_shared_libs: ["libc"],
992 }
993
994 apex_key {
995 name: "com.android.runtime.key",
996 public_key: "testkey.avbpubkey",
997 private_key: "testkey.pem",
998 }
999
1000 cc_library {
1001 name: "libc",
1002 no_libcrt: true,
1003 nocrt: true,
1004 stl: "none",
1005 system_shared_libs: [],
1006 stubs: { versions: ["1"] },
1007 apex_available: ["com.android.runtime"],
1008
1009 sanitize: {
1010 hwaddress: true,
1011 }
1012 }
1013
1014 cc_prebuilt_library_shared {
1015 name: "libclang_rt.hwasan-aarch64-android",
1016 no_libcrt: true,
1017 nocrt: true,
1018 stl: "none",
1019 system_shared_libs: [],
1020 srcs: [""],
1021 stubs: { versions: ["1"] },
1022
1023 sanitize: {
1024 never: true,
1025 },
1026 }
1027 `
1028 // override bp to use hard-coded names: com.android.runtime and libc
1029 fs["Android.bp"] = []byte(bp)
1030 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1031 })
1032
1033 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1034 "lib64/bionic/libc.so",
1035 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1036 })
1037
1038 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1039
1040 installed := hwasan.Description("install libclang_rt.hwasan")
1041 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1042
1043 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1044 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1045 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1046}
1047
1048func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1049 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1050 bp := `
1051 apex {
1052 name: "com.android.runtime",
1053 key: "com.android.runtime.key",
1054 native_shared_libs: ["libc"],
1055 }
1056
1057 apex_key {
1058 name: "com.android.runtime.key",
1059 public_key: "testkey.avbpubkey",
1060 private_key: "testkey.pem",
1061 }
1062
1063 cc_library {
1064 name: "libc",
1065 no_libcrt: true,
1066 nocrt: true,
1067 stl: "none",
1068 system_shared_libs: [],
1069 stubs: { versions: ["1"] },
1070 apex_available: ["com.android.runtime"],
1071 }
1072
1073 cc_prebuilt_library_shared {
1074 name: "libclang_rt.hwasan-aarch64-android",
1075 no_libcrt: true,
1076 nocrt: true,
1077 stl: "none",
1078 system_shared_libs: [],
1079 srcs: [""],
1080 stubs: { versions: ["1"] },
1081
1082 sanitize: {
1083 never: true,
1084 },
1085 }
1086 `
1087 // override bp to use hard-coded names: com.android.runtime and libc
1088 fs["Android.bp"] = []byte(bp)
1089 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1090
1091 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1092 })
1093
1094 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1095 "lib64/bionic/libc.so",
1096 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1097 })
1098
1099 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1100
1101 installed := hwasan.Description("install libclang_rt.hwasan")
1102 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1103
1104 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1105 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1106 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1107}
1108
Jooyung Han61b66e92020-03-21 14:21:46 +00001109func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1110 testcases := []struct {
1111 name string
1112 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001113 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001114 shouldLink string
1115 shouldNotLink []string
1116 }{
1117 {
Jooyung Han75568392020-03-20 04:29:24 +09001118 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001119 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001120 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001121 shouldLink: "30",
1122 shouldNotLink: []string{"29"},
1123 },
1124 {
1125 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001126 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001127 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001128 shouldLink: "29",
1129 shouldNotLink: []string{"30"},
1130 },
1131 }
1132 for _, tc := range testcases {
1133 t.Run(tc.name, func(t *testing.T) {
1134 ctx, _ := testApex(t, `
1135 apex {
1136 name: "myapex",
1137 key: "myapex.key",
1138 use_vendor: true,
1139 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001140 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001141 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001142
Jooyung Han61b66e92020-03-21 14:21:46 +00001143 apex_key {
1144 name: "myapex.key",
1145 public_key: "testkey.avbpubkey",
1146 private_key: "testkey.pem",
1147 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001148
Jooyung Han61b66e92020-03-21 14:21:46 +00001149 cc_library {
1150 name: "mylib",
1151 srcs: ["mylib.cpp"],
1152 vendor_available: true,
1153 shared_libs: ["libbar"],
1154 system_shared_libs: [],
1155 stl: "none",
1156 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001157 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001158 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001159
Jooyung Han61b66e92020-03-21 14:21:46 +00001160 cc_library {
1161 name: "libbar",
1162 srcs: ["mylib.cpp"],
1163 system_shared_libs: [],
1164 stl: "none",
1165 stubs: { versions: ["29","30"] },
1166 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001167
Jooyung Han61b66e92020-03-21 14:21:46 +00001168 llndk_library {
1169 name: "libbar",
1170 symbol_file: "",
1171 }
1172 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001173 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001174 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001175
Jooyung Han61b66e92020-03-21 14:21:46 +00001176 // Ensure that LLNDK dep is not included
1177 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1178 "lib64/mylib.so",
1179 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001180
Jooyung Han61b66e92020-03-21 14:21:46 +00001181 // Ensure that LLNDK dep is required
1182 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1183 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1184 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001185
Colin Crossaede88c2020-08-11 12:17:01 -07001186 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001187 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1188 for _, ver := range tc.shouldNotLink {
1189 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1190 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001191
Colin Crossaede88c2020-08-11 12:17:01 -07001192 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001193 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1194 })
1195 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001196}
1197
Jiyong Park25fc6a92018-11-18 18:02:45 +09001198func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001199 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001200 apex {
1201 name: "myapex",
1202 key: "myapex.key",
1203 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1204 }
1205
1206 apex_key {
1207 name: "myapex.key",
1208 public_key: "testkey.avbpubkey",
1209 private_key: "testkey.pem",
1210 }
1211
1212 cc_library {
1213 name: "mylib",
1214 srcs: ["mylib.cpp"],
1215 shared_libs: ["libdl#27"],
1216 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001217 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001218 }
1219
1220 cc_library_shared {
1221 name: "mylib_shared",
1222 srcs: ["mylib.cpp"],
1223 shared_libs: ["libdl#27"],
1224 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001225 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001226 }
1227
1228 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001229 name: "libBootstrap",
1230 srcs: ["mylib.cpp"],
1231 stl: "none",
1232 bootstrap: true,
1233 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001234 `)
1235
Sundong Ahnabb64432019-10-22 13:58:29 +09001236 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001237 copyCmds := apexRule.Args["copy_commands"]
1238
1239 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001240 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001241 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1242 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001243
1244 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001245 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001246
Colin Crossaede88c2020-08-11 12:17:01 -07001247 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1248 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1249 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001250
1251 // For dependency to libc
1252 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001253 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001254 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001255 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001256 // ... Cflags from stub is correctly exported to mylib
1257 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1258 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1259
1260 // For dependency to libm
1261 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001262 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001263 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001264 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001265 // ... and is not compiling with the stub
1266 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1267 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1268
1269 // For dependency to libdl
1270 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001271 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001272 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001273 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1274 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001275 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001276 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001277 // ... Cflags from stub is correctly exported to mylib
1278 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1279 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001280
1281 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001282 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1283 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1284 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1285 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001286}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001287
Jooyung Han749dc692020-04-15 11:03:39 +09001288func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001289 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001290 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1291 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001292 // 3) (platform) -> liba -> libz : this should be non-stub link
1293 ctx, _ := testApex(t, `
1294 apex {
1295 name: "myapex",
1296 key: "myapex.key",
1297 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001298 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001299 }
1300
1301 apex {
1302 name: "otherapex",
1303 key: "myapex.key",
1304 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001305 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001306 }
1307
1308 apex_key {
1309 name: "myapex.key",
1310 public_key: "testkey.avbpubkey",
1311 private_key: "testkey.pem",
1312 }
1313
1314 cc_library {
1315 name: "libx",
1316 shared_libs: ["liba"],
1317 system_shared_libs: [],
1318 stl: "none",
1319 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001320 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001321 }
1322
1323 cc_library {
1324 name: "liby",
1325 shared_libs: ["liba"],
1326 system_shared_libs: [],
1327 stl: "none",
1328 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001329 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001330 }
1331
1332 cc_library {
1333 name: "liba",
1334 shared_libs: ["libz"],
1335 system_shared_libs: [],
1336 stl: "none",
1337 apex_available: [
1338 "//apex_available:anyapex",
1339 "//apex_available:platform",
1340 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001341 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001342 }
1343
1344 cc_library {
1345 name: "libz",
1346 system_shared_libs: [],
1347 stl: "none",
1348 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001349 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001350 },
1351 }
Jooyung Han749dc692020-04-15 11:03:39 +09001352 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001353
1354 expectLink := func(from, from_variant, to, to_variant string) {
1355 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1356 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1357 }
1358 expectNoLink := func(from, from_variant, to, to_variant string) {
1359 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1360 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1361 }
1362 // platform liba is linked to non-stub version
1363 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001364 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001365 expectLink("liba", "shared_apex29", "libz", "shared_28")
1366 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1367 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001368 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001369 expectLink("liba", "shared_apex30", "libz", "shared_30")
1370 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1371 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001372}
1373
Jooyung Hanaed150d2020-04-02 01:41:41 +09001374func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1375 ctx, _ := testApex(t, `
1376 apex {
1377 name: "myapex",
1378 key: "myapex.key",
1379 native_shared_libs: ["libx"],
1380 min_sdk_version: "R",
1381 }
1382
1383 apex_key {
1384 name: "myapex.key",
1385 public_key: "testkey.avbpubkey",
1386 private_key: "testkey.pem",
1387 }
1388
1389 cc_library {
1390 name: "libx",
1391 shared_libs: ["libz"],
1392 system_shared_libs: [],
1393 stl: "none",
1394 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001395 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001396 }
1397
1398 cc_library {
1399 name: "libz",
1400 system_shared_libs: [],
1401 stl: "none",
1402 stubs: {
1403 versions: ["29", "R"],
1404 },
1405 }
1406 `, func(fs map[string][]byte, config android.Config) {
1407 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1408 })
1409
1410 expectLink := func(from, from_variant, to, to_variant string) {
1411 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1412 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1413 }
1414 expectNoLink := func(from, from_variant, to, to_variant string) {
1415 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1416 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1417 }
1418 // 9000 is quite a magic number.
1419 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1420 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1421 // to distinguish them from finalized and future_api(10000)
1422 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1423 // (refer android/api_levels.go)
Colin Crossaede88c2020-08-11 12:17:01 -07001424 expectLink("libx", "shared_apex10000", "libz", "shared_9000")
1425 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1426 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001427}
1428
Jooyung Han749dc692020-04-15 11:03:39 +09001429func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001430 ctx, _ := testApex(t, `
1431 apex {
1432 name: "myapex",
1433 key: "myapex.key",
1434 native_shared_libs: ["libx"],
1435 }
1436
1437 apex_key {
1438 name: "myapex.key",
1439 public_key: "testkey.avbpubkey",
1440 private_key: "testkey.pem",
1441 }
1442
1443 cc_library {
1444 name: "libx",
1445 shared_libs: ["libz"],
1446 system_shared_libs: [],
1447 stl: "none",
1448 apex_available: [ "myapex" ],
1449 }
1450
1451 cc_library {
1452 name: "libz",
1453 system_shared_libs: [],
1454 stl: "none",
1455 stubs: {
1456 versions: ["1", "2"],
1457 },
1458 }
1459 `)
1460
1461 expectLink := func(from, from_variant, to, to_variant string) {
1462 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1463 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1464 }
1465 expectNoLink := func(from, from_variant, to, to_variant string) {
1466 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1467 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1468 }
Colin Crossaede88c2020-08-11 12:17:01 -07001469 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1470 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1471 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001472}
1473
1474func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1475 ctx, _ := testApex(t, `
1476 apex {
1477 name: "myapex",
1478 key: "myapex.key",
1479 native_shared_libs: ["libx"],
1480 }
1481
1482 apex_key {
1483 name: "myapex.key",
1484 public_key: "testkey.avbpubkey",
1485 private_key: "testkey.pem",
1486 }
1487
1488 cc_library {
1489 name: "libx",
1490 system_shared_libs: [],
1491 stl: "none",
1492 apex_available: [ "myapex" ],
1493 stubs: {
1494 versions: ["1", "2"],
1495 },
1496 }
1497
1498 cc_library {
1499 name: "libz",
1500 shared_libs: ["libx"],
1501 system_shared_libs: [],
1502 stl: "none",
1503 }
1504 `)
1505
1506 expectLink := func(from, from_variant, to, to_variant string) {
1507 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1508 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1509 }
1510 expectNoLink := func(from, from_variant, to, to_variant string) {
1511 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1512 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1513 }
1514 expectLink("libz", "shared", "libx", "shared_2")
1515 expectNoLink("libz", "shared", "libz", "shared_1")
1516 expectNoLink("libz", "shared", "libz", "shared")
1517}
1518
Jooyung Han75568392020-03-20 04:29:24 +09001519func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001520 ctx, _ := testApex(t, `
1521 apex {
1522 name: "myapex",
1523 key: "myapex.key",
1524 native_shared_libs: ["libx"],
1525 min_sdk_version: "29",
1526 }
1527
1528 apex_key {
1529 name: "myapex.key",
1530 public_key: "testkey.avbpubkey",
1531 private_key: "testkey.pem",
1532 }
1533
1534 cc_library {
1535 name: "libx",
1536 shared_libs: ["libbar"],
1537 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001538 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001539 }
1540
1541 cc_library {
1542 name: "libbar",
1543 stubs: {
1544 versions: ["29", "30"],
1545 },
1546 }
Jooyung Han75568392020-03-20 04:29:24 +09001547 `, func(fs map[string][]byte, config android.Config) {
1548 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1549 })
Jooyung Han03b51852020-02-26 22:45:42 +09001550 expectLink := func(from, from_variant, to, to_variant string) {
1551 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1552 libFlags := ld.Args["libFlags"]
1553 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1554 }
Colin Crossaede88c2020-08-11 12:17:01 -07001555 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001556}
1557
Jooyung Han75568392020-03-20 04:29:24 +09001558func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001559 ctx, _ := testApex(t, `
1560 apex {
1561 name: "myapex",
1562 key: "myapex.key",
1563 native_shared_libs: ["libx"],
1564 min_sdk_version: "29",
1565 }
1566
1567 apex_key {
1568 name: "myapex.key",
1569 public_key: "testkey.avbpubkey",
1570 private_key: "testkey.pem",
1571 }
1572
1573 cc_library {
1574 name: "libx",
1575 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001576 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001577 }
Jooyung Han75568392020-03-20 04:29:24 +09001578 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001579
1580 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001581 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001582 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1583 // note that platform variant is not.
1584 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1585 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001586}
1587
Jooyung Han749dc692020-04-15 11:03:39 +09001588func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001589 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001590 apex {
1591 name: "myapex",
1592 key: "myapex.key",
1593 native_shared_libs: ["libx"],
1594 min_sdk_version: "29",
1595 }
1596
1597 apex_key {
1598 name: "myapex.key",
1599 public_key: "testkey.avbpubkey",
1600 private_key: "testkey.pem",
1601 }
1602
1603 cc_library {
1604 name: "libx",
1605 shared_libs: ["libz"],
1606 system_shared_libs: [],
1607 stl: "none",
1608 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001609 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001610 }
1611
1612 cc_library {
1613 name: "libz",
1614 system_shared_libs: [],
1615 stl: "none",
1616 stubs: {
1617 versions: ["30"],
1618 },
1619 }
Jooyung Han75568392020-03-20 04:29:24 +09001620 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001621}
Jooyung Han03b51852020-02-26 22:45:42 +09001622
Jooyung Han749dc692020-04-15 11:03:39 +09001623func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1624 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001625 apex {
1626 name: "myapex",
1627 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001628 native_shared_libs: ["mylib"],
1629 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001630 }
1631
1632 apex_key {
1633 name: "myapex.key",
1634 public_key: "testkey.avbpubkey",
1635 private_key: "testkey.pem",
1636 }
Jooyung Han749dc692020-04-15 11:03:39 +09001637
1638 cc_library {
1639 name: "mylib",
1640 srcs: ["mylib.cpp"],
1641 system_shared_libs: [],
1642 stl: "none",
1643 apex_available: [
1644 "myapex",
1645 ],
1646 min_sdk_version: "30",
1647 }
1648 `)
1649}
1650
1651func TestApexMinSdkVersion_Okay(t *testing.T) {
1652 testApex(t, `
1653 apex {
1654 name: "myapex",
1655 key: "myapex.key",
1656 native_shared_libs: ["libfoo"],
1657 java_libs: ["libbar"],
1658 min_sdk_version: "29",
1659 }
1660
1661 apex_key {
1662 name: "myapex.key",
1663 public_key: "testkey.avbpubkey",
1664 private_key: "testkey.pem",
1665 }
1666
1667 cc_library {
1668 name: "libfoo",
1669 srcs: ["mylib.cpp"],
1670 shared_libs: ["libfoo_dep"],
1671 apex_available: ["myapex"],
1672 min_sdk_version: "29",
1673 }
1674
1675 cc_library {
1676 name: "libfoo_dep",
1677 srcs: ["mylib.cpp"],
1678 apex_available: ["myapex"],
1679 min_sdk_version: "29",
1680 }
1681
1682 java_library {
1683 name: "libbar",
1684 sdk_version: "current",
1685 srcs: ["a.java"],
1686 static_libs: ["libbar_dep"],
1687 apex_available: ["myapex"],
1688 min_sdk_version: "29",
1689 }
1690
1691 java_library {
1692 name: "libbar_dep",
1693 sdk_version: "current",
1694 srcs: ["a.java"],
1695 apex_available: ["myapex"],
1696 min_sdk_version: "29",
1697 }
Jooyung Han03b51852020-02-26 22:45:42 +09001698 `)
1699}
1700
Artur Satayev8cf899a2020-04-15 17:29:42 +01001701func TestJavaStableSdkVersion(t *testing.T) {
1702 testCases := []struct {
1703 name string
1704 expectedError string
1705 bp string
1706 }{
1707 {
1708 name: "Non-updatable apex with non-stable dep",
1709 bp: `
1710 apex {
1711 name: "myapex",
1712 java_libs: ["myjar"],
1713 key: "myapex.key",
1714 }
1715 apex_key {
1716 name: "myapex.key",
1717 public_key: "testkey.avbpubkey",
1718 private_key: "testkey.pem",
1719 }
1720 java_library {
1721 name: "myjar",
1722 srcs: ["foo/bar/MyClass.java"],
1723 sdk_version: "core_platform",
1724 apex_available: ["myapex"],
1725 }
1726 `,
1727 },
1728 {
1729 name: "Updatable apex with stable dep",
1730 bp: `
1731 apex {
1732 name: "myapex",
1733 java_libs: ["myjar"],
1734 key: "myapex.key",
1735 updatable: true,
1736 min_sdk_version: "29",
1737 }
1738 apex_key {
1739 name: "myapex.key",
1740 public_key: "testkey.avbpubkey",
1741 private_key: "testkey.pem",
1742 }
1743 java_library {
1744 name: "myjar",
1745 srcs: ["foo/bar/MyClass.java"],
1746 sdk_version: "current",
1747 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001748 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001749 }
1750 `,
1751 },
1752 {
1753 name: "Updatable apex with non-stable dep",
1754 expectedError: "cannot depend on \"myjar\"",
1755 bp: `
1756 apex {
1757 name: "myapex",
1758 java_libs: ["myjar"],
1759 key: "myapex.key",
1760 updatable: true,
1761 }
1762 apex_key {
1763 name: "myapex.key",
1764 public_key: "testkey.avbpubkey",
1765 private_key: "testkey.pem",
1766 }
1767 java_library {
1768 name: "myjar",
1769 srcs: ["foo/bar/MyClass.java"],
1770 sdk_version: "core_platform",
1771 apex_available: ["myapex"],
1772 }
1773 `,
1774 },
1775 {
1776 name: "Updatable apex with non-stable transitive dep",
1777 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1778 bp: `
1779 apex {
1780 name: "myapex",
1781 java_libs: ["myjar"],
1782 key: "myapex.key",
1783 updatable: true,
1784 }
1785 apex_key {
1786 name: "myapex.key",
1787 public_key: "testkey.avbpubkey",
1788 private_key: "testkey.pem",
1789 }
1790 java_library {
1791 name: "myjar",
1792 srcs: ["foo/bar/MyClass.java"],
1793 sdk_version: "current",
1794 apex_available: ["myapex"],
1795 static_libs: ["transitive-jar"],
1796 }
1797 java_library {
1798 name: "transitive-jar",
1799 srcs: ["foo/bar/MyClass.java"],
1800 sdk_version: "core_platform",
1801 apex_available: ["myapex"],
1802 }
1803 `,
1804 },
1805 }
1806
1807 for _, test := range testCases {
1808 t.Run(test.name, func(t *testing.T) {
1809 if test.expectedError == "" {
1810 testApex(t, test.bp)
1811 } else {
1812 testApexError(t, test.expectedError, test.bp)
1813 }
1814 })
1815 }
1816}
1817
Jooyung Han749dc692020-04-15 11:03:39 +09001818func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1819 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 native_shared_libs: ["mylib"],
1824 min_sdk_version: "29",
1825 }
1826
1827 apex_key {
1828 name: "myapex.key",
1829 public_key: "testkey.avbpubkey",
1830 private_key: "testkey.pem",
1831 }
1832
1833 cc_library {
1834 name: "mylib",
1835 srcs: ["mylib.cpp"],
1836 shared_libs: ["mylib2"],
1837 system_shared_libs: [],
1838 stl: "none",
1839 apex_available: [
1840 "myapex",
1841 ],
1842 min_sdk_version: "29",
1843 }
1844
1845 // indirect part of the apex
1846 cc_library {
1847 name: "mylib2",
1848 srcs: ["mylib.cpp"],
1849 system_shared_libs: [],
1850 stl: "none",
1851 apex_available: [
1852 "myapex",
1853 ],
1854 min_sdk_version: "30",
1855 }
1856 `)
1857}
1858
1859func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1860 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1861 apex {
1862 name: "myapex",
1863 key: "myapex.key",
1864 apps: ["AppFoo"],
1865 min_sdk_version: "29",
1866 }
1867
1868 apex_key {
1869 name: "myapex.key",
1870 public_key: "testkey.avbpubkey",
1871 private_key: "testkey.pem",
1872 }
1873
1874 android_app {
1875 name: "AppFoo",
1876 srcs: ["foo/bar/MyClass.java"],
1877 sdk_version: "current",
1878 min_sdk_version: "29",
1879 system_modules: "none",
1880 stl: "none",
1881 static_libs: ["bar"],
1882 apex_available: [ "myapex" ],
1883 }
1884
1885 java_library {
1886 name: "bar",
1887 sdk_version: "current",
1888 srcs: ["a.java"],
1889 apex_available: [ "myapex" ],
1890 }
1891 `)
1892}
1893
1894func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
1895 ctx, _ := testApex(t, `
1896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 native_shared_libs: ["mylib"],
1900 min_sdk_version: "29",
1901 }
1902
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }
1908
1909 // mylib in myapex will link to mylib2#29
1910 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
1911 cc_library {
1912 name: "mylib",
1913 srcs: ["mylib.cpp"],
1914 shared_libs: ["mylib2"],
1915 system_shared_libs: [],
1916 stl: "none",
1917 apex_available: ["myapex", "otherapex"],
1918 min_sdk_version: "29",
1919 }
1920
1921 cc_library {
1922 name: "mylib2",
1923 srcs: ["mylib.cpp"],
1924 system_shared_libs: [],
1925 stl: "none",
1926 apex_available: ["otherapex"],
1927 stubs: { versions: ["29", "30"] },
1928 min_sdk_version: "30",
1929 }
1930
1931 apex {
1932 name: "otherapex",
1933 key: "myapex.key",
1934 native_shared_libs: ["mylib", "mylib2"],
1935 min_sdk_version: "30",
1936 }
1937 `)
1938 expectLink := func(from, from_variant, to, to_variant string) {
1939 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1940 libFlags := ld.Args["libFlags"]
1941 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1942 }
Colin Crossaede88c2020-08-11 12:17:01 -07001943 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
1944 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09001945}
1946
Jiyong Park7c2ee712018-12-07 00:42:25 +09001947func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001948 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001949 apex {
1950 name: "myapex",
1951 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001952 native_shared_libs: ["mylib"],
1953 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001954 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001955 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001956 }
1957
1958 apex_key {
1959 name: "myapex.key",
1960 public_key: "testkey.avbpubkey",
1961 private_key: "testkey.pem",
1962 }
1963
1964 prebuilt_etc {
1965 name: "myetc",
1966 src: "myprebuilt",
1967 sub_dir: "foo/bar",
1968 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001969
1970 cc_library {
1971 name: "mylib",
1972 srcs: ["mylib.cpp"],
1973 relative_install_path: "foo/bar",
1974 system_shared_libs: [],
1975 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001976 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001977 }
1978
1979 cc_binary {
1980 name: "mybin",
1981 srcs: ["mylib.cpp"],
1982 relative_install_path: "foo/bar",
1983 system_shared_libs: [],
1984 static_executable: true,
1985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001986 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001987 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001988 `)
1989
Sundong Ahnabb64432019-10-22 13:58:29 +09001990 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001991 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1992
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001993 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001994 ensureListContains(t, dirs, "etc")
1995 ensureListContains(t, dirs, "etc/foo")
1996 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001997 ensureListContains(t, dirs, "lib64")
1998 ensureListContains(t, dirs, "lib64/foo")
1999 ensureListContains(t, dirs, "lib64/foo/bar")
2000 ensureListContains(t, dirs, "lib")
2001 ensureListContains(t, dirs, "lib/foo")
2002 ensureListContains(t, dirs, "lib/foo/bar")
2003
Jiyong Parkbd13e442019-03-15 18:10:35 +09002004 ensureListContains(t, dirs, "bin")
2005 ensureListContains(t, dirs, "bin/foo")
2006 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002007}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002008
Jooyung Han35155c42020-02-06 17:33:20 +09002009func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2010 ctx, _ := testApex(t, `
2011 apex {
2012 name: "myapex",
2013 key: "myapex.key",
2014 multilib: {
2015 both: {
2016 native_shared_libs: ["mylib"],
2017 binaries: ["mybin"],
2018 },
2019 },
2020 compile_multilib: "both",
2021 native_bridge_supported: true,
2022 }
2023
2024 apex_key {
2025 name: "myapex.key",
2026 public_key: "testkey.avbpubkey",
2027 private_key: "testkey.pem",
2028 }
2029
2030 cc_library {
2031 name: "mylib",
2032 relative_install_path: "foo/bar",
2033 system_shared_libs: [],
2034 stl: "none",
2035 apex_available: [ "myapex" ],
2036 native_bridge_supported: true,
2037 }
2038
2039 cc_binary {
2040 name: "mybin",
2041 relative_install_path: "foo/bar",
2042 system_shared_libs: [],
2043 static_executable: true,
2044 stl: "none",
2045 apex_available: [ "myapex" ],
2046 native_bridge_supported: true,
2047 compile_multilib: "both", // default is "first" for binary
2048 multilib: {
2049 lib64: {
2050 suffix: "64",
2051 },
2052 },
2053 }
2054 `, withNativeBridgeEnabled)
2055 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2056 "bin/foo/bar/mybin",
2057 "bin/foo/bar/mybin64",
2058 "bin/arm/foo/bar/mybin",
2059 "bin/arm64/foo/bar/mybin64",
2060 "lib/foo/bar/mylib.so",
2061 "lib/arm/foo/bar/mylib.so",
2062 "lib64/foo/bar/mylib.so",
2063 "lib64/arm64/foo/bar/mylib.so",
2064 })
2065}
2066
Jiyong Parkda6eb592018-12-19 17:12:36 +09002067func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002068 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002069 apex {
2070 name: "myapex",
2071 key: "myapex.key",
2072 native_shared_libs: ["mylib"],
2073 use_vendor: true,
2074 }
2075
2076 apex_key {
2077 name: "myapex.key",
2078 public_key: "testkey.avbpubkey",
2079 private_key: "testkey.pem",
2080 }
2081
2082 cc_library {
2083 name: "mylib",
2084 srcs: ["mylib.cpp"],
2085 shared_libs: ["mylib2"],
2086 system_shared_libs: [],
2087 vendor_available: true,
2088 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002089 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002090 }
2091
2092 cc_library {
2093 name: "mylib2",
2094 srcs: ["mylib.cpp"],
2095 system_shared_libs: [],
2096 vendor_available: true,
2097 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002098 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002099 }
Jooyung Handc782442019-11-01 03:14:38 +09002100 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002101 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002102 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002103
2104 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002105 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002106 for _, implicit := range i.Implicits {
2107 inputsList = append(inputsList, implicit.String())
2108 }
2109 }
2110 inputsString := strings.Join(inputsList, " ")
2111
2112 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002113 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2114 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002115
2116 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002117 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2118 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002119}
Jiyong Park16e91a02018-12-20 18:18:08 +09002120
Jooyung Han85d61762020-06-24 23:50:26 +09002121func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002122 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2123 apex {
2124 name: "myapex",
2125 key: "myapex.key",
2126 use_vendor: true,
2127 }
2128 apex_key {
2129 name: "myapex.key",
2130 public_key: "testkey.avbpubkey",
2131 private_key: "testkey.pem",
2132 }
2133 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002134 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002135 })
Colin Cross440e0d02020-06-11 11:32:11 -07002136 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002137 testApex(t, `
2138 apex {
2139 name: "myapex",
2140 key: "myapex.key",
2141 use_vendor: true,
2142 }
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002149 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002150 })
2151}
2152
Jooyung Han5c998b92019-06-27 11:30:33 +09002153func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2154 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
2158 native_shared_libs: ["mylib"],
2159 use_vendor: true,
2160 }
2161
2162 apex_key {
2163 name: "myapex.key",
2164 public_key: "testkey.avbpubkey",
2165 private_key: "testkey.pem",
2166 }
2167
2168 cc_library {
2169 name: "mylib",
2170 srcs: ["mylib.cpp"],
2171 system_shared_libs: [],
2172 stl: "none",
2173 }
2174 `)
2175}
2176
Jooyung Han85d61762020-06-24 23:50:26 +09002177func TestVendorApex(t *testing.T) {
2178 ctx, config := testApex(t, `
2179 apex {
2180 name: "myapex",
2181 key: "myapex.key",
2182 binaries: ["mybin"],
2183 vendor: true,
2184 }
2185 apex_key {
2186 name: "myapex.key",
2187 public_key: "testkey.avbpubkey",
2188 private_key: "testkey.pem",
2189 }
2190 cc_binary {
2191 name: "mybin",
2192 vendor: true,
2193 shared_libs: ["libfoo"],
2194 }
2195 cc_library {
2196 name: "libfoo",
2197 proprietary: true,
2198 }
2199 `)
2200
2201 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2202 "bin/mybin",
2203 "lib64/libfoo.so",
2204 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2205 "lib64/libc++.so",
2206 })
2207
2208 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2209 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2210 name := apexBundle.BaseModuleName()
2211 prefix := "TARGET_"
2212 var builder strings.Builder
2213 data.Custom(&builder, name, prefix, "", data)
2214 androidMk := builder.String()
2215 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002216
2217 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2218 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2219 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002220}
2221
Jooyung Handf78e212020-07-22 15:54:47 +09002222func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2223 ctx, _ := testApex(t, `
2224 apex {
2225 name: "myapex",
2226 key: "myapex.key",
2227 binaries: ["mybin"],
2228 vendor: true,
2229 use_vndk_as_stable: true,
2230 }
2231 apex_key {
2232 name: "myapex.key",
2233 public_key: "testkey.avbpubkey",
2234 private_key: "testkey.pem",
2235 }
2236 cc_binary {
2237 name: "mybin",
2238 vendor: true,
2239 shared_libs: ["libvndk", "libvendor"],
2240 }
2241 cc_library {
2242 name: "libvndk",
2243 vndk: {
2244 enabled: true,
2245 },
2246 vendor_available: true,
2247 }
2248 cc_library {
2249 name: "libvendor",
2250 vendor: true,
2251 }
2252 `)
2253
2254 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2255
Colin Crossaede88c2020-08-11 12:17:01 -07002256 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002257 libs := names(ldRule.Args["libFlags"])
2258 // VNDK libs(libvndk/libc++) as they are
2259 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2260 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2261 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002262 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002263
2264 // VNDK libs are not included when use_vndk_as_stable: true
2265 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2266 "bin/mybin",
2267 "lib64/libvendor.so",
2268 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002269
2270 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2271 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2272 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002273}
2274
Jooyung Hanefb184e2020-06-25 17:14:25 +09002275func TestAndroidMk_UseVendorRequired(t *testing.T) {
2276 ctx, config := testApex(t, `
2277 apex {
2278 name: "myapex",
2279 key: "myapex.key",
2280 use_vendor: true,
2281 native_shared_libs: ["mylib"],
2282 }
2283
2284 apex_key {
2285 name: "myapex.key",
2286 public_key: "testkey.avbpubkey",
2287 private_key: "testkey.pem",
2288 }
2289
2290 cc_library {
2291 name: "mylib",
2292 vendor_available: true,
2293 apex_available: ["myapex"],
2294 }
2295 `, func(fs map[string][]byte, config android.Config) {
2296 setUseVendorAllowListForTest(config, []string{"myapex"})
2297 })
2298
2299 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2300 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2301 name := apexBundle.BaseModuleName()
2302 prefix := "TARGET_"
2303 var builder strings.Builder
2304 data.Custom(&builder, name, prefix, "", data)
2305 androidMk := builder.String()
2306 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2307}
2308
2309func TestAndroidMk_VendorApexRequired(t *testing.T) {
2310 ctx, config := testApex(t, `
2311 apex {
2312 name: "myapex",
2313 key: "myapex.key",
2314 vendor: true,
2315 native_shared_libs: ["mylib"],
2316 }
2317
2318 apex_key {
2319 name: "myapex.key",
2320 public_key: "testkey.avbpubkey",
2321 private_key: "testkey.pem",
2322 }
2323
2324 cc_library {
2325 name: "mylib",
2326 vendor_available: true,
2327 }
2328 `)
2329
2330 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2331 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2332 name := apexBundle.BaseModuleName()
2333 prefix := "TARGET_"
2334 var builder strings.Builder
2335 data.Custom(&builder, name, prefix, "", data)
2336 androidMk := builder.String()
2337 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2338}
2339
Jooyung Han2ed99d02020-06-24 23:26:26 +09002340func TestAndroidMkWritesCommonProperties(t *testing.T) {
2341 ctx, config := testApex(t, `
2342 apex {
2343 name: "myapex",
2344 key: "myapex.key",
2345 vintf_fragments: ["fragment.xml"],
2346 init_rc: ["init.rc"],
2347 }
2348 apex_key {
2349 name: "myapex.key",
2350 public_key: "testkey.avbpubkey",
2351 private_key: "testkey.pem",
2352 }
2353 cc_binary {
2354 name: "mybin",
2355 }
2356 `)
2357
2358 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2359 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2360 name := apexBundle.BaseModuleName()
2361 prefix := "TARGET_"
2362 var builder strings.Builder
2363 data.Custom(&builder, name, prefix, "", data)
2364 androidMk := builder.String()
2365 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2366 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2367}
2368
Jiyong Park16e91a02018-12-20 18:18:08 +09002369func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002370 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002371 apex {
2372 name: "myapex",
2373 key: "myapex.key",
2374 native_shared_libs: ["mylib"],
2375 }
2376
2377 apex_key {
2378 name: "myapex.key",
2379 public_key: "testkey.avbpubkey",
2380 private_key: "testkey.pem",
2381 }
2382
2383 cc_library {
2384 name: "mylib",
2385 srcs: ["mylib.cpp"],
2386 system_shared_libs: [],
2387 stl: "none",
2388 stubs: {
2389 versions: ["1", "2", "3"],
2390 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002391 apex_available: [
2392 "//apex_available:platform",
2393 "myapex",
2394 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002395 }
2396
2397 cc_binary {
2398 name: "not_in_apex",
2399 srcs: ["mylib.cpp"],
2400 static_libs: ["mylib"],
2401 static_executable: true,
2402 system_shared_libs: [],
2403 stl: "none",
2404 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002405 `)
2406
Colin Cross7113d202019-11-20 16:39:12 -08002407 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002408
2409 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002410 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002411}
Jiyong Park9335a262018-12-24 11:31:58 +09002412
2413func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002414 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002415 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002416 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002417 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002418 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002419 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002420 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002421 }
2422
2423 cc_library {
2424 name: "mylib",
2425 srcs: ["mylib.cpp"],
2426 system_shared_libs: [],
2427 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002428 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002429 }
2430
2431 apex_key {
2432 name: "myapex.key",
2433 public_key: "testkey.avbpubkey",
2434 private_key: "testkey.pem",
2435 }
2436
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002437 android_app_certificate {
2438 name: "myapex.certificate",
2439 certificate: "testkey",
2440 }
2441
2442 android_app_certificate {
2443 name: "myapex.certificate.override",
2444 certificate: "testkey.override",
2445 }
2446
Jiyong Park9335a262018-12-24 11:31:58 +09002447 `)
2448
2449 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002450 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002451
2452 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2453 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2454 "vendor/foo/devkeys/testkey.avbpubkey")
2455 }
2456 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2457 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2458 "vendor/foo/devkeys/testkey.pem")
2459 }
2460
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002461 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002462 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002463 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002464 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002465 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002466 }
2467}
Jiyong Park58e364a2019-01-19 19:24:06 +09002468
Jooyung Hanf121a652019-12-17 14:30:11 +09002469func TestCertificate(t *testing.T) {
2470 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2471 ctx, _ := testApex(t, `
2472 apex {
2473 name: "myapex",
2474 key: "myapex.key",
2475 }
2476 apex_key {
2477 name: "myapex.key",
2478 public_key: "testkey.avbpubkey",
2479 private_key: "testkey.pem",
2480 }`)
2481 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2482 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2483 if actual := rule.Args["certificates"]; actual != expected {
2484 t.Errorf("certificates should be %q, not %q", expected, actual)
2485 }
2486 })
2487 t.Run("override when unspecified", func(t *testing.T) {
2488 ctx, _ := testApex(t, `
2489 apex {
2490 name: "myapex_keytest",
2491 key: "myapex.key",
2492 file_contexts: ":myapex-file_contexts",
2493 }
2494 apex_key {
2495 name: "myapex.key",
2496 public_key: "testkey.avbpubkey",
2497 private_key: "testkey.pem",
2498 }
2499 android_app_certificate {
2500 name: "myapex.certificate.override",
2501 certificate: "testkey.override",
2502 }`)
2503 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2504 expected := "testkey.override.x509.pem testkey.override.pk8"
2505 if actual := rule.Args["certificates"]; actual != expected {
2506 t.Errorf("certificates should be %q, not %q", expected, actual)
2507 }
2508 })
2509 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2510 ctx, _ := testApex(t, `
2511 apex {
2512 name: "myapex",
2513 key: "myapex.key",
2514 certificate: ":myapex.certificate",
2515 }
2516 apex_key {
2517 name: "myapex.key",
2518 public_key: "testkey.avbpubkey",
2519 private_key: "testkey.pem",
2520 }
2521 android_app_certificate {
2522 name: "myapex.certificate",
2523 certificate: "testkey",
2524 }`)
2525 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2526 expected := "testkey.x509.pem testkey.pk8"
2527 if actual := rule.Args["certificates"]; actual != expected {
2528 t.Errorf("certificates should be %q, not %q", expected, actual)
2529 }
2530 })
2531 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2532 ctx, _ := testApex(t, `
2533 apex {
2534 name: "myapex_keytest",
2535 key: "myapex.key",
2536 file_contexts: ":myapex-file_contexts",
2537 certificate: ":myapex.certificate",
2538 }
2539 apex_key {
2540 name: "myapex.key",
2541 public_key: "testkey.avbpubkey",
2542 private_key: "testkey.pem",
2543 }
2544 android_app_certificate {
2545 name: "myapex.certificate.override",
2546 certificate: "testkey.override",
2547 }`)
2548 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2549 expected := "testkey.override.x509.pem testkey.override.pk8"
2550 if actual := rule.Args["certificates"]; actual != expected {
2551 t.Errorf("certificates should be %q, not %q", expected, actual)
2552 }
2553 })
2554 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2555 ctx, _ := testApex(t, `
2556 apex {
2557 name: "myapex",
2558 key: "myapex.key",
2559 certificate: "testkey",
2560 }
2561 apex_key {
2562 name: "myapex.key",
2563 public_key: "testkey.avbpubkey",
2564 private_key: "testkey.pem",
2565 }`)
2566 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2567 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2568 if actual := rule.Args["certificates"]; actual != expected {
2569 t.Errorf("certificates should be %q, not %q", expected, actual)
2570 }
2571 })
2572 t.Run("override when specified as <name>", func(t *testing.T) {
2573 ctx, _ := testApex(t, `
2574 apex {
2575 name: "myapex_keytest",
2576 key: "myapex.key",
2577 file_contexts: ":myapex-file_contexts",
2578 certificate: "testkey",
2579 }
2580 apex_key {
2581 name: "myapex.key",
2582 public_key: "testkey.avbpubkey",
2583 private_key: "testkey.pem",
2584 }
2585 android_app_certificate {
2586 name: "myapex.certificate.override",
2587 certificate: "testkey.override",
2588 }`)
2589 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2590 expected := "testkey.override.x509.pem testkey.override.pk8"
2591 if actual := rule.Args["certificates"]; actual != expected {
2592 t.Errorf("certificates should be %q, not %q", expected, actual)
2593 }
2594 })
2595}
2596
Jiyong Park58e364a2019-01-19 19:24:06 +09002597func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002598 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002599 apex {
2600 name: "myapex",
2601 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002602 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002603 }
2604
2605 apex {
2606 name: "otherapex",
2607 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002608 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002609 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002610 }
2611
2612 apex_key {
2613 name: "myapex.key",
2614 public_key: "testkey.avbpubkey",
2615 private_key: "testkey.pem",
2616 }
2617
2618 cc_library {
2619 name: "mylib",
2620 srcs: ["mylib.cpp"],
2621 system_shared_libs: [],
2622 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002623 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002624 "myapex",
2625 "otherapex",
2626 ],
Jooyung Han24282772020-03-21 23:20:55 +09002627 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002628 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002629 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002630 cc_library {
2631 name: "mylib2",
2632 srcs: ["mylib.cpp"],
2633 system_shared_libs: [],
2634 stl: "none",
2635 apex_available: [
2636 "myapex",
2637 "otherapex",
2638 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002639 static_libs: ["mylib3"],
2640 recovery_available: true,
2641 min_sdk_version: "29",
2642 }
2643 cc_library {
2644 name: "mylib3",
2645 srcs: ["mylib.cpp"],
2646 system_shared_libs: [],
2647 stl: "none",
2648 apex_available: [
2649 "myapex",
2650 "otherapex",
2651 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002652 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002653 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002654 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002655 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002656 `)
2657
Jooyung Hanc87a0592020-03-02 17:44:33 +09002658 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002659 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002660 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002661 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002662
Jooyung Hanccce2f22020-03-07 03:45:53 +09002663 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002664 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002665 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002666 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002667 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002668
Jooyung Hanccce2f22020-03-07 03:45:53 +09002669 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002670 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002671 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002672 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002673 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002674
Colin Crossaede88c2020-08-11 12:17:01 -07002675 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2676 // each variant defines additional macros to distinguish which apex variant it is built for
2677
2678 // non-APEX variant does not have __ANDROID_APEX__ defined
2679 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2680 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2681
2682 // APEX variant has __ANDROID_APEX__ defined
2683 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2684 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2685 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2686 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2687
2688 // APEX variant has __ANDROID_APEX__ defined
2689 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2690 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2691 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2692 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2693
2694 // recovery variant does not set __ANDROID_SDK_VERSION__
2695 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2696 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2697 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2698
2699 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2700 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002701
2702 // non-APEX variant does not have __ANDROID_APEX__ defined
2703 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2704 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2705
2706 // APEX variant has __ANDROID_APEX__ defined
2707 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002708 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002710 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002711
Jooyung Hanc87a0592020-03-02 17:44:33 +09002712 // APEX variant has __ANDROID_APEX__ defined
2713 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002714 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002715 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002716 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002717
2718 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002719 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002720 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2721 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002722}
Jiyong Park7e636d02019-01-28 16:16:54 +09002723
2724func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002725 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002726 apex {
2727 name: "myapex",
2728 key: "myapex.key",
2729 native_shared_libs: ["mylib"],
2730 }
2731
2732 apex_key {
2733 name: "myapex.key",
2734 public_key: "testkey.avbpubkey",
2735 private_key: "testkey.pem",
2736 }
2737
2738 cc_library_headers {
2739 name: "mylib_headers",
2740 export_include_dirs: ["my_include"],
2741 system_shared_libs: [],
2742 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002743 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002744 }
2745
2746 cc_library {
2747 name: "mylib",
2748 srcs: ["mylib.cpp"],
2749 system_shared_libs: [],
2750 stl: "none",
2751 header_libs: ["mylib_headers"],
2752 export_header_lib_headers: ["mylib_headers"],
2753 stubs: {
2754 versions: ["1", "2", "3"],
2755 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002756 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002757 }
2758
2759 cc_library {
2760 name: "otherlib",
2761 srcs: ["mylib.cpp"],
2762 system_shared_libs: [],
2763 stl: "none",
2764 shared_libs: ["mylib"],
2765 }
2766 `)
2767
Colin Cross7113d202019-11-20 16:39:12 -08002768 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002769
2770 // Ensure that the include path of the header lib is exported to 'otherlib'
2771 ensureContains(t, cFlags, "-Imy_include")
2772}
Alex Light9670d332019-01-29 18:07:33 -08002773
Jiyong Park7cd10e32020-01-14 09:22:18 +09002774type fileInApex struct {
2775 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002776 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002777 isLink bool
2778}
2779
Jooyung Hana57af4a2020-01-23 05:36:59 +00002780func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002781 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002782 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002783 copyCmds := apexRule.Args["copy_commands"]
2784 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002785 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002786 for _, cmd := range strings.Split(copyCmds, "&&") {
2787 cmd = strings.TrimSpace(cmd)
2788 if cmd == "" {
2789 continue
2790 }
2791 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002792 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002793 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002794 switch terms[0] {
2795 case "mkdir":
2796 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002797 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002798 t.Fatal("copyCmds contains invalid cp command", cmd)
2799 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002800 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002801 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002802 isLink = false
2803 case "ln":
2804 if len(terms) != 3 && len(terms) != 4 {
2805 // ln LINK TARGET or ln -s LINK TARGET
2806 t.Fatal("copyCmds contains invalid ln command", cmd)
2807 }
2808 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002809 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002810 isLink = true
2811 default:
2812 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2813 }
2814 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002815 index := strings.Index(dst, imageApexDir)
2816 if index == -1 {
2817 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2818 }
2819 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002820 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002821 }
2822 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002823 return ret
2824}
2825
Jooyung Hana57af4a2020-01-23 05:36:59 +00002826func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2827 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002828 var failed bool
2829 var surplus []string
2830 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002831 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002832 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002833 for _, expected := range files {
2834 if matched, _ := path.Match(expected, file.path); matched {
2835 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002836 mactchFound = true
2837 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002838 }
2839 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002840 if !mactchFound {
2841 surplus = append(surplus, file.path)
2842 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002843 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002844
Jooyung Han31c470b2019-10-18 16:26:59 +09002845 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002846 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002847 t.Log("surplus files", surplus)
2848 failed = true
2849 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002850
2851 if len(files) > len(filesMatched) {
2852 var missing []string
2853 for _, expected := range files {
2854 if !filesMatched[expected] {
2855 missing = append(missing, expected)
2856 }
2857 }
2858 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002859 t.Log("missing files", missing)
2860 failed = true
2861 }
2862 if failed {
2863 t.Fail()
2864 }
2865}
2866
Jooyung Han344d5432019-08-23 11:17:39 +09002867func TestVndkApexCurrent(t *testing.T) {
2868 ctx, _ := testApex(t, `
2869 apex_vndk {
2870 name: "myapex",
2871 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002872 }
2873
2874 apex_key {
2875 name: "myapex.key",
2876 public_key: "testkey.avbpubkey",
2877 private_key: "testkey.pem",
2878 }
2879
2880 cc_library {
2881 name: "libvndk",
2882 srcs: ["mylib.cpp"],
2883 vendor_available: true,
2884 vndk: {
2885 enabled: true,
2886 },
2887 system_shared_libs: [],
2888 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002889 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002890 }
2891
2892 cc_library {
2893 name: "libvndksp",
2894 srcs: ["mylib.cpp"],
2895 vendor_available: true,
2896 vndk: {
2897 enabled: true,
2898 support_system_process: true,
2899 },
2900 system_shared_libs: [],
2901 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002902 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002903 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002904 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002905
Jooyung Hana57af4a2020-01-23 05:36:59 +00002906 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002907 "lib/libvndk.so",
2908 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002909 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002910 "lib64/libvndk.so",
2911 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002912 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002913 "etc/llndk.libraries.VER.txt",
2914 "etc/vndkcore.libraries.VER.txt",
2915 "etc/vndksp.libraries.VER.txt",
2916 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002917 })
Jooyung Han344d5432019-08-23 11:17:39 +09002918}
2919
2920func TestVndkApexWithPrebuilt(t *testing.T) {
2921 ctx, _ := testApex(t, `
2922 apex_vndk {
2923 name: "myapex",
2924 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002925 }
2926
2927 apex_key {
2928 name: "myapex.key",
2929 public_key: "testkey.avbpubkey",
2930 private_key: "testkey.pem",
2931 }
2932
2933 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002934 name: "libvndk",
2935 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002936 vendor_available: true,
2937 vndk: {
2938 enabled: true,
2939 },
2940 system_shared_libs: [],
2941 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002942 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002943 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002944
2945 cc_prebuilt_library_shared {
2946 name: "libvndk.arm",
2947 srcs: ["libvndk.arm.so"],
2948 vendor_available: true,
2949 vndk: {
2950 enabled: true,
2951 },
2952 enabled: false,
2953 arch: {
2954 arm: {
2955 enabled: true,
2956 },
2957 },
2958 system_shared_libs: [],
2959 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002960 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002961 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002962 `+vndkLibrariesTxtFiles("current"),
2963 withFiles(map[string][]byte{
2964 "libvndk.so": nil,
2965 "libvndk.arm.so": nil,
2966 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002967
Jooyung Hana57af4a2020-01-23 05:36:59 +00002968 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002969 "lib/libvndk.so",
2970 "lib/libvndk.arm.so",
2971 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002972 "lib/libc++.so",
2973 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002974 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002975 })
Jooyung Han344d5432019-08-23 11:17:39 +09002976}
2977
Jooyung Han39edb6c2019-11-06 16:53:07 +09002978func vndkLibrariesTxtFiles(vers ...string) (result string) {
2979 for _, v := range vers {
2980 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002981 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002982 result += `
2983 vndk_libraries_txt {
2984 name: "` + txt + `.libraries.txt",
2985 }
2986 `
2987 }
2988 } else {
2989 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2990 result += `
2991 prebuilt_etc {
2992 name: "` + txt + `.libraries.` + v + `.txt",
2993 src: "dummy.txt",
2994 }
2995 `
2996 }
2997 }
2998 }
2999 return
3000}
3001
Jooyung Han344d5432019-08-23 11:17:39 +09003002func TestVndkApexVersion(t *testing.T) {
3003 ctx, _ := testApex(t, `
3004 apex_vndk {
3005 name: "myapex_v27",
3006 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003007 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003008 vndk_version: "27",
3009 }
3010
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016
Jooyung Han31c470b2019-10-18 16:26:59 +09003017 vndk_prebuilt_shared {
3018 name: "libvndk27",
3019 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003020 vendor_available: true,
3021 vndk: {
3022 enabled: true,
3023 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003024 target_arch: "arm64",
3025 arch: {
3026 arm: {
3027 srcs: ["libvndk27_arm.so"],
3028 },
3029 arm64: {
3030 srcs: ["libvndk27_arm64.so"],
3031 },
3032 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003033 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003034 }
3035
3036 vndk_prebuilt_shared {
3037 name: "libvndk27",
3038 version: "27",
3039 vendor_available: true,
3040 vndk: {
3041 enabled: true,
3042 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003043 target_arch: "x86_64",
3044 arch: {
3045 x86: {
3046 srcs: ["libvndk27_x86.so"],
3047 },
3048 x86_64: {
3049 srcs: ["libvndk27_x86_64.so"],
3050 },
3051 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003052 }
3053 `+vndkLibrariesTxtFiles("27"),
3054 withFiles(map[string][]byte{
3055 "libvndk27_arm.so": nil,
3056 "libvndk27_arm64.so": nil,
3057 "libvndk27_x86.so": nil,
3058 "libvndk27_x86_64.so": nil,
3059 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003060
Jooyung Hana57af4a2020-01-23 05:36:59 +00003061 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003062 "lib/libvndk27_arm.so",
3063 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003064 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003065 })
Jooyung Han344d5432019-08-23 11:17:39 +09003066}
3067
3068func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3069 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3070 apex_vndk {
3071 name: "myapex_v27",
3072 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003073 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003074 vndk_version: "27",
3075 }
3076 apex_vndk {
3077 name: "myapex_v27_other",
3078 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003079 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003080 vndk_version: "27",
3081 }
3082
3083 apex_key {
3084 name: "myapex.key",
3085 public_key: "testkey.avbpubkey",
3086 private_key: "testkey.pem",
3087 }
3088
3089 cc_library {
3090 name: "libvndk",
3091 srcs: ["mylib.cpp"],
3092 vendor_available: true,
3093 vndk: {
3094 enabled: true,
3095 },
3096 system_shared_libs: [],
3097 stl: "none",
3098 }
3099
3100 vndk_prebuilt_shared {
3101 name: "libvndk",
3102 version: "27",
3103 vendor_available: true,
3104 vndk: {
3105 enabled: true,
3106 },
3107 srcs: ["libvndk.so"],
3108 }
3109 `, withFiles(map[string][]byte{
3110 "libvndk.so": nil,
3111 }))
3112}
3113
Jooyung Han90eee022019-10-01 20:02:42 +09003114func TestVndkApexNameRule(t *testing.T) {
3115 ctx, _ := testApex(t, `
3116 apex_vndk {
3117 name: "myapex",
3118 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003119 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003120 }
3121 apex_vndk {
3122 name: "myapex_v28",
3123 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003124 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003125 vndk_version: "28",
3126 }
3127 apex_key {
3128 name: "myapex.key",
3129 public_key: "testkey.avbpubkey",
3130 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003131 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003132
3133 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003134 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003135 actual := proptools.String(bundle.properties.Apex_name)
3136 if !reflect.DeepEqual(actual, expected) {
3137 t.Errorf("Got '%v', expected '%v'", actual, expected)
3138 }
3139 }
3140
3141 assertApexName("com.android.vndk.vVER", "myapex")
3142 assertApexName("com.android.vndk.v28", "myapex_v28")
3143}
3144
Jooyung Han344d5432019-08-23 11:17:39 +09003145func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3146 ctx, _ := testApex(t, `
3147 apex_vndk {
3148 name: "myapex",
3149 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003150 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003151 }
3152
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158
3159 cc_library {
3160 name: "libvndk",
3161 srcs: ["mylib.cpp"],
3162 vendor_available: true,
3163 native_bridge_supported: true,
3164 host_supported: true,
3165 vndk: {
3166 enabled: true,
3167 },
3168 system_shared_libs: [],
3169 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003170 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003171 }
Jooyung Han35155c42020-02-06 17:33:20 +09003172 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003173
Jooyung Hana57af4a2020-01-23 05:36:59 +00003174 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003175 "lib/libvndk.so",
3176 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003177 "lib/libc++.so",
3178 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003179 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003180 })
Jooyung Han344d5432019-08-23 11:17:39 +09003181}
3182
3183func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3184 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3185 apex_vndk {
3186 name: "myapex",
3187 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003188 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003189 native_bridge_supported: true,
3190 }
3191
3192 apex_key {
3193 name: "myapex.key",
3194 public_key: "testkey.avbpubkey",
3195 private_key: "testkey.pem",
3196 }
3197
3198 cc_library {
3199 name: "libvndk",
3200 srcs: ["mylib.cpp"],
3201 vendor_available: true,
3202 native_bridge_supported: true,
3203 host_supported: true,
3204 vndk: {
3205 enabled: true,
3206 },
3207 system_shared_libs: [],
3208 stl: "none",
3209 }
3210 `)
3211}
3212
Jooyung Han31c470b2019-10-18 16:26:59 +09003213func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003214 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003215 apex_vndk {
3216 name: "myapex_v27",
3217 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003218 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003219 vndk_version: "27",
3220 }
3221
3222 apex_key {
3223 name: "myapex.key",
3224 public_key: "testkey.avbpubkey",
3225 private_key: "testkey.pem",
3226 }
3227
3228 vndk_prebuilt_shared {
3229 name: "libvndk27",
3230 version: "27",
3231 target_arch: "arm",
3232 vendor_available: true,
3233 vndk: {
3234 enabled: true,
3235 },
3236 arch: {
3237 arm: {
3238 srcs: ["libvndk27.so"],
3239 }
3240 },
3241 }
3242
3243 vndk_prebuilt_shared {
3244 name: "libvndk27",
3245 version: "27",
3246 target_arch: "arm",
3247 binder32bit: true,
3248 vendor_available: true,
3249 vndk: {
3250 enabled: true,
3251 },
3252 arch: {
3253 arm: {
3254 srcs: ["libvndk27binder32.so"],
3255 }
3256 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003257 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003258 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003259 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003260 withFiles(map[string][]byte{
3261 "libvndk27.so": nil,
3262 "libvndk27binder32.so": nil,
3263 }),
3264 withBinder32bit,
3265 withTargets(map[android.OsType][]android.Target{
3266 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003267 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3268 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003269 },
3270 }),
3271 )
3272
Jooyung Hana57af4a2020-01-23 05:36:59 +00003273 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003274 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003275 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003276 })
3277}
3278
Jooyung Han45a96772020-06-15 14:59:42 +09003279func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3280 ctx, _ := testApex(t, `
3281 apex_vndk {
3282 name: "myapex",
3283 key: "myapex.key",
3284 file_contexts: ":myapex-file_contexts",
3285 }
3286
3287 apex_key {
3288 name: "myapex.key",
3289 public_key: "testkey.avbpubkey",
3290 private_key: "testkey.pem",
3291 }
3292
3293 cc_library {
3294 name: "libz",
3295 vendor_available: true,
3296 vndk: {
3297 enabled: true,
3298 },
3299 stubs: {
3300 symbol_file: "libz.map.txt",
3301 versions: ["30"],
3302 }
3303 }
3304 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3305 "libz.map.txt": nil,
3306 }))
3307
3308 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3309 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3310 ensureListEmpty(t, provideNativeLibs)
3311}
3312
Jooyung Hane1633032019-08-01 17:41:43 +09003313func TestDependenciesInApexManifest(t *testing.T) {
3314 ctx, _ := testApex(t, `
3315 apex {
3316 name: "myapex_nodep",
3317 key: "myapex.key",
3318 native_shared_libs: ["lib_nodep"],
3319 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003320 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003321 }
3322
3323 apex {
3324 name: "myapex_dep",
3325 key: "myapex.key",
3326 native_shared_libs: ["lib_dep"],
3327 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003328 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003329 }
3330
3331 apex {
3332 name: "myapex_provider",
3333 key: "myapex.key",
3334 native_shared_libs: ["libfoo"],
3335 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003336 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003337 }
3338
3339 apex {
3340 name: "myapex_selfcontained",
3341 key: "myapex.key",
3342 native_shared_libs: ["lib_dep", "libfoo"],
3343 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003344 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003345 }
3346
3347 apex_key {
3348 name: "myapex.key",
3349 public_key: "testkey.avbpubkey",
3350 private_key: "testkey.pem",
3351 }
3352
3353 cc_library {
3354 name: "lib_nodep",
3355 srcs: ["mylib.cpp"],
3356 system_shared_libs: [],
3357 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003358 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003359 }
3360
3361 cc_library {
3362 name: "lib_dep",
3363 srcs: ["mylib.cpp"],
3364 shared_libs: ["libfoo"],
3365 system_shared_libs: [],
3366 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003367 apex_available: [
3368 "myapex_dep",
3369 "myapex_provider",
3370 "myapex_selfcontained",
3371 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003372 }
3373
3374 cc_library {
3375 name: "libfoo",
3376 srcs: ["mytest.cpp"],
3377 stubs: {
3378 versions: ["1"],
3379 },
3380 system_shared_libs: [],
3381 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003382 apex_available: [
3383 "myapex_provider",
3384 "myapex_selfcontained",
3385 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003386 }
3387 `)
3388
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003389 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003390 var provideNativeLibs, requireNativeLibs []string
3391
Sundong Ahnabb64432019-10-22 13:58:29 +09003392 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003393 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3394 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003395 ensureListEmpty(t, provideNativeLibs)
3396 ensureListEmpty(t, requireNativeLibs)
3397
Sundong Ahnabb64432019-10-22 13:58:29 +09003398 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003399 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3400 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003401 ensureListEmpty(t, provideNativeLibs)
3402 ensureListContains(t, requireNativeLibs, "libfoo.so")
3403
Sundong Ahnabb64432019-10-22 13:58:29 +09003404 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003405 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3406 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003407 ensureListContains(t, provideNativeLibs, "libfoo.so")
3408 ensureListEmpty(t, requireNativeLibs)
3409
Sundong Ahnabb64432019-10-22 13:58:29 +09003410 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003411 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3412 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003413 ensureListContains(t, provideNativeLibs, "libfoo.so")
3414 ensureListEmpty(t, requireNativeLibs)
3415}
3416
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003417func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003418 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003419 apex {
3420 name: "myapex",
3421 key: "myapex.key",
3422 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003423 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003424 }
3425
3426 apex_key {
3427 name: "myapex.key",
3428 public_key: "testkey.avbpubkey",
3429 private_key: "testkey.pem",
3430 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003431
3432 cc_library {
3433 name: "mylib",
3434 srcs: ["mylib.cpp"],
3435 system_shared_libs: [],
3436 stl: "none",
3437 apex_available: [
3438 "//apex_available:platform",
3439 "myapex",
3440 ],
3441 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003442 `)
3443
Sundong Ahnabb64432019-10-22 13:58:29 +09003444 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003445 apexManifestRule := module.Rule("apexManifestRule")
3446 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3447 apexRule := module.Rule("apexRule")
3448 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003449
3450 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3451 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3452 name := apexBundle.BaseModuleName()
3453 prefix := "TARGET_"
3454 var builder strings.Builder
3455 data.Custom(&builder, name, prefix, "", data)
3456 androidMk := builder.String()
3457 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3458 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003459}
3460
Alex Light0851b882019-02-07 13:20:53 -08003461func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003462 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003463 apex {
3464 name: "myapex",
3465 key: "myapex.key",
3466 native_shared_libs: ["mylib_common"],
3467 }
3468
3469 apex_key {
3470 name: "myapex.key",
3471 public_key: "testkey.avbpubkey",
3472 private_key: "testkey.pem",
3473 }
3474
3475 cc_library {
3476 name: "mylib_common",
3477 srcs: ["mylib.cpp"],
3478 system_shared_libs: [],
3479 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003480 apex_available: [
3481 "//apex_available:platform",
3482 "myapex",
3483 ],
Alex Light0851b882019-02-07 13:20:53 -08003484 }
3485 `)
3486
Sundong Ahnabb64432019-10-22 13:58:29 +09003487 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003488 apexRule := module.Rule("apexRule")
3489 copyCmds := apexRule.Args["copy_commands"]
3490
3491 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3492 t.Log("Apex was a test apex!")
3493 t.Fail()
3494 }
3495 // Ensure that main rule creates an output
3496 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3497
3498 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003499 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003500
3501 // Ensure that both direct and indirect deps are copied into apex
3502 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3503
Colin Cross7113d202019-11-20 16:39:12 -08003504 // Ensure that the platform variant ends with _shared
3505 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003506
3507 if !android.InAnyApex("mylib_common") {
3508 t.Log("Found mylib_common not in any apex!")
3509 t.Fail()
3510 }
3511}
3512
3513func TestTestApex(t *testing.T) {
3514 if android.InAnyApex("mylib_common_test") {
3515 t.Fatal("mylib_common_test must not be used in any other tests since this checks that global state is not updated in an illegal way!")
3516 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003517 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003518 apex_test {
3519 name: "myapex",
3520 key: "myapex.key",
3521 native_shared_libs: ["mylib_common_test"],
3522 }
3523
3524 apex_key {
3525 name: "myapex.key",
3526 public_key: "testkey.avbpubkey",
3527 private_key: "testkey.pem",
3528 }
3529
3530 cc_library {
3531 name: "mylib_common_test",
3532 srcs: ["mylib.cpp"],
3533 system_shared_libs: [],
3534 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003535 // TODO: remove //apex_available:platform
3536 apex_available: [
3537 "//apex_available:platform",
3538 "myapex",
3539 ],
Alex Light0851b882019-02-07 13:20:53 -08003540 }
3541 `)
3542
Sundong Ahnabb64432019-10-22 13:58:29 +09003543 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003544 apexRule := module.Rule("apexRule")
3545 copyCmds := apexRule.Args["copy_commands"]
3546
3547 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3548 t.Log("Apex was not a test apex!")
3549 t.Fail()
3550 }
3551 // Ensure that main rule creates an output
3552 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3553
3554 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003555 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003556
3557 // Ensure that both direct and indirect deps are copied into apex
3558 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3559
Colin Cross7113d202019-11-20 16:39:12 -08003560 // Ensure that the platform variant ends with _shared
3561 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003562}
3563
Alex Light9670d332019-01-29 18:07:33 -08003564func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003565 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003566 apex {
3567 name: "myapex",
3568 key: "myapex.key",
3569 multilib: {
3570 first: {
3571 native_shared_libs: ["mylib_common"],
3572 }
3573 },
3574 target: {
3575 android: {
3576 multilib: {
3577 first: {
3578 native_shared_libs: ["mylib"],
3579 }
3580 }
3581 },
3582 host: {
3583 multilib: {
3584 first: {
3585 native_shared_libs: ["mylib2"],
3586 }
3587 }
3588 }
3589 }
3590 }
3591
3592 apex_key {
3593 name: "myapex.key",
3594 public_key: "testkey.avbpubkey",
3595 private_key: "testkey.pem",
3596 }
3597
3598 cc_library {
3599 name: "mylib",
3600 srcs: ["mylib.cpp"],
3601 system_shared_libs: [],
3602 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003603 // TODO: remove //apex_available:platform
3604 apex_available: [
3605 "//apex_available:platform",
3606 "myapex",
3607 ],
Alex Light9670d332019-01-29 18:07:33 -08003608 }
3609
3610 cc_library {
3611 name: "mylib_common",
3612 srcs: ["mylib.cpp"],
3613 system_shared_libs: [],
3614 stl: "none",
3615 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003616 // TODO: remove //apex_available:platform
3617 apex_available: [
3618 "//apex_available:platform",
3619 "myapex",
3620 ],
Alex Light9670d332019-01-29 18:07:33 -08003621 }
3622
3623 cc_library {
3624 name: "mylib2",
3625 srcs: ["mylib.cpp"],
3626 system_shared_libs: [],
3627 stl: "none",
3628 compile_multilib: "first",
3629 }
3630 `)
3631
Sundong Ahnabb64432019-10-22 13:58:29 +09003632 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003633 copyCmds := apexRule.Args["copy_commands"]
3634
3635 // Ensure that main rule creates an output
3636 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3637
3638 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003639 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3640 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3641 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003642
3643 // Ensure that both direct and indirect deps are copied into apex
3644 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3645 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3646 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3647
Colin Cross7113d202019-11-20 16:39:12 -08003648 // Ensure that the platform variant ends with _shared
3649 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3650 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003652}
Jiyong Park04480cf2019-02-06 00:16:29 +09003653
3654func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003655 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003656 apex {
3657 name: "myapex",
3658 key: "myapex.key",
3659 binaries: ["myscript"],
3660 }
3661
3662 apex_key {
3663 name: "myapex.key",
3664 public_key: "testkey.avbpubkey",
3665 private_key: "testkey.pem",
3666 }
3667
3668 sh_binary {
3669 name: "myscript",
3670 src: "mylib.cpp",
3671 filename: "myscript.sh",
3672 sub_dir: "script",
3673 }
3674 `)
3675
Sundong Ahnabb64432019-10-22 13:58:29 +09003676 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003677 copyCmds := apexRule.Args["copy_commands"]
3678
3679 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3680}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003681
Jooyung Han91df2082019-11-20 01:49:42 +09003682func TestApexInVariousPartition(t *testing.T) {
3683 testcases := []struct {
3684 propName, parition, flattenedPartition string
3685 }{
3686 {"", "system", "system_ext"},
3687 {"product_specific: true", "product", "product"},
3688 {"soc_specific: true", "vendor", "vendor"},
3689 {"proprietary: true", "vendor", "vendor"},
3690 {"vendor: true", "vendor", "vendor"},
3691 {"system_ext_specific: true", "system_ext", "system_ext"},
3692 }
3693 for _, tc := range testcases {
3694 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3695 ctx, _ := testApex(t, `
3696 apex {
3697 name: "myapex",
3698 key: "myapex.key",
3699 `+tc.propName+`
3700 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003701
Jooyung Han91df2082019-11-20 01:49:42 +09003702 apex_key {
3703 name: "myapex.key",
3704 public_key: "testkey.avbpubkey",
3705 private_key: "testkey.pem",
3706 }
3707 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003708
Jooyung Han91df2082019-11-20 01:49:42 +09003709 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3710 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3711 actual := apex.installDir.String()
3712 if actual != expected {
3713 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3714 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003715
Jooyung Han91df2082019-11-20 01:49:42 +09003716 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3717 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3718 actual = flattened.installDir.String()
3719 if actual != expected {
3720 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3721 }
3722 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003723 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003724}
Jiyong Park67882562019-03-21 01:11:21 +09003725
Jooyung Han580eb4f2020-06-24 19:33:06 +09003726func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003727 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003728 apex {
3729 name: "myapex",
3730 key: "myapex.key",
3731 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003732
Jooyung Han580eb4f2020-06-24 19:33:06 +09003733 apex_key {
3734 name: "myapex.key",
3735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003738 `)
3739 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003740 rule := module.Output("file_contexts")
3741 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3742}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003743
Jooyung Han580eb4f2020-06-24 19:33:06 +09003744func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003745 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003746 apex {
3747 name: "myapex",
3748 key: "myapex.key",
3749 file_contexts: "my_own_file_contexts",
3750 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003751
Jooyung Han580eb4f2020-06-24 19:33:06 +09003752 apex_key {
3753 name: "myapex.key",
3754 public_key: "testkey.avbpubkey",
3755 private_key: "testkey.pem",
3756 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003757 `, withFiles(map[string][]byte{
3758 "my_own_file_contexts": nil,
3759 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003760}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003761
Jooyung Han580eb4f2020-06-24 19:33:06 +09003762func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003763 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003764 apex {
3765 name: "myapex",
3766 key: "myapex.key",
3767 product_specific: true,
3768 file_contexts: "product_specific_file_contexts",
3769 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003770
Jooyung Han580eb4f2020-06-24 19:33:06 +09003771 apex_key {
3772 name: "myapex.key",
3773 public_key: "testkey.avbpubkey",
3774 private_key: "testkey.pem",
3775 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003776 `)
3777
Jooyung Han580eb4f2020-06-24 19:33:06 +09003778 ctx, _ := testApex(t, `
3779 apex {
3780 name: "myapex",
3781 key: "myapex.key",
3782 product_specific: true,
3783 file_contexts: "product_specific_file_contexts",
3784 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003785
Jooyung Han580eb4f2020-06-24 19:33:06 +09003786 apex_key {
3787 name: "myapex.key",
3788 public_key: "testkey.avbpubkey",
3789 private_key: "testkey.pem",
3790 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003791 `, withFiles(map[string][]byte{
3792 "product_specific_file_contexts": nil,
3793 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003794 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3795 rule := module.Output("file_contexts")
3796 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3797}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003798
Jooyung Han580eb4f2020-06-24 19:33:06 +09003799func TestFileContexts_SetViaFileGroup(t *testing.T) {
3800 ctx, _ := testApex(t, `
3801 apex {
3802 name: "myapex",
3803 key: "myapex.key",
3804 product_specific: true,
3805 file_contexts: ":my-file-contexts",
3806 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003807
Jooyung Han580eb4f2020-06-24 19:33:06 +09003808 apex_key {
3809 name: "myapex.key",
3810 public_key: "testkey.avbpubkey",
3811 private_key: "testkey.pem",
3812 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003813
Jooyung Han580eb4f2020-06-24 19:33:06 +09003814 filegroup {
3815 name: "my-file-contexts",
3816 srcs: ["product_specific_file_contexts"],
3817 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003818 `, withFiles(map[string][]byte{
3819 "product_specific_file_contexts": nil,
3820 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003821 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3822 rule := module.Output("file_contexts")
3823 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003824}
3825
Jiyong Park67882562019-03-21 01:11:21 +09003826func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003827 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003828 apex_key {
3829 name: "myapex.key",
3830 public_key: ":my.avbpubkey",
3831 private_key: ":my.pem",
3832 product_specific: true,
3833 }
3834
3835 filegroup {
3836 name: "my.avbpubkey",
3837 srcs: ["testkey2.avbpubkey"],
3838 }
3839
3840 filegroup {
3841 name: "my.pem",
3842 srcs: ["testkey2.pem"],
3843 }
3844 `)
3845
3846 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3847 expected_pubkey := "testkey2.avbpubkey"
3848 actual_pubkey := apex_key.public_key_file.String()
3849 if actual_pubkey != expected_pubkey {
3850 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3851 }
3852 expected_privkey := "testkey2.pem"
3853 actual_privkey := apex_key.private_key_file.String()
3854 if actual_privkey != expected_privkey {
3855 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3856 }
3857}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003858
3859func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003860 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003861 prebuilt_apex {
3862 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003863 arch: {
3864 arm64: {
3865 src: "myapex-arm64.apex",
3866 },
3867 arm: {
3868 src: "myapex-arm.apex",
3869 },
3870 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003871 }
3872 `)
3873
3874 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3875
Jiyong Parkc95714e2019-03-29 14:23:10 +09003876 expectedInput := "myapex-arm64.apex"
3877 if prebuilt.inputApex.String() != expectedInput {
3878 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3879 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003880}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003881
3882func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003883 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003884 prebuilt_apex {
3885 name: "myapex",
3886 src: "myapex-arm.apex",
3887 filename: "notmyapex.apex",
3888 }
3889 `)
3890
3891 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3892
3893 expected := "notmyapex.apex"
3894 if p.installFilename != expected {
3895 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3896 }
3897}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003898
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003899func TestPrebuiltOverrides(t *testing.T) {
3900 ctx, config := testApex(t, `
3901 prebuilt_apex {
3902 name: "myapex.prebuilt",
3903 src: "myapex-arm.apex",
3904 overrides: [
3905 "myapex",
3906 ],
3907 }
3908 `)
3909
3910 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3911
3912 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003913 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003914 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003915 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003916 }
3917}
3918
Roland Levillain630846d2019-06-26 12:48:34 +01003919func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003920 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003921 apex_test {
3922 name: "myapex",
3923 key: "myapex.key",
3924 tests: [
3925 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003926 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003927 ],
3928 }
3929
3930 apex_key {
3931 name: "myapex.key",
3932 public_key: "testkey.avbpubkey",
3933 private_key: "testkey.pem",
3934 }
3935
Liz Kammer1c14a212020-05-12 15:26:55 -07003936 filegroup {
3937 name: "fg",
3938 srcs: [
3939 "baz",
3940 "bar/baz"
3941 ],
3942 }
3943
Roland Levillain630846d2019-06-26 12:48:34 +01003944 cc_test {
3945 name: "mytest",
3946 gtest: false,
3947 srcs: ["mytest.cpp"],
3948 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003949 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003950 system_shared_libs: [],
3951 static_executable: true,
3952 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003953 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003954 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003955
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003956 cc_library {
3957 name: "mylib",
3958 srcs: ["mylib.cpp"],
3959 system_shared_libs: [],
3960 stl: "none",
3961 }
3962
Liz Kammer5bd365f2020-05-27 15:15:11 -07003963 filegroup {
3964 name: "fg2",
3965 srcs: [
3966 "testdata/baz"
3967 ],
3968 }
3969
Roland Levillain9b5fde92019-06-28 15:41:19 +01003970 cc_test {
3971 name: "mytests",
3972 gtest: false,
3973 srcs: [
3974 "mytest1.cpp",
3975 "mytest2.cpp",
3976 "mytest3.cpp",
3977 ],
3978 test_per_src: true,
3979 relative_install_path: "test",
3980 system_shared_libs: [],
3981 static_executable: true,
3982 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003983 data: [
3984 ":fg",
3985 ":fg2",
3986 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003987 }
Roland Levillain630846d2019-06-26 12:48:34 +01003988 `)
3989
Sundong Ahnabb64432019-10-22 13:58:29 +09003990 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003991 copyCmds := apexRule.Args["copy_commands"]
3992
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003993 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003994 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003995 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003996
Liz Kammer1c14a212020-05-12 15:26:55 -07003997 //Ensure that test data are copied into apex.
3998 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3999 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4000
Roland Levillain9b5fde92019-06-28 15:41:19 +01004001 // Ensure that test deps built with `test_per_src` are copied into apex.
4002 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4003 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4004 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004005
4006 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004007 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4008 data := android.AndroidMkDataForTest(t, config, "", bundle)
4009 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004010 prefix := "TARGET_"
4011 var builder strings.Builder
4012 data.Custom(&builder, name, prefix, "", data)
4013 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004014 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4015 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4016 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4017 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004018 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004019 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004020 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004021
4022 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4023 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4024 data.Custom(&builder, name, prefix, "", data)
4025 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004026 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4027 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004028}
4029
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004030func TestInstallExtraFlattenedApexes(t *testing.T) {
4031 ctx, config := testApex(t, `
4032 apex {
4033 name: "myapex",
4034 key: "myapex.key",
4035 }
4036 apex_key {
4037 name: "myapex.key",
4038 public_key: "testkey.avbpubkey",
4039 private_key: "testkey.pem",
4040 }
4041 `, func(fs map[string][]byte, config android.Config) {
4042 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4043 })
4044 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004045 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004046 mk := android.AndroidMkDataForTest(t, config, "", ab)
4047 var builder strings.Builder
4048 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4049 androidMk := builder.String()
4050 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4051}
4052
Jooyung Han5c998b92019-06-27 11:30:33 +09004053func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004054 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004055 apex {
4056 name: "myapex",
4057 key: "myapex.key",
4058 native_shared_libs: ["mylib"],
4059 uses: ["commonapex"],
4060 }
4061
4062 apex {
4063 name: "commonapex",
4064 key: "myapex.key",
4065 native_shared_libs: ["libcommon"],
4066 provide_cpp_shared_libs: true,
4067 }
4068
4069 apex_key {
4070 name: "myapex.key",
4071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 cc_library {
4076 name: "mylib",
4077 srcs: ["mylib.cpp"],
4078 shared_libs: ["libcommon"],
4079 system_shared_libs: [],
4080 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004081 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004082 }
4083
4084 cc_library {
4085 name: "libcommon",
4086 srcs: ["mylib_common.cpp"],
4087 system_shared_libs: [],
4088 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004089 // TODO: remove //apex_available:platform
4090 apex_available: [
4091 "//apex_available:platform",
4092 "commonapex",
4093 "myapex",
4094 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004095 }
4096 `)
4097
Sundong Ahnabb64432019-10-22 13:58:29 +09004098 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004099 apexRule1 := module1.Rule("apexRule")
4100 copyCmds1 := apexRule1.Args["copy_commands"]
4101
Sundong Ahnabb64432019-10-22 13:58:29 +09004102 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004103 apexRule2 := module2.Rule("apexRule")
4104 copyCmds2 := apexRule2.Args["copy_commands"]
4105
Colin Crossaede88c2020-08-11 12:17:01 -07004106 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4107 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004108 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4109 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4110 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4111}
4112
4113func TestApexUsesFailsIfNotProvided(t *testing.T) {
4114 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4115 apex {
4116 name: "myapex",
4117 key: "myapex.key",
4118 uses: ["commonapex"],
4119 }
4120
4121 apex {
4122 name: "commonapex",
4123 key: "myapex.key",
4124 }
4125
4126 apex_key {
4127 name: "myapex.key",
4128 public_key: "testkey.avbpubkey",
4129 private_key: "testkey.pem",
4130 }
4131 `)
4132 testApexError(t, `uses: "commonapex" is not a provider`, `
4133 apex {
4134 name: "myapex",
4135 key: "myapex.key",
4136 uses: ["commonapex"],
4137 }
4138
4139 cc_library {
4140 name: "commonapex",
4141 system_shared_libs: [],
4142 stl: "none",
4143 }
4144
4145 apex_key {
4146 name: "myapex.key",
4147 public_key: "testkey.avbpubkey",
4148 private_key: "testkey.pem",
4149 }
4150 `)
4151}
4152
4153func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4154 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4155 apex {
4156 name: "myapex",
4157 key: "myapex.key",
4158 use_vendor: true,
4159 uses: ["commonapex"],
4160 }
4161
4162 apex {
4163 name: "commonapex",
4164 key: "myapex.key",
4165 provide_cpp_shared_libs: true,
4166 }
4167
4168 apex_key {
4169 name: "myapex.key",
4170 public_key: "testkey.avbpubkey",
4171 private_key: "testkey.pem",
4172 }
Jooyung Handc782442019-11-01 03:14:38 +09004173 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004174 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004175 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004176}
4177
Jooyung Hand48f3c32019-08-23 11:18:57 +09004178func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4179 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4180 apex {
4181 name: "myapex",
4182 key: "myapex.key",
4183 native_shared_libs: ["libfoo"],
4184 }
4185
4186 apex_key {
4187 name: "myapex.key",
4188 public_key: "testkey.avbpubkey",
4189 private_key: "testkey.pem",
4190 }
4191
4192 cc_library {
4193 name: "libfoo",
4194 stl: "none",
4195 system_shared_libs: [],
4196 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004197 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004198 }
4199 `)
4200 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4201 apex {
4202 name: "myapex",
4203 key: "myapex.key",
4204 java_libs: ["myjar"],
4205 }
4206
4207 apex_key {
4208 name: "myapex.key",
4209 public_key: "testkey.avbpubkey",
4210 private_key: "testkey.pem",
4211 }
4212
4213 java_library {
4214 name: "myjar",
4215 srcs: ["foo/bar/MyClass.java"],
4216 sdk_version: "none",
4217 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004218 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004219 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004220 }
4221 `)
4222}
4223
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004224func TestApexWithApps(t *testing.T) {
4225 ctx, _ := testApex(t, `
4226 apex {
4227 name: "myapex",
4228 key: "myapex.key",
4229 apps: [
4230 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004231 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004232 ],
4233 }
4234
4235 apex_key {
4236 name: "myapex.key",
4237 public_key: "testkey.avbpubkey",
4238 private_key: "testkey.pem",
4239 }
4240
4241 android_app {
4242 name: "AppFoo",
4243 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004244 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004245 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004246 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004247 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004248 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004249 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004250
4251 android_app {
4252 name: "AppFooPriv",
4253 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004254 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004255 system_modules: "none",
4256 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004258 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004259 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004260
4261 cc_library_shared {
4262 name: "libjni",
4263 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004264 shared_libs: ["libfoo"],
4265 stl: "none",
4266 system_shared_libs: [],
4267 apex_available: [ "myapex" ],
4268 sdk_version: "current",
4269 }
4270
4271 cc_library_shared {
4272 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004273 stl: "none",
4274 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004275 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004276 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004277 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004278 `)
4279
Sundong Ahnabb64432019-10-22 13:58:29 +09004280 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004281 apexRule := module.Rule("apexRule")
4282 copyCmds := apexRule.Args["copy_commands"]
4283
4284 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004285 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004286
Colin Crossaede88c2020-08-11 12:17:01 -07004287 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004288 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004289 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004290 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004291 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004292 // JNI libraries including transitive deps are
4293 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004294 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004295 // ... embedded inside APK (jnilibs.zip)
4296 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4297 // ... and not directly inside the APEX
4298 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4299 }
Dario Frenicde2a032019-10-27 00:29:22 +01004300}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004301
Dario Frenicde2a032019-10-27 00:29:22 +01004302func TestApexWithAppImports(t *testing.T) {
4303 ctx, _ := testApex(t, `
4304 apex {
4305 name: "myapex",
4306 key: "myapex.key",
4307 apps: [
4308 "AppFooPrebuilt",
4309 "AppFooPrivPrebuilt",
4310 ],
4311 }
4312
4313 apex_key {
4314 name: "myapex.key",
4315 public_key: "testkey.avbpubkey",
4316 private_key: "testkey.pem",
4317 }
4318
4319 android_app_import {
4320 name: "AppFooPrebuilt",
4321 apk: "PrebuiltAppFoo.apk",
4322 presigned: true,
4323 dex_preopt: {
4324 enabled: false,
4325 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004326 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004327 }
4328
4329 android_app_import {
4330 name: "AppFooPrivPrebuilt",
4331 apk: "PrebuiltAppFooPriv.apk",
4332 privileged: true,
4333 presigned: true,
4334 dex_preopt: {
4335 enabled: false,
4336 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004337 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004338 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004339 }
4340 `)
4341
Sundong Ahnabb64432019-10-22 13:58:29 +09004342 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004343 apexRule := module.Rule("apexRule")
4344 copyCmds := apexRule.Args["copy_commands"]
4345
4346 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004347 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4348}
4349
4350func TestApexWithAppImportsPrefer(t *testing.T) {
4351 ctx, _ := testApex(t, `
4352 apex {
4353 name: "myapex",
4354 key: "myapex.key",
4355 apps: [
4356 "AppFoo",
4357 ],
4358 }
4359
4360 apex_key {
4361 name: "myapex.key",
4362 public_key: "testkey.avbpubkey",
4363 private_key: "testkey.pem",
4364 }
4365
4366 android_app {
4367 name: "AppFoo",
4368 srcs: ["foo/bar/MyClass.java"],
4369 sdk_version: "none",
4370 system_modules: "none",
4371 apex_available: [ "myapex" ],
4372 }
4373
4374 android_app_import {
4375 name: "AppFoo",
4376 apk: "AppFooPrebuilt.apk",
4377 filename: "AppFooPrebuilt.apk",
4378 presigned: true,
4379 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004380 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004381 }
4382 `, withFiles(map[string][]byte{
4383 "AppFooPrebuilt.apk": nil,
4384 }))
4385
4386 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4387 "app/AppFoo/AppFooPrebuilt.apk",
4388 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004389}
4390
Dario Freni6f3937c2019-12-20 22:58:03 +00004391func TestApexWithTestHelperApp(t *testing.T) {
4392 ctx, _ := testApex(t, `
4393 apex {
4394 name: "myapex",
4395 key: "myapex.key",
4396 apps: [
4397 "TesterHelpAppFoo",
4398 ],
4399 }
4400
4401 apex_key {
4402 name: "myapex.key",
4403 public_key: "testkey.avbpubkey",
4404 private_key: "testkey.pem",
4405 }
4406
4407 android_test_helper_app {
4408 name: "TesterHelpAppFoo",
4409 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004410 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004411 }
4412
4413 `)
4414
4415 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4416 apexRule := module.Rule("apexRule")
4417 copyCmds := apexRule.Args["copy_commands"]
4418
4419 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4420}
4421
Jooyung Han18020ea2019-11-13 10:50:48 +09004422func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4423 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004424 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004425 apex {
4426 name: "myapex",
4427 key: "myapex.key",
4428 native_shared_libs: ["libfoo"],
4429 }
4430
4431 apex_key {
4432 name: "myapex.key",
4433 public_key: "testkey.avbpubkey",
4434 private_key: "testkey.pem",
4435 }
4436
4437 apex {
4438 name: "otherapex",
4439 key: "myapex.key",
4440 native_shared_libs: ["libfoo"],
4441 }
4442
4443 cc_defaults {
4444 name: "libfoo-defaults",
4445 apex_available: ["otherapex"],
4446 }
4447
4448 cc_library {
4449 name: "libfoo",
4450 defaults: ["libfoo-defaults"],
4451 stl: "none",
4452 system_shared_libs: [],
4453 }`)
4454}
4455
Paul Duffine52e66f2020-03-30 17:54:29 +01004456func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004457 // libfoo is not available to myapex, but only to otherapex
4458 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4459 apex {
4460 name: "myapex",
4461 key: "myapex.key",
4462 native_shared_libs: ["libfoo"],
4463 }
4464
4465 apex_key {
4466 name: "myapex.key",
4467 public_key: "testkey.avbpubkey",
4468 private_key: "testkey.pem",
4469 }
4470
4471 apex {
4472 name: "otherapex",
4473 key: "otherapex.key",
4474 native_shared_libs: ["libfoo"],
4475 }
4476
4477 apex_key {
4478 name: "otherapex.key",
4479 public_key: "testkey.avbpubkey",
4480 private_key: "testkey.pem",
4481 }
4482
4483 cc_library {
4484 name: "libfoo",
4485 stl: "none",
4486 system_shared_libs: [],
4487 apex_available: ["otherapex"],
4488 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004489}
Jiyong Park127b40b2019-09-30 16:04:35 +09004490
Paul Duffine52e66f2020-03-30 17:54:29 +01004491func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004492 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004493 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004494.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004495.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004496.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004497.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004498.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004499.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004500 apex {
4501 name: "myapex",
4502 key: "myapex.key",
4503 native_shared_libs: ["libfoo"],
4504 }
4505
4506 apex_key {
4507 name: "myapex.key",
4508 public_key: "testkey.avbpubkey",
4509 private_key: "testkey.pem",
4510 }
4511
Jiyong Park127b40b2019-09-30 16:04:35 +09004512 cc_library {
4513 name: "libfoo",
4514 stl: "none",
4515 shared_libs: ["libbar"],
4516 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004517 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004518 }
4519
4520 cc_library {
4521 name: "libbar",
4522 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004523 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004524 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004525 apex_available: ["myapex"],
4526 }
4527
4528 cc_library {
4529 name: "libbaz",
4530 stl: "none",
4531 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004532 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004533}
Jiyong Park127b40b2019-09-30 16:04:35 +09004534
Paul Duffine52e66f2020-03-30 17:54:29 +01004535func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004536 testApexError(t, "\"otherapex\" is not a valid module name", `
4537 apex {
4538 name: "myapex",
4539 key: "myapex.key",
4540 native_shared_libs: ["libfoo"],
4541 }
4542
4543 apex_key {
4544 name: "myapex.key",
4545 public_key: "testkey.avbpubkey",
4546 private_key: "testkey.pem",
4547 }
4548
4549 cc_library {
4550 name: "libfoo",
4551 stl: "none",
4552 system_shared_libs: [],
4553 apex_available: ["otherapex"],
4554 }`)
4555
Paul Duffine52e66f2020-03-30 17:54:29 +01004556 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004557 apex {
4558 name: "myapex",
4559 key: "myapex.key",
4560 native_shared_libs: ["libfoo", "libbar"],
4561 }
4562
4563 apex_key {
4564 name: "myapex.key",
4565 public_key: "testkey.avbpubkey",
4566 private_key: "testkey.pem",
4567 }
4568
4569 cc_library {
4570 name: "libfoo",
4571 stl: "none",
4572 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004573 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004574 apex_available: ["myapex"],
4575 }
4576
4577 cc_library {
4578 name: "libbar",
4579 stl: "none",
4580 system_shared_libs: [],
4581 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004582 }
4583
4584 cc_library {
4585 name: "libbaz",
4586 stl: "none",
4587 system_shared_libs: [],
4588 stubs: {
4589 versions: ["10", "20", "30"],
4590 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004591 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004592}
Jiyong Park127b40b2019-09-30 16:04:35 +09004593
Jiyong Park89e850a2020-04-07 16:37:39 +09004594func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004595 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004596 apex {
4597 name: "myapex",
4598 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004599 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004600 }
4601
4602 apex_key {
4603 name: "myapex.key",
4604 public_key: "testkey.avbpubkey",
4605 private_key: "testkey.pem",
4606 }
4607
4608 cc_library {
4609 name: "libfoo",
4610 stl: "none",
4611 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004612 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004613 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004614 }
4615
4616 cc_library {
4617 name: "libfoo2",
4618 stl: "none",
4619 system_shared_libs: [],
4620 shared_libs: ["libbaz"],
4621 apex_available: ["//apex_available:platform"],
4622 }
4623
4624 cc_library {
4625 name: "libbar",
4626 stl: "none",
4627 system_shared_libs: [],
4628 apex_available: ["myapex"],
4629 }
4630
4631 cc_library {
4632 name: "libbaz",
4633 stl: "none",
4634 system_shared_libs: [],
4635 apex_available: ["myapex"],
4636 stubs: {
4637 versions: ["1"],
4638 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004639 }`)
4640
Jiyong Park89e850a2020-04-07 16:37:39 +09004641 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4642 // because it depends on libbar which isn't available to platform
4643 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4644 if libfoo.NotAvailableForPlatform() != true {
4645 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4646 }
4647
4648 // libfoo2 however can be available to platform because it depends on libbaz which provides
4649 // stubs
4650 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4651 if libfoo2.NotAvailableForPlatform() == true {
4652 t.Errorf("%q should be available to platform", libfoo2.String())
4653 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004654}
Jiyong Parka90ca002019-10-07 15:47:24 +09004655
Paul Duffine52e66f2020-03-30 17:54:29 +01004656func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004657 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004658 apex {
4659 name: "myapex",
4660 key: "myapex.key",
4661 native_shared_libs: ["libfoo"],
4662 }
4663
4664 apex_key {
4665 name: "myapex.key",
4666 public_key: "testkey.avbpubkey",
4667 private_key: "testkey.pem",
4668 }
4669
4670 cc_library {
4671 name: "libfoo",
4672 stl: "none",
4673 system_shared_libs: [],
4674 apex_available: ["myapex"],
4675 static: {
4676 apex_available: ["//apex_available:platform"],
4677 },
4678 }`)
4679
Jiyong Park89e850a2020-04-07 16:37:39 +09004680 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4681 if libfooShared.NotAvailableForPlatform() != true {
4682 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4683 }
4684 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4685 if libfooStatic.NotAvailableForPlatform() != false {
4686 t.Errorf("%q should be available to platform", libfooStatic.String())
4687 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004688}
4689
Jiyong Park5d790c32019-11-15 18:40:32 +09004690func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004691 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004692 apex {
4693 name: "myapex",
4694 key: "myapex.key",
4695 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004696 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004697 }
4698
4699 override_apex {
4700 name: "override_myapex",
4701 base: "myapex",
4702 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004703 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004704 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004705 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004706 }
4707
4708 apex_key {
4709 name: "myapex.key",
4710 public_key: "testkey.avbpubkey",
4711 private_key: "testkey.pem",
4712 }
4713
4714 android_app {
4715 name: "app",
4716 srcs: ["foo/bar/MyClass.java"],
4717 package_name: "foo",
4718 sdk_version: "none",
4719 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004720 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004721 }
4722
4723 override_android_app {
4724 name: "override_app",
4725 base: "app",
4726 package_name: "bar",
4727 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004728 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004729
Jiyong Park317645e2019-12-05 13:20:58 +09004730 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4731 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4732 if originalVariant.GetOverriddenBy() != "" {
4733 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4734 }
4735 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4736 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4737 }
4738
Jiyong Park5d790c32019-11-15 18:40:32 +09004739 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4740 apexRule := module.Rule("apexRule")
4741 copyCmds := apexRule.Args["copy_commands"]
4742
4743 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004744 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004745
4746 apexBundle := module.Module().(*apexBundle)
4747 name := apexBundle.Name()
4748 if name != "override_myapex" {
4749 t.Errorf("name should be \"override_myapex\", but was %q", name)
4750 }
4751
Baligh Uddin004d7172020-02-19 21:29:28 -08004752 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4753 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4754 }
4755
Jiyong Park20bacab2020-03-03 11:45:41 +09004756 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004757 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004758
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004759 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4760 var builder strings.Builder
4761 data.Custom(&builder, name, "TARGET_", "", data)
4762 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004763 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004764 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4765 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004766 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004767 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004768 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004769 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4770 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004771}
4772
Jooyung Han214bf372019-11-12 13:03:50 +09004773func TestLegacyAndroid10Support(t *testing.T) {
4774 ctx, _ := testApex(t, `
4775 apex {
4776 name: "myapex",
4777 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004778 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004779 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004780 }
4781
4782 apex_key {
4783 name: "myapex.key",
4784 public_key: "testkey.avbpubkey",
4785 private_key: "testkey.pem",
4786 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004787
4788 cc_library {
4789 name: "mylib",
4790 srcs: ["mylib.cpp"],
4791 stl: "libc++",
4792 system_shared_libs: [],
4793 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004794 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004795 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004796 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004797
4798 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4799 args := module.Rule("apexRule").Args
4800 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004801 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004802
4803 // The copies of the libraries in the apex should have one more dependency than
4804 // the ones outside the apex, namely the unwinder. Ideally we should check
4805 // the dependency names directly here but for some reason the names are blank in
4806 // this test.
4807 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004808 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004809 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4810 if len(apexImplicits) != len(nonApexImplicits)+1 {
4811 t.Errorf("%q missing unwinder dep", lib)
4812 }
4813 }
Jooyung Han214bf372019-11-12 13:03:50 +09004814}
4815
Paul Duffin9b879592020-05-26 13:21:35 +01004816var filesForSdkLibrary = map[string][]byte{
4817 "api/current.txt": nil,
4818 "api/removed.txt": nil,
4819 "api/system-current.txt": nil,
4820 "api/system-removed.txt": nil,
4821 "api/test-current.txt": nil,
4822 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004823
4824 // For java_sdk_library_import
4825 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004826}
4827
Jooyung Han58f26ab2019-12-18 15:34:32 +09004828func TestJavaSDKLibrary(t *testing.T) {
4829 ctx, _ := testApex(t, `
4830 apex {
4831 name: "myapex",
4832 key: "myapex.key",
4833 java_libs: ["foo"],
4834 }
4835
4836 apex_key {
4837 name: "myapex.key",
4838 public_key: "testkey.avbpubkey",
4839 private_key: "testkey.pem",
4840 }
4841
4842 java_sdk_library {
4843 name: "foo",
4844 srcs: ["a.java"],
4845 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004846 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004847 }
Paul Duffin9b879592020-05-26 13:21:35 +01004848 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004849
4850 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004851 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004852 "javalib/foo.jar",
4853 "etc/permissions/foo.xml",
4854 })
4855 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004856 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4857 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004858}
4859
Paul Duffin9b879592020-05-26 13:21:35 +01004860func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4861 ctx, _ := testApex(t, `
4862 apex {
4863 name: "myapex",
4864 key: "myapex.key",
4865 java_libs: ["foo", "bar"],
4866 }
4867
4868 apex_key {
4869 name: "myapex.key",
4870 public_key: "testkey.avbpubkey",
4871 private_key: "testkey.pem",
4872 }
4873
4874 java_sdk_library {
4875 name: "foo",
4876 srcs: ["a.java"],
4877 api_packages: ["foo"],
4878 apex_available: ["myapex"],
4879 sdk_version: "none",
4880 system_modules: "none",
4881 }
4882
4883 java_library {
4884 name: "bar",
4885 srcs: ["a.java"],
4886 libs: ["foo"],
4887 apex_available: ["myapex"],
4888 sdk_version: "none",
4889 system_modules: "none",
4890 }
4891 `, withFiles(filesForSdkLibrary))
4892
4893 // java_sdk_library installs both impl jar and permission XML
4894 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4895 "javalib/bar.jar",
4896 "javalib/foo.jar",
4897 "etc/permissions/foo.xml",
4898 })
4899
4900 // The bar library should depend on the implementation jar.
4901 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4902 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4903 t.Errorf("expected %q, found %#q", expected, actual)
4904 }
4905}
4906
4907func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4908 ctx, _ := testApex(t, `
4909 apex {
4910 name: "myapex",
4911 key: "myapex.key",
4912 java_libs: ["foo"],
4913 }
4914
4915 apex_key {
4916 name: "myapex.key",
4917 public_key: "testkey.avbpubkey",
4918 private_key: "testkey.pem",
4919 }
4920
4921 java_sdk_library {
4922 name: "foo",
4923 srcs: ["a.java"],
4924 api_packages: ["foo"],
4925 apex_available: ["myapex"],
4926 sdk_version: "none",
4927 system_modules: "none",
4928 }
4929
4930 java_library {
4931 name: "bar",
4932 srcs: ["a.java"],
4933 libs: ["foo"],
4934 sdk_version: "none",
4935 system_modules: "none",
4936 }
4937 `, withFiles(filesForSdkLibrary))
4938
4939 // java_sdk_library installs both impl jar and permission XML
4940 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4941 "javalib/foo.jar",
4942 "etc/permissions/foo.xml",
4943 })
4944
4945 // The bar library should depend on the stubs jar.
4946 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4947 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4948 t.Errorf("expected %q, found %#q", expected, actual)
4949 }
4950}
4951
Paul Duffineedc5d52020-06-12 17:46:39 +01004952func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4953 ctx, _ := testApex(t, ``,
4954 withFiles(map[string][]byte{
4955 "apex/a.java": nil,
4956 "apex/apex_manifest.json": nil,
4957 "apex/Android.bp": []byte(`
4958 package {
4959 default_visibility: ["//visibility:private"],
4960 }
4961
4962 apex {
4963 name: "myapex",
4964 key: "myapex.key",
4965 java_libs: ["foo", "bar"],
4966 }
4967
4968 apex_key {
4969 name: "myapex.key",
4970 public_key: "testkey.avbpubkey",
4971 private_key: "testkey.pem",
4972 }
4973
4974 java_library {
4975 name: "bar",
4976 srcs: ["a.java"],
4977 libs: ["foo"],
4978 apex_available: ["myapex"],
4979 sdk_version: "none",
4980 system_modules: "none",
4981 }
4982`),
4983 "source/a.java": nil,
4984 "source/api/current.txt": nil,
4985 "source/api/removed.txt": nil,
4986 "source/Android.bp": []byte(`
4987 package {
4988 default_visibility: ["//visibility:private"],
4989 }
4990
4991 java_sdk_library {
4992 name: "foo",
4993 visibility: ["//apex"],
4994 srcs: ["a.java"],
4995 api_packages: ["foo"],
4996 apex_available: ["myapex"],
4997 sdk_version: "none",
4998 system_modules: "none",
4999 public: {
5000 enabled: true,
5001 },
5002 }
5003`),
5004 "prebuilt/a.jar": nil,
5005 "prebuilt/Android.bp": []byte(`
5006 package {
5007 default_visibility: ["//visibility:private"],
5008 }
5009
5010 java_sdk_library_import {
5011 name: "foo",
5012 visibility: ["//apex", "//source"],
5013 apex_available: ["myapex"],
5014 prefer: true,
5015 public: {
5016 jars: ["a.jar"],
5017 },
5018 }
5019`),
5020 }),
5021 )
5022
5023 // java_sdk_library installs both impl jar and permission XML
5024 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5025 "javalib/bar.jar",
5026 "javalib/foo.jar",
5027 "etc/permissions/foo.xml",
5028 })
5029
5030 // The bar library should depend on the implementation jar.
5031 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5032 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5033 t.Errorf("expected %q, found %#q", expected, actual)
5034 }
5035}
5036
5037func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5038 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
5042 java_libs: ["foo"],
5043 }
5044
5045 apex_key {
5046 name: "myapex.key",
5047 public_key: "testkey.avbpubkey",
5048 private_key: "testkey.pem",
5049 }
5050
5051 java_sdk_library_import {
5052 name: "foo",
5053 apex_available: ["myapex"],
5054 prefer: true,
5055 public: {
5056 jars: ["a.jar"],
5057 },
5058 }
5059
5060 `, withFiles(filesForSdkLibrary))
5061}
5062
atrost6e126252020-01-27 17:01:16 +00005063func TestCompatConfig(t *testing.T) {
5064 ctx, _ := testApex(t, `
5065 apex {
5066 name: "myapex",
5067 key: "myapex.key",
5068 prebuilts: ["myjar-platform-compat-config"],
5069 java_libs: ["myjar"],
5070 }
5071
5072 apex_key {
5073 name: "myapex.key",
5074 public_key: "testkey.avbpubkey",
5075 private_key: "testkey.pem",
5076 }
5077
5078 platform_compat_config {
5079 name: "myjar-platform-compat-config",
5080 src: ":myjar",
5081 }
5082
5083 java_library {
5084 name: "myjar",
5085 srcs: ["foo/bar/MyClass.java"],
5086 sdk_version: "none",
5087 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005088 apex_available: [ "myapex" ],
5089 }
5090 `)
5091 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5092 "etc/compatconfig/myjar-platform-compat-config.xml",
5093 "javalib/myjar.jar",
5094 })
5095}
5096
Jiyong Park479321d2019-12-16 11:47:12 +09005097func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5098 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5099 apex {
5100 name: "myapex",
5101 key: "myapex.key",
5102 java_libs: ["myjar"],
5103 }
5104
5105 apex_key {
5106 name: "myapex.key",
5107 public_key: "testkey.avbpubkey",
5108 private_key: "testkey.pem",
5109 }
5110
5111 java_library {
5112 name: "myjar",
5113 srcs: ["foo/bar/MyClass.java"],
5114 sdk_version: "none",
5115 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005116 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005117 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005118 }
5119 `)
5120}
5121
Jiyong Park7afd1072019-12-30 16:56:33 +09005122func TestCarryRequiredModuleNames(t *testing.T) {
5123 ctx, config := testApex(t, `
5124 apex {
5125 name: "myapex",
5126 key: "myapex.key",
5127 native_shared_libs: ["mylib"],
5128 }
5129
5130 apex_key {
5131 name: "myapex.key",
5132 public_key: "testkey.avbpubkey",
5133 private_key: "testkey.pem",
5134 }
5135
5136 cc_library {
5137 name: "mylib",
5138 srcs: ["mylib.cpp"],
5139 system_shared_libs: [],
5140 stl: "none",
5141 required: ["a", "b"],
5142 host_required: ["c", "d"],
5143 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005144 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005145 }
5146 `)
5147
5148 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5149 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5150 name := apexBundle.BaseModuleName()
5151 prefix := "TARGET_"
5152 var builder strings.Builder
5153 data.Custom(&builder, name, prefix, "", data)
5154 androidMk := builder.String()
5155 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5156 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5157 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5158}
5159
Jiyong Park7cd10e32020-01-14 09:22:18 +09005160func TestSymlinksFromApexToSystem(t *testing.T) {
5161 bp := `
5162 apex {
5163 name: "myapex",
5164 key: "myapex.key",
5165 native_shared_libs: ["mylib"],
5166 java_libs: ["myjar"],
5167 }
5168
Jiyong Park9d677202020-02-19 16:29:35 +09005169 apex {
5170 name: "myapex.updatable",
5171 key: "myapex.key",
5172 native_shared_libs: ["mylib"],
5173 java_libs: ["myjar"],
5174 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005175 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005176 }
5177
Jiyong Park7cd10e32020-01-14 09:22:18 +09005178 apex_key {
5179 name: "myapex.key",
5180 public_key: "testkey.avbpubkey",
5181 private_key: "testkey.pem",
5182 }
5183
5184 cc_library {
5185 name: "mylib",
5186 srcs: ["mylib.cpp"],
5187 shared_libs: ["myotherlib"],
5188 system_shared_libs: [],
5189 stl: "none",
5190 apex_available: [
5191 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005192 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005193 "//apex_available:platform",
5194 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005195 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005196 }
5197
5198 cc_library {
5199 name: "myotherlib",
5200 srcs: ["mylib.cpp"],
5201 system_shared_libs: [],
5202 stl: "none",
5203 apex_available: [
5204 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005205 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005206 "//apex_available:platform",
5207 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005208 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005209 }
5210
5211 java_library {
5212 name: "myjar",
5213 srcs: ["foo/bar/MyClass.java"],
5214 sdk_version: "none",
5215 system_modules: "none",
5216 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005217 apex_available: [
5218 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005219 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005220 "//apex_available:platform",
5221 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005222 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005223 }
5224
5225 java_library {
5226 name: "myotherjar",
5227 srcs: ["foo/bar/MyClass.java"],
5228 sdk_version: "none",
5229 system_modules: "none",
5230 apex_available: [
5231 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005232 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005233 "//apex_available:platform",
5234 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005235 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005236 }
5237 `
5238
5239 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5240 for _, f := range files {
5241 if f.path == file {
5242 if f.isLink {
5243 t.Errorf("%q is not a real file", file)
5244 }
5245 return
5246 }
5247 }
5248 t.Errorf("%q is not found", file)
5249 }
5250
5251 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5252 for _, f := range files {
5253 if f.path == file {
5254 if !f.isLink {
5255 t.Errorf("%q is not a symlink", file)
5256 }
5257 return
5258 }
5259 }
5260 t.Errorf("%q is not found", file)
5261 }
5262
Jiyong Park9d677202020-02-19 16:29:35 +09005263 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5264 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005265 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005266 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005267 ensureRealfileExists(t, files, "javalib/myjar.jar")
5268 ensureRealfileExists(t, files, "lib64/mylib.so")
5269 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5270
Jiyong Park9d677202020-02-19 16:29:35 +09005271 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5272 ensureRealfileExists(t, files, "javalib/myjar.jar")
5273 ensureRealfileExists(t, files, "lib64/mylib.so")
5274 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5275
5276 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005277 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005278 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005279 ensureRealfileExists(t, files, "javalib/myjar.jar")
5280 ensureRealfileExists(t, files, "lib64/mylib.so")
5281 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005282
5283 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5284 ensureRealfileExists(t, files, "javalib/myjar.jar")
5285 ensureRealfileExists(t, files, "lib64/mylib.so")
5286 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005287}
5288
Yo Chiange8128052020-07-23 20:09:18 +08005289func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5290 ctx, config := testApex(t, `
5291 apex {
5292 name: "myapex",
5293 key: "myapex.key",
5294 native_shared_libs: ["mylib"],
5295 }
5296
5297 apex_key {
5298 name: "myapex.key",
5299 public_key: "testkey.avbpubkey",
5300 private_key: "testkey.pem",
5301 }
5302
5303 cc_library_shared {
5304 name: "mylib",
5305 srcs: ["mylib.cpp"],
5306 shared_libs: ["myotherlib"],
5307 system_shared_libs: [],
5308 stl: "none",
5309 apex_available: [
5310 "myapex",
5311 "//apex_available:platform",
5312 ],
5313 }
5314
5315 cc_prebuilt_library_shared {
5316 name: "myotherlib",
5317 srcs: ["prebuilt.so"],
5318 system_shared_libs: [],
5319 stl: "none",
5320 apex_available: [
5321 "myapex",
5322 "//apex_available:platform",
5323 ],
5324 }
5325 `)
5326
5327 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5328 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5329 var builder strings.Builder
5330 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5331 androidMk := builder.String()
5332 // `myotherlib` is added to `myapex` as symlink
5333 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5334 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5335 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5336 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5337 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5338}
5339
Jooyung Han643adc42020-02-27 13:50:06 +09005340func TestApexWithJniLibs(t *testing.T) {
5341 ctx, _ := testApex(t, `
5342 apex {
5343 name: "myapex",
5344 key: "myapex.key",
5345 jni_libs: ["mylib"],
5346 }
5347
5348 apex_key {
5349 name: "myapex.key",
5350 public_key: "testkey.avbpubkey",
5351 private_key: "testkey.pem",
5352 }
5353
5354 cc_library {
5355 name: "mylib",
5356 srcs: ["mylib.cpp"],
5357 shared_libs: ["mylib2"],
5358 system_shared_libs: [],
5359 stl: "none",
5360 apex_available: [ "myapex" ],
5361 }
5362
5363 cc_library {
5364 name: "mylib2",
5365 srcs: ["mylib.cpp"],
5366 system_shared_libs: [],
5367 stl: "none",
5368 apex_available: [ "myapex" ],
5369 }
5370 `)
5371
5372 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5373 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5374 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5375 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5376 "lib64/mylib.so",
5377 "lib64/mylib2.so",
5378 })
5379}
5380
Jooyung Han49f67012020-04-17 13:43:10 +09005381func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5382 ctx, _ := testApex(t, `
5383 apex {
5384 name: "myapex",
5385 key: "myapex.key",
5386 }
5387 apex_key {
5388 name: "myapex.key",
5389 public_key: "testkey.avbpubkey",
5390 private_key: "testkey.pem",
5391 }
5392 `, func(fs map[string][]byte, config android.Config) {
5393 delete(config.Targets, android.Android)
5394 config.AndroidCommonTarget = android.Target{}
5395 })
5396
5397 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5398 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5399 }
5400}
5401
Jooyung Han643adc42020-02-27 13:50:06 +09005402func TestApexWithJniLibs_Errors(t *testing.T) {
5403 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
5404 apex {
5405 name: "myapex",
5406 key: "myapex.key",
5407 jni_libs: ["xxx"],
5408 }
5409
5410 apex_key {
5411 name: "myapex.key",
5412 public_key: "testkey.avbpubkey",
5413 private_key: "testkey.pem",
5414 }
5415
5416 prebuilt_etc {
5417 name: "xxx",
5418 src: "xxx",
5419 }
5420 `, withFiles(map[string][]byte{
5421 "xxx": nil,
5422 }))
5423}
5424
Jiyong Parkbd159612020-02-28 15:22:21 +09005425func TestAppBundle(t *testing.T) {
5426 ctx, _ := testApex(t, `
5427 apex {
5428 name: "myapex",
5429 key: "myapex.key",
5430 apps: ["AppFoo"],
5431 }
5432
5433 apex_key {
5434 name: "myapex.key",
5435 public_key: "testkey.avbpubkey",
5436 private_key: "testkey.pem",
5437 }
5438
5439 android_app {
5440 name: "AppFoo",
5441 srcs: ["foo/bar/MyClass.java"],
5442 sdk_version: "none",
5443 system_modules: "none",
5444 apex_available: [ "myapex" ],
5445 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005446 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005447
5448 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5449 content := bundleConfigRule.Args["content"]
5450
5451 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005452 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 +09005453}
5454
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005455func TestAppSetBundle(t *testing.T) {
5456 ctx, _ := testApex(t, `
5457 apex {
5458 name: "myapex",
5459 key: "myapex.key",
5460 apps: ["AppSet"],
5461 }
5462
5463 apex_key {
5464 name: "myapex.key",
5465 public_key: "testkey.avbpubkey",
5466 private_key: "testkey.pem",
5467 }
5468
5469 android_app_set {
5470 name: "AppSet",
5471 set: "AppSet.apks",
5472 }`)
5473 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5474 bundleConfigRule := mod.Description("Bundle Config")
5475 content := bundleConfigRule.Args["content"]
5476 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5477 s := mod.Rule("apexRule").Args["copy_commands"]
5478 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5479 if len(copyCmds) != 3 {
5480 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5481 }
5482 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5483 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5484 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5485}
5486
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005487func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005488 t.Helper()
5489
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005490 bp := `
5491 java_library {
5492 name: "some-updatable-apex-lib",
5493 srcs: ["a.java"],
5494 sdk_version: "current",
5495 apex_available: [
5496 "some-updatable-apex",
5497 ],
5498 }
5499
5500 java_library {
5501 name: "some-non-updatable-apex-lib",
5502 srcs: ["a.java"],
5503 apex_available: [
5504 "some-non-updatable-apex",
5505 ],
5506 }
5507
5508 java_library {
5509 name: "some-platform-lib",
5510 srcs: ["a.java"],
5511 sdk_version: "current",
5512 installable: true,
5513 }
5514
5515 java_library {
5516 name: "some-art-lib",
5517 srcs: ["a.java"],
5518 sdk_version: "current",
5519 apex_available: [
5520 "com.android.art.something",
5521 ],
5522 hostdex: true,
5523 }
5524
5525 apex {
5526 name: "some-updatable-apex",
5527 key: "some-updatable-apex.key",
5528 java_libs: ["some-updatable-apex-lib"],
5529 updatable: true,
5530 min_sdk_version: "current",
5531 }
5532
5533 apex {
5534 name: "some-non-updatable-apex",
5535 key: "some-non-updatable-apex.key",
5536 java_libs: ["some-non-updatable-apex-lib"],
5537 }
5538
5539 apex_key {
5540 name: "some-updatable-apex.key",
5541 }
5542
5543 apex_key {
5544 name: "some-non-updatable-apex.key",
5545 }
5546
5547 apex {
5548 name: "com.android.art.something",
5549 key: "com.android.art.something.key",
5550 java_libs: ["some-art-lib"],
5551 updatable: true,
5552 min_sdk_version: "current",
5553 }
5554
5555 apex_key {
5556 name: "com.android.art.something.key",
5557 }
5558
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005559 filegroup {
5560 name: "some-updatable-apex-file_contexts",
5561 srcs: [
5562 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5563 ],
5564 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005565
5566 filegroup {
5567 name: "some-non-updatable-apex-file_contexts",
5568 srcs: [
5569 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5570 ],
5571 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005572 `
5573 bp += cc.GatherRequiredDepsForTest(android.Android)
5574 bp += java.GatherRequiredDepsForTest()
5575 bp += dexpreopt.BpToolModulesForTest()
5576
5577 fs := map[string][]byte{
5578 "a.java": nil,
5579 "a.jar": nil,
5580 "build/make/target/product/security": nil,
5581 "apex_manifest.json": nil,
5582 "AndroidManifest.xml": nil,
5583 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005584 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005585 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5586 "framework/aidl/a.aidl": nil,
5587 }
5588 cc.GatherRequiredFilesForTest(fs)
5589
5590 ctx := android.NewTestArchContext()
5591 ctx.RegisterModuleType("apex", BundleFactory)
5592 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5593 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005594 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005595 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005596 cc.RegisterRequiredBuildComponentsForTest(ctx)
5597 java.RegisterJavaBuildComponents(ctx)
5598 java.RegisterSystemModulesBuildComponents(ctx)
5599 java.RegisterAppBuildComponents(ctx)
5600 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005601 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5602 ctx.PreDepsMutators(RegisterPreDepsMutators)
5603 ctx.PostDepsMutators(RegisterPostDepsMutators)
5604
5605 config := android.TestArchConfig(buildDir, nil, bp, fs)
5606 ctx.Register(config)
5607
5608 _ = dexpreopt.GlobalSoongConfigForTests(config)
5609 dexpreopt.RegisterToolModulesForTest(ctx)
5610 pathCtx := android.PathContextForTesting(config)
5611 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5612 transformDexpreoptConfig(dexpreoptConfig)
5613 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5614
5615 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5616 android.FailIfErrored(t, errs)
5617
5618 _, errs = ctx.PrepareBuildActions(config)
5619 if errmsg == "" {
5620 android.FailIfErrored(t, errs)
5621 } else if len(errs) > 0 {
5622 android.FailIfNoMatchingErrors(t, errmsg, errs)
5623 return
5624 } else {
5625 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5626 }
5627}
5628
Jooyung Han548640b2020-04-27 12:10:30 +09005629func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5630 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5631 apex {
5632 name: "myapex",
5633 key: "myapex.key",
5634 updatable: true,
5635 }
5636
5637 apex_key {
5638 name: "myapex.key",
5639 public_key: "testkey.avbpubkey",
5640 private_key: "testkey.pem",
5641 }
5642 `)
5643}
5644
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005645func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005646 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005647 var transform func(*dexpreopt.GlobalConfig)
5648
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005649 config := android.TestArchConfig(buildDir, nil, "", nil)
5650 ctx := android.PathContextForTesting(config)
5651
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005652 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5653 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005654 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005655 }
5656 testNoUpdatableJarsInBootImage(t, "", transform)
5657 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005658
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005659 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005660 err = `module "some-art-lib" from updatable apexes \["com.android.art.something"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005661 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005662 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005663 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005664 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005665 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005666
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005667 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 -07005668 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 +01005669 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005670 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005671 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005672 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005673 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005674
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005675 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 -07005676 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005677 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005678 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005679 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005680 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005681 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005682
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005683 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 -07005684 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 +01005685 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005686 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005687 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005688 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005689 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005690
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005691 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5692 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005693 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005694 }
5695 testNoUpdatableJarsInBootImage(t, "", transform)
5696 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005697
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005698 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005699 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005700 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005701 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005702 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005703 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005704 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005705
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005706 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005707 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005708 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005709 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005710 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005711 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005712 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005713
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005714 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005715 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005716 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005717 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005718 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005719 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005720 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005721
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005722 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5723 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005724 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005725 }
5726 testNoUpdatableJarsInBootImage(t, "", transform)
5727 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005728}
5729
Jiyong Park62304bb2020-04-13 16:19:48 +09005730func TestTestFor(t *testing.T) {
5731 ctx, _ := testApex(t, `
5732 apex {
5733 name: "myapex",
5734 key: "myapex.key",
5735 native_shared_libs: ["mylib", "myprivlib"],
5736 }
5737
5738 apex_key {
5739 name: "myapex.key",
5740 public_key: "testkey.avbpubkey",
5741 private_key: "testkey.pem",
5742 }
5743
5744 cc_library {
5745 name: "mylib",
5746 srcs: ["mylib.cpp"],
5747 system_shared_libs: [],
5748 stl: "none",
5749 stubs: {
5750 versions: ["1"],
5751 },
5752 apex_available: ["myapex"],
5753 }
5754
5755 cc_library {
5756 name: "myprivlib",
5757 srcs: ["mylib.cpp"],
5758 system_shared_libs: [],
5759 stl: "none",
5760 apex_available: ["myapex"],
5761 }
5762
5763
5764 cc_test {
5765 name: "mytest",
5766 gtest: false,
5767 srcs: ["mylib.cpp"],
5768 system_shared_libs: [],
5769 stl: "none",
5770 shared_libs: ["mylib", "myprivlib"],
5771 test_for: ["myapex"]
5772 }
5773 `)
5774
5775 // the test 'mytest' is a test for the apex, therefore is linked to the
5776 // actual implementation of mylib instead of its stub.
5777 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5778 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5779 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5780}
5781
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005782// TODO(jungjw): Move this to proptools
5783func intPtr(i int) *int {
5784 return &i
5785}
5786
5787func TestApexSet(t *testing.T) {
5788 ctx, config := testApex(t, `
5789 apex_set {
5790 name: "myapex",
5791 set: "myapex.apks",
5792 filename: "foo_v2.apex",
5793 overrides: ["foo"],
5794 }
5795 `, func(fs map[string][]byte, config android.Config) {
5796 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5797 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5798 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5799 })
5800
5801 m := ctx.ModuleForTests("myapex", "android_common")
5802
5803 // Check extract_apks tool parameters.
5804 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5805 actual := extractedApex.Args["abis"]
5806 expected := "ARMEABI_V7A,ARM64_V8A"
5807 if actual != expected {
5808 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5809 }
5810 actual = extractedApex.Args["sdk-version"]
5811 expected = "30"
5812 if actual != expected {
5813 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5814 }
5815
5816 a := m.Module().(*ApexSet)
5817 expectedOverrides := []string{"foo"}
5818 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5819 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5820 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5821 }
5822}
5823
Jiyong Park7d95a512020-05-10 15:16:24 +09005824func TestNoStaticLinkingToStubsLib(t *testing.T) {
5825 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5826 apex {
5827 name: "myapex",
5828 key: "myapex.key",
5829 native_shared_libs: ["mylib"],
5830 }
5831
5832 apex_key {
5833 name: "myapex.key",
5834 public_key: "testkey.avbpubkey",
5835 private_key: "testkey.pem",
5836 }
5837
5838 cc_library {
5839 name: "mylib",
5840 srcs: ["mylib.cpp"],
5841 static_libs: ["otherlib"],
5842 system_shared_libs: [],
5843 stl: "none",
5844 apex_available: [ "myapex" ],
5845 }
5846
5847 cc_library {
5848 name: "otherlib",
5849 srcs: ["mylib.cpp"],
5850 system_shared_libs: [],
5851 stl: "none",
5852 stubs: {
5853 versions: ["1", "2", "3"],
5854 },
5855 apex_available: [ "myapex" ],
5856 }
5857 `)
5858}
5859
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005860func TestApexKeysTxt(t *testing.T) {
5861 ctx, _ := testApex(t, `
5862 apex {
5863 name: "myapex",
5864 key: "myapex.key",
5865 }
5866
5867 apex_key {
5868 name: "myapex.key",
5869 public_key: "testkey.avbpubkey",
5870 private_key: "testkey.pem",
5871 }
5872
5873 prebuilt_apex {
5874 name: "myapex",
5875 prefer: true,
5876 arch: {
5877 arm64: {
5878 src: "myapex-arm64.apex",
5879 },
5880 arm: {
5881 src: "myapex-arm.apex",
5882 },
5883 },
5884 }
5885
5886 apex_set {
5887 name: "myapex_set",
5888 set: "myapex.apks",
5889 filename: "myapex_set.apex",
5890 overrides: ["myapex"],
5891 }
5892 `)
5893
5894 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5895 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5896 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 +09005897 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 +09005898}
5899
Jooyung Han938b5932020-06-20 12:47:47 +09005900func TestAllowedFiles(t *testing.T) {
5901 ctx, _ := testApex(t, `
5902 apex {
5903 name: "myapex",
5904 key: "myapex.key",
5905 apps: ["app"],
5906 allowed_files: "allowed.txt",
5907 }
5908
5909 apex_key {
5910 name: "myapex.key",
5911 public_key: "testkey.avbpubkey",
5912 private_key: "testkey.pem",
5913 }
5914
5915 android_app {
5916 name: "app",
5917 srcs: ["foo/bar/MyClass.java"],
5918 package_name: "foo",
5919 sdk_version: "none",
5920 system_modules: "none",
5921 apex_available: [ "myapex" ],
5922 }
5923 `, withFiles(map[string][]byte{
5924 "sub/Android.bp": []byte(`
5925 override_apex {
5926 name: "override_myapex",
5927 base: "myapex",
5928 apps: ["override_app"],
5929 allowed_files: ":allowed",
5930 }
5931 // Overridable "path" property should be referenced indirectly
5932 filegroup {
5933 name: "allowed",
5934 srcs: ["allowed.txt"],
5935 }
5936 override_android_app {
5937 name: "override_app",
5938 base: "app",
5939 package_name: "bar",
5940 }
5941 `),
5942 }))
5943
5944 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5945 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5946 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5947 }
5948
5949 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5950 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5951 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5952 }
5953}
5954
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005955func TestNonPreferredPrebuiltDependency(t *testing.T) {
5956 _, _ = testApex(t, `
5957 apex {
5958 name: "myapex",
5959 key: "myapex.key",
5960 native_shared_libs: ["mylib"],
5961 }
5962
5963 apex_key {
5964 name: "myapex.key",
5965 public_key: "testkey.avbpubkey",
5966 private_key: "testkey.pem",
5967 }
5968
5969 cc_library {
5970 name: "mylib",
5971 srcs: ["mylib.cpp"],
5972 stubs: {
5973 versions: ["10000"],
5974 },
5975 apex_available: ["myapex"],
5976 }
5977
5978 cc_prebuilt_library_shared {
5979 name: "mylib",
5980 prefer: false,
5981 srcs: ["prebuilt.so"],
5982 stubs: {
5983 versions: ["10000"],
5984 },
5985 apex_available: ["myapex"],
5986 }
5987 `)
5988}
5989
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005990func TestMain(m *testing.M) {
5991 run := func() int {
5992 setUp()
5993 defer tearDown()
5994
5995 return m.Run()
5996 }
5997
5998 os.Exit(run())
5999}