blob: 391fca0aa952ff50447965aae7eb0857c2671ee1 [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)
Jooyung Han0703fd82020-08-26 22:11:53 +0900251 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
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 Han0703fd82020-08-26 22:11:53 +09002275func TestVendorApex_withPrebuiltFirmware(t *testing.T) {
2276 ctx, _ := testApex(t, `
2277 apex {
2278 name: "myapex",
2279 key: "myapex.key",
2280 prebuilts: ["myfirmware"],
2281 vendor: true,
2282 }
2283 apex_key {
2284 name: "myapex.key",
2285 public_key: "testkey.avbpubkey",
2286 private_key: "testkey.pem",
2287 }
2288 prebuilt_firmware {
2289 name: "myfirmware",
2290 src: "myfirmware.bin",
2291 filename_from_src: true,
2292 vendor: true,
2293 }
2294 `)
2295
2296 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2297 "firmware/myfirmware.bin",
2298 })
2299}
2300
Jooyung Hanefb184e2020-06-25 17:14:25 +09002301func TestAndroidMk_UseVendorRequired(t *testing.T) {
2302 ctx, config := testApex(t, `
2303 apex {
2304 name: "myapex",
2305 key: "myapex.key",
2306 use_vendor: true,
2307 native_shared_libs: ["mylib"],
2308 }
2309
2310 apex_key {
2311 name: "myapex.key",
2312 public_key: "testkey.avbpubkey",
2313 private_key: "testkey.pem",
2314 }
2315
2316 cc_library {
2317 name: "mylib",
2318 vendor_available: true,
2319 apex_available: ["myapex"],
2320 }
2321 `, func(fs map[string][]byte, config android.Config) {
2322 setUseVendorAllowListForTest(config, []string{"myapex"})
2323 })
2324
2325 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2326 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2327 name := apexBundle.BaseModuleName()
2328 prefix := "TARGET_"
2329 var builder strings.Builder
2330 data.Custom(&builder, name, prefix, "", data)
2331 androidMk := builder.String()
2332 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2333}
2334
2335func TestAndroidMk_VendorApexRequired(t *testing.T) {
2336 ctx, config := testApex(t, `
2337 apex {
2338 name: "myapex",
2339 key: "myapex.key",
2340 vendor: true,
2341 native_shared_libs: ["mylib"],
2342 }
2343
2344 apex_key {
2345 name: "myapex.key",
2346 public_key: "testkey.avbpubkey",
2347 private_key: "testkey.pem",
2348 }
2349
2350 cc_library {
2351 name: "mylib",
2352 vendor_available: true,
2353 }
2354 `)
2355
2356 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2357 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2358 name := apexBundle.BaseModuleName()
2359 prefix := "TARGET_"
2360 var builder strings.Builder
2361 data.Custom(&builder, name, prefix, "", data)
2362 androidMk := builder.String()
2363 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2364}
2365
Jooyung Han2ed99d02020-06-24 23:26:26 +09002366func TestAndroidMkWritesCommonProperties(t *testing.T) {
2367 ctx, config := testApex(t, `
2368 apex {
2369 name: "myapex",
2370 key: "myapex.key",
2371 vintf_fragments: ["fragment.xml"],
2372 init_rc: ["init.rc"],
2373 }
2374 apex_key {
2375 name: "myapex.key",
2376 public_key: "testkey.avbpubkey",
2377 private_key: "testkey.pem",
2378 }
2379 cc_binary {
2380 name: "mybin",
2381 }
2382 `)
2383
2384 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2385 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2386 name := apexBundle.BaseModuleName()
2387 prefix := "TARGET_"
2388 var builder strings.Builder
2389 data.Custom(&builder, name, prefix, "", data)
2390 androidMk := builder.String()
2391 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2392 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2393}
2394
Jiyong Park16e91a02018-12-20 18:18:08 +09002395func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002396 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002397 apex {
2398 name: "myapex",
2399 key: "myapex.key",
2400 native_shared_libs: ["mylib"],
2401 }
2402
2403 apex_key {
2404 name: "myapex.key",
2405 public_key: "testkey.avbpubkey",
2406 private_key: "testkey.pem",
2407 }
2408
2409 cc_library {
2410 name: "mylib",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 stubs: {
2415 versions: ["1", "2", "3"],
2416 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002417 apex_available: [
2418 "//apex_available:platform",
2419 "myapex",
2420 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002421 }
2422
2423 cc_binary {
2424 name: "not_in_apex",
2425 srcs: ["mylib.cpp"],
2426 static_libs: ["mylib"],
2427 static_executable: true,
2428 system_shared_libs: [],
2429 stl: "none",
2430 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002431 `)
2432
Colin Cross7113d202019-11-20 16:39:12 -08002433 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002434
2435 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002436 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002437}
Jiyong Park9335a262018-12-24 11:31:58 +09002438
2439func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002440 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002441 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002442 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002443 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002444 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002445 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002446 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002447 }
2448
2449 cc_library {
2450 name: "mylib",
2451 srcs: ["mylib.cpp"],
2452 system_shared_libs: [],
2453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002454 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002455 }
2456
2457 apex_key {
2458 name: "myapex.key",
2459 public_key: "testkey.avbpubkey",
2460 private_key: "testkey.pem",
2461 }
2462
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002463 android_app_certificate {
2464 name: "myapex.certificate",
2465 certificate: "testkey",
2466 }
2467
2468 android_app_certificate {
2469 name: "myapex.certificate.override",
2470 certificate: "testkey.override",
2471 }
2472
Jiyong Park9335a262018-12-24 11:31:58 +09002473 `)
2474
2475 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002476 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002477
2478 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2479 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2480 "vendor/foo/devkeys/testkey.avbpubkey")
2481 }
2482 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2483 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2484 "vendor/foo/devkeys/testkey.pem")
2485 }
2486
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002487 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002488 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002489 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002490 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002491 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002492 }
2493}
Jiyong Park58e364a2019-01-19 19:24:06 +09002494
Jooyung Hanf121a652019-12-17 14:30:11 +09002495func TestCertificate(t *testing.T) {
2496 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2497 ctx, _ := testApex(t, `
2498 apex {
2499 name: "myapex",
2500 key: "myapex.key",
2501 }
2502 apex_key {
2503 name: "myapex.key",
2504 public_key: "testkey.avbpubkey",
2505 private_key: "testkey.pem",
2506 }`)
2507 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2508 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2509 if actual := rule.Args["certificates"]; actual != expected {
2510 t.Errorf("certificates should be %q, not %q", expected, actual)
2511 }
2512 })
2513 t.Run("override when unspecified", func(t *testing.T) {
2514 ctx, _ := testApex(t, `
2515 apex {
2516 name: "myapex_keytest",
2517 key: "myapex.key",
2518 file_contexts: ":myapex-file_contexts",
2519 }
2520 apex_key {
2521 name: "myapex.key",
2522 public_key: "testkey.avbpubkey",
2523 private_key: "testkey.pem",
2524 }
2525 android_app_certificate {
2526 name: "myapex.certificate.override",
2527 certificate: "testkey.override",
2528 }`)
2529 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2530 expected := "testkey.override.x509.pem testkey.override.pk8"
2531 if actual := rule.Args["certificates"]; actual != expected {
2532 t.Errorf("certificates should be %q, not %q", expected, actual)
2533 }
2534 })
2535 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2536 ctx, _ := testApex(t, `
2537 apex {
2538 name: "myapex",
2539 key: "myapex.key",
2540 certificate: ":myapex.certificate",
2541 }
2542 apex_key {
2543 name: "myapex.key",
2544 public_key: "testkey.avbpubkey",
2545 private_key: "testkey.pem",
2546 }
2547 android_app_certificate {
2548 name: "myapex.certificate",
2549 certificate: "testkey",
2550 }`)
2551 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2552 expected := "testkey.x509.pem testkey.pk8"
2553 if actual := rule.Args["certificates"]; actual != expected {
2554 t.Errorf("certificates should be %q, not %q", expected, actual)
2555 }
2556 })
2557 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2558 ctx, _ := testApex(t, `
2559 apex {
2560 name: "myapex_keytest",
2561 key: "myapex.key",
2562 file_contexts: ":myapex-file_contexts",
2563 certificate: ":myapex.certificate",
2564 }
2565 apex_key {
2566 name: "myapex.key",
2567 public_key: "testkey.avbpubkey",
2568 private_key: "testkey.pem",
2569 }
2570 android_app_certificate {
2571 name: "myapex.certificate.override",
2572 certificate: "testkey.override",
2573 }`)
2574 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2575 expected := "testkey.override.x509.pem testkey.override.pk8"
2576 if actual := rule.Args["certificates"]; actual != expected {
2577 t.Errorf("certificates should be %q, not %q", expected, actual)
2578 }
2579 })
2580 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2581 ctx, _ := testApex(t, `
2582 apex {
2583 name: "myapex",
2584 key: "myapex.key",
2585 certificate: "testkey",
2586 }
2587 apex_key {
2588 name: "myapex.key",
2589 public_key: "testkey.avbpubkey",
2590 private_key: "testkey.pem",
2591 }`)
2592 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2593 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2594 if actual := rule.Args["certificates"]; actual != expected {
2595 t.Errorf("certificates should be %q, not %q", expected, actual)
2596 }
2597 })
2598 t.Run("override when specified as <name>", func(t *testing.T) {
2599 ctx, _ := testApex(t, `
2600 apex {
2601 name: "myapex_keytest",
2602 key: "myapex.key",
2603 file_contexts: ":myapex-file_contexts",
2604 certificate: "testkey",
2605 }
2606 apex_key {
2607 name: "myapex.key",
2608 public_key: "testkey.avbpubkey",
2609 private_key: "testkey.pem",
2610 }
2611 android_app_certificate {
2612 name: "myapex.certificate.override",
2613 certificate: "testkey.override",
2614 }`)
2615 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2616 expected := "testkey.override.x509.pem testkey.override.pk8"
2617 if actual := rule.Args["certificates"]; actual != expected {
2618 t.Errorf("certificates should be %q, not %q", expected, actual)
2619 }
2620 })
2621}
2622
Jiyong Park58e364a2019-01-19 19:24:06 +09002623func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002624 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002625 apex {
2626 name: "myapex",
2627 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002628 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002629 }
2630
2631 apex {
2632 name: "otherapex",
2633 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002634 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002635 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002636 }
2637
2638 apex_key {
2639 name: "myapex.key",
2640 public_key: "testkey.avbpubkey",
2641 private_key: "testkey.pem",
2642 }
2643
2644 cc_library {
2645 name: "mylib",
2646 srcs: ["mylib.cpp"],
2647 system_shared_libs: [],
2648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002649 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002650 "myapex",
2651 "otherapex",
2652 ],
Jooyung Han24282772020-03-21 23:20:55 +09002653 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002654 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002655 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002656 cc_library {
2657 name: "mylib2",
2658 srcs: ["mylib.cpp"],
2659 system_shared_libs: [],
2660 stl: "none",
2661 apex_available: [
2662 "myapex",
2663 "otherapex",
2664 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002665 static_libs: ["mylib3"],
2666 recovery_available: true,
2667 min_sdk_version: "29",
2668 }
2669 cc_library {
2670 name: "mylib3",
2671 srcs: ["mylib.cpp"],
2672 system_shared_libs: [],
2673 stl: "none",
2674 apex_available: [
2675 "myapex",
2676 "otherapex",
2677 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002678 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002679 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002680 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002681 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002682 `)
2683
Jooyung Hanc87a0592020-03-02 17:44:33 +09002684 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002685 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002686 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002687 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002688
Jooyung Hanccce2f22020-03-07 03:45:53 +09002689 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002690 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002691 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002692 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002693 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002694
Jooyung Hanccce2f22020-03-07 03:45:53 +09002695 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002696 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002697 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002698 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002699 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002700
Colin Crossaede88c2020-08-11 12:17:01 -07002701 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2702 // each variant defines additional macros to distinguish which apex variant it is built for
2703
2704 // non-APEX variant does not have __ANDROID_APEX__ defined
2705 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2706 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2707
2708 // APEX variant has __ANDROID_APEX__ defined
2709 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2710 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2711 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2712 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2713
2714 // APEX variant has __ANDROID_APEX__ defined
2715 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2716 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2717 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2718 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2719
2720 // recovery variant does not set __ANDROID_SDK_VERSION__
2721 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2722 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2723 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
2724
2725 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2726 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002727
2728 // non-APEX variant does not have __ANDROID_APEX__ defined
2729 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2730 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2731
2732 // APEX variant has __ANDROID_APEX__ defined
2733 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002734 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002735 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002736 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002737
Jooyung Hanc87a0592020-03-02 17:44:33 +09002738 // APEX variant has __ANDROID_APEX__ defined
2739 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002740 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002741 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002742 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002743
2744 // recovery variant does not set __ANDROID_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002745 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002746 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2747 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002748}
Jiyong Park7e636d02019-01-28 16:16:54 +09002749
2750func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002751 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["mylib"],
2756 }
2757
2758 apex_key {
2759 name: "myapex.key",
2760 public_key: "testkey.avbpubkey",
2761 private_key: "testkey.pem",
2762 }
2763
2764 cc_library_headers {
2765 name: "mylib_headers",
2766 export_include_dirs: ["my_include"],
2767 system_shared_libs: [],
2768 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002769 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002770 }
2771
2772 cc_library {
2773 name: "mylib",
2774 srcs: ["mylib.cpp"],
2775 system_shared_libs: [],
2776 stl: "none",
2777 header_libs: ["mylib_headers"],
2778 export_header_lib_headers: ["mylib_headers"],
2779 stubs: {
2780 versions: ["1", "2", "3"],
2781 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002782 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002783 }
2784
2785 cc_library {
2786 name: "otherlib",
2787 srcs: ["mylib.cpp"],
2788 system_shared_libs: [],
2789 stl: "none",
2790 shared_libs: ["mylib"],
2791 }
2792 `)
2793
Colin Cross7113d202019-11-20 16:39:12 -08002794 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002795
2796 // Ensure that the include path of the header lib is exported to 'otherlib'
2797 ensureContains(t, cFlags, "-Imy_include")
2798}
Alex Light9670d332019-01-29 18:07:33 -08002799
Jiyong Park7cd10e32020-01-14 09:22:18 +09002800type fileInApex struct {
2801 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002802 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002803 isLink bool
2804}
2805
Jooyung Hana57af4a2020-01-23 05:36:59 +00002806func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002807 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002808 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002809 copyCmds := apexRule.Args["copy_commands"]
2810 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002811 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002812 for _, cmd := range strings.Split(copyCmds, "&&") {
2813 cmd = strings.TrimSpace(cmd)
2814 if cmd == "" {
2815 continue
2816 }
2817 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002818 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002819 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002820 switch terms[0] {
2821 case "mkdir":
2822 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002823 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002824 t.Fatal("copyCmds contains invalid cp command", cmd)
2825 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002826 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002827 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002828 isLink = false
2829 case "ln":
2830 if len(terms) != 3 && len(terms) != 4 {
2831 // ln LINK TARGET or ln -s LINK TARGET
2832 t.Fatal("copyCmds contains invalid ln command", cmd)
2833 }
2834 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002835 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002836 isLink = true
2837 default:
2838 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2839 }
2840 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002841 index := strings.Index(dst, imageApexDir)
2842 if index == -1 {
2843 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2844 }
2845 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002846 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002847 }
2848 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002849 return ret
2850}
2851
Jooyung Hana57af4a2020-01-23 05:36:59 +00002852func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2853 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002854 var failed bool
2855 var surplus []string
2856 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002857 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002858 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002859 for _, expected := range files {
2860 if matched, _ := path.Match(expected, file.path); matched {
2861 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002862 mactchFound = true
2863 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002864 }
2865 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002866 if !mactchFound {
2867 surplus = append(surplus, file.path)
2868 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002869 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002870
Jooyung Han31c470b2019-10-18 16:26:59 +09002871 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002872 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002873 t.Log("surplus files", surplus)
2874 failed = true
2875 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002876
2877 if len(files) > len(filesMatched) {
2878 var missing []string
2879 for _, expected := range files {
2880 if !filesMatched[expected] {
2881 missing = append(missing, expected)
2882 }
2883 }
2884 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002885 t.Log("missing files", missing)
2886 failed = true
2887 }
2888 if failed {
2889 t.Fail()
2890 }
2891}
2892
Jooyung Han344d5432019-08-23 11:17:39 +09002893func TestVndkApexCurrent(t *testing.T) {
2894 ctx, _ := testApex(t, `
2895 apex_vndk {
2896 name: "myapex",
2897 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002898 }
2899
2900 apex_key {
2901 name: "myapex.key",
2902 public_key: "testkey.avbpubkey",
2903 private_key: "testkey.pem",
2904 }
2905
2906 cc_library {
2907 name: "libvndk",
2908 srcs: ["mylib.cpp"],
2909 vendor_available: true,
2910 vndk: {
2911 enabled: true,
2912 },
2913 system_shared_libs: [],
2914 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002915 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002916 }
2917
2918 cc_library {
2919 name: "libvndksp",
2920 srcs: ["mylib.cpp"],
2921 vendor_available: true,
2922 vndk: {
2923 enabled: true,
2924 support_system_process: true,
2925 },
2926 system_shared_libs: [],
2927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002928 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002929 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002930 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002931
Jooyung Hana57af4a2020-01-23 05:36:59 +00002932 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002933 "lib/libvndk.so",
2934 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002935 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002936 "lib64/libvndk.so",
2937 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002938 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002939 "etc/llndk.libraries.VER.txt",
2940 "etc/vndkcore.libraries.VER.txt",
2941 "etc/vndksp.libraries.VER.txt",
2942 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002943 })
Jooyung Han344d5432019-08-23 11:17:39 +09002944}
2945
2946func TestVndkApexWithPrebuilt(t *testing.T) {
2947 ctx, _ := testApex(t, `
2948 apex_vndk {
2949 name: "myapex",
2950 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002951 }
2952
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958
2959 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002960 name: "libvndk",
2961 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002962 vendor_available: true,
2963 vndk: {
2964 enabled: true,
2965 },
2966 system_shared_libs: [],
2967 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002968 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002969 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002970
2971 cc_prebuilt_library_shared {
2972 name: "libvndk.arm",
2973 srcs: ["libvndk.arm.so"],
2974 vendor_available: true,
2975 vndk: {
2976 enabled: true,
2977 },
2978 enabled: false,
2979 arch: {
2980 arm: {
2981 enabled: true,
2982 },
2983 },
2984 system_shared_libs: [],
2985 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002986 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002987 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002988 `+vndkLibrariesTxtFiles("current"),
2989 withFiles(map[string][]byte{
2990 "libvndk.so": nil,
2991 "libvndk.arm.so": nil,
2992 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002993
Jooyung Hana57af4a2020-01-23 05:36:59 +00002994 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002995 "lib/libvndk.so",
2996 "lib/libvndk.arm.so",
2997 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002998 "lib/libc++.so",
2999 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003000 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003001 })
Jooyung Han344d5432019-08-23 11:17:39 +09003002}
3003
Jooyung Han39edb6c2019-11-06 16:53:07 +09003004func vndkLibrariesTxtFiles(vers ...string) (result string) {
3005 for _, v := range vers {
3006 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003007 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003008 result += `
3009 vndk_libraries_txt {
3010 name: "` + txt + `.libraries.txt",
3011 }
3012 `
3013 }
3014 } else {
3015 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3016 result += `
3017 prebuilt_etc {
3018 name: "` + txt + `.libraries.` + v + `.txt",
3019 src: "dummy.txt",
3020 }
3021 `
3022 }
3023 }
3024 }
3025 return
3026}
3027
Jooyung Han344d5432019-08-23 11:17:39 +09003028func TestVndkApexVersion(t *testing.T) {
3029 ctx, _ := testApex(t, `
3030 apex_vndk {
3031 name: "myapex_v27",
3032 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003033 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003034 vndk_version: "27",
3035 }
3036
3037 apex_key {
3038 name: "myapex.key",
3039 public_key: "testkey.avbpubkey",
3040 private_key: "testkey.pem",
3041 }
3042
Jooyung Han31c470b2019-10-18 16:26:59 +09003043 vndk_prebuilt_shared {
3044 name: "libvndk27",
3045 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003046 vendor_available: true,
3047 vndk: {
3048 enabled: true,
3049 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003050 target_arch: "arm64",
3051 arch: {
3052 arm: {
3053 srcs: ["libvndk27_arm.so"],
3054 },
3055 arm64: {
3056 srcs: ["libvndk27_arm64.so"],
3057 },
3058 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003059 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003060 }
3061
3062 vndk_prebuilt_shared {
3063 name: "libvndk27",
3064 version: "27",
3065 vendor_available: true,
3066 vndk: {
3067 enabled: true,
3068 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003069 target_arch: "x86_64",
3070 arch: {
3071 x86: {
3072 srcs: ["libvndk27_x86.so"],
3073 },
3074 x86_64: {
3075 srcs: ["libvndk27_x86_64.so"],
3076 },
3077 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003078 }
3079 `+vndkLibrariesTxtFiles("27"),
3080 withFiles(map[string][]byte{
3081 "libvndk27_arm.so": nil,
3082 "libvndk27_arm64.so": nil,
3083 "libvndk27_x86.so": nil,
3084 "libvndk27_x86_64.so": nil,
3085 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003086
Jooyung Hana57af4a2020-01-23 05:36:59 +00003087 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003088 "lib/libvndk27_arm.so",
3089 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003090 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003091 })
Jooyung Han344d5432019-08-23 11:17:39 +09003092}
3093
3094func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3095 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3096 apex_vndk {
3097 name: "myapex_v27",
3098 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003099 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003100 vndk_version: "27",
3101 }
3102 apex_vndk {
3103 name: "myapex_v27_other",
3104 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003105 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003106 vndk_version: "27",
3107 }
3108
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }
3114
3115 cc_library {
3116 name: "libvndk",
3117 srcs: ["mylib.cpp"],
3118 vendor_available: true,
3119 vndk: {
3120 enabled: true,
3121 },
3122 system_shared_libs: [],
3123 stl: "none",
3124 }
3125
3126 vndk_prebuilt_shared {
3127 name: "libvndk",
3128 version: "27",
3129 vendor_available: true,
3130 vndk: {
3131 enabled: true,
3132 },
3133 srcs: ["libvndk.so"],
3134 }
3135 `, withFiles(map[string][]byte{
3136 "libvndk.so": nil,
3137 }))
3138}
3139
Jooyung Han90eee022019-10-01 20:02:42 +09003140func TestVndkApexNameRule(t *testing.T) {
3141 ctx, _ := testApex(t, `
3142 apex_vndk {
3143 name: "myapex",
3144 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003145 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003146 }
3147 apex_vndk {
3148 name: "myapex_v28",
3149 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003150 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003151 vndk_version: "28",
3152 }
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003157 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003158
3159 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003160 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003161 actual := proptools.String(bundle.properties.Apex_name)
3162 if !reflect.DeepEqual(actual, expected) {
3163 t.Errorf("Got '%v', expected '%v'", actual, expected)
3164 }
3165 }
3166
3167 assertApexName("com.android.vndk.vVER", "myapex")
3168 assertApexName("com.android.vndk.v28", "myapex_v28")
3169}
3170
Jooyung Han344d5432019-08-23 11:17:39 +09003171func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3172 ctx, _ := testApex(t, `
3173 apex_vndk {
3174 name: "myapex",
3175 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003176 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003177 }
3178
3179 apex_key {
3180 name: "myapex.key",
3181 public_key: "testkey.avbpubkey",
3182 private_key: "testkey.pem",
3183 }
3184
3185 cc_library {
3186 name: "libvndk",
3187 srcs: ["mylib.cpp"],
3188 vendor_available: true,
3189 native_bridge_supported: true,
3190 host_supported: true,
3191 vndk: {
3192 enabled: true,
3193 },
3194 system_shared_libs: [],
3195 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003196 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003197 }
Jooyung Han35155c42020-02-06 17:33:20 +09003198 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003199
Jooyung Hana57af4a2020-01-23 05:36:59 +00003200 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003201 "lib/libvndk.so",
3202 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003203 "lib/libc++.so",
3204 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003205 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003206 })
Jooyung Han344d5432019-08-23 11:17:39 +09003207}
3208
3209func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3210 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3211 apex_vndk {
3212 name: "myapex",
3213 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003214 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003215 native_bridge_supported: true,
3216 }
3217
3218 apex_key {
3219 name: "myapex.key",
3220 public_key: "testkey.avbpubkey",
3221 private_key: "testkey.pem",
3222 }
3223
3224 cc_library {
3225 name: "libvndk",
3226 srcs: ["mylib.cpp"],
3227 vendor_available: true,
3228 native_bridge_supported: true,
3229 host_supported: true,
3230 vndk: {
3231 enabled: true,
3232 },
3233 system_shared_libs: [],
3234 stl: "none",
3235 }
3236 `)
3237}
3238
Jooyung Han31c470b2019-10-18 16:26:59 +09003239func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003240 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003241 apex_vndk {
3242 name: "myapex_v27",
3243 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003244 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003245 vndk_version: "27",
3246 }
3247
3248 apex_key {
3249 name: "myapex.key",
3250 public_key: "testkey.avbpubkey",
3251 private_key: "testkey.pem",
3252 }
3253
3254 vndk_prebuilt_shared {
3255 name: "libvndk27",
3256 version: "27",
3257 target_arch: "arm",
3258 vendor_available: true,
3259 vndk: {
3260 enabled: true,
3261 },
3262 arch: {
3263 arm: {
3264 srcs: ["libvndk27.so"],
3265 }
3266 },
3267 }
3268
3269 vndk_prebuilt_shared {
3270 name: "libvndk27",
3271 version: "27",
3272 target_arch: "arm",
3273 binder32bit: true,
3274 vendor_available: true,
3275 vndk: {
3276 enabled: true,
3277 },
3278 arch: {
3279 arm: {
3280 srcs: ["libvndk27binder32.so"],
3281 }
3282 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003283 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003284 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003285 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003286 withFiles(map[string][]byte{
3287 "libvndk27.so": nil,
3288 "libvndk27binder32.so": nil,
3289 }),
3290 withBinder32bit,
3291 withTargets(map[android.OsType][]android.Target{
3292 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003293 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3294 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003295 },
3296 }),
3297 )
3298
Jooyung Hana57af4a2020-01-23 05:36:59 +00003299 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003300 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003301 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003302 })
3303}
3304
Jooyung Han45a96772020-06-15 14:59:42 +09003305func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3306 ctx, _ := testApex(t, `
3307 apex_vndk {
3308 name: "myapex",
3309 key: "myapex.key",
3310 file_contexts: ":myapex-file_contexts",
3311 }
3312
3313 apex_key {
3314 name: "myapex.key",
3315 public_key: "testkey.avbpubkey",
3316 private_key: "testkey.pem",
3317 }
3318
3319 cc_library {
3320 name: "libz",
3321 vendor_available: true,
3322 vndk: {
3323 enabled: true,
3324 },
3325 stubs: {
3326 symbol_file: "libz.map.txt",
3327 versions: ["30"],
3328 }
3329 }
3330 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3331 "libz.map.txt": nil,
3332 }))
3333
3334 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3335 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3336 ensureListEmpty(t, provideNativeLibs)
3337}
3338
Jooyung Hane1633032019-08-01 17:41:43 +09003339func TestDependenciesInApexManifest(t *testing.T) {
3340 ctx, _ := testApex(t, `
3341 apex {
3342 name: "myapex_nodep",
3343 key: "myapex.key",
3344 native_shared_libs: ["lib_nodep"],
3345 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003346 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003347 }
3348
3349 apex {
3350 name: "myapex_dep",
3351 key: "myapex.key",
3352 native_shared_libs: ["lib_dep"],
3353 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003354 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003355 }
3356
3357 apex {
3358 name: "myapex_provider",
3359 key: "myapex.key",
3360 native_shared_libs: ["libfoo"],
3361 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003362 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003363 }
3364
3365 apex {
3366 name: "myapex_selfcontained",
3367 key: "myapex.key",
3368 native_shared_libs: ["lib_dep", "libfoo"],
3369 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003370 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003371 }
3372
3373 apex_key {
3374 name: "myapex.key",
3375 public_key: "testkey.avbpubkey",
3376 private_key: "testkey.pem",
3377 }
3378
3379 cc_library {
3380 name: "lib_nodep",
3381 srcs: ["mylib.cpp"],
3382 system_shared_libs: [],
3383 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003384 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003385 }
3386
3387 cc_library {
3388 name: "lib_dep",
3389 srcs: ["mylib.cpp"],
3390 shared_libs: ["libfoo"],
3391 system_shared_libs: [],
3392 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003393 apex_available: [
3394 "myapex_dep",
3395 "myapex_provider",
3396 "myapex_selfcontained",
3397 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003398 }
3399
3400 cc_library {
3401 name: "libfoo",
3402 srcs: ["mytest.cpp"],
3403 stubs: {
3404 versions: ["1"],
3405 },
3406 system_shared_libs: [],
3407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003408 apex_available: [
3409 "myapex_provider",
3410 "myapex_selfcontained",
3411 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003412 }
3413 `)
3414
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003415 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003416 var provideNativeLibs, requireNativeLibs []string
3417
Sundong Ahnabb64432019-10-22 13:58:29 +09003418 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003419 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3420 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003421 ensureListEmpty(t, provideNativeLibs)
3422 ensureListEmpty(t, requireNativeLibs)
3423
Sundong Ahnabb64432019-10-22 13:58:29 +09003424 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003425 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3426 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003427 ensureListEmpty(t, provideNativeLibs)
3428 ensureListContains(t, requireNativeLibs, "libfoo.so")
3429
Sundong Ahnabb64432019-10-22 13:58:29 +09003430 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003431 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3432 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003433 ensureListContains(t, provideNativeLibs, "libfoo.so")
3434 ensureListEmpty(t, requireNativeLibs)
3435
Sundong Ahnabb64432019-10-22 13:58:29 +09003436 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003437 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3438 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003439 ensureListContains(t, provideNativeLibs, "libfoo.so")
3440 ensureListEmpty(t, requireNativeLibs)
3441}
3442
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003443func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003444 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003445 apex {
3446 name: "myapex",
3447 key: "myapex.key",
3448 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003449 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003450 }
3451
3452 apex_key {
3453 name: "myapex.key",
3454 public_key: "testkey.avbpubkey",
3455 private_key: "testkey.pem",
3456 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003457
3458 cc_library {
3459 name: "mylib",
3460 srcs: ["mylib.cpp"],
3461 system_shared_libs: [],
3462 stl: "none",
3463 apex_available: [
3464 "//apex_available:platform",
3465 "myapex",
3466 ],
3467 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003468 `)
3469
Sundong Ahnabb64432019-10-22 13:58:29 +09003470 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003471 apexManifestRule := module.Rule("apexManifestRule")
3472 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3473 apexRule := module.Rule("apexRule")
3474 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003475
3476 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3477 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3478 name := apexBundle.BaseModuleName()
3479 prefix := "TARGET_"
3480 var builder strings.Builder
3481 data.Custom(&builder, name, prefix, "", data)
3482 androidMk := builder.String()
3483 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3484 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003485}
3486
Alex Light0851b882019-02-07 13:20:53 -08003487func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003488 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003489 apex {
3490 name: "myapex",
3491 key: "myapex.key",
3492 native_shared_libs: ["mylib_common"],
3493 }
3494
3495 apex_key {
3496 name: "myapex.key",
3497 public_key: "testkey.avbpubkey",
3498 private_key: "testkey.pem",
3499 }
3500
3501 cc_library {
3502 name: "mylib_common",
3503 srcs: ["mylib.cpp"],
3504 system_shared_libs: [],
3505 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003506 apex_available: [
3507 "//apex_available:platform",
3508 "myapex",
3509 ],
Alex Light0851b882019-02-07 13:20:53 -08003510 }
3511 `)
3512
Sundong Ahnabb64432019-10-22 13:58:29 +09003513 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003514 apexRule := module.Rule("apexRule")
3515 copyCmds := apexRule.Args["copy_commands"]
3516
3517 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3518 t.Log("Apex was a test apex!")
3519 t.Fail()
3520 }
3521 // Ensure that main rule creates an output
3522 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3523
3524 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003525 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003526
3527 // Ensure that both direct and indirect deps are copied into apex
3528 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3529
Colin Cross7113d202019-11-20 16:39:12 -08003530 // Ensure that the platform variant ends with _shared
3531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003532
3533 if !android.InAnyApex("mylib_common") {
3534 t.Log("Found mylib_common not in any apex!")
3535 t.Fail()
3536 }
3537}
3538
3539func TestTestApex(t *testing.T) {
3540 if android.InAnyApex("mylib_common_test") {
3541 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!")
3542 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003543 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003544 apex_test {
3545 name: "myapex",
3546 key: "myapex.key",
3547 native_shared_libs: ["mylib_common_test"],
3548 }
3549
3550 apex_key {
3551 name: "myapex.key",
3552 public_key: "testkey.avbpubkey",
3553 private_key: "testkey.pem",
3554 }
3555
3556 cc_library {
3557 name: "mylib_common_test",
3558 srcs: ["mylib.cpp"],
3559 system_shared_libs: [],
3560 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003561 // TODO: remove //apex_available:platform
3562 apex_available: [
3563 "//apex_available:platform",
3564 "myapex",
3565 ],
Alex Light0851b882019-02-07 13:20:53 -08003566 }
3567 `)
3568
Sundong Ahnabb64432019-10-22 13:58:29 +09003569 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003570 apexRule := module.Rule("apexRule")
3571 copyCmds := apexRule.Args["copy_commands"]
3572
3573 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3574 t.Log("Apex was not a test apex!")
3575 t.Fail()
3576 }
3577 // Ensure that main rule creates an output
3578 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3579
3580 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003581 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003582
3583 // Ensure that both direct and indirect deps are copied into apex
3584 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3585
Colin Cross7113d202019-11-20 16:39:12 -08003586 // Ensure that the platform variant ends with _shared
3587 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003588}
3589
Alex Light9670d332019-01-29 18:07:33 -08003590func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003591 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003592 apex {
3593 name: "myapex",
3594 key: "myapex.key",
3595 multilib: {
3596 first: {
3597 native_shared_libs: ["mylib_common"],
3598 }
3599 },
3600 target: {
3601 android: {
3602 multilib: {
3603 first: {
3604 native_shared_libs: ["mylib"],
3605 }
3606 }
3607 },
3608 host: {
3609 multilib: {
3610 first: {
3611 native_shared_libs: ["mylib2"],
3612 }
3613 }
3614 }
3615 }
3616 }
3617
3618 apex_key {
3619 name: "myapex.key",
3620 public_key: "testkey.avbpubkey",
3621 private_key: "testkey.pem",
3622 }
3623
3624 cc_library {
3625 name: "mylib",
3626 srcs: ["mylib.cpp"],
3627 system_shared_libs: [],
3628 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003629 // TODO: remove //apex_available:platform
3630 apex_available: [
3631 "//apex_available:platform",
3632 "myapex",
3633 ],
Alex Light9670d332019-01-29 18:07:33 -08003634 }
3635
3636 cc_library {
3637 name: "mylib_common",
3638 srcs: ["mylib.cpp"],
3639 system_shared_libs: [],
3640 stl: "none",
3641 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003642 // TODO: remove //apex_available:platform
3643 apex_available: [
3644 "//apex_available:platform",
3645 "myapex",
3646 ],
Alex Light9670d332019-01-29 18:07:33 -08003647 }
3648
3649 cc_library {
3650 name: "mylib2",
3651 srcs: ["mylib.cpp"],
3652 system_shared_libs: [],
3653 stl: "none",
3654 compile_multilib: "first",
3655 }
3656 `)
3657
Sundong Ahnabb64432019-10-22 13:58:29 +09003658 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003659 copyCmds := apexRule.Args["copy_commands"]
3660
3661 // Ensure that main rule creates an output
3662 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3663
3664 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003665 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3666 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3667 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003668
3669 // Ensure that both direct and indirect deps are copied into apex
3670 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3671 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3672 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3673
Colin Cross7113d202019-11-20 16:39:12 -08003674 // Ensure that the platform variant ends with _shared
3675 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3676 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3677 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003678}
Jiyong Park04480cf2019-02-06 00:16:29 +09003679
3680func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003681 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003682 apex {
3683 name: "myapex",
3684 key: "myapex.key",
3685 binaries: ["myscript"],
3686 }
3687
3688 apex_key {
3689 name: "myapex.key",
3690 public_key: "testkey.avbpubkey",
3691 private_key: "testkey.pem",
3692 }
3693
3694 sh_binary {
3695 name: "myscript",
3696 src: "mylib.cpp",
3697 filename: "myscript.sh",
3698 sub_dir: "script",
3699 }
3700 `)
3701
Sundong Ahnabb64432019-10-22 13:58:29 +09003702 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003703 copyCmds := apexRule.Args["copy_commands"]
3704
3705 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3706}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003707
Jooyung Han91df2082019-11-20 01:49:42 +09003708func TestApexInVariousPartition(t *testing.T) {
3709 testcases := []struct {
3710 propName, parition, flattenedPartition string
3711 }{
3712 {"", "system", "system_ext"},
3713 {"product_specific: true", "product", "product"},
3714 {"soc_specific: true", "vendor", "vendor"},
3715 {"proprietary: true", "vendor", "vendor"},
3716 {"vendor: true", "vendor", "vendor"},
3717 {"system_ext_specific: true", "system_ext", "system_ext"},
3718 }
3719 for _, tc := range testcases {
3720 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3721 ctx, _ := testApex(t, `
3722 apex {
3723 name: "myapex",
3724 key: "myapex.key",
3725 `+tc.propName+`
3726 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003727
Jooyung Han91df2082019-11-20 01:49:42 +09003728 apex_key {
3729 name: "myapex.key",
3730 public_key: "testkey.avbpubkey",
3731 private_key: "testkey.pem",
3732 }
3733 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003734
Jooyung Han91df2082019-11-20 01:49:42 +09003735 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3736 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3737 actual := apex.installDir.String()
3738 if actual != expected {
3739 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3740 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003741
Jooyung Han91df2082019-11-20 01:49:42 +09003742 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3743 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3744 actual = flattened.installDir.String()
3745 if actual != expected {
3746 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3747 }
3748 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003749 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003750}
Jiyong Park67882562019-03-21 01:11:21 +09003751
Jooyung Han580eb4f2020-06-24 19:33:06 +09003752func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003753 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003754 apex {
3755 name: "myapex",
3756 key: "myapex.key",
3757 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003758
Jooyung Han580eb4f2020-06-24 19:33:06 +09003759 apex_key {
3760 name: "myapex.key",
3761 public_key: "testkey.avbpubkey",
3762 private_key: "testkey.pem",
3763 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003764 `)
3765 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003766 rule := module.Output("file_contexts")
3767 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3768}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003769
Jooyung Han580eb4f2020-06-24 19:33:06 +09003770func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003771 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003772 apex {
3773 name: "myapex",
3774 key: "myapex.key",
3775 file_contexts: "my_own_file_contexts",
3776 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003777
Jooyung Han580eb4f2020-06-24 19:33:06 +09003778 apex_key {
3779 name: "myapex.key",
3780 public_key: "testkey.avbpubkey",
3781 private_key: "testkey.pem",
3782 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003783 `, withFiles(map[string][]byte{
3784 "my_own_file_contexts": nil,
3785 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003786}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003787
Jooyung Han580eb4f2020-06-24 19:33:06 +09003788func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003789 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003790 apex {
3791 name: "myapex",
3792 key: "myapex.key",
3793 product_specific: true,
3794 file_contexts: "product_specific_file_contexts",
3795 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003796
Jooyung Han580eb4f2020-06-24 19:33:06 +09003797 apex_key {
3798 name: "myapex.key",
3799 public_key: "testkey.avbpubkey",
3800 private_key: "testkey.pem",
3801 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003802 `)
3803
Jooyung Han580eb4f2020-06-24 19:33:06 +09003804 ctx, _ := testApex(t, `
3805 apex {
3806 name: "myapex",
3807 key: "myapex.key",
3808 product_specific: true,
3809 file_contexts: "product_specific_file_contexts",
3810 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003811
Jooyung Han580eb4f2020-06-24 19:33:06 +09003812 apex_key {
3813 name: "myapex.key",
3814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003817 `, withFiles(map[string][]byte{
3818 "product_specific_file_contexts": nil,
3819 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003820 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3821 rule := module.Output("file_contexts")
3822 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3823}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003824
Jooyung Han580eb4f2020-06-24 19:33:06 +09003825func TestFileContexts_SetViaFileGroup(t *testing.T) {
3826 ctx, _ := testApex(t, `
3827 apex {
3828 name: "myapex",
3829 key: "myapex.key",
3830 product_specific: true,
3831 file_contexts: ":my-file-contexts",
3832 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003833
Jooyung Han580eb4f2020-06-24 19:33:06 +09003834 apex_key {
3835 name: "myapex.key",
3836 public_key: "testkey.avbpubkey",
3837 private_key: "testkey.pem",
3838 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003839
Jooyung Han580eb4f2020-06-24 19:33:06 +09003840 filegroup {
3841 name: "my-file-contexts",
3842 srcs: ["product_specific_file_contexts"],
3843 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003844 `, withFiles(map[string][]byte{
3845 "product_specific_file_contexts": nil,
3846 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003847 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3848 rule := module.Output("file_contexts")
3849 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09003850}
3851
Jiyong Park67882562019-03-21 01:11:21 +09003852func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003853 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003854 apex_key {
3855 name: "myapex.key",
3856 public_key: ":my.avbpubkey",
3857 private_key: ":my.pem",
3858 product_specific: true,
3859 }
3860
3861 filegroup {
3862 name: "my.avbpubkey",
3863 srcs: ["testkey2.avbpubkey"],
3864 }
3865
3866 filegroup {
3867 name: "my.pem",
3868 srcs: ["testkey2.pem"],
3869 }
3870 `)
3871
3872 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3873 expected_pubkey := "testkey2.avbpubkey"
3874 actual_pubkey := apex_key.public_key_file.String()
3875 if actual_pubkey != expected_pubkey {
3876 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3877 }
3878 expected_privkey := "testkey2.pem"
3879 actual_privkey := apex_key.private_key_file.String()
3880 if actual_privkey != expected_privkey {
3881 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3882 }
3883}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003884
3885func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003886 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003887 prebuilt_apex {
3888 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003889 arch: {
3890 arm64: {
3891 src: "myapex-arm64.apex",
3892 },
3893 arm: {
3894 src: "myapex-arm.apex",
3895 },
3896 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003897 }
3898 `)
3899
3900 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3901
Jiyong Parkc95714e2019-03-29 14:23:10 +09003902 expectedInput := "myapex-arm64.apex"
3903 if prebuilt.inputApex.String() != expectedInput {
3904 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3905 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003906}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003907
3908func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003909 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003910 prebuilt_apex {
3911 name: "myapex",
3912 src: "myapex-arm.apex",
3913 filename: "notmyapex.apex",
3914 }
3915 `)
3916
3917 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3918
3919 expected := "notmyapex.apex"
3920 if p.installFilename != expected {
3921 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3922 }
3923}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003924
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003925func TestPrebuiltOverrides(t *testing.T) {
3926 ctx, config := testApex(t, `
3927 prebuilt_apex {
3928 name: "myapex.prebuilt",
3929 src: "myapex-arm.apex",
3930 overrides: [
3931 "myapex",
3932 ],
3933 }
3934 `)
3935
3936 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3937
3938 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003939 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003940 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003941 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003942 }
3943}
3944
Roland Levillain630846d2019-06-26 12:48:34 +01003945func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003946 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003947 apex_test {
3948 name: "myapex",
3949 key: "myapex.key",
3950 tests: [
3951 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003952 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003953 ],
3954 }
3955
3956 apex_key {
3957 name: "myapex.key",
3958 public_key: "testkey.avbpubkey",
3959 private_key: "testkey.pem",
3960 }
3961
Liz Kammer1c14a212020-05-12 15:26:55 -07003962 filegroup {
3963 name: "fg",
3964 srcs: [
3965 "baz",
3966 "bar/baz"
3967 ],
3968 }
3969
Roland Levillain630846d2019-06-26 12:48:34 +01003970 cc_test {
3971 name: "mytest",
3972 gtest: false,
3973 srcs: ["mytest.cpp"],
3974 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003975 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003976 system_shared_libs: [],
3977 static_executable: true,
3978 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003979 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003980 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003981
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003982 cc_library {
3983 name: "mylib",
3984 srcs: ["mylib.cpp"],
3985 system_shared_libs: [],
3986 stl: "none",
3987 }
3988
Liz Kammer5bd365f2020-05-27 15:15:11 -07003989 filegroup {
3990 name: "fg2",
3991 srcs: [
3992 "testdata/baz"
3993 ],
3994 }
3995
Roland Levillain9b5fde92019-06-28 15:41:19 +01003996 cc_test {
3997 name: "mytests",
3998 gtest: false,
3999 srcs: [
4000 "mytest1.cpp",
4001 "mytest2.cpp",
4002 "mytest3.cpp",
4003 ],
4004 test_per_src: true,
4005 relative_install_path: "test",
4006 system_shared_libs: [],
4007 static_executable: true,
4008 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004009 data: [
4010 ":fg",
4011 ":fg2",
4012 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004013 }
Roland Levillain630846d2019-06-26 12:48:34 +01004014 `)
4015
Sundong Ahnabb64432019-10-22 13:58:29 +09004016 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004017 copyCmds := apexRule.Args["copy_commands"]
4018
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004019 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004020 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004021 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004022
Liz Kammer1c14a212020-05-12 15:26:55 -07004023 //Ensure that test data are copied into apex.
4024 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4025 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4026
Roland Levillain9b5fde92019-06-28 15:41:19 +01004027 // Ensure that test deps built with `test_per_src` are copied into apex.
4028 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4029 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4030 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004031
4032 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004033 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4034 data := android.AndroidMkDataForTest(t, config, "", bundle)
4035 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004036 prefix := "TARGET_"
4037 var builder strings.Builder
4038 data.Custom(&builder, name, prefix, "", data)
4039 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004040 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4041 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4042 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4043 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004044 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004045 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004046 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004047
4048 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4049 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4050 data.Custom(&builder, name, prefix, "", data)
4051 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004052 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4053 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004054}
4055
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004056func TestInstallExtraFlattenedApexes(t *testing.T) {
4057 ctx, config := testApex(t, `
4058 apex {
4059 name: "myapex",
4060 key: "myapex.key",
4061 }
4062 apex_key {
4063 name: "myapex.key",
4064 public_key: "testkey.avbpubkey",
4065 private_key: "testkey.pem",
4066 }
4067 `, func(fs map[string][]byte, config android.Config) {
4068 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4069 })
4070 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004071 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004072 mk := android.AndroidMkDataForTest(t, config, "", ab)
4073 var builder strings.Builder
4074 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4075 androidMk := builder.String()
4076 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4077}
4078
Jooyung Han5c998b92019-06-27 11:30:33 +09004079func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004080 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09004081 apex {
4082 name: "myapex",
4083 key: "myapex.key",
4084 native_shared_libs: ["mylib"],
4085 uses: ["commonapex"],
4086 }
4087
4088 apex {
4089 name: "commonapex",
4090 key: "myapex.key",
4091 native_shared_libs: ["libcommon"],
4092 provide_cpp_shared_libs: true,
4093 }
4094
4095 apex_key {
4096 name: "myapex.key",
4097 public_key: "testkey.avbpubkey",
4098 private_key: "testkey.pem",
4099 }
4100
4101 cc_library {
4102 name: "mylib",
4103 srcs: ["mylib.cpp"],
4104 shared_libs: ["libcommon"],
4105 system_shared_libs: [],
4106 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004107 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004108 }
4109
4110 cc_library {
4111 name: "libcommon",
4112 srcs: ["mylib_common.cpp"],
4113 system_shared_libs: [],
4114 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004115 // TODO: remove //apex_available:platform
4116 apex_available: [
4117 "//apex_available:platform",
4118 "commonapex",
4119 "myapex",
4120 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09004121 }
4122 `)
4123
Sundong Ahnabb64432019-10-22 13:58:29 +09004124 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004125 apexRule1 := module1.Rule("apexRule")
4126 copyCmds1 := apexRule1.Args["copy_commands"]
4127
Sundong Ahnabb64432019-10-22 13:58:29 +09004128 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09004129 apexRule2 := module2.Rule("apexRule")
4130 copyCmds2 := apexRule2.Args["copy_commands"]
4131
Colin Crossaede88c2020-08-11 12:17:01 -07004132 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4133 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000")
Jooyung Han5c998b92019-06-27 11:30:33 +09004134 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
4135 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
4136 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
4137}
4138
4139func TestApexUsesFailsIfNotProvided(t *testing.T) {
4140 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
4141 apex {
4142 name: "myapex",
4143 key: "myapex.key",
4144 uses: ["commonapex"],
4145 }
4146
4147 apex {
4148 name: "commonapex",
4149 key: "myapex.key",
4150 }
4151
4152 apex_key {
4153 name: "myapex.key",
4154 public_key: "testkey.avbpubkey",
4155 private_key: "testkey.pem",
4156 }
4157 `)
4158 testApexError(t, `uses: "commonapex" is not a provider`, `
4159 apex {
4160 name: "myapex",
4161 key: "myapex.key",
4162 uses: ["commonapex"],
4163 }
4164
4165 cc_library {
4166 name: "commonapex",
4167 system_shared_libs: [],
4168 stl: "none",
4169 }
4170
4171 apex_key {
4172 name: "myapex.key",
4173 public_key: "testkey.avbpubkey",
4174 private_key: "testkey.pem",
4175 }
4176 `)
4177}
4178
4179func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
4180 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
4181 apex {
4182 name: "myapex",
4183 key: "myapex.key",
4184 use_vendor: true,
4185 uses: ["commonapex"],
4186 }
4187
4188 apex {
4189 name: "commonapex",
4190 key: "myapex.key",
4191 provide_cpp_shared_libs: true,
4192 }
4193
4194 apex_key {
4195 name: "myapex.key",
4196 public_key: "testkey.avbpubkey",
4197 private_key: "testkey.pem",
4198 }
Jooyung Handc782442019-11-01 03:14:38 +09004199 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07004200 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09004201 })
Jooyung Han5c998b92019-06-27 11:30:33 +09004202}
4203
Jooyung Hand48f3c32019-08-23 11:18:57 +09004204func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4205 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4206 apex {
4207 name: "myapex",
4208 key: "myapex.key",
4209 native_shared_libs: ["libfoo"],
4210 }
4211
4212 apex_key {
4213 name: "myapex.key",
4214 public_key: "testkey.avbpubkey",
4215 private_key: "testkey.pem",
4216 }
4217
4218 cc_library {
4219 name: "libfoo",
4220 stl: "none",
4221 system_shared_libs: [],
4222 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004223 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004224 }
4225 `)
4226 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4227 apex {
4228 name: "myapex",
4229 key: "myapex.key",
4230 java_libs: ["myjar"],
4231 }
4232
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238
4239 java_library {
4240 name: "myjar",
4241 srcs: ["foo/bar/MyClass.java"],
4242 sdk_version: "none",
4243 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004244 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004245 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004246 }
4247 `)
4248}
4249
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004250func TestApexWithApps(t *testing.T) {
4251 ctx, _ := testApex(t, `
4252 apex {
4253 name: "myapex",
4254 key: "myapex.key",
4255 apps: [
4256 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004257 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004258 ],
4259 }
4260
4261 apex_key {
4262 name: "myapex.key",
4263 public_key: "testkey.avbpubkey",
4264 private_key: "testkey.pem",
4265 }
4266
4267 android_app {
4268 name: "AppFoo",
4269 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004270 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004271 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004272 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004274 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004275 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004276
4277 android_app {
4278 name: "AppFooPriv",
4279 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004280 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004281 system_modules: "none",
4282 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004283 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004284 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004285 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004286
4287 cc_library_shared {
4288 name: "libjni",
4289 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004290 shared_libs: ["libfoo"],
4291 stl: "none",
4292 system_shared_libs: [],
4293 apex_available: [ "myapex" ],
4294 sdk_version: "current",
4295 }
4296
4297 cc_library_shared {
4298 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004299 stl: "none",
4300 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004301 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004302 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004303 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004304 `)
4305
Sundong Ahnabb64432019-10-22 13:58:29 +09004306 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004307 apexRule := module.Rule("apexRule")
4308 copyCmds := apexRule.Args["copy_commands"]
4309
4310 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004311 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004312
Colin Crossaede88c2020-08-11 12:17:01 -07004313 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004314 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004315 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004316 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004317 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004318 // JNI libraries including transitive deps are
4319 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004320 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004321 // ... embedded inside APK (jnilibs.zip)
4322 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4323 // ... and not directly inside the APEX
4324 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4325 }
Dario Frenicde2a032019-10-27 00:29:22 +01004326}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004327
Dario Frenicde2a032019-10-27 00:29:22 +01004328func TestApexWithAppImports(t *testing.T) {
4329 ctx, _ := testApex(t, `
4330 apex {
4331 name: "myapex",
4332 key: "myapex.key",
4333 apps: [
4334 "AppFooPrebuilt",
4335 "AppFooPrivPrebuilt",
4336 ],
4337 }
4338
4339 apex_key {
4340 name: "myapex.key",
4341 public_key: "testkey.avbpubkey",
4342 private_key: "testkey.pem",
4343 }
4344
4345 android_app_import {
4346 name: "AppFooPrebuilt",
4347 apk: "PrebuiltAppFoo.apk",
4348 presigned: true,
4349 dex_preopt: {
4350 enabled: false,
4351 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004352 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004353 }
4354
4355 android_app_import {
4356 name: "AppFooPrivPrebuilt",
4357 apk: "PrebuiltAppFooPriv.apk",
4358 privileged: true,
4359 presigned: true,
4360 dex_preopt: {
4361 enabled: false,
4362 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004363 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004364 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004365 }
4366 `)
4367
Sundong Ahnabb64432019-10-22 13:58:29 +09004368 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004369 apexRule := module.Rule("apexRule")
4370 copyCmds := apexRule.Args["copy_commands"]
4371
4372 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004373 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4374}
4375
4376func TestApexWithAppImportsPrefer(t *testing.T) {
4377 ctx, _ := testApex(t, `
4378 apex {
4379 name: "myapex",
4380 key: "myapex.key",
4381 apps: [
4382 "AppFoo",
4383 ],
4384 }
4385
4386 apex_key {
4387 name: "myapex.key",
4388 public_key: "testkey.avbpubkey",
4389 private_key: "testkey.pem",
4390 }
4391
4392 android_app {
4393 name: "AppFoo",
4394 srcs: ["foo/bar/MyClass.java"],
4395 sdk_version: "none",
4396 system_modules: "none",
4397 apex_available: [ "myapex" ],
4398 }
4399
4400 android_app_import {
4401 name: "AppFoo",
4402 apk: "AppFooPrebuilt.apk",
4403 filename: "AppFooPrebuilt.apk",
4404 presigned: true,
4405 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004406 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004407 }
4408 `, withFiles(map[string][]byte{
4409 "AppFooPrebuilt.apk": nil,
4410 }))
4411
4412 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4413 "app/AppFoo/AppFooPrebuilt.apk",
4414 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004415}
4416
Dario Freni6f3937c2019-12-20 22:58:03 +00004417func TestApexWithTestHelperApp(t *testing.T) {
4418 ctx, _ := testApex(t, `
4419 apex {
4420 name: "myapex",
4421 key: "myapex.key",
4422 apps: [
4423 "TesterHelpAppFoo",
4424 ],
4425 }
4426
4427 apex_key {
4428 name: "myapex.key",
4429 public_key: "testkey.avbpubkey",
4430 private_key: "testkey.pem",
4431 }
4432
4433 android_test_helper_app {
4434 name: "TesterHelpAppFoo",
4435 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004436 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004437 }
4438
4439 `)
4440
4441 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4442 apexRule := module.Rule("apexRule")
4443 copyCmds := apexRule.Args["copy_commands"]
4444
4445 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4446}
4447
Jooyung Han18020ea2019-11-13 10:50:48 +09004448func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4449 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09004450 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004451 apex {
4452 name: "myapex",
4453 key: "myapex.key",
4454 native_shared_libs: ["libfoo"],
4455 }
4456
4457 apex_key {
4458 name: "myapex.key",
4459 public_key: "testkey.avbpubkey",
4460 private_key: "testkey.pem",
4461 }
4462
4463 apex {
4464 name: "otherapex",
4465 key: "myapex.key",
4466 native_shared_libs: ["libfoo"],
4467 }
4468
4469 cc_defaults {
4470 name: "libfoo-defaults",
4471 apex_available: ["otherapex"],
4472 }
4473
4474 cc_library {
4475 name: "libfoo",
4476 defaults: ["libfoo-defaults"],
4477 stl: "none",
4478 system_shared_libs: [],
4479 }`)
4480}
4481
Paul Duffine52e66f2020-03-30 17:54:29 +01004482func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004483 // libfoo is not available to myapex, but only to otherapex
4484 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
4485 apex {
4486 name: "myapex",
4487 key: "myapex.key",
4488 native_shared_libs: ["libfoo"],
4489 }
4490
4491 apex_key {
4492 name: "myapex.key",
4493 public_key: "testkey.avbpubkey",
4494 private_key: "testkey.pem",
4495 }
4496
4497 apex {
4498 name: "otherapex",
4499 key: "otherapex.key",
4500 native_shared_libs: ["libfoo"],
4501 }
4502
4503 apex_key {
4504 name: "otherapex.key",
4505 public_key: "testkey.avbpubkey",
4506 private_key: "testkey.pem",
4507 }
4508
4509 cc_library {
4510 name: "libfoo",
4511 stl: "none",
4512 system_shared_libs: [],
4513 apex_available: ["otherapex"],
4514 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004515}
Jiyong Park127b40b2019-09-30 16:04:35 +09004516
Paul Duffine52e66f2020-03-30 17:54:29 +01004517func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004518 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004519 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004520.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004521.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004522.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004523.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004524.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004525.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004526 apex {
4527 name: "myapex",
4528 key: "myapex.key",
4529 native_shared_libs: ["libfoo"],
4530 }
4531
4532 apex_key {
4533 name: "myapex.key",
4534 public_key: "testkey.avbpubkey",
4535 private_key: "testkey.pem",
4536 }
4537
Jiyong Park127b40b2019-09-30 16:04:35 +09004538 cc_library {
4539 name: "libfoo",
4540 stl: "none",
4541 shared_libs: ["libbar"],
4542 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004543 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004544 }
4545
4546 cc_library {
4547 name: "libbar",
4548 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004549 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004550 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004551 apex_available: ["myapex"],
4552 }
4553
4554 cc_library {
4555 name: "libbaz",
4556 stl: "none",
4557 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004558 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004559}
Jiyong Park127b40b2019-09-30 16:04:35 +09004560
Paul Duffine52e66f2020-03-30 17:54:29 +01004561func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004562 testApexError(t, "\"otherapex\" is not a valid module name", `
4563 apex {
4564 name: "myapex",
4565 key: "myapex.key",
4566 native_shared_libs: ["libfoo"],
4567 }
4568
4569 apex_key {
4570 name: "myapex.key",
4571 public_key: "testkey.avbpubkey",
4572 private_key: "testkey.pem",
4573 }
4574
4575 cc_library {
4576 name: "libfoo",
4577 stl: "none",
4578 system_shared_libs: [],
4579 apex_available: ["otherapex"],
4580 }`)
4581
Paul Duffine52e66f2020-03-30 17:54:29 +01004582 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004583 apex {
4584 name: "myapex",
4585 key: "myapex.key",
4586 native_shared_libs: ["libfoo", "libbar"],
4587 }
4588
4589 apex_key {
4590 name: "myapex.key",
4591 public_key: "testkey.avbpubkey",
4592 private_key: "testkey.pem",
4593 }
4594
4595 cc_library {
4596 name: "libfoo",
4597 stl: "none",
4598 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004599 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004600 apex_available: ["myapex"],
4601 }
4602
4603 cc_library {
4604 name: "libbar",
4605 stl: "none",
4606 system_shared_libs: [],
4607 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004608 }
4609
4610 cc_library {
4611 name: "libbaz",
4612 stl: "none",
4613 system_shared_libs: [],
4614 stubs: {
4615 versions: ["10", "20", "30"],
4616 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004617 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004618}
Jiyong Park127b40b2019-09-30 16:04:35 +09004619
Jiyong Park89e850a2020-04-07 16:37:39 +09004620func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004621 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004622 apex {
4623 name: "myapex",
4624 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004625 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004626 }
4627
4628 apex_key {
4629 name: "myapex.key",
4630 public_key: "testkey.avbpubkey",
4631 private_key: "testkey.pem",
4632 }
4633
4634 cc_library {
4635 name: "libfoo",
4636 stl: "none",
4637 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004638 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004639 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004640 }
4641
4642 cc_library {
4643 name: "libfoo2",
4644 stl: "none",
4645 system_shared_libs: [],
4646 shared_libs: ["libbaz"],
4647 apex_available: ["//apex_available:platform"],
4648 }
4649
4650 cc_library {
4651 name: "libbar",
4652 stl: "none",
4653 system_shared_libs: [],
4654 apex_available: ["myapex"],
4655 }
4656
4657 cc_library {
4658 name: "libbaz",
4659 stl: "none",
4660 system_shared_libs: [],
4661 apex_available: ["myapex"],
4662 stubs: {
4663 versions: ["1"],
4664 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004665 }`)
4666
Jiyong Park89e850a2020-04-07 16:37:39 +09004667 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4668 // because it depends on libbar which isn't available to platform
4669 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4670 if libfoo.NotAvailableForPlatform() != true {
4671 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4672 }
4673
4674 // libfoo2 however can be available to platform because it depends on libbaz which provides
4675 // stubs
4676 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4677 if libfoo2.NotAvailableForPlatform() == true {
4678 t.Errorf("%q should be available to platform", libfoo2.String())
4679 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004680}
Jiyong Parka90ca002019-10-07 15:47:24 +09004681
Paul Duffine52e66f2020-03-30 17:54:29 +01004682func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004683 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004684 apex {
4685 name: "myapex",
4686 key: "myapex.key",
4687 native_shared_libs: ["libfoo"],
4688 }
4689
4690 apex_key {
4691 name: "myapex.key",
4692 public_key: "testkey.avbpubkey",
4693 private_key: "testkey.pem",
4694 }
4695
4696 cc_library {
4697 name: "libfoo",
4698 stl: "none",
4699 system_shared_libs: [],
4700 apex_available: ["myapex"],
4701 static: {
4702 apex_available: ["//apex_available:platform"],
4703 },
4704 }`)
4705
Jiyong Park89e850a2020-04-07 16:37:39 +09004706 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4707 if libfooShared.NotAvailableForPlatform() != true {
4708 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4709 }
4710 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4711 if libfooStatic.NotAvailableForPlatform() != false {
4712 t.Errorf("%q should be available to platform", libfooStatic.String())
4713 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004714}
4715
Jiyong Park5d790c32019-11-15 18:40:32 +09004716func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004717 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004718 apex {
4719 name: "myapex",
4720 key: "myapex.key",
4721 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004722 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004723 }
4724
4725 override_apex {
4726 name: "override_myapex",
4727 base: "myapex",
4728 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004729 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004730 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004731 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004732 }
4733
4734 apex_key {
4735 name: "myapex.key",
4736 public_key: "testkey.avbpubkey",
4737 private_key: "testkey.pem",
4738 }
4739
4740 android_app {
4741 name: "app",
4742 srcs: ["foo/bar/MyClass.java"],
4743 package_name: "foo",
4744 sdk_version: "none",
4745 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004746 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004747 }
4748
4749 override_android_app {
4750 name: "override_app",
4751 base: "app",
4752 package_name: "bar",
4753 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004754 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004755
Jiyong Park317645e2019-12-05 13:20:58 +09004756 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4757 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4758 if originalVariant.GetOverriddenBy() != "" {
4759 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4760 }
4761 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4762 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4763 }
4764
Jiyong Park5d790c32019-11-15 18:40:32 +09004765 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4766 apexRule := module.Rule("apexRule")
4767 copyCmds := apexRule.Args["copy_commands"]
4768
4769 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004770 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004771
4772 apexBundle := module.Module().(*apexBundle)
4773 name := apexBundle.Name()
4774 if name != "override_myapex" {
4775 t.Errorf("name should be \"override_myapex\", but was %q", name)
4776 }
4777
Baligh Uddin004d7172020-02-19 21:29:28 -08004778 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4779 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4780 }
4781
Jiyong Park20bacab2020-03-03 11:45:41 +09004782 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004783 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004784
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004785 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4786 var builder strings.Builder
4787 data.Custom(&builder, name, "TARGET_", "", data)
4788 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004789 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004790 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4791 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004792 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004793 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004794 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004795 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4796 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004797}
4798
Jooyung Han214bf372019-11-12 13:03:50 +09004799func TestLegacyAndroid10Support(t *testing.T) {
4800 ctx, _ := testApex(t, `
4801 apex {
4802 name: "myapex",
4803 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004804 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004805 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004806 }
4807
4808 apex_key {
4809 name: "myapex.key",
4810 public_key: "testkey.avbpubkey",
4811 private_key: "testkey.pem",
4812 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004813
4814 cc_library {
4815 name: "mylib",
4816 srcs: ["mylib.cpp"],
4817 stl: "libc++",
4818 system_shared_libs: [],
4819 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004820 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004821 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004822 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004823
4824 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4825 args := module.Rule("apexRule").Args
4826 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004827 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004828
4829 // The copies of the libraries in the apex should have one more dependency than
4830 // the ones outside the apex, namely the unwinder. Ideally we should check
4831 // the dependency names directly here but for some reason the names are blank in
4832 // this test.
4833 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004834 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004835 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4836 if len(apexImplicits) != len(nonApexImplicits)+1 {
4837 t.Errorf("%q missing unwinder dep", lib)
4838 }
4839 }
Jooyung Han214bf372019-11-12 13:03:50 +09004840}
4841
Paul Duffin9b879592020-05-26 13:21:35 +01004842var filesForSdkLibrary = map[string][]byte{
4843 "api/current.txt": nil,
4844 "api/removed.txt": nil,
4845 "api/system-current.txt": nil,
4846 "api/system-removed.txt": nil,
4847 "api/test-current.txt": nil,
4848 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004849
4850 // For java_sdk_library_import
4851 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004852}
4853
Jooyung Han58f26ab2019-12-18 15:34:32 +09004854func TestJavaSDKLibrary(t *testing.T) {
4855 ctx, _ := testApex(t, `
4856 apex {
4857 name: "myapex",
4858 key: "myapex.key",
4859 java_libs: ["foo"],
4860 }
4861
4862 apex_key {
4863 name: "myapex.key",
4864 public_key: "testkey.avbpubkey",
4865 private_key: "testkey.pem",
4866 }
4867
4868 java_sdk_library {
4869 name: "foo",
4870 srcs: ["a.java"],
4871 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004872 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004873 }
Paul Duffin9b879592020-05-26 13:21:35 +01004874 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004875
4876 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004877 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004878 "javalib/foo.jar",
4879 "etc/permissions/foo.xml",
4880 })
4881 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004882 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4883 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004884}
4885
Paul Duffin9b879592020-05-26 13:21:35 +01004886func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4887 ctx, _ := testApex(t, `
4888 apex {
4889 name: "myapex",
4890 key: "myapex.key",
4891 java_libs: ["foo", "bar"],
4892 }
4893
4894 apex_key {
4895 name: "myapex.key",
4896 public_key: "testkey.avbpubkey",
4897 private_key: "testkey.pem",
4898 }
4899
4900 java_sdk_library {
4901 name: "foo",
4902 srcs: ["a.java"],
4903 api_packages: ["foo"],
4904 apex_available: ["myapex"],
4905 sdk_version: "none",
4906 system_modules: "none",
4907 }
4908
4909 java_library {
4910 name: "bar",
4911 srcs: ["a.java"],
4912 libs: ["foo"],
4913 apex_available: ["myapex"],
4914 sdk_version: "none",
4915 system_modules: "none",
4916 }
4917 `, withFiles(filesForSdkLibrary))
4918
4919 // java_sdk_library installs both impl jar and permission XML
4920 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4921 "javalib/bar.jar",
4922 "javalib/foo.jar",
4923 "etc/permissions/foo.xml",
4924 })
4925
4926 // The bar library should depend on the implementation jar.
4927 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4928 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4929 t.Errorf("expected %q, found %#q", expected, actual)
4930 }
4931}
4932
4933func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4934 ctx, _ := testApex(t, `
4935 apex {
4936 name: "myapex",
4937 key: "myapex.key",
4938 java_libs: ["foo"],
4939 }
4940
4941 apex_key {
4942 name: "myapex.key",
4943 public_key: "testkey.avbpubkey",
4944 private_key: "testkey.pem",
4945 }
4946
4947 java_sdk_library {
4948 name: "foo",
4949 srcs: ["a.java"],
4950 api_packages: ["foo"],
4951 apex_available: ["myapex"],
4952 sdk_version: "none",
4953 system_modules: "none",
4954 }
4955
4956 java_library {
4957 name: "bar",
4958 srcs: ["a.java"],
4959 libs: ["foo"],
4960 sdk_version: "none",
4961 system_modules: "none",
4962 }
4963 `, withFiles(filesForSdkLibrary))
4964
4965 // java_sdk_library installs both impl jar and permission XML
4966 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4967 "javalib/foo.jar",
4968 "etc/permissions/foo.xml",
4969 })
4970
4971 // The bar library should depend on the stubs jar.
4972 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4973 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4974 t.Errorf("expected %q, found %#q", expected, actual)
4975 }
4976}
4977
Paul Duffineedc5d52020-06-12 17:46:39 +01004978func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
4979 ctx, _ := testApex(t, ``,
4980 withFiles(map[string][]byte{
4981 "apex/a.java": nil,
4982 "apex/apex_manifest.json": nil,
4983 "apex/Android.bp": []byte(`
4984 package {
4985 default_visibility: ["//visibility:private"],
4986 }
4987
4988 apex {
4989 name: "myapex",
4990 key: "myapex.key",
4991 java_libs: ["foo", "bar"],
4992 }
4993
4994 apex_key {
4995 name: "myapex.key",
4996 public_key: "testkey.avbpubkey",
4997 private_key: "testkey.pem",
4998 }
4999
5000 java_library {
5001 name: "bar",
5002 srcs: ["a.java"],
5003 libs: ["foo"],
5004 apex_available: ["myapex"],
5005 sdk_version: "none",
5006 system_modules: "none",
5007 }
5008`),
5009 "source/a.java": nil,
5010 "source/api/current.txt": nil,
5011 "source/api/removed.txt": nil,
5012 "source/Android.bp": []byte(`
5013 package {
5014 default_visibility: ["//visibility:private"],
5015 }
5016
5017 java_sdk_library {
5018 name: "foo",
5019 visibility: ["//apex"],
5020 srcs: ["a.java"],
5021 api_packages: ["foo"],
5022 apex_available: ["myapex"],
5023 sdk_version: "none",
5024 system_modules: "none",
5025 public: {
5026 enabled: true,
5027 },
5028 }
5029`),
5030 "prebuilt/a.jar": nil,
5031 "prebuilt/Android.bp": []byte(`
5032 package {
5033 default_visibility: ["//visibility:private"],
5034 }
5035
5036 java_sdk_library_import {
5037 name: "foo",
5038 visibility: ["//apex", "//source"],
5039 apex_available: ["myapex"],
5040 prefer: true,
5041 public: {
5042 jars: ["a.jar"],
5043 },
5044 }
5045`),
5046 }),
5047 )
5048
5049 // java_sdk_library installs both impl jar and permission XML
5050 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5051 "javalib/bar.jar",
5052 "javalib/foo.jar",
5053 "etc/permissions/foo.xml",
5054 })
5055
5056 // The bar library should depend on the implementation jar.
5057 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5058 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5059 t.Errorf("expected %q, found %#q", expected, actual)
5060 }
5061}
5062
5063func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5064 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5065 apex {
5066 name: "myapex",
5067 key: "myapex.key",
5068 java_libs: ["foo"],
5069 }
5070
5071 apex_key {
5072 name: "myapex.key",
5073 public_key: "testkey.avbpubkey",
5074 private_key: "testkey.pem",
5075 }
5076
5077 java_sdk_library_import {
5078 name: "foo",
5079 apex_available: ["myapex"],
5080 prefer: true,
5081 public: {
5082 jars: ["a.jar"],
5083 },
5084 }
5085
5086 `, withFiles(filesForSdkLibrary))
5087}
5088
atrost6e126252020-01-27 17:01:16 +00005089func TestCompatConfig(t *testing.T) {
5090 ctx, _ := testApex(t, `
5091 apex {
5092 name: "myapex",
5093 key: "myapex.key",
5094 prebuilts: ["myjar-platform-compat-config"],
5095 java_libs: ["myjar"],
5096 }
5097
5098 apex_key {
5099 name: "myapex.key",
5100 public_key: "testkey.avbpubkey",
5101 private_key: "testkey.pem",
5102 }
5103
5104 platform_compat_config {
5105 name: "myjar-platform-compat-config",
5106 src: ":myjar",
5107 }
5108
5109 java_library {
5110 name: "myjar",
5111 srcs: ["foo/bar/MyClass.java"],
5112 sdk_version: "none",
5113 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005114 apex_available: [ "myapex" ],
5115 }
5116 `)
5117 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5118 "etc/compatconfig/myjar-platform-compat-config.xml",
5119 "javalib/myjar.jar",
5120 })
5121}
5122
Jiyong Park479321d2019-12-16 11:47:12 +09005123func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5124 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5125 apex {
5126 name: "myapex",
5127 key: "myapex.key",
5128 java_libs: ["myjar"],
5129 }
5130
5131 apex_key {
5132 name: "myapex.key",
5133 public_key: "testkey.avbpubkey",
5134 private_key: "testkey.pem",
5135 }
5136
5137 java_library {
5138 name: "myjar",
5139 srcs: ["foo/bar/MyClass.java"],
5140 sdk_version: "none",
5141 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005142 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005143 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005144 }
5145 `)
5146}
5147
Jiyong Park7afd1072019-12-30 16:56:33 +09005148func TestCarryRequiredModuleNames(t *testing.T) {
5149 ctx, config := testApex(t, `
5150 apex {
5151 name: "myapex",
5152 key: "myapex.key",
5153 native_shared_libs: ["mylib"],
5154 }
5155
5156 apex_key {
5157 name: "myapex.key",
5158 public_key: "testkey.avbpubkey",
5159 private_key: "testkey.pem",
5160 }
5161
5162 cc_library {
5163 name: "mylib",
5164 srcs: ["mylib.cpp"],
5165 system_shared_libs: [],
5166 stl: "none",
5167 required: ["a", "b"],
5168 host_required: ["c", "d"],
5169 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005170 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005171 }
5172 `)
5173
5174 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5175 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5176 name := apexBundle.BaseModuleName()
5177 prefix := "TARGET_"
5178 var builder strings.Builder
5179 data.Custom(&builder, name, prefix, "", data)
5180 androidMk := builder.String()
5181 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5182 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5183 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5184}
5185
Jiyong Park7cd10e32020-01-14 09:22:18 +09005186func TestSymlinksFromApexToSystem(t *testing.T) {
5187 bp := `
5188 apex {
5189 name: "myapex",
5190 key: "myapex.key",
5191 native_shared_libs: ["mylib"],
5192 java_libs: ["myjar"],
5193 }
5194
Jiyong Park9d677202020-02-19 16:29:35 +09005195 apex {
5196 name: "myapex.updatable",
5197 key: "myapex.key",
5198 native_shared_libs: ["mylib"],
5199 java_libs: ["myjar"],
5200 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005201 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005202 }
5203
Jiyong Park7cd10e32020-01-14 09:22:18 +09005204 apex_key {
5205 name: "myapex.key",
5206 public_key: "testkey.avbpubkey",
5207 private_key: "testkey.pem",
5208 }
5209
5210 cc_library {
5211 name: "mylib",
5212 srcs: ["mylib.cpp"],
5213 shared_libs: ["myotherlib"],
5214 system_shared_libs: [],
5215 stl: "none",
5216 apex_available: [
5217 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005218 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005219 "//apex_available:platform",
5220 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005221 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005222 }
5223
5224 cc_library {
5225 name: "myotherlib",
5226 srcs: ["mylib.cpp"],
5227 system_shared_libs: [],
5228 stl: "none",
5229 apex_available: [
5230 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005231 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005232 "//apex_available:platform",
5233 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005234 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005235 }
5236
5237 java_library {
5238 name: "myjar",
5239 srcs: ["foo/bar/MyClass.java"],
5240 sdk_version: "none",
5241 system_modules: "none",
5242 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005243 apex_available: [
5244 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005245 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005246 "//apex_available:platform",
5247 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005248 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005249 }
5250
5251 java_library {
5252 name: "myotherjar",
5253 srcs: ["foo/bar/MyClass.java"],
5254 sdk_version: "none",
5255 system_modules: "none",
5256 apex_available: [
5257 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005258 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005259 "//apex_available:platform",
5260 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005261 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005262 }
5263 `
5264
5265 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5266 for _, f := range files {
5267 if f.path == file {
5268 if f.isLink {
5269 t.Errorf("%q is not a real file", file)
5270 }
5271 return
5272 }
5273 }
5274 t.Errorf("%q is not found", file)
5275 }
5276
5277 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5278 for _, f := range files {
5279 if f.path == file {
5280 if !f.isLink {
5281 t.Errorf("%q is not a symlink", file)
5282 }
5283 return
5284 }
5285 }
5286 t.Errorf("%q is not found", file)
5287 }
5288
Jiyong Park9d677202020-02-19 16:29:35 +09005289 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5290 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005291 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005292 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005293 ensureRealfileExists(t, files, "javalib/myjar.jar")
5294 ensureRealfileExists(t, files, "lib64/mylib.so")
5295 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5296
Jiyong Park9d677202020-02-19 16:29:35 +09005297 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5298 ensureRealfileExists(t, files, "javalib/myjar.jar")
5299 ensureRealfileExists(t, files, "lib64/mylib.so")
5300 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5301
5302 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005303 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005304 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005305 ensureRealfileExists(t, files, "javalib/myjar.jar")
5306 ensureRealfileExists(t, files, "lib64/mylib.so")
5307 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005308
5309 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5310 ensureRealfileExists(t, files, "javalib/myjar.jar")
5311 ensureRealfileExists(t, files, "lib64/mylib.so")
5312 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005313}
5314
Yo Chiange8128052020-07-23 20:09:18 +08005315func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5316 ctx, config := testApex(t, `
5317 apex {
5318 name: "myapex",
5319 key: "myapex.key",
5320 native_shared_libs: ["mylib"],
5321 }
5322
5323 apex_key {
5324 name: "myapex.key",
5325 public_key: "testkey.avbpubkey",
5326 private_key: "testkey.pem",
5327 }
5328
5329 cc_library_shared {
5330 name: "mylib",
5331 srcs: ["mylib.cpp"],
5332 shared_libs: ["myotherlib"],
5333 system_shared_libs: [],
5334 stl: "none",
5335 apex_available: [
5336 "myapex",
5337 "//apex_available:platform",
5338 ],
5339 }
5340
5341 cc_prebuilt_library_shared {
5342 name: "myotherlib",
5343 srcs: ["prebuilt.so"],
5344 system_shared_libs: [],
5345 stl: "none",
5346 apex_available: [
5347 "myapex",
5348 "//apex_available:platform",
5349 ],
5350 }
5351 `)
5352
5353 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5354 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5355 var builder strings.Builder
5356 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5357 androidMk := builder.String()
5358 // `myotherlib` is added to `myapex` as symlink
5359 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5360 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5361 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5362 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5363 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5364}
5365
Jooyung Han643adc42020-02-27 13:50:06 +09005366func TestApexWithJniLibs(t *testing.T) {
5367 ctx, _ := testApex(t, `
5368 apex {
5369 name: "myapex",
5370 key: "myapex.key",
5371 jni_libs: ["mylib"],
5372 }
5373
5374 apex_key {
5375 name: "myapex.key",
5376 public_key: "testkey.avbpubkey",
5377 private_key: "testkey.pem",
5378 }
5379
5380 cc_library {
5381 name: "mylib",
5382 srcs: ["mylib.cpp"],
5383 shared_libs: ["mylib2"],
5384 system_shared_libs: [],
5385 stl: "none",
5386 apex_available: [ "myapex" ],
5387 }
5388
5389 cc_library {
5390 name: "mylib2",
5391 srcs: ["mylib.cpp"],
5392 system_shared_libs: [],
5393 stl: "none",
5394 apex_available: [ "myapex" ],
5395 }
5396 `)
5397
5398 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5399 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5400 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5401 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5402 "lib64/mylib.so",
5403 "lib64/mylib2.so",
5404 })
5405}
5406
Jooyung Han49f67012020-04-17 13:43:10 +09005407func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5408 ctx, _ := testApex(t, `
5409 apex {
5410 name: "myapex",
5411 key: "myapex.key",
5412 }
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
5418 `, func(fs map[string][]byte, config android.Config) {
5419 delete(config.Targets, android.Android)
5420 config.AndroidCommonTarget = android.Target{}
5421 })
5422
5423 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5424 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5425 }
5426}
5427
Jiyong Parkbd159612020-02-28 15:22:21 +09005428func TestAppBundle(t *testing.T) {
5429 ctx, _ := testApex(t, `
5430 apex {
5431 name: "myapex",
5432 key: "myapex.key",
5433 apps: ["AppFoo"],
5434 }
5435
5436 apex_key {
5437 name: "myapex.key",
5438 public_key: "testkey.avbpubkey",
5439 private_key: "testkey.pem",
5440 }
5441
5442 android_app {
5443 name: "AppFoo",
5444 srcs: ["foo/bar/MyClass.java"],
5445 sdk_version: "none",
5446 system_modules: "none",
5447 apex_available: [ "myapex" ],
5448 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005449 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005450
5451 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
5452 content := bundleConfigRule.Args["content"]
5453
5454 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005455 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 +09005456}
5457
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005458func TestAppSetBundle(t *testing.T) {
5459 ctx, _ := testApex(t, `
5460 apex {
5461 name: "myapex",
5462 key: "myapex.key",
5463 apps: ["AppSet"],
5464 }
5465
5466 apex_key {
5467 name: "myapex.key",
5468 public_key: "testkey.avbpubkey",
5469 private_key: "testkey.pem",
5470 }
5471
5472 android_app_set {
5473 name: "AppSet",
5474 set: "AppSet.apks",
5475 }`)
5476 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5477 bundleConfigRule := mod.Description("Bundle Config")
5478 content := bundleConfigRule.Args["content"]
5479 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5480 s := mod.Rule("apexRule").Args["copy_commands"]
5481 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5482 if len(copyCmds) != 3 {
5483 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5484 }
5485 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5486 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5487 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5488}
5489
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005490func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005491 t.Helper()
5492
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005493 bp := `
5494 java_library {
5495 name: "some-updatable-apex-lib",
5496 srcs: ["a.java"],
5497 sdk_version: "current",
5498 apex_available: [
5499 "some-updatable-apex",
5500 ],
5501 }
5502
5503 java_library {
5504 name: "some-non-updatable-apex-lib",
5505 srcs: ["a.java"],
5506 apex_available: [
5507 "some-non-updatable-apex",
5508 ],
5509 }
5510
5511 java_library {
5512 name: "some-platform-lib",
5513 srcs: ["a.java"],
5514 sdk_version: "current",
5515 installable: true,
5516 }
5517
5518 java_library {
5519 name: "some-art-lib",
5520 srcs: ["a.java"],
5521 sdk_version: "current",
5522 apex_available: [
5523 "com.android.art.something",
5524 ],
5525 hostdex: true,
5526 }
5527
5528 apex {
5529 name: "some-updatable-apex",
5530 key: "some-updatable-apex.key",
5531 java_libs: ["some-updatable-apex-lib"],
5532 updatable: true,
5533 min_sdk_version: "current",
5534 }
5535
5536 apex {
5537 name: "some-non-updatable-apex",
5538 key: "some-non-updatable-apex.key",
5539 java_libs: ["some-non-updatable-apex-lib"],
5540 }
5541
5542 apex_key {
5543 name: "some-updatable-apex.key",
5544 }
5545
5546 apex_key {
5547 name: "some-non-updatable-apex.key",
5548 }
5549
5550 apex {
5551 name: "com.android.art.something",
5552 key: "com.android.art.something.key",
5553 java_libs: ["some-art-lib"],
5554 updatable: true,
5555 min_sdk_version: "current",
5556 }
5557
5558 apex_key {
5559 name: "com.android.art.something.key",
5560 }
5561
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005562 filegroup {
5563 name: "some-updatable-apex-file_contexts",
5564 srcs: [
5565 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5566 ],
5567 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005568
5569 filegroup {
5570 name: "some-non-updatable-apex-file_contexts",
5571 srcs: [
5572 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5573 ],
5574 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005575 `
5576 bp += cc.GatherRequiredDepsForTest(android.Android)
5577 bp += java.GatherRequiredDepsForTest()
5578 bp += dexpreopt.BpToolModulesForTest()
5579
5580 fs := map[string][]byte{
5581 "a.java": nil,
5582 "a.jar": nil,
5583 "build/make/target/product/security": nil,
5584 "apex_manifest.json": nil,
5585 "AndroidManifest.xml": nil,
5586 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005587 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005588 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5589 "framework/aidl/a.aidl": nil,
5590 }
5591 cc.GatherRequiredFilesForTest(fs)
5592
5593 ctx := android.NewTestArchContext()
5594 ctx.RegisterModuleType("apex", BundleFactory)
5595 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5596 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005597 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005598 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005599 cc.RegisterRequiredBuildComponentsForTest(ctx)
5600 java.RegisterJavaBuildComponents(ctx)
5601 java.RegisterSystemModulesBuildComponents(ctx)
5602 java.RegisterAppBuildComponents(ctx)
5603 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005604 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5605 ctx.PreDepsMutators(RegisterPreDepsMutators)
5606 ctx.PostDepsMutators(RegisterPostDepsMutators)
5607
5608 config := android.TestArchConfig(buildDir, nil, bp, fs)
5609 ctx.Register(config)
5610
5611 _ = dexpreopt.GlobalSoongConfigForTests(config)
5612 dexpreopt.RegisterToolModulesForTest(ctx)
5613 pathCtx := android.PathContextForTesting(config)
5614 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5615 transformDexpreoptConfig(dexpreoptConfig)
5616 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5617
5618 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5619 android.FailIfErrored(t, errs)
5620
5621 _, errs = ctx.PrepareBuildActions(config)
5622 if errmsg == "" {
5623 android.FailIfErrored(t, errs)
5624 } else if len(errs) > 0 {
5625 android.FailIfNoMatchingErrors(t, errmsg, errs)
5626 return
5627 } else {
5628 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5629 }
5630}
5631
Jooyung Han548640b2020-04-27 12:10:30 +09005632func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5633 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5634 apex {
5635 name: "myapex",
5636 key: "myapex.key",
5637 updatable: true,
5638 }
5639
5640 apex_key {
5641 name: "myapex.key",
5642 public_key: "testkey.avbpubkey",
5643 private_key: "testkey.pem",
5644 }
5645 `)
5646}
5647
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005648func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005649 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005650 var transform func(*dexpreopt.GlobalConfig)
5651
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005652 config := android.TestArchConfig(buildDir, nil, "", nil)
5653 ctx := android.PathContextForTesting(config)
5654
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005655 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5656 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005657 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005658 }
5659 testNoUpdatableJarsInBootImage(t, "", transform)
5660 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005661
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005662 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005663 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 +01005664 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005665 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005666 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005667 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005668 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005669
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005670 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 -07005671 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 +01005672 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005673 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005674 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005675 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005676 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005677
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005678 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 -07005679 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005680 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005681 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005682 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005683 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005684 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005685
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005686 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 -07005687 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 +01005688 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005689 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005690 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005691 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005692 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005693
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005694 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5695 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005696 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005697 }
5698 testNoUpdatableJarsInBootImage(t, "", transform)
5699 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005700
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005701 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005702 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005703 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005704 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005705 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005706 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005707 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005708
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005709 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005710 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005711 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005712 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005713 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005714 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005715 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005716
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005717 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005718 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005719 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005720 config.ArtApexJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005721 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005722 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005723 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005724
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005725 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5726 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich249386a2020-07-01 14:31:13 +01005727 config.BootJars = android.CreateConfiguredJarList(ctx, []string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005728 }
5729 testNoUpdatableJarsInBootImage(t, "", transform)
5730 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005731}
5732
Jiyong Park62304bb2020-04-13 16:19:48 +09005733func TestTestFor(t *testing.T) {
5734 ctx, _ := testApex(t, `
5735 apex {
5736 name: "myapex",
5737 key: "myapex.key",
5738 native_shared_libs: ["mylib", "myprivlib"],
5739 }
5740
5741 apex_key {
5742 name: "myapex.key",
5743 public_key: "testkey.avbpubkey",
5744 private_key: "testkey.pem",
5745 }
5746
5747 cc_library {
5748 name: "mylib",
5749 srcs: ["mylib.cpp"],
5750 system_shared_libs: [],
5751 stl: "none",
5752 stubs: {
5753 versions: ["1"],
5754 },
5755 apex_available: ["myapex"],
5756 }
5757
5758 cc_library {
5759 name: "myprivlib",
5760 srcs: ["mylib.cpp"],
5761 system_shared_libs: [],
5762 stl: "none",
5763 apex_available: ["myapex"],
5764 }
5765
5766
5767 cc_test {
5768 name: "mytest",
5769 gtest: false,
5770 srcs: ["mylib.cpp"],
5771 system_shared_libs: [],
5772 stl: "none",
5773 shared_libs: ["mylib", "myprivlib"],
5774 test_for: ["myapex"]
5775 }
5776 `)
5777
5778 // the test 'mytest' is a test for the apex, therefore is linked to the
5779 // actual implementation of mylib instead of its stub.
5780 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5781 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5782 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5783}
5784
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005785// TODO(jungjw): Move this to proptools
5786func intPtr(i int) *int {
5787 return &i
5788}
5789
5790func TestApexSet(t *testing.T) {
5791 ctx, config := testApex(t, `
5792 apex_set {
5793 name: "myapex",
5794 set: "myapex.apks",
5795 filename: "foo_v2.apex",
5796 overrides: ["foo"],
5797 }
5798 `, func(fs map[string][]byte, config android.Config) {
5799 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5800 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5801 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5802 })
5803
5804 m := ctx.ModuleForTests("myapex", "android_common")
5805
5806 // Check extract_apks tool parameters.
5807 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5808 actual := extractedApex.Args["abis"]
5809 expected := "ARMEABI_V7A,ARM64_V8A"
5810 if actual != expected {
5811 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5812 }
5813 actual = extractedApex.Args["sdk-version"]
5814 expected = "30"
5815 if actual != expected {
5816 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5817 }
5818
5819 a := m.Module().(*ApexSet)
5820 expectedOverrides := []string{"foo"}
5821 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5822 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5823 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5824 }
5825}
5826
Jiyong Park7d95a512020-05-10 15:16:24 +09005827func TestNoStaticLinkingToStubsLib(t *testing.T) {
5828 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
5832 native_shared_libs: ["mylib"],
5833 }
5834
5835 apex_key {
5836 name: "myapex.key",
5837 public_key: "testkey.avbpubkey",
5838 private_key: "testkey.pem",
5839 }
5840
5841 cc_library {
5842 name: "mylib",
5843 srcs: ["mylib.cpp"],
5844 static_libs: ["otherlib"],
5845 system_shared_libs: [],
5846 stl: "none",
5847 apex_available: [ "myapex" ],
5848 }
5849
5850 cc_library {
5851 name: "otherlib",
5852 srcs: ["mylib.cpp"],
5853 system_shared_libs: [],
5854 stl: "none",
5855 stubs: {
5856 versions: ["1", "2", "3"],
5857 },
5858 apex_available: [ "myapex" ],
5859 }
5860 `)
5861}
5862
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005863func TestApexKeysTxt(t *testing.T) {
5864 ctx, _ := testApex(t, `
5865 apex {
5866 name: "myapex",
5867 key: "myapex.key",
5868 }
5869
5870 apex_key {
5871 name: "myapex.key",
5872 public_key: "testkey.avbpubkey",
5873 private_key: "testkey.pem",
5874 }
5875
5876 prebuilt_apex {
5877 name: "myapex",
5878 prefer: true,
5879 arch: {
5880 arm64: {
5881 src: "myapex-arm64.apex",
5882 },
5883 arm: {
5884 src: "myapex-arm.apex",
5885 },
5886 },
5887 }
5888
5889 apex_set {
5890 name: "myapex_set",
5891 set: "myapex.apks",
5892 filename: "myapex_set.apex",
5893 overrides: ["myapex"],
5894 }
5895 `)
5896
5897 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5898 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5899 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 +09005900 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 +09005901}
5902
Jooyung Han938b5932020-06-20 12:47:47 +09005903func TestAllowedFiles(t *testing.T) {
5904 ctx, _ := testApex(t, `
5905 apex {
5906 name: "myapex",
5907 key: "myapex.key",
5908 apps: ["app"],
5909 allowed_files: "allowed.txt",
5910 }
5911
5912 apex_key {
5913 name: "myapex.key",
5914 public_key: "testkey.avbpubkey",
5915 private_key: "testkey.pem",
5916 }
5917
5918 android_app {
5919 name: "app",
5920 srcs: ["foo/bar/MyClass.java"],
5921 package_name: "foo",
5922 sdk_version: "none",
5923 system_modules: "none",
5924 apex_available: [ "myapex" ],
5925 }
5926 `, withFiles(map[string][]byte{
5927 "sub/Android.bp": []byte(`
5928 override_apex {
5929 name: "override_myapex",
5930 base: "myapex",
5931 apps: ["override_app"],
5932 allowed_files: ":allowed",
5933 }
5934 // Overridable "path" property should be referenced indirectly
5935 filegroup {
5936 name: "allowed",
5937 srcs: ["allowed.txt"],
5938 }
5939 override_android_app {
5940 name: "override_app",
5941 base: "app",
5942 package_name: "bar",
5943 }
5944 `),
5945 }))
5946
5947 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
5948 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
5949 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5950 }
5951
5952 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
5953 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
5954 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
5955 }
5956}
5957
Martin Stjernholm58c33f02020-07-06 22:56:01 +01005958func TestNonPreferredPrebuiltDependency(t *testing.T) {
5959 _, _ = testApex(t, `
5960 apex {
5961 name: "myapex",
5962 key: "myapex.key",
5963 native_shared_libs: ["mylib"],
5964 }
5965
5966 apex_key {
5967 name: "myapex.key",
5968 public_key: "testkey.avbpubkey",
5969 private_key: "testkey.pem",
5970 }
5971
5972 cc_library {
5973 name: "mylib",
5974 srcs: ["mylib.cpp"],
5975 stubs: {
5976 versions: ["10000"],
5977 },
5978 apex_available: ["myapex"],
5979 }
5980
5981 cc_prebuilt_library_shared {
5982 name: "mylib",
5983 prefer: false,
5984 srcs: ["prebuilt.so"],
5985 stubs: {
5986 versions: ["10000"],
5987 },
5988 apex_available: ["myapex"],
5989 }
5990 `)
5991}
5992
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005993func TestMain(m *testing.M) {
5994 run := func() int {
5995 setUp()
5996 defer tearDown()
5997
5998 return m.Run()
5999 }
6000
6001 os.Exit(run())
6002}